import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
import java.security.KeyManagementException;
+import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.sql.SQLException;
import java.util.Locale;
+import java.util.Map.Entry;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import club.wpia.gigi.GigiApiException;
import club.wpia.gigi.database.GigiPreparedStatement;
import club.wpia.gigi.database.GigiResultSet;
+import club.wpia.gigi.dbObjects.Certificate;
+import club.wpia.gigi.dbObjects.Certificate.CSRType;
+import club.wpia.gigi.dbObjects.Digest;
import club.wpia.gigi.dbObjects.EmailAddress;
import club.wpia.gigi.dbObjects.Group;
import club.wpia.gigi.dbObjects.Job;
private static String acceptLanguage = null;
+ protected static Certificate loginCertificate;
+
+ protected static PrivateKey loginPrivateKey;
+
public static void setAcceptLanguage(String acceptLanguage) {
ManagedTest.acceptLanguage = acceptLanguage;
}
private static boolean inited = false;
public static Properties initEnvironment() {
+ return initEnvironment(new Properties());
+ }
+
+ public static Properties initEnvironment(Properties additionalConfig) {
try {
Properties mainProps = ConfiguredTest.initEnvironment();
+ for (Entry<Object, Object> i : additionalConfig.entrySet()) {
+ if (i.getKey() instanceof String && i.getValue() instanceof String) {
+ mainProps.setProperty((String) i.getKey(), (String) i.getValue());
+ }
+ }
if (inited) {
return mainProps;
}
inited = true;
+ url = testProps.getProperty("name.www") + ":" + testProps.getProperty("serverPort.https");
purgeDatabase();
String type = testProps.getProperty("type");
generateMainProps(mainProps);
if (type.equals("local")) {
- url = testProps.getProperty("name.www") + ":" + testProps.getProperty("serverPort.https");
String[] parts = testProps.getProperty("mail").split(":", 2);
ter = new TestEmailReceiver(new InetSocketAddress(parts[0], Integer.parseInt(parts[1])));
ter.start();
}
return mainProps;
}
- url = testProps.getProperty("name.www") + ":" + testProps.getProperty("serverPort.https");
gigi = Runtime.getRuntime().exec(testProps.getProperty("java"));
DataOutputStream toGigi = new DataOutputStream(gigi.getOutputStream());
System.out.println("... starting server");
public static void purgeDatabase() throws SQLException, IOException {
purgeOnlyDB();
- clearCaches();
+ if (gigi != null) {
+ clearCaches();
+ }
}
public static void clearCaches() throws IOException {
ObjectCache.clearAllCaches();
// String type = testProps.getProperty("type");
URL u = new URL("https://" + getServerName() + "/manage");
- u.openConnection().getHeaderField("Location");
+ URLConnection connection = u.openConnection();
+ connection.getHeaderField("Location");
+ connection.getInputStream().close();
}
private static void generateMainProps(Properties mainProps) {
String type = testProps.getProperty("type");
ter.destroy();
if (type.equals("local")) {
+ if (testProps.getProperty("withSigner", "false").equals("true")) {
+ try {
+ SimpleSigner.stopSigner();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ inited = false;
return;
}
gigi.destroy();
} catch (InterruptedException e) {
e.printStackTrace();
}
+ inited = false;
}
public final String uniq = createUniqueName();
public static void registerUser(String firstName, String lastName, String email, String password) {
try {
- String query = "name-type=western&fname=" + URLEncoder.encode(firstName, "UTF-8") + "&lname=" + URLEncoder.encode(lastName, "UTF-8") + "&email=" + URLEncoder.encode(email, "UTF-8") + "&pword1=" + URLEncoder.encode(password, "UTF-8") + "&pword2=" + URLEncoder.encode(password, "UTF-8") + "&day=1&month=1&year=1910&tos_agree=1";
+ String query = "name-type=western&fname=" + URLEncoder.encode(firstName, "UTF-8") + "&lname=" + URLEncoder.encode(lastName, "UTF-8") + "&email=" + URLEncoder.encode(email, "UTF-8") + "&pword1=" + URLEncoder.encode(password, "UTF-8") + "&pword2=" + URLEncoder.encode(password, "UTF-8") + "&day=1&month=1&year=1910&tos_agree=1&dp_agree=1";
String data = fetchStartErrorMessage(runRegister(query));
assertNull(data);
} catch (UnsupportedEncodingException e) {
public static int createVerifiedUser(String firstName, String lastName, String email, String password) {
registerUser(firstName, lastName, email, password);
try {
- ter.receive().verify();
+ ter.receive(email).verify();
try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT `id` FROM `users` WHERE `email`=?")) {
ps.setString(1, email);
}
public static HttpURLConnection post(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 server = getServerName();
+ if (loginCertificate != null) {
+ server = getSecureServerName();
+ }
+ URLConnection uc = new URL("https://" + server + path).openConnection();
+ authenticate((HttpURLConnection) uc, cookie);
String csrf = getCSRF(uc, formIndex);
- uc = new URL("https://" + getServerName() + path).openConnection();
- uc.addRequestProperty("Cookie", cookie);
+ uc = new URL("https://" + server + path).openConnection();
+ authenticate((HttpURLConnection) uc, cookie);
uc.setDoOutput(true);
OutputStream os = uc.getOutputStream();
os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
}
public static HttpURLConnection get(String cookie, String path) throws IOException {
- URLConnection uc = new URL("https://" + getServerName() + path).openConnection();
- uc.addRequestProperty("Cookie", cookie);
+ String server = getServerName();
+ if (loginCertificate != null) {
+ server = getSecureServerName();
+ }
+ URLConnection uc = new URL("https://" + server + path).openConnection();
+ authenticate((HttpURLConnection) uc, cookie);
return (HttpURLConnection) uc;
}
public EmailAddress createVerifiedEmail(User u, String email) throws InterruptedException, GigiApiException {
EmailAddress addr = new EmailAddress(u, email, Locale.ENGLISH);
- TestMail testMail = getMailReceiver().receive();
- assertEquals(addr.getAddress(), testMail.getTo());
+ TestMail testMail = getMailReceiver().receive(addr.getAddress());
String hash = testMail.extractLink().substring(testMail.extractLink().lastIndexOf('=') + 1);
addr.verify(hash);
- getMailReceiver().clearMails();
+ getMailReceiver().assertEmpty();
return addr;
}
supporter = User.getById(i);
return supporter;
}
+
+ protected static void authenticate(HttpURLConnection uc, String cookie) throws IOException {
+ uc.addRequestProperty("Cookie", cookie);
+ if (loginCertificate != null) {
+ try {
+ authenticateClientCert(loginPrivateKey, loginCertificate.cert(), uc);
+ } catch (GeneralSecurityException | GigiApiException e) {
+ throw new IOException(e);
+ }
+ }
+ }
+
+ protected String cookieWithCertificateLogin(User u) throws IOException, GigiApiException {
+
+ try {
+ KeyPair kp;
+ kp = generateKeypair();
+
+ String csr;
+ csr = generatePEMCSR(kp, "CN=" + u.getPreferredName().toString());
+
+ Certificate c = new Certificate(u, u, Certificate.buildDN("CN", u.getPreferredName().toString()), Digest.SHA256, csr, CSRType.CSR, getClientProfile());
+ final PrivateKey pk = kp.getPrivate();
+ await(c.issue(null, "2y", u));
+ final X509Certificate ce = c.cert();
+ c.setLoginEnabled(true);
+ loginCertificate = c;
+ loginPrivateKey = pk;
+ return login(pk, ce);
+ } catch (InterruptedException e) {
+ throw new GigiApiException(e.toString());
+ } catch (GeneralSecurityException e) {
+ throw new GigiApiException(e.toString());
+ }
+
+ }
}