command.line/java/com/jetbrains/teamcity/resources/TCAccess.java (128 lines of code) (raw):

package com.jetbrains.teamcity.resources; import com.jetbrains.teamcity.Debug; import com.jetbrains.teamcity.Storage; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Map; import jetbrains.buildServer.serverSide.crypt.EncryptUtil; public class TCAccess { static Storage.IKey<ArrayList<ICredential>> CREDENTIAL_KEY = new Storage.IKey<ArrayList<ICredential>>() { private static final long serialVersionUID = 6509717225043443905L; public Object getKey() { return TCAccess.class.getName() + ".CREDENTIAL"; //$NON-NLS-1$ } }; static Storage.IKey<ArrayList<?>> SHARES_KEY = new Storage.IKey<ArrayList<?>>() { private static final long serialVersionUID = 6509717225043443905L; public Object getKey() { return TCAccess.class.getName() + ".SHARES"; //$NON-NLS-1$ } }; private static TCAccess ourInstance; private final ArrayList<ICredential> myCredentials; public static synchronized TCAccess getInstance() { if (ourInstance == null) { ourInstance = new TCAccess(); } return ourInstance; } private TCAccess() { // //cleanup // Storage.getInstance().remove(SHARES_KEY); // credentials. note: password encoded final ArrayList<ICredential> credentials = Storage.getInstance().get(CREDENTIAL_KEY); myCredentials = new ArrayList<ICredential>(); if (credentials != null) { myCredentials.addAll(credentials); } } @Override protected void finalize() throws Throwable { Storage.getInstance().flush(); Debug.getInstance().debug(TCAccess.class, "Flush enforced"); super.finalize(); } synchronized void clear() { myCredentials.clear(); Storage.getInstance().put(CREDENTIAL_KEY, new ArrayList<ICredential>(myCredentials), true); } static class TeamCityCredential implements ICredential, Serializable { private static final long serialVersionUID = 468772737075052773L; private final String myPassword; private final String myServer; private final String myUser; private final long myTs; TeamCityCredential(final String url, final String user, final String password) { myPassword = password;// TODO: crypt it myServer = url; myUser = user; myTs = System.currentTimeMillis(); } public String getPassword() { return myPassword; } public String getServer() { return myServer; } public String getUser() { return myUser; } public String toString() { return MessageFormat.format("{0}:{1}:*************", myServer, myUser, myPassword); //$NON-NLS-1$ } public long getCreationTimestamp() { return myTs; } } public ICredential findCredential(final String host) { for (ICredential credential : myCredentials) { try { if (new URL(credential.getServer()).equals(new URL(host))) { return credential; } } catch (MalformedURLException e) { Debug.getInstance().error(TCAccess.class, e.getMessage(), e); } } return null; } public void setCredential(final String url, final String user, final String password) { final String scrambled = EncryptUtil.scramble(password); final TeamCityCredential account = new TeamCityCredential(url, user, scrambled);// make // serializable // check try { final ICredential existing = findCredential(account.getServer()); if (existing == null) { myCredentials.add(account); } else { myCredentials.remove(existing); myCredentials.add(account); } } finally { Storage.getInstance().put(CREDENTIAL_KEY, new ArrayList<ICredential>(myCredentials), true); } } public void removeCredential(final String host) { // check try { final ICredential existing = findCredential(host); if (existing != null) { myCredentials.remove(existing); } } finally { Storage.getInstance().put(CREDENTIAL_KEY, new ArrayList<ICredential>(myCredentials), true); } } public Collection<ICredential> credentials() { return Collections.unmodifiableCollection(myCredentials); // do // not // allow // modification } // TODO: remove next release & uncomment "cleanup" @Deprecated public static class TeamCityRoot implements Serializable { private static final long serialVersionUID = 1L; private Long myRemote; private String myLocal; private String myId; private Map<String, String> myProperies; private String myVcs; } }