View Javadoc
1   /*
2    * Copyright (C) 2020, 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;
11  
12  import java.util.Collections;
13  import java.util.List;
14  import java.util.Map;
15  
16  import org.eclipse.jgit.annotations.NonNull;
17  
18  /**
19   * An abstraction for a SSH config storage, like the OpenSSH ~/.ssh/config file.
20   *
21   * @since 5.8
22   */
23  public interface SshConfigStore {
24  
25  	/**
26  	 * Locate the configuration for a specific host request.
27  	 *
28  	 * @param hostName
29  	 *            to look up
30  	 * @param port
31  	 *            the user supplied; &lt;= 0 if none
32  	 * @param userName
33  	 *            the user supplied, may be {@code null} or empty if none given
34  	 * @return the configuration for the requested name.
35  	 */
36  	@NonNull
37  	HostConfig lookup(@NonNull String hostName, int port, String userName);
38  
39  	/**
40  	 * Locate the configuration for a specific host request and if the
41  	 * configuration has no values for {@link SshConstants#HOST_NAME},
42  	 * {@link SshConstants#PORT}, {@link SshConstants#USER}, or
43  	 * {@link SshConstants#CONNECTION_ATTEMPTS}, fill those values with defaults
44  	 * from the arguments:
45  	 * <table>
46  	 * <tr>
47  	 * <th>ssh config key</th>
48  	 * <th>value from argument</th>
49  	 * </tr>
50  	 * <tr>
51  	 * <td>{@code HostName}</td>
52  	 * <td>{@code hostName}</td>
53  	 * </tr>
54  	 * <tr>
55  	 * <td>{@code Port}</td>
56  	 * <td>{@code port > 0 ? port : 22}</td>
57  	 * </tr>
58  	 * <tr>
59  	 * <td>{@code User}</td>
60  	 * <td>{@code userName}</td>
61  	 * </tr>
62  	 * <tr>
63  	 * <td>{@code ConnectionAttempts}</td>
64  	 * <td>{@code 1}</td>
65  	 * </tr>
66  	 * </table>
67  	 *
68  	 * @param hostName
69  	 *            host name to look up
70  	 * @param port
71  	 *            port number; &lt;= 0 if none
72  	 * @param userName
73  	 *            the user name, may be {@code null} or empty if none given
74  	 * @return the configuration for the requested name.
75  	 * @since 6.0
76  	 */
77  	@NonNull
78  	HostConfig lookupDefault(@NonNull String hostName, int port,
79  			String userName);
80  
81  	/**
82  	 * A host entry from the ssh config. Any merging of global values and of
83  	 * several matching host entries, %-substitutions, and ~ replacement have
84  	 * all been done.
85  	 */
86  	interface HostConfig {
87  
88  		/**
89  		 * Retrieves the value of a single-valued key, or the first if the key
90  		 * has multiple values. Keys are case-insensitive, so
91  		 * {@code getValue("HostName") == getValue("HOSTNAME")}.
92  		 *
93  		 * @param key
94  		 *            to get the value of
95  		 * @return the value, or {@code null} if none
96  		 */
97  		String getValue(String key);
98  
99  		/**
100 		 * Retrieves the values of a multi- or list-valued key. Keys are
101 		 * case-insensitive, so
102 		 * {@code getValue("HostName") == getValue("HOSTNAME")}.
103 		 *
104 		 * @param key
105 		 *            to get the values of
106 		 * @return a possibly empty list of values
107 		 */
108 		List<String> getValues(String key);
109 
110 		/**
111 		 * Retrieves an unmodifiable map of all single-valued options, with
112 		 * case-insensitive lookup by keys.
113 		 *
114 		 * @return all single-valued options
115 		 */
116 		@NonNull
117 		Map<String, String> getOptions();
118 
119 		/**
120 		 * Retrieves an unmodifiable map of all multi- or list-valued options,
121 		 * with case-insensitive lookup by keys.
122 		 *
123 		 * @return all multi-valued options
124 		 */
125 		@NonNull
126 		Map<String, List<String>> getMultiValuedOptions();
127 
128 	}
129 
130 	/**
131 	 * An empty {@link HostConfig}.
132 	 */
133 	static final HostConfig EMPTY_CONFIG = new HostConfig() {
134 
135 		@Override
136 		public String getValue(String key) {
137 			return null;
138 		}
139 
140 		@Override
141 		public List<String> getValues(String key) {
142 			return Collections.emptyList();
143 		}
144 
145 		@Override
146 		public Map<String, String> getOptions() {
147 			return Collections.emptyMap();
148 		}
149 
150 		@Override
151 		public Map<String, List<String>> getMultiValuedOptions() {
152 			return Collections.emptyMap();
153 		}
154 
155 	};
156 }