chg: enforce email address for certificate was pinged within 6 months
[gigi.git] / tests / club / wpia / gigi / pages / account / TestCertificateRequest.java
1 package club.wpia.gigi.pages.account;
2
3 import static org.hamcrest.CoreMatchers.*;
4 import static org.junit.Assert.*;
5
6 import java.io.IOException;
7 import java.security.GeneralSecurityException;
8 import java.security.KeyPair;
9 import java.util.Locale;
10
11 import org.junit.Test;
12
13 import club.wpia.gigi.GigiApiException;
14 import club.wpia.gigi.database.GigiPreparedStatement;
15 import club.wpia.gigi.dbObjects.EmailAddress;
16 import club.wpia.gigi.dbObjects.Group;
17 import club.wpia.gigi.pages.account.certs.CertificateRequest;
18 import club.wpia.gigi.testUtils.ClientTest;
19 import club.wpia.gigi.testUtils.TestEmailReceiver.TestMail;
20 import club.wpia.gigi.util.AuthorizationContext;
21 import club.wpia.gigi.util.TimeConditions;
22
23 public class TestCertificateRequest extends ClientTest {
24
25     KeyPair kp = generateKeypair();
26
27     AuthorizationContext ac;
28
29     public TestCertificateRequest() throws GeneralSecurityException, IOException, GigiApiException {
30         ac = new AuthorizationContext(u, u);
31         makeAgent(u.getId());
32     }
33
34     @Test
35     public void testIssuingOtherName() throws Exception {
36         try {
37             new CertificateRequest(ac, generatePEMCSR(kp, "CN=hansi")).draft();
38             fail();
39         } catch (GigiApiException e) {
40             assertThat(e.getMessage(), containsString("name you entered was invalid"));
41         }
42     }
43
44     @Test
45     public void testIssuingDefault() throws Exception {
46         new CertificateRequest(ac, generatePEMCSR(kp, "CN=" + CertificateRequest.DEFAULT_CN + ",EMAIL=" + email)).draft();
47     }
48
49     @Test
50     public void testIssuingRealName() throws Exception {
51         new CertificateRequest(ac, generatePEMCSR(kp, "CN=a b,EMAIL=" + email)).draft();
52     }
53
54     @Test
55     public void testIssuingModifiedName() throws Exception {
56         try {
57             new CertificateRequest(ac, generatePEMCSR(kp, "CN=a ab")).draft();
58             fail();
59         } catch (GigiApiException e) {
60             assertThat(e.getMessage(), containsString("name you entered was invalid"));
61         }
62
63     }
64
65     // TODO annotate that this depends on default config
66     @Test
67     public void testCodesignModifiedName() throws Exception {
68         try {
69             u.grantGroup(getSupporter(), Group.CODESIGNING);
70             CertificateRequest cr = new CertificateRequest(ac, generatePEMCSR(kp, "CN=a ab"));
71             cr.update("name", "SHA512", "code-a", null, null, "email:" + email);
72             cr.draft();
73             fail();
74         } catch (GigiApiException e) {
75             assertThat(e.getMessage(), containsString("does not match the details"));
76         }
77
78     }
79
80     // TODO annotate that this depends on default config
81     @Test
82     public void testCodesignNoPermModifiedName() throws Exception {
83         try {
84             CertificateRequest cr = new CertificateRequest(ac, generatePEMCSR(kp, "CN=a ab"));
85             cr.update("name", "SHA512", "code-a", null, null, "email:" + email);
86             cr.draft();
87             fail();
88         } catch (GigiApiException e) {
89             assertThat(e.getMessage(), containsString("Certificate Profile is invalid."));
90         }
91
92     }
93
94     @Test
95     public void testPingPeriodOneAddress() throws IOException, GeneralSecurityException, GigiApiException {
96         // get new email address with last ping in past
97         String furtherEmail = createUniqueName() + "@example.org";
98         EmailAddress ea = new EmailAddress(u, furtherEmail, Locale.ENGLISH);
99         TestMail mail = getMailReceiver().receive(furtherEmail);
100         try (GigiPreparedStatement stmt = new GigiPreparedStatement("UPDATE `emailPinglog` SET `status`='success'::`pingState`, `when` = (now() - interval '1 months' * ?::INTEGER) WHERE `email`=? ")) {
101             stmt.setInt(1, TimeConditions.getInstance().getEmailPingMonths());
102             stmt.setString(2, furtherEmail);
103             stmt.executeUpdate();
104         }
105
106         try {
107             CertificateRequest cr = new CertificateRequest(ac, generatePEMCSR(kp, "CN=a ab"));
108             cr.update("name", "SHA512", "mail", null, null, "email:" + furtherEmail);
109             cr.draft();
110             fail();
111         } catch (GigiApiException e) {
112             assertThat(e.getMessage(), containsString("needs an email ping within the past"));
113         }
114
115     }
116
117     @Test
118     public void testPingPeriodTwoAddresses() throws IOException, GeneralSecurityException, GigiApiException {
119         // get new email address with last ping in past
120         String furtherEmail = createUniqueName() + "@example.org";
121         EmailAddress ea = new EmailAddress(u, furtherEmail, Locale.ENGLISH);
122         TestMail mail = getMailReceiver().receive(furtherEmail);
123         try (GigiPreparedStatement stmt = new GigiPreparedStatement("UPDATE `emailPinglog` SET `status`='success'::`pingState`, `when` = (now() - interval '1 months' * ?::INTEGER) WHERE `email`=? ")) {
124             stmt.setInt(1, TimeConditions.getInstance().getEmailPingMonths());
125             stmt.setString(2, furtherEmail);
126             stmt.executeUpdate();
127         }
128
129         try {
130             CertificateRequest cr = new CertificateRequest(ac, generatePEMCSR(kp, "CN=a ab"));
131             cr.update("name", "SHA512", "mail", null, null, "email:" + furtherEmail + ",email:" + email);
132             cr.draft();
133             fail();
134         } catch (GigiApiException e) {
135             assertThat(e.getMessage(), containsString("needs an email ping within the past"));
136         }
137
138     }
139 }