diff options
| author | cyBerta <cyberta@riseup.net> | 2024-11-07 17:22:19 +0100 | 
|---|---|---|
| committer | cyberta <cyberta@riseup.net> | 2024-12-11 00:09:34 +0000 | 
| commit | ab4c3397c501e059849d16f05fa211d5ebd3c4db (patch) | |
| tree | 2bcce219b2c0df1d17affb1bba2068f3416d937b /app/src | |
| parent | 44b33d83bdb1f5670eb0eb2adb13695aa8388667 (diff) | |
add CredentialsParser which is responsible to parse the reponse from /api/5/openvpn/cert endpoint
Diffstat (limited to 'app/src')
| -rw-r--r-- | app/src/main/java/se/leap/bitmaskclient/base/utils/CredentialsParser.java | 66 | ||||
| -rw-r--r-- | app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java | 48 | 
2 files changed, 114 insertions, 0 deletions
| diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/CredentialsParser.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/CredentialsParser.java new file mode 100644 index 00000000..e02922fc --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/CredentialsParser.java @@ -0,0 +1,66 @@ +package se.leap.bitmaskclient.base.utils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.IOException; +import java.io.StringReader; + +import se.leap.bitmaskclient.base.models.Provider; + +public class CredentialsParser { + +    public static void parseXml(String xmlString, Provider provider) throws XmlPullParserException, IOException { +            XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); +            XmlPullParser parser = factory.newPullParser(); +            parser.setInput(new StringReader(xmlString)); + +            String currentTag = null; +            String ca = null; +            String key = null; +            String cert = null; + +            int eventType = parser.getEventType(); +            while (eventType != XmlPullParser.END_DOCUMENT) { +                switch (eventType) { +                    case XmlPullParser.START_TAG -> currentTag = parser.getName(); +                    case XmlPullParser.TEXT -> { +                        if (currentTag != null) { +                            switch (currentTag) { +                                case "ca" -> { +                                    ca = parser.getText(); +                                    ca = ca.replaceAll("-----BEGIN CERTIFICATE-----", ""); +                                    ca = ca.replaceAll("-----END CERTIFICATE-----", ""); +                                    ca = ca.trim(); +                                } +                                case "key" -> { +                                    key = parser.getText(); +                                    key = key.replaceAll("-----BEGIN PRIVATE KEY-----", ""); +                                    key = key.replaceAll("-----BEGIN RSA PRIVATE KEY-----", ""); +                                    key = key.replaceAll("-----END PRIVATE KEY-----", ""); +                                    key = key.replaceAll("-----END RSA PRIVATE KEY-----", ""); +                                    key = key.trim(); +                                } +                                case "cert" -> { +                                    cert = parser.getText(); +                                    cert = cert.replaceAll("-----BEGIN CERTIFICATE-----", ""); +                                    cert = cert.replaceAll("-----END CERTIFICATE-----", ""); +                                    cert = cert.trim(); +                                } +                            } +                        } +                    } +                    case XmlPullParser.END_TAG -> currentTag = null; +                } +                eventType = parser.next(); +            } + +            provider.setCaCert(ca); +            provider.setPrivateKeyString(key); +            provider.setVpnCertificate(cert); + +   } +} + + diff --git a/app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java b/app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java new file mode 100644 index 00000000..c8bfd21f --- /dev/null +++ b/app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java @@ -0,0 +1,48 @@ +package se.leap.bitmaskclient.base.utils; + +import static org.junit.Assert.assertEquals; + +import android.os.Build; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +import se.leap.bitmaskclient.base.models.Provider; +import se.leap.bitmaskclient.testutils.TestSetupHelper; + +@RunWith(RobolectricTestRunner.class) +@Config(sdk = {Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P}) +public class CredentialsParserTest { + +    @Test +    public void testCertificateResponse() throws IOException, XmlPullParserException { +        String ed25519_creds = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ed25519_credentials.pem")); +        Provider provider = new Provider("https://demo.bitmask.net"); +        CredentialsParser.parseXml(ed25519_creds, provider); +        assertEquals("MC4CAQAwBQYDK2VwBCIEIF+HZvpSdhnTbYeT635bT2+IU4FbW3EWlHuUnXvhb10m", provider.getPrivateKeyString()); +        assertEquals("MIIBgzCCASigAwIBAgIRALD3Z4SsobpcU7tcC0r9JOQwCgYIKoZIzj0EAwIwNzE1\n" + +                "MDMGA1UEAwwsUHJvdmlkZXIgUm9vdCBDQSAoY2xpZW50IGNlcnRpZmljYXRlcyBv\n" + +                "bmx5ISkwHhcNMjQxMTA1MTU0MjU0WhcNMjQxMTI5MTU0MjU0WjAUMRIwEAYDVQQD\n" + +                "EwlVTkxJTUlURUQwKjAFBgMrZXADIQC5QkZAcpkQ3Rm54gN5iLEU1Zp1w+patXVT\n" + +                "W9GRXmFz+6NnMGUwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMC\n" + +                "MB0GA1UdDgQWBBRMxeMW4vqGK7FBkDt2+8upfkK1kzAfBgNVHSMEGDAWgBS0pVQs\n" + +                "1wnvNYG0AnmkxUcLOw+BLDAKBggqhkjOPQQDAgNJADBGAiEAg112+zWMm9qrPTvK\n" + +                "99IMa+wbeNzZLSoN9xewf5rxOX0CIQCvMi08JcajsAJ9Dg6YAQgpmFdb35HDCzve\n" + +                "lhkTCWJpgQ==", provider.getVpnCertificate()); +        assertEquals("MIIBozCCAUigAwIBAgIBATAKBggqhkjOPQQDAjA3MTUwMwYDVQQDDCxQcm92aWRl\n" + +                "ciBSb290IENBIChjbGllbnQgY2VydGlmaWNhdGVzIG9ubHkhKTAeFw0yNDEwMjMx\n" + +                "MjA0MjRaFw0yOTEwMjMxMjA5MjRaMDcxNTAzBgNVBAMMLFByb3ZpZGVyIFJvb3Qg\n" + +                "Q0EgKGNsaWVudCBjZXJ0aWZpY2F0ZXMgb25seSEpMFkwEwYHKoZIzj0CAQYIKoZI\n" + +                "zj0DAQcDQgAEMImwbNTDrXMeWfyTb2TMNzXNr79OsKjLDdZWqVT0iHMI8apo2P4H\n" + +                "eXCHVGjS2Z+jpyI1u9ic3igThsKEmdZMSKNFMEMwDgYDVR0PAQH/BAQDAgKkMBIG\n" + +                "A1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFLSlVCzXCe81gbQCeaTFRws7D4Es\n" + +                "MAoGCCqGSM49BAMCA0kAMEYCIQCw88nXg/vs/KgGqH1uPs9oZkOxucVn/ZEznYzg\n" + +                "szLhtAIhAPY32oHwmj3yHO9H2Jp7x0CoHuu1fKd9fQTBvEEbi7o9", provider.getCaCert()); +    } + +} | 
