]> WPIA git - gigi.git/blob - tests/club/wpia/gigi/TestCertificate.java
chg: make description work for certificate, save and display description
[gigi.git] / tests / club / wpia / gigi / TestCertificate.java
1 package club.wpia.gigi;
2
3 import static org.junit.Assert.*;
4
5 import java.io.IOException;
6 import java.security.GeneralSecurityException;
7 import java.security.KeyPair;
8 import java.security.PrivateKey;
9 import java.security.cert.X509Certificate;
10 import java.sql.SQLException;
11 import java.util.Collection;
12 import java.util.List;
13
14 import org.hamcrest.CoreMatchers;
15 import org.junit.Test;
16
17 import club.wpia.gigi.dbObjects.Certificate;
18 import club.wpia.gigi.dbObjects.Certificate.CSRType;
19 import club.wpia.gigi.dbObjects.Certificate.CertificateStatus;
20 import club.wpia.gigi.dbObjects.Certificate.RevocationType;
21 import club.wpia.gigi.dbObjects.Certificate.SANType;
22 import club.wpia.gigi.dbObjects.Certificate.SubjectAlternateName;
23 import club.wpia.gigi.dbObjects.Digest;
24 import club.wpia.gigi.dbObjects.User;
25 import club.wpia.gigi.pages.account.certs.Certificates;
26 import club.wpia.gigi.testUtils.IOUtils;
27 import club.wpia.gigi.testUtils.ManagedTest;
28 import club.wpia.gigi.util.RandomToken;
29 import sun.security.x509.GeneralNameInterface;
30
31 public class TestCertificate extends ManagedTest {
32
33     User u = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.com", TEST_PASSWORD));
34
35     @Test
36     public void testClientCertLoginStates() throws IOException, GeneralSecurityException, SQLException, InterruptedException, GigiApiException {
37         KeyPair kp = generateKeypair();
38         String key1 = generatePEMCSR(kp, "CN=testmail@example.com");
39         Certificate c = new Certificate(u, u, Certificate.buildDN("CN", "testmail@example.com"), Digest.SHA256, key1, CSRType.CSR, getClientProfile());
40         final PrivateKey pk = kp.getPrivate();
41         await(c.issue(null, "2y", u));
42         final X509Certificate ce = c.cert();
43         c.setLoginEnabled(true);
44         assertNotNull(login(pk, ce));
45     }
46
47     @Test
48     public void testSANs() throws IOException, GeneralSecurityException, SQLException, InterruptedException, GigiApiException {
49         KeyPair kp = generateKeypair();
50         String key = generatePEMCSR(kp, "CN=testmail@example.com");
51         Certificate c = new Certificate(u, u, Certificate.buildDN("CN", "testmail@example.com"), Digest.SHA256, key, CSRType.CSR, getClientProfile(),//
52                 new SubjectAlternateName(SANType.EMAIL, "testmail@example.com"), new SubjectAlternateName(SANType.DNS, "testmail.example.com"));
53
54         testFails(CertificateStatus.DRAFT, c);
55         await(c.issue(null, "2y", u));
56         X509Certificate cert = c.cert();
57         Collection<List<?>> sans = cert.getSubjectAlternativeNames();
58         assertEquals(2, sans.size());
59         boolean hadDNS = false;
60         boolean hadEmail = false;
61         for (List<?> list : sans) {
62             assertEquals(2, list.size());
63             Integer type = (Integer) list.get(0);
64             switch (type) {
65             case GeneralNameInterface.NAME_RFC822:
66                 hadEmail = true;
67                 assertEquals("testmail@example.com", list.get(1));
68                 break;
69             case GeneralNameInterface.NAME_DNS:
70                 hadDNS = true;
71                 assertEquals("testmail.example.com", list.get(1));
72                 break;
73             default:
74                 fail("Unknown type");
75
76             }
77         }
78         assertTrue(hadDNS);
79         assertTrue(hadEmail);
80
81         testFails(CertificateStatus.ISSUED, c);
82
83         Certificate c2 = Certificate.getBySerial(c.getSerial());
84         assertNotNull(c2);
85         assertEquals(2, c2.getSANs().size());
86         assertEquals(c.getSANs().get(0).getName(), c2.getSANs().get(0).getName());
87         assertEquals(c.getSANs().get(0).getType(), c2.getSANs().get(0).getType());
88         assertEquals(c.getSANs().get(1).getName(), c2.getSANs().get(1).getName());
89         assertEquals(c.getSANs().get(1).getType(), c2.getSANs().get(1).getType());
90
91         try {
92             c2.getSANs().remove(0);
93             fail("the list should not be modifiable");
94         } catch (UnsupportedOperationException e) {
95             // expected
96         }
97     }
98
99     @Test
100     public void testCertCreateSHA384() throws IOException, GeneralSecurityException, SQLException, InterruptedException, GigiApiException {
101         KeyPair kp = generateKeypair();
102         String key = generatePEMCSR(kp, "CN=testmail@example.com");
103         Certificate c = new Certificate(u, u, Certificate.buildDN("CN", "testmail@example.com"), Digest.SHA384, key, CSRType.CSR, getClientProfile());
104         await(c.issue(null, "2y", u));
105         assertThat(c.cert().getSigAlgName().toLowerCase(), CoreMatchers.containsString("sha384"));
106     }
107
108     @Test
109     public void testCertLifeCycle() throws IOException, GeneralSecurityException, SQLException, InterruptedException, GigiApiException {
110         KeyPair kp = generateKeypair();
111         String key = generatePEMCSR(kp, "CN=testmail@example.com");
112         Certificate c = new Certificate(u, u, Certificate.buildDN("CN", "testmail@example.com"), Digest.SHA256, key, CSRType.CSR, getClientProfile());
113         final PrivateKey pk = kp.getPrivate();
114
115         testFails(CertificateStatus.DRAFT, c);
116         await(c.issue(null, "2y", u));
117
118         String cookie = login(u.getEmail(), TEST_PASSWORD);
119         testFails(CertificateStatus.ISSUED, c);
120         X509Certificate cert = c.cert();
121         c.setLoginEnabled(true);
122         assertNotNull(login(pk, cert));
123         assertEquals(1, countRegex(IOUtils.readURL(get(cookie, Certificates.PATH)), "<td>(?:REVOKED|ISSUED)</td>"));
124         assertEquals(1, countRegex(IOUtils.readURL(get(cookie, Certificates.PATH + "?withRevoked")), "<td>(?:REVOKED|ISSUED)</td>"));
125         await(c.revoke(RevocationType.USER));
126
127         testFails(CertificateStatus.REVOKED, c);
128         assertNull(login(pk, cert));
129
130         assertEquals(0, countRegex(IOUtils.readURL(get(cookie, Certificates.PATH)), "<td>(?:REVOKED|ISSUED)</td>"));
131         assertEquals(1, countRegex(IOUtils.readURL(get(cookie, Certificates.PATH + "?withRevoked")), "<td>(?:REVOKED|ISSUED)</td>"));
132     }
133
134     private void testFails(CertificateStatus status, Certificate c) throws IOException, GeneralSecurityException, SQLException, GigiApiException {
135         assertEquals(status, c.getStatus());
136         if (status != CertificateStatus.ISSUED) {
137             try {
138                 c.revoke(RevocationType.USER);
139                 fail(status + " is in invalid state");
140             } catch (IllegalStateException ise) {
141
142             }
143         }
144         if (status != CertificateStatus.DRAFT) {
145             try {
146                 c.issue(null, "2y", u);
147                 fail(status + " is in invalid state");
148             } catch (IllegalStateException ise) {
149
150             }
151         }
152         if (status != CertificateStatus.ISSUED) {
153             try {
154                 c.cert();
155                 if (status != CertificateStatus.REVOKED) {
156                     fail(status + " is in invalid state");
157                 }
158             } catch (IllegalStateException ise) {
159
160             }
161         }
162     }
163
164     @Test
165     public void testClientCertDescription() throws IOException, GeneralSecurityException, SQLException, InterruptedException, GigiApiException {
166         KeyPair kp = generateKeypair();
167         String key1 = generatePEMCSR(kp, "CN=testmail@example.com");
168         Certificate c = new Certificate(u, u, Certificate.buildDN("CN", "testmail@example.com"), Digest.SHA256, key1, CSRType.CSR, getClientProfile());
169         await(c.issue(null, "2y", u));
170         String description = RandomToken.generateToken(95) + DIFFICULT_CHARS;
171         c.setDescription(description);
172         assertEquals(description, c.getDescription());
173
174         // test that description is entered to db
175         int cid = c.getId();
176         clearCaches();
177         Certificate cn = Certificate.getById(cid);
178         assertEquals(description, cn.getDescription());
179
180     }
181 }