1 /*
2 * Copyright (C) 2019 Thomas Wolf <thomas.wolf@paranor.ch> and others
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Distribution License v. 1.0 which is available at
6 * https://www.eclipse.org/org/documents/edl-v10.php.
7 *
8 * SPDX-License-Identifier: BSD-3-Clause
9 */
10 package org.eclipse.jgit.transport.sshd;
11
12 import java.net.InetSocketAddress;
13 import java.security.PublicKey;
14 import java.util.List;
15
16 import org.eclipse.jgit.annotations.NonNull;
17 import org.eclipse.jgit.transport.CredentialsProvider;
18
19 /**
20 * An interface for a database of known server keys, supporting finding all
21 * known keys and also deciding whether a server key is to be accepted.
22 * <p>
23 * Connection addresses are given as strings of the format
24 * {@code [hostName]:port} if using a non-standard port (i.e., not port 22),
25 * otherwise just {@code hostname}.
26 * </p>
27 *
28 * @since 5.5
29 */
30 public interface ServerKeyDatabase {
31
32 /**
33 * Retrieves all known and not revoked host keys for the given addresses.
34 *
35 * @param connectAddress
36 * IP address the session tried to connect to
37 * @param remoteAddress
38 * IP address as reported for the remote end point
39 * @param config
40 * giving access to potentially interesting configuration
41 * settings
42 * @return the list of known and not revoked keys for the given addresses
43 */
44 @NonNull
45 List<PublicKey> lookup(@NonNull String connectAddress,
46 @NonNull InetSocketAddress remoteAddress,
47 @NonNull Configuration config);
48
49 /**
50 * Determines whether to accept a received server host key.
51 *
52 * @param connectAddress
53 * IP address the session tried to connect to
54 * @param remoteAddress
55 * IP address as reported for the remote end point
56 * @param serverKey
57 * received from the remote end
58 * @param config
59 * giving access to potentially interesting configuration
60 * settings
61 * @param provider
62 * for interacting with the user, if required; may be
63 * {@code null}
64 * @return {@code true} if the serverKey is accepted, {@code false}
65 * otherwise
66 */
67 boolean accept(@NonNull String connectAddress,
68 @NonNull InetSocketAddress remoteAddress,
69 @NonNull PublicKey serverKey,
70 @NonNull Configuration config, CredentialsProvider provider);
71
72 /**
73 * A simple provider for ssh config settings related to host key checking.
74 * An instance is created by the JGit sshd framework and passed into
75 * {@link ServerKeyDatabase#lookup(String, InetSocketAddress, Configuration)}
76 * and
77 * {@link ServerKeyDatabase#accept(String, InetSocketAddress, PublicKey, Configuration, CredentialsProvider)}.
78 */
79 interface Configuration {
80
81 /**
82 * Retrieves the list of file names from the "UserKnownHostsFile" ssh
83 * config.
84 *
85 * @return the list as configured, with ~ already replaced
86 */
87 List<String> getUserKnownHostsFiles();
88
89 /**
90 * Retrieves the list of file names from the "GlobalKnownHostsFile" ssh
91 * config.
92 *
93 * @return the list as configured, with ~ already replaced
94 */
95 List<String> getGlobalKnownHostsFiles();
96
97 /**
98 * The possible values for the "StrictHostKeyChecking" ssh config.
99 */
100 enum StrictHostKeyChecking {
101 /**
102 * "ask"; default: ask the user whether to accept (and store) a new
103 * or mismatched key.
104 */
105 ASK,
106 /**
107 * "yes", "on": never accept new or mismatched keys.
108 */
109 REQUIRE_MATCH,
110 /**
111 * "no", "off": always accept new or mismatched keys.
112 */
113 ACCEPT_ANY,
114 /**
115 * "accept-new": accept new keys, but never accept modified keys.
116 */
117 ACCEPT_NEW
118 }
119
120 /**
121 * Obtains the value of the "StrictHostKeyChecking" ssh config.
122 *
123 * @return the {@link StrictHostKeyChecking}
124 */
125 @NonNull
126 StrictHostKeyChecking getStrictHostKeyChecking();
127
128 /**
129 * Obtains the value of the "HashKnownHosts" ssh config.
130 *
131 * @return {@code true} if new entries should be stored with hashed host
132 * information, {@code false} otherwise
133 */
134 boolean getHashKnownHosts();
135
136 /**
137 * Obtains the user name used in the connection attempt.
138 *
139 * @return the user name
140 */
141 @NonNull
142 String getUsername();
143 }
144 }