]> WPIA git - gigi.git/blobdiff - tests/org/cacert/gigi/testUtils/ManagedTest.java
ADD: cretaeVerifiedEmail fo testcases
[gigi.git] / tests / org / cacert / gigi / testUtils / ManagedTest.java
index 880f600631fa7a77c2b976d23bdfd5ae8039126f..ec773a47f294104444a7e874b1359ce33b25f232 100644 (file)
@@ -1,7 +1,6 @@
 package org.cacert.gigi.testUtils;
 
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 import java.io.BufferedReader;
 import java.io.DataOutputStream;
@@ -12,11 +11,18 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.Socket;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLEncoder;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -24,15 +30,31 @@ import java.util.Properties;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.X509KeyManager;
+
 import org.cacert.gigi.DevelLauncher;
+import org.cacert.gigi.EmailAddress;
+import org.cacert.gigi.GigiApiException;
+import org.cacert.gigi.Language;
+import org.cacert.gigi.User;
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.testUtils.TestEmailReciever.TestMail;
 import org.cacert.gigi.util.DatabaseManager;
+import org.cacert.gigi.util.ServerConstants;
+import org.cacert.gigi.util.SimpleSigner;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
 public class ManagedTest {
+       /**
+        * Some password that fullfills the password criteria.
+        */
+       protected static final String TEST_PASSWORD = "xvXV12°§";
+
        private final String registerService = "/register";
 
        private static TestEmailReciever ter;
@@ -59,8 +81,9 @@ public class ManagedTest {
                        System.out.println("... purging Database");
                        DatabaseManager.run(new String[] { testProps.getProperty("sql.driver"), testProps.getProperty("sql.url"),
                                        testProps.getProperty("sql.user"), testProps.getProperty("sql.password") });
-
                        String type = testProps.getProperty("type");
+                       Properties mainProps = generateMainProps();
+                       ServerConstants.init(mainProps);
                        if (type.equals("local")) {
                                url = testProps.getProperty("name.www") + ":" + testProps.getProperty("serverPort");
                                String[] parts = testProps.getProperty("mail").split(":", 2);
@@ -71,19 +94,6 @@ public class ManagedTest {
                        gigi = Runtime.getRuntime().exec(testProps.getProperty("java"));
                        DataOutputStream toGigi = new DataOutputStream(gigi.getOutputStream());
                        System.out.println("... starting server");
-                       Properties mainProps = new Properties();
-                       mainProps.setProperty("host", "127.0.0.1");
-                       mainProps.setProperty("name.secure", testProps.getProperty("name.secure"));
-                       mainProps.setProperty("name.www", testProps.getProperty("name.www"));
-                       mainProps.setProperty("name.static", testProps.getProperty("name.static"));
-
-                       mainProps.setProperty("port", testProps.getProperty("serverPort"));
-                       mainProps.setProperty("emailProvider", "org.cacert.gigi.email.TestEmailProvider");
-                       mainProps.setProperty("emailProvider.port", "8473");
-                       mainProps.setProperty("sql.driver", testProps.getProperty("sql.driver"));
-                       mainProps.setProperty("sql.url", testProps.getProperty("sql.url"));
-                       mainProps.setProperty("sql.user", testProps.getProperty("sql.user"));
-                       mainProps.setProperty("sql.password", testProps.getProperty("sql.password"));
 
                        byte[] cacerts = Files.readAllBytes(Paths.get("config/cacerts.jks"));
                        byte[] keystore = Files.readAllBytes(Paths.get("config/keystore.pkcs12"));
@@ -113,16 +123,36 @@ public class ManagedTest {
                                throw new Error("Server startup failed");
                        }
                        ter = new TestEmailReciever(new InetSocketAddress("localhost", 8473));
+                       SimpleSigner.runSigner();
                } catch (IOException e) {
                        throw new Error(e);
                } catch (ClassNotFoundException e1) {
                        e1.printStackTrace();
                } catch (SQLException e1) {
                        e1.printStackTrace();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
                }
 
        }
 
+       private static Properties generateMainProps() {
+               Properties mainProps = new Properties();
+               mainProps.setProperty("host", "127.0.0.1");
+               mainProps.setProperty("name.secure", testProps.getProperty("name.secure"));
+               mainProps.setProperty("name.www", testProps.getProperty("name.www"));
+               mainProps.setProperty("name.static", testProps.getProperty("name.static"));
+
+               mainProps.setProperty("port", testProps.getProperty("serverPort"));
+               mainProps.setProperty("emailProvider", "org.cacert.gigi.email.TestEmailProvider");
+               mainProps.setProperty("emailProvider.port", "8473");
+               mainProps.setProperty("sql.driver", testProps.getProperty("sql.driver"));
+               mainProps.setProperty("sql.url", testProps.getProperty("sql.url"));
+               mainProps.setProperty("sql.user", testProps.getProperty("sql.user"));
+               mainProps.setProperty("sql.password", testProps.getProperty("sql.password"));
+               return mainProps;
+       }
+
        @AfterClass
        public static void tearDownServer() {
                String type = testProps.getProperty("type");
@@ -131,6 +161,11 @@ public class ManagedTest {
                        return;
                }
                gigi.destroy();
+               try {
+                       SimpleSigner.stopSigner();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
        }
 
        @After
@@ -151,10 +186,17 @@ public class ManagedTest {
        }
 
        public String runRegister(String param) throws IOException {
-               HttpURLConnection uc = (HttpURLConnection) new URL("https://" + getServerName() + registerService)
-                       .openConnection();
+               URL regist = new URL("https://" + getServerName() + registerService);
+               HttpURLConnection uc = (HttpURLConnection) regist.openConnection();
+               HttpURLConnection csrfConn = (HttpURLConnection) regist.openConnection();
+
+               String headerField = csrfConn.getHeaderField("Set-Cookie");
+               headerField = stripCookie(headerField);
+
+               String csrf = getCSRF(csrfConn);
+               uc.addRequestProperty("Cookie", headerField);
                uc.setDoOutput(true);
-               uc.getOutputStream().write(param.getBytes());
+               uc.getOutputStream().write((param + "&csrf=" + csrf).getBytes());
                String d = IOUtils.readURL(uc);
                return d;
        }
@@ -162,7 +204,9 @@ public class ManagedTest {
        public String fetchStartErrorMessage(String d) throws IOException {
                String formFail = "<div class='formError'>";
                int idx = d.indexOf(formFail);
-               assertNotEquals(-1, idx);
+               if (idx == -1) {
+                       return null;
+               }
                String startError = d.substring(idx + formFail.length(), idx + 100).trim();
                return startError;
        }
@@ -246,6 +290,19 @@ public class ManagedTest {
                return "test" + System.currentTimeMillis() + "a" + (count++);
        }
 
+       private String stripCookie(String headerField) {
+               return headerField.substring(0, headerField.indexOf(';'));
+       }
+
+       public static final String SECURE_REFERENCE = "/account/certs/email";
+
+       public boolean isLoggedin(String cookie) throws IOException {
+               URL u = new URL("https://" + getServerName() + SECURE_REFERENCE);
+               HttpURLConnection huc = (HttpURLConnection) u.openConnection();
+               huc.addRequestProperty("Cookie", cookie);
+               return huc.getResponseCode() == 200;
+       }
+
        public String login(String email, String pw) throws IOException {
                URL u = new URL("https://" + getServerName() + "/login");
                HttpURLConnection huc = (HttpURLConnection) u.openConnection();
@@ -255,17 +312,130 @@ public class ManagedTest {
                os.write(data.getBytes());
                os.flush();
                String headerField = huc.getHeaderField("Set-Cookie");
-               headerField = headerField.substring(0, headerField.indexOf(';'));
-               return headerField;
+               return stripCookie(headerField);
+       }
+
+       public String login(final PrivateKey pk, final X509Certificate ce) throws NoSuchAlgorithmException,
+               KeyManagementException, IOException, MalformedURLException {
+
+               HttpURLConnection connection = (HttpURLConnection) new URL("https://"
+                       + getServerName().replaceFirst("^www.", "secure.") + "/login").openConnection();
+               authenticateClientCert(pk, ce, connection);
+               if (connection.getResponseCode() == 302) {
+                       assertEquals("https://" + getServerName().replaceFirst("^www.", "secure.").replaceFirst(":443$", "") + "/",
+                               connection.getHeaderField("Location").replaceFirst(":443$", ""));
+                       return stripCookie(connection.getHeaderField("Set-Cookie"));
+               } else {
+                       return null;
+               }
+       }
+
+       public void authenticateClientCert(final PrivateKey pk, final X509Certificate ce, HttpURLConnection connection)
+               throws NoSuchAlgorithmException, KeyManagementException {
+               KeyManager km = new X509KeyManager() {
+
+                       @Override
+                       public String chooseClientAlias(String[] arg0, Principal[] arg1, Socket arg2) {
+                               return "client";
+                       }
+
+                       @Override
+                       public String chooseServerAlias(String arg0, Principal[] arg1, Socket arg2) {
+                               return null;
+                       }
+
+                       @Override
+                       public X509Certificate[] getCertificateChain(String arg0) {
+                               return new X509Certificate[] { ce };
+                       }
+
+                       @Override
+                       public String[] getClientAliases(String arg0, Principal[] arg1) {
+                               return new String[] { "client" };
+                       }
+
+                       @Override
+                       public PrivateKey getPrivateKey(String arg0) {
+                               if (arg0.equals("client")) {
+                                       return pk;
+                               }
+                               return null;
+                       }
+
+                       @Override
+                       public String[] getServerAliases(String arg0, Principal[] arg1) {
+                               return new String[] { "client" };
+                       }
+               };
+               SSLContext sc = SSLContext.getInstance("TLS");
+               sc.init(new KeyManager[] { km }, null, null);
+               if (connection instanceof HttpsURLConnection) {
+                       ((HttpsURLConnection) connection).setSSLSocketFactory(sc.getSocketFactory());
+               }
        }
 
        public String getCSRF(URLConnection u) throws IOException {
+               return getCSRF(u, 0);
+       }
+
+       public String getCSRF(URLConnection u, int formIndex) throws IOException {
                String content = IOUtils.readURL(u);
-               Pattern p = Pattern.compile("<input type='csrf' value='([^']+)'>");
+               Pattern p = Pattern.compile("<input type='hidden' name='csrf' value='([^']+)'>");
                Matcher m = p.matcher(content);
-               if (!m.find()) {
-                       throw new Error("New CSRF Token");
+               for (int i = 0; i < formIndex + 1; i++) {
+                       if (!m.find()) {
+                               throw new Error("No CSRF Token");
+                       }
                }
                return m.group(1);
        }
+
+       public static String[] generateCSR(String dn) throws IOException {
+               Process p = Runtime.getRuntime().exec(
+                       new String[] { "openssl", "req", "-newkey", "rsa:1024", "-nodes", "-subj", dn, "-config",
+                                       "keys/selfsign.config" });
+               String csr = IOUtils.readURL(new InputStreamReader(p.getInputStream()));
+
+               String[] parts = csr.split("(?<=-----)\n(?=-----)");
+               if (parts.length != 2) {
+                       System.err.println(IOUtils.readURL(new InputStreamReader(p.getErrorStream())));
+                       throw new Error();
+               }
+               return parts;
+       }
+
+       public String executeBasicWebInteraction(String cookie, String path, String query) throws MalformedURLException,
+               UnsupportedEncodingException, IOException {
+               return executeBasicWebInteraction(cookie, path, query, 0);
+       }
+
+       public String executeBasicWebInteraction(String cookie, String path, String query, int formIndex)
+               throws IOException, MalformedURLException, UnsupportedEncodingException {
+               URLConnection uc = new URL("https://" + getServerName() + path).openConnection();
+               uc.addRequestProperty("Cookie", cookie);
+               String csrf = getCSRF(uc, formIndex);
+
+               uc = new URL("https://" + getServerName() + path).openConnection();
+               uc.addRequestProperty("Cookie", cookie);
+               uc.setDoOutput(true);
+               OutputStream os = uc.getOutputStream();
+               os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
+               + query//
+               ).getBytes());
+               os.flush();
+               String error = fetchStartErrorMessage(IOUtils.readURL(uc));
+               return error;
+       }
+
+       public EmailAddress createVerifiedEmail(User u) throws InterruptedException, GigiApiException {
+               EmailAddress adrr = new EmailAddress(createUniqueName() + "test@test.tld", u);
+               adrr.insert(Language.getInstance("en"));
+               TestMail testMail = getMailReciever().recieve();
+               assertTrue(adrr.getAddress().equals(testMail.getTo()));
+               String hash = testMail.extractLink().substring(testMail.extractLink().lastIndexOf('=') + 1);
+               adrr.verify(hash);
+               getMailReciever().clearMails();
+               return adrr;
+       }
+
 }