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; <= 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  	 * A host entry from the ssh config. Any merging of global values and of
41  	 * several matching host entries, %-substitutions, and ~ replacement have
42  	 * all been done.
43  	 */
44  	interface HostConfig {
45  
46  		/**
47  		 * Retrieves the value of a single-valued key, or the first if the key
48  		 * has multiple values. Keys are case-insensitive, so
49  		 * {@code getValue("HostName") == getValue("HOSTNAME")}.
50  		 *
51  		 * @param key
52  		 *            to get the value of
53  		 * @return the value, or {@code null} if none
54  		 */
55  		String getValue(String key);
56  
57  		/**
58  		 * Retrieves the values of a multi- or list-valued key. Keys are
59  		 * case-insensitive, so
60  		 * {@code getValue("HostName") == getValue("HOSTNAME")}.
61  		 *
62  		 * @param key
63  		 *            to get the values of
64  		 * @return a possibly empty list of values
65  		 */
66  		List<String> getValues(String key);
67  
68  		/**
69  		 * Retrieves an unmodifiable map of all single-valued options, with
70  		 * case-insensitive lookup by keys.
71  		 *
72  		 * @return all single-valued options
73  		 */
74  		@NonNull
75  		Map<String, String> getOptions();
76  
77  		/**
78  		 * Retrieves an unmodifiable map of all multi- or list-valued options,
79  		 * with case-insensitive lookup by keys.
80  		 *
81  		 * @return all multi-valued options
82  		 */
83  		@NonNull
84  		Map<String, List<String>> getMultiValuedOptions();
85  
86  	}
87  
88  	/**
89  	 * An empty {@link HostConfig}.
90  	 */
91  	static final HostConfig EMPTY_CONFIG = new HostConfig() {
92  
93  		@Override
94  		public String getValue(String key) {
95  			return null;
96  		}
97  
98  		@Override
99  		public List<String> getValues(String key) {
100 			return Collections.emptyList();
101 		}
102 
103 		@Override
104 		public Map<String, String> getOptions() {
105 			return Collections.emptyMap();
106 		}
107 
108 		@Override
109 		public Map<String, List<String>> getMultiValuedOptions() {
110 			return Collections.emptyMap();
111 		}
112 
113 	};
114 }