package org.tmatesoft.svn.test;
import junit.framework.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.*;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.wc.SVNConfigFile;
import org.tmatesoft.svn.core.wc2.SvnGetInfo;
import org.tmatesoft.svn.core.wc2.SvnInfo;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class CredentialsTest {
@Test
public void testPasswordIsNotRemovedIfStorePasswordsOptionIsFalse() throws Exception {
final TestOptions testOptions = TestOptions.getInstance();
Assume.assumeTrue(TestUtil.areAllApacheOptionsSpecified(testOptions));
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testPasswordIsNotRemovedIfStorePasswordsOptionIsFalse", testOptions);
try {
final BasicAuthenticationManager authenticationManager = new BasicAuthenticationManager("username", "password");
final Map<String, String> loginToPassword = new HashMap<String, String>();
loginToPassword.put("username", "password");
final SVNURL url = sandbox.createSvnRepositoryWithDavAccess(loginToPassword);
final CommitBuilder commitBuilder = new CommitBuilder(url);
commitBuilder.setAuthenticationManager(authenticationManager);
commitBuilder.addFile("file");
commitBuilder.commit();
final File configDirectory = sandbox.createDirectory("config.directory");
new SVNConfigFile(new File(configDirectory, "config")).setPropertyValue("auth", "password-stores", "", true);
final File serversFile = new File(configDirectory, "servers");
final DefaultSVNAuthenticationManager defaultAuthenticationManager = createAuthenticationManager(configDirectory, true, "username", "password");
new SVNConfigFile(serversFile).setPropertyValue("global", "store-passwords", "yes", true);
new SVNConfigFile(serversFile).setPropertyValue("global", "store-plaintext-passwords", "yes", true);
runInfo(svnOperationFactory, url, createAuthenticationManager(configDirectory, true, "username", "password"));
new SVNConfigFile(serversFile).setPropertyValue("global", "store-passwords", "no", true);
new SVNConfigFile(serversFile).setPropertyValue("global", "store-plaintext-passwords", "no", true);
runInfo(svnOperationFactory, url, defaultAuthenticationManager);
runInfo(svnOperationFactory, url, defaultAuthenticationManager); //because of the bug, password is removed here
final SvnInfo svnInfo = runInfo(svnOperationFactory, url, new DefaultSVNAuthenticationManager(configDirectory, false, null, null));
Assert.assertEquals(url, svnInfo.getUrl());
Assert.assertEquals(1, svnInfo.getRevision());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
private SvnInfo runInfo(SvnOperationFactory svnOperationFactory, SVNURL url, ISVNAuthenticationManager authenticationManager) throws SVNException {
svnOperationFactory = new SvnOperationFactory();
try {
svnOperationFactory.setAuthenticationManager(authenticationManager);
final SvnGetInfo getInfo = svnOperationFactory.createGetInfo();
getInfo.setSingleTarget(SvnTarget.fromURL(url));
return getInfo.run();
} finally {
svnOperationFactory.dispose();
}
}
private DefaultSVNAuthenticationManager createAuthenticationManager(File configDirectory, final boolean storageAllowed, final String username, final String password) {
final DefaultSVNAuthenticationManager defaultAuthenticationManager = new DefaultSVNAuthenticationManager(configDirectory, storageAllowed, null, null);
defaultAuthenticationManager.setAuthenticationProvider(new ISVNAuthenticationProvider() {
public SVNAuthentication requestClientAuthentication(String kind, SVNURL url, String realm, SVNErrorMessage errorMessage, SVNAuthentication previousAuth, boolean authMayBeStored) {
if (errorMessage != null && errorMessage.getErrorCode() == SVNErrorCode.RA_NOT_AUTHORIZED) {
return null;
}
return new SVNPasswordAuthentication(username, password, storageAllowed, url, false);
}
public int acceptServerAuthentication(SVNURL url, String realm, Object certificate, boolean resultMayBeStored) {
return ACCEPTED;
}
});
return defaultAuthenticationManager;
}
private String getTestName() {
return "CredentialsTest";
}
}