package org.cacert.gigi.testUtils;
-import static org.junit.Assert.assertEquals;
-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;
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;
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);
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"));
}
+ 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");
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;
}
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();
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
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(new KeyManager[] { km }, null, null);
-
- HttpURLConnection connection = (HttpURLConnection) new URL("https://"
- + getServerName().replaceFirst("^www.", "secure.") + "/login").openConnection();
if (connection instanceof HttpsURLConnection) {
((HttpsURLConnection) connection).setSSLSocketFactory(sc.getSocketFactory());
}
- 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 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='hidden' name='csrf' value='([^']+)'>");
Matcher m = p.matcher(content);
- if (!m.find()) {
- throw new Error("No CSRF Token");
+ for (int i = 0; i < formIndex + 1; i++) {
+ if (!m.find()) {
+ throw new Error("No CSRF Token");
+ }
}
return m.group(1);
}
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;
+ }
+
}