http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/CredentialManagerImplTest.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/CredentialManagerImplTest.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/CredentialManagerImplTest.java deleted file mode 100644 index 931fa07..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/CredentialManagerImplTest.java +++ /dev/null @@ -1,872 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import static org.junit.Assert.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.security.Key; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.Security; -import java.security.UnrecoverableKeyException; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.List; -import java.util.Random; - -import javax.net.ssl.SSLSocketFactory; - -import net.sf.taverna.t2.lang.observer.Observable; -import net.sf.taverna.t2.lang.observer.Observer; -import net.sf.taverna.t2.security.credentialmanager.CMException; -import net.sf.taverna.t2.security.credentialmanager.CredentialManager; -import net.sf.taverna.t2.security.credentialmanager.CredentialManager.KeystoreType; -import net.sf.taverna.t2.security.credentialmanager.JavaTruststorePasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.KeystoreChangedEvent; -import net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.ServiceUsernameAndPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.TrustConfirmationProvider; -import net.sf.taverna.t2.security.credentialmanager.UsernamePassword; - -import org.apache.commons.io.FileUtils; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -/** - * Tests here should not require Java strong/unlimited cryptography policy to be installed, - * although if something goes wrong that is the first thing to be checked for. - * - * Java by default comes with the weak policy - * that disables the use of certain cryto algorithms and bigger key sizes. Although - * it is claimed that as of Java 6 the default policy is strong, we have seen otherwise, - * so make sure you install it. - * - * For Java 6, strong/unlimited cryptography policy can be downloaded - * (together with the installation instructions) from: - * http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html - * - * An empty Keystore/Truststore is created before each test so we always start afresh - * (see the setUp() method). - * s - * @author Alex Nenadic - * - */ -public class CredentialManagerImplTest { - - private CredentialManagerImpl credentialManager; - private String masterPassword = "uber"; - private DummyMasterPasswordProvider masterPasswordProvider; - private File credentialManagerDirectory; - - private static UsernamePassword usernamePassword; - private static URI serviceURI; - - private static Key privateKey; - private static Certificate[] privateKeyCertChain; - private static URL privateKeyFileURL = CredentialManagerImplTest.class.getResource( - "/security/test-private-key-cert.p12"); - private static final String privateKeyAndPKCS12KeystorePassword = "test"; // password for the test PKCS#12 keystore in resources - - private static X509Certificate trustedCertficate; - private static URL trustedCertficateFileURL = CredentialManagerImplTest.class.getResource( - "/security/google-trusted-certificate.pem"); - - private static Observer<KeystoreChangedEvent> keystoreChangedObserver; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception { - - // Just in case, add the BouncyCastle provider - // It gets added from the CredentialManagerImpl constructor as well - // but we may need some crypto operations before we invoke the Cred. Manager - Security.addProvider(new BouncyCastleProvider()); - - // Create a test username and password for a service - serviceURI = new URI("http://someservice"); - usernamePassword = new UsernamePassword("testuser", "testpasswd"); - - // Load the test private key and its certificate - File privateKeyCertFile = new File(privateKeyFileURL.getPath()); - KeyStore pkcs12Keystore = java.security.KeyStore.getInstance("PKCS12", "BC"); // We have to use the BC provider here as the certificate chain is not loaded if we use whichever provider is first in Java!!! - FileInputStream inStream = new FileInputStream(privateKeyCertFile); - pkcs12Keystore.load(inStream, privateKeyAndPKCS12KeystorePassword.toCharArray()); - // KeyStore pkcs12Keystore = credentialManager.loadPKCS12Keystore(privateKeyCertFile, privateKeyPassword); - Enumeration<String> aliases = pkcs12Keystore.aliases(); - while (aliases.hasMoreElements()) { - // The test-private-key-cert.p12 file contains only one private key - // and corresponding certificate entry - String alias = aliases.nextElement(); - if (pkcs12Keystore.isKeyEntry(alias)) { // is it a (private) key entry? - privateKey = pkcs12Keystore.getKey(alias, - privateKeyAndPKCS12KeystorePassword.toCharArray()); - privateKeyCertChain = pkcs12Keystore.getCertificateChain(alias); - break; - } - } - inStream.close(); - - // Load the test trusted certificate (belonging to *.Google.com) - File trustedCertFile = new File(trustedCertficateFileURL.getPath()); - inStream = new FileInputStream(trustedCertFile); - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - trustedCertficate = (X509Certificate) certFactory.generateCertificate(inStream); - try{ - inStream.close(); - } - catch (Exception e) { - // Ignore - } - - keystoreChangedObserver = new Observer<KeystoreChangedEvent>() { - - @Override - public void notify(Observable<KeystoreChangedEvent> sender, - KeystoreChangedEvent message) throws Exception { - // TODO Auto-generated method stub - - } - }; - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - - try { - credentialManager = new CredentialManagerImpl(); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - Random randomGenerator = new Random(); - String credentialManagerDirectoryPath = System - .getProperty("java.io.tmpdir") - + System.getProperty("file.separator") - + "taverna-security-" - + randomGenerator.nextInt(1000000); - System.out.println("Credential Manager's directory path: " - + credentialManagerDirectoryPath); - credentialManagerDirectory = new File(credentialManagerDirectoryPath); - try { - credentialManager - .setConfigurationDirectoryPath(credentialManagerDirectory); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - - // Create the dummy master password provider - masterPasswordProvider = new DummyMasterPasswordProvider(); - masterPasswordProvider.setMasterPassword(masterPassword); - List<MasterPasswordProvider> masterPasswordProviders = new ArrayList<MasterPasswordProvider>(); - masterPasswordProviders.add(masterPasswordProvider); - credentialManager.setMasterPasswordProviders(masterPasswordProviders); - - // Set an empty list for service username and password providers - credentialManager.setServiceUsernameAndPasswordProviders(new ArrayList<ServiceUsernameAndPasswordProvider>()); - - credentialManager.setJavaTruststorePasswordProviders(new ArrayList<JavaTruststorePasswordProvider>()); - - credentialManager.setTrustConfirmationProviders(new ArrayList<TrustConfirmationProvider>()); - - } - - @After - // Clean up the credentialManagerDirectory we created for testing - public void cleanUp(){ -// assertTrue(credentialManagerDirectory.exists()); -// assertFalse(credentialManagerDirectory.listFiles().length == 0); // something was created there - - if (credentialManagerDirectory.exists()){ - try { - FileUtils.deleteDirectory(credentialManagerDirectory); - System.out.println("Deleting Credential Manager's directory: " - + credentialManagerDirectory.getAbsolutePath()); - } catch (IOException e) { - System.out.println(e.getStackTrace()); - } - } - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#CredentialManagerImpl()}. - * @throws CMException - */ - @Test - public void testCredentialManagerImpl() throws CMException { - new CredentialManagerImpl(); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getUsernameAndPasswordForService(java.net.URI, boolean, java.lang.String)}. - * @throws URISyntaxException - * @throws CMException - */ - @Test - public void testGetUsernameAndPasswordForServiceURI() throws URISyntaxException, CMException { - // The Credential Manage's Keystore is empty so we should not be able to find anything initially - assertNull(credentialManager.getUsernameAndPasswordForService(serviceURI, false, "")); - - credentialManager.addUsernameAndPasswordForService(usernamePassword,serviceURI); - - UsernamePassword testUsernamePassword = credentialManager.getUsernameAndPasswordForService(serviceURI, false, ""); - assertNotNull(testUsernamePassword); - assertTrue(Arrays.equals(usernamePassword.getPassword(), testUsernamePassword.getPassword())); - assertTrue(usernamePassword.getUsername().equals(testUsernamePassword.getUsername())); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#addUsernameAndPasswordForService(net.sf.taverna.t2.security.credentialmanager.UsernamePassword, java.net.URI)}. - * @throws URISyntaxException - * @throws CMException - */ - @Test - public void testAddUsernameAndPasswordForService() throws CMException, URISyntaxException { - - String alias = credentialManager.addUsernameAndPasswordForService(usernamePassword,serviceURI); - - UsernamePassword testUsernamePassword = credentialManager.getUsernameAndPasswordForService(serviceURI, false, ""); - assertNotNull(testUsernamePassword); - assertTrue(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.KEYSTORE, alias)); - assertTrue(Arrays.equals(usernamePassword.getPassword(), testUsernamePassword.getPassword())); - assertTrue(usernamePassword.getUsername().equals(testUsernamePassword.getUsername())); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#hasUsernamePasswordForService(java.net.URI)}. - * @throws CMException - */ - @Test - public void testHasUsernamePasswordForService() throws CMException { - - UsernamePassword testUsernamePassword = credentialManager.getUsernameAndPasswordForService(serviceURI, false, ""); - assertNull(testUsernamePassword); - - String alias = credentialManager.addUsernameAndPasswordForService(usernamePassword,serviceURI); - testUsernamePassword = credentialManager.getUsernameAndPasswordForService(serviceURI, false, ""); - assertNotNull(testUsernamePassword); - assertTrue(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.KEYSTORE, alias)); - assertTrue(Arrays.equals(usernamePassword.getPassword(), testUsernamePassword.getPassword())); - assertTrue(usernamePassword.getUsername().equals(testUsernamePassword.getUsername())); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#deleteUsernameAndPasswordForService(java.net.URI)}. - * @throws URISyntaxException - * @throws CMException - */ - @Test - public void testDeleteUsernameAndPasswordForServiceURI() throws URISyntaxException, CMException { - - // The Credential Manage's Keystore is empty initially so this should - // have no effect apart from initializing the Keystore/Truststore - credentialManager.deleteUsernameAndPasswordForService(serviceURI); - - credentialManager.addUsernameAndPasswordForService(usernamePassword,serviceURI); - credentialManager.deleteUsernameAndPasswordForService(serviceURI); - - assertNull(credentialManager.getUsernameAndPasswordForService(serviceURI, false, "")); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#addKeyPair(java.security.Key, java.security.cert.Certificate[])}. - * @throws CMException - * @throws KeyStoreException - * @throws NoSuchAlgorithmException - * @throws UnrecoverableKeyException - * @throws IOException - * @throws FileNotFoundException - * @throws CertificateException - */ - @Test - public void testAddKeyPair() throws CMException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException { - - String alias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - assertTrue(credentialManager.hasKeyPair(privateKey, privateKeyCertChain)); - assertTrue(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.KEYSTORE, alias)); - - credentialManager.deleteKeyPair(alias); - assertFalse(credentialManager.hasKeyPair(privateKey, privateKeyCertChain)); - assertFalse(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.KEYSTORE, alias)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#hasKeyPair(java.security.Key, java.security.cert.Certificate[])}. - * @throws CMException - * @throws KeyStoreException - * @throws NoSuchAlgorithmException - * @throws UnrecoverableKeyException - * @throws IOException - * @throws FileNotFoundException - * @throws CertificateException - */ - @Test - public void testHasKeyPair() throws CMException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException { - assertFalse(credentialManager.hasKeyPair(privateKey, privateKeyCertChain)); - credentialManager.addKeyPair(privateKey, privateKeyCertChain); - assertTrue(credentialManager.hasKeyPair(privateKey, privateKeyCertChain)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#deleteKeyPair(java.lang.String)}. - * @throws CMException - * @throws KeyStoreException - * @throws NoSuchAlgorithmException - * @throws UnrecoverableKeyException - * @throws IOException - * @throws FileNotFoundException - * @throws CertificateException - */ - @Test - public void testDeleteKeyPair() throws CMException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException { - // The Credential Manage's Keystore is empty initially so this should - // have no effect apart from initializing the Keystore/Truststore - credentialManager.deleteKeyPair("somealias"); - - String alias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - credentialManager.deleteKeyPair(alias); - assertFalse(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.KEYSTORE, alias)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#deleteKeyPair(Key, Certificate[])}. - * @throws CMException - */ - @Test - public void testDeleteKeyPair2() throws CMException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException { - credentialManager.addKeyPair(privateKey, privateKeyCertChain); - assertTrue(credentialManager.hasKeyPair(privateKey, privateKeyCertChain)); - credentialManager.deleteKeyPair(privateKey, privateKeyCertChain); - assertFalse(credentialManager.hasKeyPair(privateKey, privateKeyCertChain)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#exportKeyPair(java.lang.String, java.io.File, java.lang.String)}. - * @throws CMException - * @throws KeyStoreException - * @throws NoSuchAlgorithmException - * @throws UnrecoverableKeyException - */ - @Test - public void testExportKeyPair() throws CMException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException { - String alias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - File fileToExportTo = new File(credentialManagerDirectory, "test-export-key.p12"); - credentialManager.exportKeyPair(alias, fileToExportTo, privateKeyAndPKCS12KeystorePassword); - assertTrue(fileToExportTo.exists()); - // Load it back from the file we just saved - KeyStore ks = credentialManager.loadPKCS12Keystore(fileToExportTo, privateKeyAndPKCS12KeystorePassword); - Enumeration<String> aliases = ks.aliases(); - Key newPrivateKey = null; - Certificate[] newPrivateKeyCerts = null; - while (aliases.hasMoreElements()) { - // The test-private-key-cert.p12 file contains only one private key - // and corresponding certificate entry - alias = aliases.nextElement(); - if (ks.isKeyEntry(alias)) { // is it a (private) key entry? - newPrivateKey = ks.getKey(alias, - privateKeyAndPKCS12KeystorePassword.toCharArray()); - newPrivateKeyCerts = ks.getCertificateChain(alias); - break; - } - } - assertNotNull(newPrivateKey); - assertNotNull(newPrivateKeyCerts); - //assertTrue(Arrays.equals(newPrivateKey.getEncoded(), privateKey.getEncoded())); - assertTrue(newPrivateKey.equals(privateKey)); - assertTrue(Arrays.equals(newPrivateKeyCerts, privateKeyCertChain)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getCertificate(java.lang.String, java.lang.String)}. - * @throws CMException - */ - @Test - public void testGetCertificate() throws CMException { - String alias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - // Get certificate from the Keystore associated with the private key we just inserted - Certificate privateKeyCertificate = credentialManager.getCertificate(CredentialManager.KeystoreType.KEYSTORE, alias); - assertNotNull(privateKeyCertificate); - assertTrue(privateKeyCertChain[0].equals(privateKeyCertificate)); - - // We should also have some trusted certificates in the Truststore - // Need to get their aliases - ArrayList<String> truststoreAliases = credentialManager.getAliases(CredentialManager.KeystoreType.TRUSTSTORE); - assertTrue(!truststoreAliases.isEmpty()); - // Just get the first one - Certificate trustedCertificate = credentialManager.getCertificate(CredentialManager.KeystoreType.TRUSTSTORE, truststoreAliases.get(0)); - assertNotNull(trustedCertificate); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getKeyPairsCertificateChain(java.lang.String)}. - * @throws CMException - */ - @Test - public void testGetKeyPairCertificateChain() throws CMException { - String alias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - Certificate[] keyPairCertificateChain = credentialManager.getKeyPairsCertificateChain(alias); - assertNotNull(keyPairCertificateChain); - assertTrue(Arrays.equals(privateKeyCertChain, keyPairCertificateChain)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getKeyPairsPrivateKey(java.lang.String)}. - * @throws CMException - */ - @Test - public void testGetKeyPairsPrivateKey() throws CMException { - String alias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - Key prvKey = credentialManager.getKeyPairsPrivateKey(alias); - assertNotNull(prvKey); - assertEquals(privateKey, prvKey); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#addTrustedCertificate(java.security.cert.X509Certificate)}. - * @throws CMException - */ - @Test - public void testAddTrustedCertificate() throws CMException { - - String alias = credentialManager.addTrustedCertificate(trustedCertficate); - assertTrue(credentialManager.hasTrustedCertificate(trustedCertficate)); - assertTrue(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.TRUSTSTORE, alias)); - - credentialManager.deleteTrustedCertificate(alias); - assertFalse(credentialManager.hasTrustedCertificate(trustedCertficate)); - assertFalse(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.TRUSTSTORE, alias)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#createTrustedCertificateAlias(java.security.cert.X509Certificate)}. - * @throws CMException - */ - @Test - public void testGetX509CertificateAlias() throws CMException { - - String alias = credentialManager.createTrustedCertificateAlias(trustedCertficate); - String alias2 = credentialManager.addTrustedCertificate(trustedCertficate); - assertEquals(alias, alias2); - - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#deleteTrustedCertificate(java.lang.String)}. - * @throws CMException - */ - @Test - public void testDeleteTrustedCertificate() throws CMException { - // The Credential Manage's Truststore is empty initially so this should - // have no effect apart from initializing the Keystore/Truststore - credentialManager.deleteTrustedCertificate("somealias"); - - String alias = credentialManager.addTrustedCertificate(trustedCertficate); - assertTrue(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.TRUSTSTORE, alias)); - credentialManager.deleteTrustedCertificate(alias); - assertFalse(credentialManager.hasTrustedCertificate(trustedCertficate)); - assertFalse(credentialManager.hasEntryWithAlias(CredentialManager.KeystoreType.TRUSTSTORE, alias)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#deleteTrustedCertificate(X509Certificate)}. - * @throws CMException - */ - @Test - public void testDeleteTrustedCertificate2() throws CMException { - - credentialManager.addTrustedCertificate(trustedCertficate); - assertTrue(credentialManager.hasTrustedCertificate(trustedCertficate)); - credentialManager.deleteTrustedCertificate(trustedCertficate); - assertFalse(credentialManager.hasTrustedCertificate(trustedCertficate)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#isKeyEntry(java.lang.String)}. - * @throws CMException - */ - @Test - public void testIsKeyEntry() throws CMException { - // The Credential Manage's Keystore/Truststore is empty initially so this should - // have no effect apart from initializing them - // This should throw an exception - assertFalse(credentialManager.isKeyEntry("somealias")); - - String aliasPassword = credentialManager.addUsernameAndPasswordForService(usernamePassword, serviceURI); - String aliasKeyPair = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - String aliasTrustedCert = credentialManager.addTrustedCertificate(trustedCertficate); - - assertTrue(credentialManager.isKeyEntry(aliasPassword)); // passwords are saves as symmetric key entries - assertTrue(credentialManager.isKeyEntry(aliasKeyPair)); - assertFalse(credentialManager.isKeyEntry(aliasTrustedCert)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#hasEntryWithAlias(java.lang.String, java.lang.String)}. - * @throws CMException - */ - @Test - public void testHasEntryWithAlias() throws CMException { - - String aliasTrustedCert = credentialManager.createTrustedCertificateAlias(trustedCertficate); - assertFalse(credentialManager.hasEntryWithAlias(KeystoreType.TRUSTSTORE, aliasTrustedCert)); - - String aliasTrustedCert2 = credentialManager.addTrustedCertificate(trustedCertficate); - assertTrue(credentialManager.hasEntryWithAlias(KeystoreType.TRUSTSTORE, aliasTrustedCert2)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getAliases(net.sf.taverna.t2.security.credentialmanager.CredentialManager.KeystoreType)}. - * @throws CMException - */ - @Test - public void testGetAliases() throws CMException { - - ArrayList<String> keystoreAliases = credentialManager.getAliases(KeystoreType.KEYSTORE); - ArrayList<String> truststoreAliases = credentialManager.getAliases(KeystoreType.TRUSTSTORE); - - // Initially Keystore/Truststore is empty - assertTrue(keystoreAliases.isEmpty()); - - String aliasPassword = credentialManager.addUsernameAndPasswordForService(usernamePassword, serviceURI); - String aliasKeyPair = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - String aliasTrustedCert = credentialManager.addTrustedCertificate(trustedCertficate); - - keystoreAliases = credentialManager.getAliases(KeystoreType.KEYSTORE); - truststoreAliases = credentialManager.getAliases(KeystoreType.TRUSTSTORE); - - assertTrue(keystoreAliases.size() == 2); - assertTrue(truststoreAliases.size() >= 1); // we at least have the one we inserted but could be more copied from Java's defauls truststore - - assertTrue(keystoreAliases.contains(aliasPassword)); - assertTrue(keystoreAliases.contains(aliasKeyPair)); - assertTrue(truststoreAliases.contains(aliasTrustedCert)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getServiceURIsForAllUsernameAndPasswordPairs()}. - * @throws CMException - * @throws URISyntaxException - */ - @Test - public void testGetServiceURIsForAllUsernameAndPasswordPairs() throws CMException, URISyntaxException { - // Initially empty so this - assertTrue(credentialManager.getServiceURIsForAllUsernameAndPasswordPairs().isEmpty()); - - credentialManager.addUsernameAndPasswordForService(usernamePassword, serviceURI); - - URI serviceURI2 = new URI("http://someservice2"); - UsernamePassword usernamePassword2 = new UsernamePassword("testuser2", "testpasswd2"); - credentialManager.addUsernameAndPasswordForService(usernamePassword2, serviceURI2); - - List<URI> serviceURIs = credentialManager.getServiceURIsForAllUsernameAndPasswordPairs(); - assertTrue(credentialManager.getServiceURIsForAllUsernameAndPasswordPairs().size() == 2); - assertTrue(serviceURIs.contains(serviceURI)); - assertTrue(serviceURIs.contains(serviceURI2)); - - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#loadPKCS12Keystore(java.io.File, java.lang.String)}. - * @throws CMException - * @throws KeyStoreException - * @throws NoSuchAlgorithmException - * @throws UnrecoverableKeyException - */ - @Test - public void testLoadPKCS12Keystore() throws CMException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException { - KeyStore pkcs12Keystore = credentialManager.loadPKCS12Keystore(new File(privateKeyFileURL.getPath()), privateKeyAndPKCS12KeystorePassword); - - Key privateKey2 = null; - Certificate[] privateKeyCertChain2 = null; - - Enumeration<String> aliases = pkcs12Keystore.aliases(); - while (aliases.hasMoreElements()) { - // The test-private-key-cert.p12 file contains only one private key - // and corresponding certificate entry - String alias = aliases.nextElement(); - if (pkcs12Keystore.isKeyEntry(alias)) { // is it a (private) key entry? - privateKey2 = pkcs12Keystore.getKey(alias, - privateKeyAndPKCS12KeystorePassword.toCharArray()); - privateKeyCertChain2 = pkcs12Keystore.getCertificateChain(alias); - break; - } - } - assertNotNull(privateKey2); - assertNotNull(privateKeyCertChain2); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#addObserver(net.sf.taverna.t2.lang.observer.Observer)}. - */ - @Test - public void testAddObserver() { - - credentialManager.addObserver(keystoreChangedObserver); - assertEquals(keystoreChangedObserver, credentialManager.getObservers().get(0)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getObservers()}. - */ - @Test - public void testGetObservers() { - // Initially there are no observers - assertTrue(credentialManager.getObservers().isEmpty()); - - credentialManager.addObserver(keystoreChangedObserver); - - assertEquals(keystoreChangedObserver, credentialManager.getObservers().get(0)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#removeObserver(net.sf.taverna.t2.lang.observer.Observer)}. - */ - @Test - public void testRemoveObserver() { - credentialManager.addObserver(keystoreChangedObserver); - assertTrue(credentialManager.getObservers().size() == 1); - credentialManager.removeObserver(keystoreChangedObserver); - assertTrue(credentialManager.getObservers().size() == 0); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#confirmMasterPassword(java.lang.String)}. - * @throws CMException - */ - @Test - public void testConfirmMasterPassword() throws CMException { - credentialManager.confirmMasterPassword("uber"); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#changeMasterPassword(java.lang.String)}. - * @throws CMException - */ - @Test - public void testChangeMasterPassword() throws CMException { - // Test the changeMasterPassword() method first to see if - // it will initialize Credential Manager properly - credentialManager.changeMasterPassword("blah"); - credentialManager.confirmMasterPassword("blah"); - - // Add new stuff - key pair and password entries - under the new master password - String keyPairAlias = credentialManager.addKeyPair(privateKey, privateKeyCertChain); - credentialManager.addUsernameAndPasswordForService(usernamePassword, serviceURI); - - // Change the master password again and try to retrieve the private key and password - credentialManager.changeMasterPassword("hlab"); - assertArrayEquals(credentialManager.getUsernameAndPasswordForService(serviceURI, false, "").getPassword(), usernamePassword.getPassword()); - assertEquals(privateKey, credentialManager.getKeyPairsPrivateKey(keyPairAlias)); - assertTrue(Arrays.equals(privateKeyCertChain, credentialManager.getKeyPairsCertificateChain(keyPairAlias))); - - // Load the Credential Manager back from the saved file to see of entries will be picked up properly - CredentialManagerImpl credentialManagerNew = null; - try { - credentialManagerNew = new CredentialManagerImpl(); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - try { - credentialManagerNew - .setConfigurationDirectoryPath(credentialManagerDirectory); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - - // Create the dummy master password provider - masterPasswordProvider = new DummyMasterPasswordProvider(); - masterPasswordProvider.setMasterPassword("hlab"); - List<MasterPasswordProvider> masterPasswordProviders = new ArrayList<MasterPasswordProvider>(); - masterPasswordProviders.add(masterPasswordProvider); - credentialManager.setMasterPasswordProviders(masterPasswordProviders); - - // Set an empty list for service username and password providers - credentialManagerNew.setServiceUsernameAndPasswordProviders(new ArrayList<ServiceUsernameAndPasswordProvider>()); - - credentialManager.setJavaTruststorePasswordProviders(new ArrayList<JavaTruststorePasswordProvider>()); - - credentialManager.setTrustConfirmationProviders(new ArrayList<TrustConfirmationProvider>()); - - assertArrayEquals(credentialManager.getUsernameAndPasswordForService(serviceURI, false, "").getPassword(), usernamePassword.getPassword()); - assertEquals(privateKey, credentialManager.getKeyPairsPrivateKey(keyPairAlias)); - assertTrue(Arrays.equals(privateKeyCertChain, credentialManager.getKeyPairsCertificateChain(keyPairAlias))); - - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#initializeSSL()}. - * @throws CMException - */ - @Test - public void testInitializeSSL() throws CMException { - //credentialManager.initializeSSL(); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getTavernaSSLSocketFactory()}. - * @throws CMException - */ - @Test - public void testGetTavernaSSLSocketFactory() throws CMException { - SSLSocketFactory sslSocketFactory = credentialManager.getTavernaSSLSocketFactory(); - assertNotNull(sslSocketFactory); - - // This should also create Taverna's SSLSocketFactory backed by Credential Manager's Keystore and Truststore - // if not already created - credentialManager.initializeSSL(); - assertEquals(sslSocketFactory, credentialManager.getTavernaSSLSocketFactory()); - - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#setMasterPasswordProviders(java.util.List)}. - */ - @Test - public void testSetMasterPasswordProviders() { - - List<MasterPasswordProvider> masterPasswordProviders = new ArrayList<MasterPasswordProvider>(); - masterPasswordProviders.add(masterPasswordProvider); - - credentialManager.setMasterPasswordProviders(masterPasswordProviders); - - assertTrue(credentialManager.getMasterPasswordProviders().contains(masterPasswordProvider)); - - // Set it to null and see what happens - credentialManager.setMasterPasswordProviders(null); - assertNull(credentialManager.getMasterPasswordProviders()); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getMasterPasswordProviders()}. - */ - @Test - public void testGetMasterPasswordProviders() { - - assertFalse(credentialManager.getMasterPasswordProviders().isEmpty()); - assertTrue(credentialManager.getMasterPasswordProviders().contains(masterPasswordProvider)); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#setJavaTruststorePasswordProviders(java.util.List)}. - */ - @Test - public void testSetJavaTruststorePasswordProviders() { - - List<JavaTruststorePasswordProvider> javaTruststorePasswordProviders = new ArrayList<JavaTruststorePasswordProvider>(); - JavaTruststorePasswordProvider javaTruststorePasswordProvider = new DummyJavaTruststorePasswordProvider(); - javaTruststorePasswordProvider.setJavaTruststorePassword("blah"); - javaTruststorePasswordProviders.add(javaTruststorePasswordProvider); - - credentialManager.setJavaTruststorePasswordProviders(javaTruststorePasswordProviders); - - assertTrue(credentialManager.getJavaTruststorePasswordProviders().contains(javaTruststorePasswordProvider)); - - // Set it to null and see what happens - credentialManager.setJavaTruststorePasswordProviders(null); - assertNull(credentialManager.getJavaTruststorePasswordProviders()); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getJavaTruststorePasswordProviders()}. - */ - @Test - public void testGetJavaTruststorePasswordProviders() { - - assertTrue(credentialManager.getJavaTruststorePasswordProviders().isEmpty()); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#setServiceUsernameAndPasswordProviders(java.util.List)}. - * @throws URISyntaxException - */ - @Test - public void testSetServiceUsernameAndPasswordProviders() throws URISyntaxException { - - List<ServiceUsernameAndPasswordProvider> serviceUsernameAndPasswordProviders = new ArrayList<ServiceUsernameAndPasswordProvider>(); - ServiceUsernameAndPasswordProvider serviceUsernameAndPasswordProvider = new DummyServiceUsernameAndPasswordProvider(); - serviceUsernameAndPasswordProvider.setServiceUsernameAndPassword(new URI("http://someservice"), new UsernamePassword("blah", "blah")); - serviceUsernameAndPasswordProviders.add(serviceUsernameAndPasswordProvider); - - credentialManager.setServiceUsernameAndPasswordProviders(serviceUsernameAndPasswordProviders); - - assertTrue(credentialManager.getServiceUsernameAndPasswordProviders().contains(serviceUsernameAndPasswordProvider)); - - // Set it to null and see what happens - credentialManager.setServiceUsernameAndPasswordProviders(null); - assertNull(credentialManager.getServiceUsernameAndPasswordProviders()); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getServiceUsernameAndPasswordProviders()}. - */ - @Test - public void testGetServiceUsernameAndPasswordProviders() { - - assertTrue(credentialManager.getServiceUsernameAndPasswordProviders().isEmpty()); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#setTrustConfirmationProviders(java.util.List)}. - * @throws IOException - */ - @Test - public void testSetTrustConfirmationProviders() throws IOException { - List<TrustConfirmationProvider> trustConfirmationProviders = new ArrayList<TrustConfirmationProvider>(); - TrustConfirmationProvider trustConfirmationProvider = new TrustAlwaysTrustConfirmationProvider(); - trustConfirmationProviders.add(trustConfirmationProvider); - - credentialManager.setTrustConfirmationProviders(trustConfirmationProviders); - - assertTrue(credentialManager.getTrustConfirmationProviders().contains(trustConfirmationProvider)); - - // Set it to null and see what happens - credentialManager.setTrustConfirmationProviders(null); - assertNull(credentialManager.getTrustConfirmationProviders()); - } - - /** - * Test method for {@link net.sf.taverna.t2.security.credentialmanager.impl.CredentialManagerImpl#getTrustConfirmationProviders()}. - */ - @Test - public void testGetTrustConfirmationProviders() { - - assertTrue(credentialManager.getTrustConfirmationProviders().isEmpty()); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyJavaTruststorePasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyJavaTruststorePasswordProvider.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyJavaTruststorePasswordProvider.java deleted file mode 100644 index 6a1b9dc..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyJavaTruststorePasswordProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import net.sf.taverna.t2.security.credentialmanager.JavaTruststorePasswordProvider; - -public class DummyJavaTruststorePasswordProvider implements JavaTruststorePasswordProvider{ - - String javaTruststorePassword; - - @Override - public String getJavaTruststorePassword() { - return javaTruststorePassword; - } - - @Override - public void setJavaTruststorePassword(String password) { - javaTruststorePassword = password; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyMasterPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyMasterPasswordProvider.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyMasterPasswordProvider.java deleted file mode 100644 index ddcd7e6..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyMasterPasswordProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider; - -public class DummyMasterPasswordProvider implements MasterPasswordProvider{ - - private String masterPassword; - private int priority = 0; - - @Override - public String getMasterPassword(boolean firstTime) { - return masterPassword; - } - - @Override - public int getProviderPriority() { - return priority; - } - - @Override - public void setMasterPassword(String password) { - masterPassword = password; - } - -// @Override -// public void setProviderPriority(int priority) { -// this.priority = priority; -// } - -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyServiceUsernameAndPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyServiceUsernameAndPasswordProvider.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyServiceUsernameAndPasswordProvider.java deleted file mode 100644 index f2227fc..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/DummyServiceUsernameAndPasswordProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import java.net.URI; - -import net.sf.taverna.t2.security.credentialmanager.ServiceUsernameAndPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.UsernamePassword; - -public class DummyServiceUsernameAndPasswordProvider implements ServiceUsernameAndPasswordProvider{ - - private UsernamePassword usernamePassword; - private URI serviceURI; - private String requestingMessage; - - @Override - public UsernamePassword getServiceUsernameAndPassword(URI serviceURI, - String requestingMessage) { - this.requestingMessage = requestingMessage; - this.serviceURI = serviceURI; - return usernamePassword; - } - - @Override - public void setServiceUsernameAndPassword(URI serviceURI, - UsernamePassword usernamePassword) { - - //this.serviceURI = serviceURI; - this.usernamePassword = usernamePassword; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorIT.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorIT.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorIT.java deleted file mode 100644 index 18068db..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorIT.java +++ /dev/null @@ -1,535 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.net.Authenticator; -import java.net.PasswordAuthentication; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.sf.taverna.t2.security.credentialmanager.CMException; -import net.sf.taverna.t2.security.credentialmanager.CredentialManager; -import net.sf.taverna.t2.security.credentialmanager.JavaTruststorePasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.ServiceUsernameAndPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.TrustConfirmationProvider; -import net.sf.taverna.t2.security.credentialmanager.UsernamePassword; - -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.mortbay.jetty.Connector; -import org.mortbay.jetty.Handler; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.handler.DefaultHandler; -import org.mortbay.jetty.handler.HandlerCollection; -import org.mortbay.jetty.nio.SelectChannelConnector; -import org.mortbay.jetty.security.Constraint; -import org.mortbay.jetty.security.ConstraintMapping; -import org.mortbay.jetty.security.HashUserRealm; -import org.mortbay.jetty.security.SecurityHandler; -import org.mortbay.jetty.webapp.WebAppContext; - -/** - * - * Based on net.sf.tavenra.security.credentialmanager.FixedPasswordProvider from the - * Taverna 2 codebase. - * - * @author Stian Soiland-Reyes - * @author Alex Nenadic - * - */ -public class HTTPAuthenticatorIT { - - protected static final String WRONG_PASSWORD = "wrongOne"; - protected final static String PASSWORD = "basicPassword"; - protected static final String PASSWORD2 = "password2"; - protected static final String PASSWORD3 = "password3"; - protected static final String PASSWORD4 = "password4"; - protected static final String REALM = "realm1"; - protected static final String REALM2 = "realm2"; - protected final static String USERNAME = "basicUser"; - - protected static final int PORT = 9638; - - private final class CountingAuthenticator extends - CredentialManagerAuthenticator { - - public CountingAuthenticator(CredentialManager credManager) { - super(credManager); - } - - private int calls; - - @Override - protected PasswordAuthentication getPasswordAuthentication() { - calls++; - return super.getPasswordAuthentication(); - } - } - - public class NullAuthenticator extends Authenticator { - } - - protected static final String ROLE_NAME = "user"; - protected static final String HTML = "/html/"; - protected static Server server; - protected static HashUserRealm userRealm; - private static SecurityHandler sh; - - private static CredentialManagerImpl credentialManager; - private static File credentialManagerDirectory; - private static DummyMasterPasswordProvider masterPasswordProvider; - private static HTTPAuthenticatorServiceUsernameAndPasswordProvider httpAuthProvider; - - @BeforeClass - public static void startCredentialManager() throws CMException, IOException { - - try { - credentialManager = new CredentialManagerImpl(); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - Random randomGenerator = new Random(); - String credentialManagerDirectoryPath = System - .getProperty("java.io.tmpdir") - + System.getProperty("file.separator") - + "taverna-security-" - + randomGenerator.nextInt(1000000); - System.out.println("Credential Manager's directory path: " - + credentialManagerDirectoryPath); - credentialManagerDirectory = new File(credentialManagerDirectoryPath); - try { - credentialManager - .setConfigurationDirectoryPath(credentialManagerDirectory); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - - // Create the dummy master password provider - masterPasswordProvider = new DummyMasterPasswordProvider(); - /* Short password to avoid issues with key sizes and Java strong crypto policy*/ - masterPasswordProvider.setMasterPassword("uber"); - List<MasterPasswordProvider> masterPasswordProviders = new ArrayList<MasterPasswordProvider>(); - masterPasswordProviders.add(masterPasswordProvider); - credentialManager.setMasterPasswordProviders(masterPasswordProviders); - - // Put our HTTP authenticator in the list of service username and password providers - httpAuthProvider = new HTTPAuthenticatorServiceUsernameAndPasswordProvider(); - ArrayList<ServiceUsernameAndPasswordProvider> serviceUsernameAndPasswordProviders = new ArrayList<ServiceUsernameAndPasswordProvider>(); - serviceUsernameAndPasswordProviders.add(httpAuthProvider); - credentialManager.setServiceUsernameAndPasswordProviders(serviceUsernameAndPasswordProviders); - - // These can be empty - credentialManager.setJavaTruststorePasswordProviders(new ArrayList<JavaTruststorePasswordProvider>()); - credentialManager.setTrustConfirmationProviders(new ArrayList<TrustConfirmationProvider>()); - } - - @AfterClass - // Clean up the credentialManagerDirectory we created for testing - public static void cleanUp(){ - - if (credentialManagerDirectory.exists()){ - try { - FileUtils.deleteDirectory(credentialManagerDirectory); - System.out.println("Deleting Credential Manager's directory: " - + credentialManagerDirectory.getAbsolutePath()); - } catch (IOException e) { - System.out.println(e.getStackTrace()); - } - } - } - - @BeforeClass - public static void jettyServer() throws Exception { - - server = new Server(); - - Connector connector = new SelectChannelConnector(); - connector.setPort(PORT); - server.setConnectors(new Connector[] { connector }); - ConstraintMapping cm = new ConstraintMapping(); - Constraint constraint = new Constraint(); - constraint.setName(Constraint.__BASIC_AUTH); - constraint.setRoles(new String[] { ROLE_NAME }); - constraint.setAuthenticate(true); - cm.setConstraint(constraint); - cm.setPathSpec("/*"); - - sh = new SecurityHandler(); - userRealm = new HashUserRealm(REALM); - userRealm.put(USERNAME, PASSWORD); - userRealm.addUserToRole(USERNAME, ROLE_NAME); - sh.setUserRealm(userRealm); - sh.setConstraintMappings(new ConstraintMapping[] { cm }); - - WebAppContext webappcontext = new WebAppContext(); - webappcontext.setContextPath("/"); - - URL htmlRoot = HTTPAuthenticatorIT.class.getResource(HTML); - assertNotNull("Could not find " + HTML, htmlRoot); - webappcontext.setWar(htmlRoot.toExternalForm()); - - webappcontext.addHandler(sh); - - HandlerCollection handlers = new HandlerCollection(); - handlers.setHandlers(new Handler[] { webappcontext, - new DefaultHandler() }); - - server.setHandler(handlers); - server.start(); - } - - - @AfterClass - public static void shutdownJetty() throws Exception { - server.stop(); - } - - @Before - @After - public void resetAuthenticator() throws CMException { - Authenticator.setDefault(new NullAuthenticator()); - HTTPAuthenticatorServiceUsernameAndPasswordProvider.resetCalls(); - } - - @Before - public void resetAuthCache() throws CMException { - credentialManager.resetAuthCache(); - } - - @Before - public void resetUserRealmPassword() { - userRealm.put(USERNAME, PASSWORD); - userRealm.setName(REALM); - } - - @Test() - public void failsWithoutAuthenticator() throws Exception { - URL url = new URL("http://localhost:" + PORT + "/test.html"); - URLConnection c = url.openConnection(); - assertEquals("HTTP/1.1 401 Unauthorized", c.getHeaderField(0)); - } - - @Test() - public void withAuthenticator() throws Exception { - assertEquals("Unexpected calls to password provider", 0, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - // Set the authenticator to our Credential Manager-backed one that also - // counts calls to itself - CountingAuthenticator authenticator = new CountingAuthenticator(credentialManager); - assertEquals("Unexpected calls to authenticator", 0, - authenticator.calls); - Authenticator.setDefault(authenticator); -// FixedPasswordProvider.setUsernamePassword(new UsernamePassword( -// USERNAME, PASSWORD)); - - URL url = new URL("http://localhost:" + PORT + "/test.html"); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), new UsernamePassword( - USERNAME, PASSWORD)); - URLConnection c = url.openConnection(); - - c.connect(); - try { - c.getContent(); - } catch (Exception ex) { - } - System.out.println(c.getHeaderField(0)); - assertEquals("Did not invoke authenticator", 1, authenticator.calls); - assertEquals("Did not invoke our password provider", 1, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - assertEquals("HTTP/1.1 200 OK", c.getHeaderField(0)); - - - assertEquals("Unexpected prompt/realm", REALM, httpAuthProvider.getRequestMessage()); - assertEquals("Unexpected URI", url.toURI().toASCIIString() + "#" + REALM, HTTPAuthenticatorServiceUsernameAndPasswordProvider - .getServiceURI().toASCIIString()); - - // And test Java's cache: - URLConnection c2 = url.openConnection(); - c2.connect(); - assertEquals("HTTP/1.1 200 OK", c2.getHeaderField(0)); - assertEquals("JVM invoked our authenticator again instead of caching", 1, - authenticator.calls); - assertEquals("Invoked our password provider again instead of caching", - 1, HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - } - - @Test() - public void withAuthenticatorResetJava() throws Exception { - assertTrue("Could not reset JVMs authCache, ignore on non-Sun JVM", - credentialManager.resetAuthCache()); - - assertEquals("Unexpected calls to password provider", 0, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - CountingAuthenticator authenticator = new CountingAuthenticator(credentialManager); - assertEquals("Unexpected calls to authenticator", 0, - authenticator.calls); - Authenticator.setDefault(authenticator); -// FixedPasswordProvider.setUsernamePassword(new UsernamePassword( -// USERNAME, PASSWORD)); - - URL url = new URL("http://localhost:" + PORT + "/test.html"); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), new UsernamePassword( - USERNAME, PASSWORD)); - URLConnection c = url.openConnection(); - - c.connect(); - try { - c.getContent(); - } catch (Exception ex) { - } - - assertEquals("HTTP/1.1 200 OK", c.getHeaderField(0)); - - assertEquals("Did not invoke authenticator", 1, authenticator.calls); - assertEquals("Did not invoke our password provider", 1, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - assertEquals("Unexpected prompt/realm", REALM, httpAuthProvider.getRequestMessage()); - assertEquals("Unexpected URI", url.toURI().toASCIIString() + "#" + REALM, HTTPAuthenticatorServiceUsernameAndPasswordProvider - .getServiceURI().toASCIIString()); - - - - // And without Java's cache: - assertTrue("Could not reset VMs authCache, ignore on non-Sun VM", - credentialManager.resetAuthCache()); - - URLConnection c2 = url.openConnection(); - c2.connect(); - assertEquals("HTTP/1.1 200 OK", c2.getHeaderField(0)); - assertEquals("Did not invoke our authenticator again", 2, - authenticator.calls); - assertEquals("Did not invoke our password provider again", - 2, HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - } - - - @Test() - public void differentRealm() throws Exception { - - assertEquals("Unexpected calls to password provider", 0, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - CountingAuthenticator authenticator = new CountingAuthenticator(credentialManager); - assertEquals("Unexpected calls to authenticator", 0, - authenticator.calls); - Authenticator.setDefault(authenticator); - // Different password in case resetAuthCache() did not run - UsernamePassword userPassword = new UsernamePassword( - USERNAME, PASSWORD4); - userRealm.put(USERNAME, PASSWORD4); -// userPassword.setShouldSave(true); - //FixedPasswordProvider.setUsernamePassword(userPassword); - - URL url = new URL("http://localhost:" + PORT + "/test.html"); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), userPassword); - URLConnection c = url.openConnection(); - - c.connect(); - try { - c.getContent(); - } catch (Exception ex) { - } - - assertEquals("Unexpected prompt/realm", REALM, httpAuthProvider.getRequestMessage()); - assertEquals("Unexpected URI", url.toURI().toASCIIString() + "#" + REALM, HTTPAuthenticatorServiceUsernameAndPasswordProvider - .getServiceURI().toASCIIString()); - - assertEquals("HTTP/1.1 200 OK", c.getHeaderField(0)); - - assertEquals("Did not invoke authenticator", 1, authenticator.calls); - assertEquals("Did not invoke our password provider", 1, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - - // different realm should be treated as a second connection, and not even use saved credentials - - credentialManager.resetAuthCache(); - userRealm.setName(REALM2); - - URLConnection c2 = url.openConnection(); - c2.connect(); - try { - c.getContent(); - } catch (Exception ex) { - } - - assertEquals("HTTP/1.1 200 OK", c2.getHeaderField(0)); - - assertEquals("Did not invoke authenticator again", 2, - authenticator.calls); - assertEquals("Did not invoke provider again", - 2, HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - assertEquals("Unexpected prompt/realm", REALM2, httpAuthProvider - .getRequestMessage()); - assertEquals("Unexpected URI", url.toURI().toASCIIString() + "#" + REALM2, HTTPAuthenticatorServiceUsernameAndPasswordProvider - .getServiceURI().toASCIIString()); - } - - - @Test() - public void wrongPasswordDontSave() throws Exception { - assertEquals("Unexpected calls to password provider", 0, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - CountingAuthenticator authenticator = new CountingAuthenticator(credentialManager); - assertEquals("Unexpected calls to authenticator", 0, - authenticator.calls); - Authenticator.setDefault(authenticator); - - // Make the server expect different password so our cache is no longer - // valid - userRealm.put(USERNAME, PASSWORD2); - // But we'll try with the old one, which we'll this time ask to save in - // DB - UsernamePassword usernamePassword = new UsernamePassword(USERNAME, - PASSWORD); - assertFalse("Should not be set to save by default", usernamePassword - .isShouldSave()); - //FixedPasswordProvider.setUsernamePassword(usernamePassword); - - URL url = new URL("http://localhost:" + PORT + "/test.html"); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), usernamePassword); - URLConnection c = url.openConnection(); - try { - c.getContent(); - } catch (Exception ex) { - } - - assertEquals("Unexpected prompt/realm", REALM, httpAuthProvider - .getRequestMessage()); - assertEquals("Unexpected URI", url.toURI().toASCIIString() + "#" + REALM, HTTPAuthenticatorServiceUsernameAndPasswordProvider - .getServiceURI().toASCIIString()); - - assertEquals("HTTP/1.1 401 Unauthorized", c.getHeaderField(0)); - - assertTrue("Did not invoke authenticator enough times", - authenticator.calls > 1); - assertEquals("Should have asked provider as much as authenticator", - authenticator.calls, HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - - // Update provider to now provide the right one -// HTTPAuthenticatorServiceUsernameAndPasswordProvider.setUsernamePassword(new UsernamePassword( -// USERNAME, PASSWORD2)); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), new UsernamePassword( - USERNAME, PASSWORD2)); - HTTPAuthenticatorServiceUsernameAndPasswordProvider.resetCalls(); - authenticator.calls = 0; - - URLConnection c2 = url.openConnection(); - try { - c2.getContent(); - } catch (Exception ex) { - } - assertEquals("Did not call authenticator again with cache pw invalid", - 1, authenticator.calls); - assertEquals( - "id not called our password provider once", - 1, HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - assertEquals("HTTP/1.1 200 OK", c2.getHeaderField(0)); - } - - @Test() - public void saveToDatabase() throws Exception { - assertEquals("Unexpected calls to password provider", 0, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - CountingAuthenticator authenticator = new CountingAuthenticator(credentialManager); - assertEquals("Unexpected calls to authenticator", 0, - authenticator.calls); - Authenticator.setDefault(authenticator); - - // Make the server expect different password so our cache is no longer - // valid (In case CredManager.resetAuthCache() did not succeed on non-Sun VMs) - userRealm.put(USERNAME, PASSWORD3); - // But we'll try with the old one, which we'll this time ask to save in - // DB - UsernamePassword usernamePassword = new UsernamePassword(USERNAME, - PASSWORD2); - usernamePassword.setShouldSave(true); - //HTTPAuthenticatorServiceUsernameAndPasswordProvider.setUsernamePassword(usernamePassword); - - URL url = new URL("http://localhost:" + PORT + "/test.html"); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), usernamePassword); - URLConnection c = url.openConnection(); - try { - c.getContent(); - } catch (Exception ex) { - } - - assertEquals("Unexpected prompt/realm", REALM, httpAuthProvider - .getRequestMessage()); - assertEquals("Unexpected URI", url.toURI().toASCIIString() + "#" + REALM, HTTPAuthenticatorServiceUsernameAndPasswordProvider - .getServiceURI().toASCIIString()); - - assertEquals("HTTP/1.1 401 Unauthorized", c.getHeaderField(0)); - - assertTrue("Did not invoke authenticator enough times", - authenticator.calls > 1); - assertEquals( - "Asked our provider more than once, not saved in credMan?", 1, - HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - - - - // Expect the old one again - userRealm.put(USERNAME, PASSWORD2); - // We'll now set our provider to give an invalid password, but we should - // not be asked - // as the old one (now correct agian) is stored in DB -// HTTPAuthenticatorServiceUsernameAndPasswordProvider.setUsernamePassword(new UsernamePassword( -// USERNAME, WRONG_PASSWORD)); - httpAuthProvider.setServiceUsernameAndPassword(url.toURI(), new UsernamePassword( - USERNAME, WRONG_PASSWORD)); - - HTTPAuthenticatorServiceUsernameAndPasswordProvider.resetCalls(); - authenticator.calls = 0; - - URLConnection c2 = url.openConnection(); - try { - c2.getContent(); - } catch (Exception ex) { - } - assertEquals("Did not call authenticator again with cache pw invalid", - 1, authenticator.calls); - assertEquals( - "Called our password provider instead of using credMan saved one", - 0, HTTPAuthenticatorServiceUsernameAndPasswordProvider.getCalls()); - assertEquals("HTTP/1.1 200 OK", c2.getHeaderField(0)); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorServiceUsernameAndPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorServiceUsernameAndPasswordProvider.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorServiceUsernameAndPasswordProvider.java deleted file mode 100644 index 5d3d6f2..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPAuthenticatorServiceUsernameAndPasswordProvider.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import java.net.URI; - -import net.sf.taverna.t2.security.credentialmanager.ServiceUsernameAndPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.UsernamePassword; - -/** - * - * @author Stian Soiland-Reyes - * @author Alex Nenadic - * - */ -public class HTTPAuthenticatorServiceUsernameAndPasswordProvider implements ServiceUsernameAndPasswordProvider { - - private static UsernamePassword usernamePassword; - private static URI serviceURI; - private static String requestMessage; - private static long calls = 0; - - public static long getCalls() { - return calls; - } - - - public static void resetCalls() { - calls = 0; - } - - @Override - public UsernamePassword getServiceUsernameAndPassword(URI serviceURI, - String requestMessage) { - HTTPAuthenticatorServiceUsernameAndPasswordProvider.serviceURI = serviceURI; - HTTPAuthenticatorServiceUsernameAndPasswordProvider.requestMessage = requestMessage; - calls++; - return usernamePassword.clone(); - } - - @Override - public void setServiceUsernameAndPassword(URI serviceURI, - UsernamePassword usernamePassword) { - HTTPAuthenticatorServiceUsernameAndPasswordProvider.serviceURI = serviceURI; - HTTPAuthenticatorServiceUsernameAndPasswordProvider.usernamePassword = usernamePassword; - } - - public static URI getServiceURI() { - return serviceURI; - } - - public String getRequestMessage() { - return requestMessage; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/3ecb1291/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPSConnectionAndTrustConfirmationIT.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPSConnectionAndTrustConfirmationIT.java b/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPSConnectionAndTrustConfirmationIT.java deleted file mode 100644 index a9211b1..0000000 --- a/taverna-credential-manager-impl/src/test/java/net/sf/taverna/t2/security/credentialmanager/impl/HTTPSConnectionAndTrustConfirmationIT.java +++ /dev/null @@ -1,336 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008-2010 The University of Manchester - * - * Modifications to the initial code base are copyright of their - * respective authors, or their employers as appropriate. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - ******************************************************************************/ -package net.sf.taverna.t2.security.credentialmanager.impl; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.SecureRandom; -import java.security.Security; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLHandshakeException; -import javax.net.ssl.TrustManagerFactory; - -import net.sf.taverna.t2.security.credentialmanager.CMException; -import net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider; -import net.sf.taverna.t2.security.credentialmanager.TrustConfirmationProvider; - -import org.apache.commons.io.FileUtils; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -//import org.apache.log4j.Logger; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class HTTPSConnectionAndTrustConfirmationIT { - - - private static CredentialManagerImpl credentialManager; - private static DummyMasterPasswordProvider masterPasswordProvider; - private static File credentialManagerDirectory; - //private static URL trustedCertficateFileURL = HTTPSConnectionAndTrustConfirmationIT.class.getResource("/security/tomcat_heater_certificate.pem"); - - // Log4J Logger - //private static Logger logger = Logger.getLogger(HTTPSConnectionAndTrustConfirmationIT.class); - -// public static void main(String[] args){ -// -// try { -// CredentialManagerOld.initialiseSSL(); -// //CredentialManager.getInstance(); -// //HttpsURLConnection.setDefaultSSLSocketFactory(CredentialManager.createTavernaSSLSocketFactory()); -// URL url = new URL ("https://rpc103.cs.man.ac.uk:8443/wsrf/services/cagrid/SecureHelloWorld?wsdl"); -// HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection(); -// // user should be asked automatically if they want to trust the connection -// httpsConnection.connect(); -// -// } catch (CMException e) { -// logger.error("", e); -// } catch (MalformedURLException e) { -// logger.error("", e); -// } catch (IOException e) { -// logger.error("", e); -// } -// catch(Exception ex){ // anything we did not expect -// logger.error("", ex); -// } -// -// } - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception { - - // Just in case, add the BouncyCastle provider - // It gets added from the CredentialManagerImpl constructor as well - // but we may need some crypto operations before we invoke the Cred. Manager - Security.addProvider(new BouncyCastleProvider()); - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - - try { - credentialManager = new CredentialManagerImpl(); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - Random randomGenerator = new Random(); - String credentialManagerDirectoryPath = System - .getProperty("java.io.tmpdir") - + System.getProperty("file.separator") - + "taverna-security-" - + randomGenerator.nextInt(1000000); - System.out.println("Credential Manager's directory path: " - + credentialManagerDirectoryPath); - credentialManagerDirectory = new File(credentialManagerDirectoryPath); - try { - credentialManager - .setConfigurationDirectoryPath(credentialManagerDirectory); - } catch (CMException e) { - System.out.println(e.getStackTrace()); - } - - // Create the dummy master password provider - masterPasswordProvider = new DummyMasterPasswordProvider(); - masterPasswordProvider.setMasterPassword("uber"); - List<MasterPasswordProvider> masterPasswordProviders = new ArrayList<MasterPasswordProvider>(); - masterPasswordProviders.add(masterPasswordProvider); - credentialManager.setMasterPasswordProviders(masterPasswordProviders); - - // Set an empty list for trust confirmation providers - credentialManager.setTrustConfirmationProviders(new ArrayList<TrustConfirmationProvider>()); - } - - @After - // Clean up the credentialManagerDirectory we created for testing - public void cleanUp() throws NoSuchAlgorithmException, KeyManagementException, NoSuchProviderException, KeyStoreException, UnrecoverableKeyException, CertificateException, IOException{ -// assertTrue(credentialManagerDirectory.exists()); -// assertFalse(credentialManagerDirectory.listFiles().length == 0); // something was created there - - if (credentialManagerDirectory.exists()){ - try { - FileUtils.deleteDirectory(credentialManagerDirectory); - System.out.println("Deleting Credential Manager's directory: " - + credentialManagerDirectory.getAbsolutePath()); - } catch (IOException e) { - System.out.println(e.getStackTrace()); - } - } - - // Reset the SSLSocketFactory in JVM so we always have a clean start - SSLContext sc = null; - sc = SSLContext.getInstance("SSLv3"); - - // Create a "default" JSSE X509KeyManager. - KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509", - "SunJSSE"); - KeyStore ks = KeyStore.getInstance("JKS"); - ks.load(null, null); - kmf.init(ks, "blah".toCharArray()); - - // Create a "default" JSSE X509TrustManager. - TrustManagerFactory tmf = TrustManagerFactory.getInstance( - "SunX509", "SunJSSE"); - KeyStore ts = KeyStore.getInstance("JKS"); - ts.load(null, null); - tmf.init(ts); - - sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); - SSLContext.setDefault(sc); - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - } - - @Test - public void testTrustConfirmationProvidersTrustAlways() throws IOException, CMException { - // Initially trust provider list is empty, we only verify by what is in - // Credential Manager's Truststore (and it does not contains the certificate for https://heater.cs.man.ac.uk:7443/) - - // Do not forget to initialise Taverna's/Credential Manager's SSLSocketFactory - credentialManager.initializeSSL(); - - URL url = new URL("https://heater.cs.man.ac.uk:7443/"); - HttpsURLConnection conn; - conn = (HttpsURLConnection) url.openConnection(); - try{ - // This should fail - conn.connect(); - fail("Connection to https://heater.cs.man.ac.uk:7443/ should be untrusted at this point."); - } - catch(SSLHandshakeException sslex){ - // expected to fail so all is good - System.out.println(sslex.getStackTrace()); - } - finally{ - conn.disconnect(); - } - - // Add the trust confirmation provider that trusts everyone - List<TrustConfirmationProvider> trustProviders = new ArrayList<TrustConfirmationProvider>(); - trustProviders.add(new TrustAlwaysTrustConfirmationProvider()); - credentialManager.setTrustConfirmationProviders(trustProviders); - - HttpsURLConnection conn2 = (HttpsURLConnection) url.openConnection(); - // This should work now - conn2.connect(); - System.out.println("Status header: "+ conn2.getHeaderField(0)); - - assertEquals("HTTP/1.1 200 OK", conn2.getHeaderField(0)); - conn2.disconnect(); - } - - @Test - public void testTrustConfirmationProvidersTrustNever() throws IOException, CMException { - // Initially trust provider list is empty, we only verify by what is in - // Credential Manager's Truststore (and it does not contains the certificate for https://heater.cs.man.ac.uk:7443/) - - // Do not forget to initialise Taverna's/Credential Manager's SSLSocketFactory - credentialManager.initializeSSL(); - - URL url = new URL("https://heater.cs.man.ac.uk:7443/"); - HttpsURLConnection conn; - conn = (HttpsURLConnection) url.openConnection(); - try{ - // This should fail - conn.connect(); - fail("Connection to https://heater.cs.man.ac.uk:7443/ should be untrusted at this point."); - } - catch(SSLHandshakeException sslex){ - // expected to fail so all is good - } - finally{ - conn.disconnect(); - } - - // Add the trust confirmation provider that trusts no one - List<TrustConfirmationProvider> trustProviders = new ArrayList<TrustConfirmationProvider>(); - credentialManager.setTrustConfirmationProviders(trustProviders); - trustProviders = new ArrayList<TrustConfirmationProvider>(); - trustProviders.add(new TrustNeverTrustConfimationProvider()); - credentialManager.setTrustConfirmationProviders(trustProviders); - - HttpsURLConnection conn2 = (HttpsURLConnection) url.openConnection(); - try{ - // This should still fail as our trust providers are not trusting anyone - // and we have not added heater's certificate to Credential Manager's Truststore - conn2.connect(); - fail("Connection to https://heater.cs.man.ac.uk:7443/ should be untrusted at this point."); - } - catch(SSLHandshakeException sslex){ - // expected to fail so all is good - } - finally{ - conn2.disconnect(); - } - } - - @Test - public void testTrustConfirmationAddDeleteCertificateDirectly() throws CMException, IOException, CertificateException{ - // Initially trust provider list is empty, we only verify by what is in - // Credential Manager's Truststore (and it does not contains the certificate for https://heater.cs.man.ac.uk:7443/) - - // Do not forget to initialise Taverna's/Credential Manager's SSLSocketFactory - credentialManager.initializeSSL(); - - URL url = new URL("https://heater.cs.man.ac.uk:7443/"); - HttpsURLConnection conn; - conn = (HttpsURLConnection) url.openConnection(); - try{ - // This should fail - conn.connect(); - fail("Connection to https://heater.cs.man.ac.uk:7443/ should be untrusted at this point."); - } - catch(SSLHandshakeException sslex){ - // expected to fail so all is good - } - finally{ - conn.disconnect(); - } - - // Add heater's certificate directly to Credential Manager's Truststore - - // Load the test trusted certificate (belonging to heater.cs.man.ac.uk) - X509Certificate trustedCertficate; - URL trustedCertficateFileURL = getClass().getResource("/security/tomcat_heater_certificate.pem"); - System.out.println("testTrustConfirmationAddDeleteCertificateDirectly: trusted certficate file URL " + trustedCertficateFileURL); - File trustedCertFile = new File(trustedCertficateFileURL.getPath()); - FileInputStream inStream = new FileInputStream(trustedCertFile); - //InputStream inStream = getClass().getClassLoader().getResourceAsStream("security/tomcat_heater_certificate.pem"); - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - trustedCertficate = (X509Certificate) certFactory.generateCertificate(inStream); - try{ - inStream.close(); - } - catch (Exception e) { - // Ignore - } - String alias = credentialManager.addTrustedCertificate(trustedCertficate); - - HttpsURLConnection conn2 = (HttpsURLConnection) url.openConnection(); - // This should work now - conn2.connect(); - //System.out.println(conn2.getHeaderField(0)); - - assertEquals("HTTP/1.1 200 OK", conn2.getHeaderField(0)); - conn2.disconnect(); - - // Now remove certificate and see if the "trust" changes - credentialManager.deleteTrustedCertificate(alias); - HttpsURLConnection conn3; - conn3 = (HttpsURLConnection) url.openConnection(); - try{ - // This should fail - conn3.connect(); - fail("Connection to https://heater.cs.man.ac.uk:7443/ should be untrusted at this point."); - } - catch(SSLHandshakeException sslex){ - // expected to fail so all is good - } - finally{ - conn3.disconnect(); - } - } -}
