1 package org.cacert.gigi.testUtils;
3 import static org.junit.Assert.*;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.io.IOException;
9 import java.io.ObjectInputStream;
10 import java.io.ObjectOutputStream;
11 import java.security.GeneralSecurityException;
12 import java.security.KeyPair;
13 import java.security.KeyPairGenerator;
14 import java.security.Signature;
15 import java.sql.SQLException;
16 import java.util.Properties;
17 import java.util.TimeZone;
18 import java.util.regex.Matcher;
19 import java.util.regex.Pattern;
21 import org.cacert.gigi.GigiApiException;
22 import org.cacert.gigi.database.DatabaseConnection;
23 import org.cacert.gigi.database.DatabaseConnection.Link;
24 import org.cacert.gigi.database.GigiPreparedStatement;
25 import org.cacert.gigi.database.SQLFileManager.ImportType;
26 import org.cacert.gigi.dbObjects.CATS.CATSType;
27 import org.cacert.gigi.dbObjects.Domain;
28 import org.cacert.gigi.dbObjects.DomainPingType;
29 import org.cacert.gigi.testUtils.TestEmailReceiver.TestMail;
30 import org.cacert.gigi.util.DatabaseManager;
31 import org.cacert.gigi.util.DomainAssessment;
32 import org.cacert.gigi.util.PEM;
33 import org.cacert.gigi.util.ServerConstants;
34 import org.junit.BeforeClass;
36 import sun.security.pkcs10.PKCS10;
37 import sun.security.pkcs10.PKCS10Attributes;
38 import sun.security.x509.X500Name;
41 * Base class for a Testsuite that makes use of the config variables that define
44 public abstract class ConfiguredTest {
46 static Properties testProps = new Properties();
48 public static Properties getTestProps() {
52 private static boolean envInited = false;
55 * Some password that fulfills the password criteria.
57 public static final String TEST_PASSWORD = "xvXV12°§";
59 public static final String DIFFICULT_CHARS = "ÜÖÄß𐀀";
62 public static void initEnvironmentHook() throws IOException {
66 public static Properties initEnvironment() throws IOException {
67 TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
69 return generateProps();
72 try (FileInputStream inStream = new FileInputStream("config/test.properties")) {
73 testProps.load(inStream);
75 Properties props = generateProps();
76 ServerConstants.init(props);
77 DomainAssessment.init(props);
79 if ( !DatabaseConnection.isInited()) {
80 DatabaseConnection.init(testProps);
82 l = DatabaseConnection.newLink(false);
83 } catch (InterruptedException e) {
91 private static Properties generateProps() throws Error {
92 Properties mainProps = new Properties();
93 mainProps.setProperty("name.secure", testProps.getProperty("name.secure"));
94 mainProps.setProperty("name.www", testProps.getProperty("name.www"));
95 mainProps.setProperty("name.static", testProps.getProperty("name.static"));
96 mainProps.setProperty("name.api", testProps.getProperty("name.api"));
98 mainProps.setProperty("https.port", testProps.getProperty("serverPort.https"));
99 mainProps.setProperty("http.port", testProps.getProperty("serverPort.http"));
101 File out = new File("financial.dat");
102 if ( !out.exists()) {
103 try (FileOutputStream fos = new FileOutputStream(out)) {
104 fos.write("google.com\ntwitter.com\n".getBytes("UTF-8"));
105 } catch (IOException e) {
109 mainProps.setProperty("highFinancialValue", out.getAbsolutePath());
113 public static KeyPair generateKeypair() throws GeneralSecurityException {
114 KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
115 kpg.initialize(4096);
116 KeyPair keyPair = null;
117 File f = new File("testKeypair");
119 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f))) {
120 keyPair = (KeyPair) ois.readObject();
121 } catch (ClassNotFoundException e) {
123 } catch (IOException e) {
127 keyPair = kpg.generateKeyPair();
128 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f))) {
129 oos.writeObject(keyPair);
131 } catch (IOException e) {
138 public static String generatePEMCSR(KeyPair kp, String dn) throws GeneralSecurityException, IOException {
139 return generatePEMCSR(kp, dn, new PKCS10Attributes());
142 public static String generatePEMCSR(KeyPair kp, String dn, PKCS10Attributes atts) throws GeneralSecurityException, IOException {
143 return generatePEMCSR(kp, dn, atts, "SHA256WithRSA");
146 public static String generatePEMCSR(KeyPair kp, String dn, PKCS10Attributes atts, String signature) throws GeneralSecurityException, IOException {
147 PKCS10 p10 = new PKCS10(kp.getPublic(), atts);
148 Signature s = Signature.getInstance(signature);
149 s.initSign(kp.getPrivate());
150 p10.encodeAndSign(new X500Name(dn), s);
151 return PEM.encode("CERTIFICATE REQUEST", p10.getEncoded());
154 static int count = 0;
156 private static Link l;
158 public static String createUniqueName() {
159 return "test" + System.currentTimeMillis() + "a" + (count++) + "u";
162 public static int countRegex(String text, String pattern) {
163 Pattern p = Pattern.compile(pattern);
164 Matcher m = p.matcher(text);
172 public static void makeAssurer(int uid) {
173 try (GigiPreparedStatement ps1 = new GigiPreparedStatement("INSERT INTO cats_passed SET user_id=?, variant_id=?, language='en_EN', version=1")) {
175 ps1.setInt(2, CATSType.ASSURER_CHALLENGE.getId());
179 try (GigiPreparedStatement ps2 = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, points='100'")) {
186 public MailReceiver getMailReciever() {
187 throw new Error("Feature requires Business or ManagedTest.");
190 public void verify(Domain d) {
192 d.addPing(DomainPingType.EMAIL, "admin");
193 TestMail testMail = getMailReciever().receive();
195 assertTrue(d.isVerified());
196 } catch (GigiApiException e) {
198 } catch (IOException e) {
203 public static void purgeOnlyDB() throws SQLException, IOException {
204 System.out.print("... resetting Database");
205 long ms = System.currentTimeMillis();
207 DatabaseManager.run(new String[] {
208 testProps.getProperty("sql.driver"), testProps.getProperty("sql.url"), testProps.getProperty("sql.user"), testProps.getProperty("sql.password")
209 }, ImportType.TRUNCATE);
210 } catch (ClassNotFoundException e) {
213 System.out.println(" in " + (System.currentTimeMillis() - ms) + " ms");