X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=tests%2Forg%2Fcacert%2Fgigi%2FtestUtils%2FManagedTest.java;h=724126ab4eb39180eee8bd4d9486f72f85f0e542;hb=63d97b58fdda853ec712cba3e821a16e8daec401;hp=2159a66322f002e709208907bd151367ee95d922;hpb=bc3ca7a56553d4d2e323618560a8c7f4ceeeec13;p=gigi.git diff --git a/tests/org/cacert/gigi/testUtils/ManagedTest.java b/tests/org/cacert/gigi/testUtils/ManagedTest.java index 2159a663..724126ab 100644 --- a/tests/org/cacert/gigi/testUtils/ManagedTest.java +++ b/tests/org/cacert/gigi/testUtils/ManagedTest.java @@ -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,16 +30,27 @@ 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.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; @@ -60,8 +77,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); @@ -72,19 +90,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")); @@ -127,6 +132,23 @@ public class ManagedTest { } + 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"); @@ -165,7 +187,7 @@ public class ManagedTest { HttpURLConnection csrfConn = (HttpURLConnection) regist.openConnection(); String headerField = csrfConn.getHeaderField("Set-Cookie"); - headerField = headerField.substring(0, headerField.indexOf(';')); + headerField = stripCookie(headerField); String csrf = getCSRF(csrfConn); uc.addRequestProperty("Cookie", headerField); @@ -178,7 +200,9 @@ public class ManagedTest { public String fetchStartErrorMessage(String d) throws IOException { String formFail = "
"; 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; } @@ -262,6 +286,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(); @@ -271,8 +308,66 @@ 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 { @@ -299,4 +394,22 @@ public class ManagedTest { return parts; } + public String executeBasicWebInteraction(String cookie, String path, String query) throws IOException, + MalformedURLException, UnsupportedEncodingException { + URLConnection uc = new URL("https://" + getServerName() + path).openConnection(); + uc.addRequestProperty("Cookie", cookie); + String csrf = getCSRF(uc); + + 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; + } + }