/******************************************************************************* * 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 v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.egit.core.securestorage; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import javax.crypto.spec.PBEKeySpec; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.equinox.security.storage.ISecurePreferences; import org.eclipse.equinox.security.storage.SecurePreferencesFactory; import org.eclipse.equinox.security.storage.provider.IProviderHints; import org.eclipse.jgit.transport.URIish; import org.eclipse.jgit.util.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; public class EGitSecureStoreTest { ISecurePreferences secureStoreForTest; EGitSecureStore store; @Before public void setUp() throws Exception { setupNewSecureStore(); store = new EGitSecureStore(secureStoreForTest); } @After public void tearDown() throws Exception { secureStoreForTest.flush(); } @Test public void testPutUserAndPassword() throws Exception { URIish uri = new URIish("http://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); ISecurePreferences node = secureStoreForTest.node(EGitSecureStore .calcNodePath(uri).toString()); assertEquals("agitter", node.get("user", null)); assertTrue(node.isEncrypted("password")); assertEquals("letmein", node.get("password", null)); } @Test public void testGetUserAndPassword() throws Exception { URIish uri = new URIish("http://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); UserPasswordCredentials storedCredentials = store.getCredentials(uri); assertEquals("agitter", storedCredentials.getUser()); assertEquals("letmein", storedCredentials.getPassword()); } @Test public void testGetUserAndPasswordUnknownURI() throws Exception { URIish uri = new URIish("http://testRepo.example.com/testrepo"); UserPasswordCredentials storedCredentials = store.getCredentials(uri); assertNull(storedCredentials); } @Test public void testPutUserAndPasswordURIContainingUserAndPass() throws Exception { URIish uri = new URIish( "http://user:pass@testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); ISecurePreferences node = secureStoreForTest.node(EGitSecureStore .calcNodePath(uri).toString()); assertEquals("agitter", node.get("user", null)); assertTrue(node.isEncrypted("password")); assertEquals("letmein", node.get("password", null)); } @Test public void testGetUserAndPasswordURIContainingUserAndPass() throws Exception { store.putCredentials( new URIish("http://testRepo.example.com/testrepo"), new UserPasswordCredentials("agitter", "letmein")); UserPasswordCredentials credentials = store.getCredentials(new URIish( "http://agitter:letmein@testRepo.example.com/testrepo")); assertEquals("agitter", credentials.getUser()); assertEquals("letmein", credentials.getPassword()); } @Test public void testGetUserAndPasswordURIContainingOtherUserAndPass() throws Exception { store.putCredentials( new URIish("http://testRepo.example.com/testrepo"), new UserPasswordCredentials("agitter", "letmein")); assertNull(store.getCredentials(new URIish( "http://otheruser:otherpass@testRepo.example.com/testrepo"))); } @Test public void testClearCredentials() throws Exception { URIish uri = new URIish("http://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); store.clearCredentials(uri); assertEquals(null, store.getCredentials(uri)); } @Test public void testEnsureDefaultPortHttp() throws Exception { URIish uri = new URIish("http://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); URIish uri2 = new URIish("http://testRepo.example.com:80/testrepo"); assertEquals(credentials.getUser(), store.getCredentials(uri2).getUser()); assertEquals(credentials.getPassword(), store.getCredentials(uri2).getPassword()); } @Test public void testEnsureDefaultPortHttps() throws Exception { URIish uri = new URIish("https://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); URIish uri2 = new URIish("https://testRepo.example.com:443/testrepo"); assertEquals(credentials.getUser(), store.getCredentials(uri2).getUser()); assertEquals(credentials.getPassword(), store.getCredentials(uri2).getPassword()); } @Test public void testEnsureDefaultPortSftp() throws Exception { URIish uri = new URIish("sftp://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); URIish uri2 = new URIish("sftp://testRepo.example.com:22/testrepo"); assertEquals(credentials.getUser(), store.getCredentials(uri2).getUser()); assertEquals(credentials.getPassword(), store.getCredentials(uri2).getPassword()); } @Test public void testEnsureDefaultPortFtp() throws Exception { URIish uri = new URIish("ftp://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); URIish uri2 = new URIish("ftp://testRepo.example.com:21/testrepo"); assertEquals(credentials.getUser(), store.getCredentials(uri2).getUser()); assertEquals(credentials.getPassword(), store.getCredentials(uri2).getPassword()); } @Test public void testEnsureDefaultPortSsh() throws Exception { URIish uri = new URIish("ssh://agitter@testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); URIish uri2 = new URIish("ssh://testRepo.example.com:22/testrepo"); assertEquals(credentials.getUser(), store.getCredentials(uri2).getUser()); assertEquals(credentials.getPassword(), store.getCredentials(uri2).getPassword()); } @Test public void testClearCredentialsTwice() throws Exception { URIish uri = new URIish("http://testRepo.example.com/testrepo"); UserPasswordCredentials credentials = new UserPasswordCredentials( "agitter", "letmein"); store.putCredentials(uri, credentials); store.clearCredentials(uri); assertEquals(null, store.getCredentials(uri)); store.clearCredentials(uri); assertEquals(null, store.getCredentials(uri)); } private void setupNewSecureStore() throws IOException, MalformedURLException { HashMap<String, Object> options = new HashMap<String, Object>(); options.put(IProviderHints.DEFAULT_PASSWORD, new PBEKeySpec( "masterpass".toCharArray())); String secureStorePath = ResourcesPlugin.getWorkspace().getRoot() .getLocation().append("testSecureStore").toOSString(); File file = new File(secureStorePath); if (file.exists()) FileUtils.delete(file, FileUtils.RECURSIVE | FileUtils.RETRY); URL url = file.toURI().toURL(); secureStoreForTest = SecurePreferencesFactory.open(url, options); secureStoreForTest.node("/GIT").removeNode(); } }