1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/*******************************************************************************
* Copyright (C) 2010, Jens Baumgart <jens.baumgart@sap.com>
* Copyright (C) 2010, Edwin Kempin <edwin.kempin@sap.com>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.egit.core.securestorage;
import java.io.IOException;
import org.eclipse.equinox.security.storage.EncodingUtils;
import org.eclipse.equinox.security.storage.ISecurePreferences;
import org.eclipse.equinox.security.storage.StorageException;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.util.StringUtils;
/**
* This class wraps the Eclipse secure store. It provides methods to put
* credentials for a given URI to the secure store and to retrieve credentials
* for a given URI.
*/
public class EGitSecureStore {
private static final String USER = "user"; //$NON-NLS-1$
private static final String PASSWORD = "password"; //$NON-NLS-1$
private static final String GIT_PATH_PREFIX = "/GIT/"; //$NON-NLS-1$
private final ISecurePreferences preferences;
/**
* Constructor
*
* @param preferences
* the Eclipse secure store should be passed here if not in test
* mode
*/
public EGitSecureStore(ISecurePreferences preferences) {
this.preferences = preferences;
}
/**
* Puts credentials for the given URI into the secure store
*
* @param uri
* @param credentials
* @throws StorageException
* @throws IOException
*/
public void putCredentials(URIish uri, UserPasswordCredentials credentials)
throws StorageException, IOException {
String u = credentials.getUser();
String p = credentials.getPassword();
if (StringUtils.isEmptyOrNull(u) || StringUtils.isEmptyOrNull(p)) {
return;
}
String pathName = calcNodePath(uri);
ISecurePreferences node = preferences.node(pathName);
node.put(USER, u, false);
node.put(PASSWORD, p, true);
node.flush();
}
/**
* Retrieves credentials stored for the given URI from the secure store
*
* @param uri
* @return credentials
* @throws StorageException
*/
public UserPasswordCredentials getCredentials(URIish uri)
throws StorageException {
String pathName = calcNodePath(uri);
if (!preferences.nodeExists(pathName))
return null;
ISecurePreferences node = preferences.node(pathName);
String user = node.get(USER, ""); //$NON-NLS-1$
String password = node.get(PASSWORD, ""); //$NON-NLS-1$
if (uri.getUser() != null && !user.equals(uri.getUser()))
return null;
return new UserPasswordCredentials(user, password);
}
static String calcNodePath(URIish uri) {
URIish storedURI = uri.setUser(null).setPass(null).setPath(null);
if (uri.getPort() == -1) {
String s = uri.getScheme();
if ("http".equals(s)) //$NON-NLS-1$
storedURI = storedURI.setPort(80);
else if ("https".equals(s)) //$NON-NLS-1$
storedURI = storedURI.setPort(443);
else if ("ssh".equals(s) || "sftp".equals(s)) //$NON-NLS-1$ //$NON-NLS-2$
storedURI = storedURI.setPort(22);
else if ("ftp".equals(s)) //$NON-NLS-1$
storedURI = storedURI.setPort(21);
}
String pathName = GIT_PATH_PREFIX
+ EncodingUtils.encodeSlashes(storedURI.toString());
return pathName;
}
/**
* Clear credentials for the given uri.
*
* @param uri
* @throws IOException
*/
public void clearCredentials(URIish uri) throws IOException {
String pathName = calcNodePath(uri);
if (!preferences.nodeExists(pathName))
return;
ISecurePreferences node = preferences.node(pathName);
node.removeNode();
node.flush();
}
}
|