/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.wc; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; import org.tmatesoft.svn.core.auth.ISVNAuthenticationProvider; import org.tmatesoft.svn.core.auth.SVNAuthentication; import org.tmatesoft.svn.core.auth.SVNPasswordAuthentication; import org.tmatesoft.svn.core.auth.SVNSSHAuthentication; import org.tmatesoft.svn.core.auth.SVNSSLAuthentication; import org.tmatesoft.svn.core.auth.SVNUserNameAuthentication; import org.tmatesoft.svn.core.internal.util.SVNHashMap; /** * @version 1.3 * @author TMate Software Ltd. */ public class EclipseSVNAuthenticationManager extends DefaultSVNAuthenticationManager { private static URL DEFAULT_URL; static { try { DEFAULT_URL = new URL("http://tmate.org/svn/"); } catch (MalformedURLException e) { } } public EclipseSVNAuthenticationManager(File configDirectory, boolean storeAuth, String userName, String password, File keyFile, String passphrase) { super(configDirectory, storeAuth, userName, password, keyFile, passphrase); } protected ISVNAuthenticationProvider createCacheAuthenticationProvider(File authDir, String userName) { return new KeyringAuthenticationProvider(); } protected ISVNAuthenticationProvider createDefaultAuthenticationProvider(String userName, String password, File privateKey, String passphrase, boolean allowSave) { return new DumbAuthenticationProvider(userName, password, privateKey, passphrase, allowSave) { public int acceptServerAuthentication(SVNURL url, String realm, Object certificate, boolean resultMayBeStored) { return ACCEPTED; } }; } static class KeyringAuthenticationProvider implements ISVNAuthenticationProvider, ISVNPersistentAuthenticationProvider { public KeyringAuthenticationProvider() { } public SVNAuthentication requestClientAuthentication(String kind, SVNURL url, String realm, SVNErrorMessage errorMessage, SVNAuthentication previousAuth, boolean authMayBeStored) { // get from key-ring, use realm. realm = realm == null ? DEFAULT_URL.toString() : realm; Map info = Platform.getAuthorizationInfo(DEFAULT_URL, realm, kind); // convert info to SVNAuthentication. if (info != null && ISVNAuthenticationManager.SSL.equals(kind)) { String sslKind = (String) info.get("ssl-kind"); if (sslKind != null && SVNSSLAuthentication.MSCAPI.equals(sslKind)) { String alias = (String) info.get("alias"); return new SVNSSLAuthentication(sslKind, alias, authMayBeStored, url, false); } String password = (String) info.get("password"); if (SVNSSLAuthentication.isCertificatePath(realm)) { if (password != null) { return new SVNPasswordAuthentication("", password, authMayBeStored, url, false); } } else { String path = (String) info.get("cert"); if (path != null) { SVNSSLAuthentication auth = new SVNSSLAuthentication(new File(path), password, authMayBeStored, url, false); auth.setCertificatePath(path); return auth; } } } else if (info != null && !info.isEmpty() && info.get("username") != null) { if (ISVNAuthenticationManager.PASSWORD.equals(kind)) { return new SVNPasswordAuthentication((String) info.get("username"), (String) info.get("password"), authMayBeStored, url, false); } else if (ISVNAuthenticationManager.SSH.equals(kind)) { int port = url.hasPort() ? url.getPort() : -1; if (port < 0 && info.get("port") != null) { port = Integer.parseInt((String) info.get("port")); } if (port < 0) { // will give us default port. port = url.getPort(); } if (info.get("key") != null) { File keyPath = new File((String) info.get("key")); return new SVNSSHAuthentication((String) info.get("username"), keyPath, (String) info.get("passphrase"), port, authMayBeStored, url, false); } else if (info.get("password") != null) { return new SVNSSHAuthentication((String) info.get("username"), (String) info.get("password"), port, authMayBeStored, url, false); } } else if (ISVNAuthenticationManager.USERNAME.equals(kind)) { return new SVNUserNameAuthentication((String) info.get("username"), authMayBeStored, url, false); } } return null; } public int acceptServerAuthentication(SVNURL url, String realm, Object certificate, boolean resultMayBeStored) { return ACCEPTED_TEMPORARY; } public void saveAuthentication(SVNAuthentication auth, String kind, String realm) { if (!(auth instanceof SVNSSLAuthentication) && (auth.getUserName() == null || "".equals(auth.getUserName()))) { return; } realm = realm == null ? DEFAULT_URL.toString() : realm; Map info = new SVNHashMap(); // convert info to SVNAuthentication. info.put("username", auth.getUserName()); if (auth instanceof SVNPasswordAuthentication) { info.put("password", ((SVNPasswordAuthentication) auth).getPassword()); } else if (auth instanceof SVNSSHAuthentication) { SVNSSHAuthentication sshAuth = (SVNSSHAuthentication) auth; if (sshAuth.getPrivateKeyFile() != null) { info.put("key", sshAuth.getPrivateKeyFile().getAbsolutePath()); if (sshAuth.getPassphrase() != null) { info.put("passphrase", sshAuth.getPassphrase()); } } else if (sshAuth.getPassword() != null) { info.put("password", sshAuth.getPassword()); } if (sshAuth.getPortNumber() >= 0) { info.put("port", Integer.toString(sshAuth.getPortNumber())); } } else if (auth instanceof SVNSSLAuthentication) { SVNSSLAuthentication sslAuth = (SVNSSLAuthentication) auth; String password = sslAuth.getPassword(); if (password != null && !"".equals(password)) { info.put("password", password); } if (SVNSSLAuthentication.SSL.equals(sslAuth.getSSLKind())) { String path = sslAuth.getCertificatePath(); if (path != null) { info.put("cert", path); } } else if (SVNSSLAuthentication.MSCAPI.equals(sslAuth.getSSLKind())) { info.put("ssl-kind", sslAuth.getSSLKind()); info.put("alias", sslAuth.getAlias()); } } try { Platform.addAuthorizationInfo(DEFAULT_URL, realm, kind, info); } catch (CoreException e) { } } public byte[] loadFingerprints(String realm) { Map info = Platform.getAuthorizationInfo(DEFAULT_URL, realm, "svn.ssh.server"); if (info != null && realm.equals(info.get("svn:realmstring"))) { return (byte[]) info.get("hostkey"); } return null; } public void saveFingerprints(String realm, byte[] fingerprints) { Map info = new SVNHashMap(); info.put("svn:realmstring", realm); info.put("hostkey", fingerprints); try { Platform.addAuthorizationInfo(DEFAULT_URL, realm, "svn.ssh.server", info); } catch (CoreException e) { } } } }