View Javadoc
1   /*
2    * Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com>,
3    * Copyright (C) 2010, Stefan Lay <stefan.lay@sap.com>
4    * and other copyright owners as documented in the project's IP log.
5    *
6    * This program and the accompanying materials are made available
7    * under the terms of the Eclipse Distribution License v1.0 which
8    * accompanies this distribution, is reproduced below, and is
9    * available at http://www.eclipse.org/org/documents/edl-v10.php
10   *
11   * All rights reserved.
12   *
13   * Redistribution and use in source and binary forms, with or
14   * without modification, are permitted provided that the following
15   * conditions are met:
16   *
17   * - Redistributions of source code must retain the above copyright
18   *   notice, this list of conditions and the following disclaimer.
19   *
20   * - Redistributions in binary form must reproduce the above
21   *   copyright notice, this list of conditions and the following
22   *   disclaimer in the documentation and/or other materials provided
23   *   with the distribution.
24   *
25   * - Neither the name of the Eclipse Foundation, Inc. nor the
26   *   names of its contributors may be used to endorse or promote
27   *   products derived from this software without specific prior
28   *   written permission.
29   *
30   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
31   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
32   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
35   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
39   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
42   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43   */
44  
45  package org.eclipse.jgit.transport;
46  
47  import java.util.List;
48  
49  import org.eclipse.jgit.errors.UnsupportedCredentialItem;
50  
51  /**
52   * Provide credentials for use in connecting to Git repositories.
53   *
54   * Implementors are strongly encouraged to support at least the minimal
55   * {@link org.eclipse.jgit.transport.CredentialItem.Username} and
56   * {@link org.eclipse.jgit.transport.CredentialItem.Password} items. More
57   * sophisticated implementors may implement additional types, such as
58   * {@link org.eclipse.jgit.transport.CredentialItem.StringType}.
59   *
60   * CredentialItems are usually presented in bulk, allowing implementors to
61   * combine them into a single UI widget and streamline the authentication
62   * process for an end-user.
63   *
64   * @see UsernamePasswordCredentialsProvider
65   */
66  public abstract class CredentialsProvider {
67  	private static volatile CredentialsProvider defaultProvider;
68  
69  	/**
70  	 * Get the default credentials provider, or null.
71  	 *
72  	 * @return the default credentials provider, or null.
73  	 */
74  	public static CredentialsProvider getDefault() {
75  		return defaultProvider;
76  	}
77  
78  	/**
79  	 * Set the default credentials provider.
80  	 *
81  	 * @param p
82  	 *            the new default provider, may be null to select no default.
83  	 */
84  	public static void setDefault(CredentialsProvider p) {
85  		defaultProvider = p;
86  	}
87  
88  	/**
89  	 * Whether any of the passed items is null
90  	 *
91  	 * @param items
92  	 *            credential items to check
93  	 * @return {@code true} if any of the passed items is null, {@code false}
94  	 *         otherwise
95  	 * @since 4.2
96  	 */
97  	protected static boolean isAnyNull(CredentialItem... items) {
98  		for (CredentialItem i : items)
99  			if (i == null)
100 				return true;
101 		return false;
102 	}
103 
104 	/**
105 	 * Check if the provider is interactive with the end-user.
106 	 *
107 	 * An interactive provider may try to open a dialog box, or prompt for input
108 	 * on the terminal, and will wait for a user response. A non-interactive
109 	 * provider will either populate CredentialItems, or fail.
110 	 *
111 	 * @return {@code true} if the provider is interactive with the end-user.
112 	 */
113 	public abstract boolean isInteractive();
114 
115 	/**
116 	 * Check if the provider can supply the necessary
117 	 * {@link org.eclipse.jgit.transport.CredentialItem}s.
118 	 *
119 	 * @param items
120 	 *            the items the application requires to complete authentication.
121 	 * @return {@code true} if this
122 	 *         {@link org.eclipse.jgit.transport.CredentialsProvider} supports
123 	 *         all of the items supplied.
124 	 */
125 	public abstract boolean supports(CredentialItem... items);
126 
127 	/**
128 	 * Ask for the credential items to be populated.
129 	 *
130 	 * @param uri
131 	 *            the URI of the remote resource that needs authentication.
132 	 * @param items
133 	 *            the items the application requires to complete authentication.
134 	 * @return {@code true} if the request was successful and values were
135 	 *         supplied; {@code false} if the user canceled the request and did
136 	 *         not supply all requested values.
137 	 * @throws org.eclipse.jgit.errors.UnsupportedCredentialItem
138 	 *             if one of the items supplied is not supported.
139 	 */
140 	public abstract boolean get(URIish uri, CredentialItem... items)
141 			throws UnsupportedCredentialItem;
142 
143 	/**
144 	 * Ask for the credential items to be populated.
145 	 *
146 	 * @param uri
147 	 *            the URI of the remote resource that needs authentication.
148 	 * @param items
149 	 *            the items the application requires to complete authentication.
150 	 * @return {@code true} if the request was successful and values were
151 	 *         supplied; {@code false} if the user canceled the request and did
152 	 *         not supply all requested values.
153 	 * @throws org.eclipse.jgit.errors.UnsupportedCredentialItem
154 	 *             if one of the items supplied is not supported.
155 	 */
156 	public boolean get(URIish uri, List<CredentialItem> items)
157 			throws UnsupportedCredentialItem {
158 		return get(uri, items.toArray(new CredentialItem[items.size()]));
159 	}
160 
161 	/**
162 	 * Reset the credentials provider for the given URI
163 	 *
164 	 * @param uri
165 	 *            a {@link org.eclipse.jgit.transport.URIish} object.
166 	 */
167 	public void reset(URIish uri) {
168 		// default does nothing
169 	}
170 }