summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/custom/assets/ptdemo.bitmask.secrets.json4
-rw-r--r--app/src/main/java/de/blinkt/openvpn/VpnProfile.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java0
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EIP.java8
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java37
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java50
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java19
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/EipStatusTest.java6
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java9
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java89
-rw-r--r--app/src/test/resources/ptdemo.bitmask.eip-service.json4
-rw-r--r--app/src/test/resources/ptdemo_pt_tcp_udp.eip-service.json2
-rw-r--r--app/src/test/resources/ptdemo_pt_udp_tcp.eip-service.json2
-rw-r--r--app/src/test/resources/ptdemo_three_mixed_gateways.json133
14 files changed, 261 insertions, 104 deletions
diff --git a/app/src/custom/assets/ptdemo.bitmask.secrets.json b/app/src/custom/assets/ptdemo.bitmask.secrets.json
index 7d84bd79..61f1fe1d 100644
--- a/app/src/custom/assets/ptdemo.bitmask.secrets.json
+++ b/app/src/custom/assets/ptdemo.bitmask.secrets.json
@@ -1,5 +1,5 @@
{
"ca_cert":"-----BEGIN CERTIFICATE-----\nMIIFjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBZMRgwFgYDVQQKDA9SaXNl\ndXAgTmV0d29ya3MxGzAZBgNVBAsMEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UE\nAwwXUmlzZXVwIE5ldHdvcmtzIFJvb3QgQ0EwHhcNMTQwNDI4MDAwMDAwWhcNMjQw\nNDI4MDAwMDAwWjBZMRgwFgYDVQQKDA9SaXNldXAgTmV0d29ya3MxGzAZBgNVBAsM\nEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UEAwwXUmlzZXVwIE5ldHdvcmtzIFJv\nb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC76J4ciMJ8Sg0m\nTP7DF2DT9zNe0Csk4myoMFC57rfJeqsAlJCv1XMzBmXrw8wq/9z7XHv6n/0sWU7a\n7cF2hLR33ktjwODlx7vorU39/lXLndo492ZBhXQtG1INMShyv+nlmzO6GT7ESfNE\nLliFitEzwIegpMqxCIHXFuobGSCWF4N0qLHkq/SYUMoOJ96O3hmPSl1kFDRMtWXY\niw1SEKjUvpyDJpVs3NGxeLCaA7bAWhDY5s5Yb2fA1o8ICAqhowurowJpW7n5ZuLK\n5VNTlNy6nZpkjt1QycYvNycffyPOFm/Q/RKDlvnorJIrihPkyniV3YY5cGgP+Qkx\nHUOT0uLA6LHtzfiyaOqkXwc4b0ZcQD5Vbf6Prd20Ppt6ei0zazkUPwxld3hgyw58\nm/4UIjG3PInWTNf293GngK2Bnz8Qx9e/6TueMSAn/3JBLem56E0WtmbLVjvko+LF\nPM5xA+m0BmuSJtrD1MUCXMhqYTtiOvgLBlUm5zkNxALzG+cXB28k6XikXt6MRG7q\nhzIPG38zwkooM55yy5i1YfcIi5NjMH6A+t4IJxxwb67MSb6UFOwg5kFokdONZcwj\nshczHdG9gLKSBIvrKa03Nd3W2dF9hMbRu//STcQxOailDBQCnXXfAATj9pYzdY4k\nha8VCAREGAKTDAex9oXf1yRuktES4QIDAQABo2AwXjAdBgNVHQ4EFgQUC4tdmLVu\nf9hwfK4AGliaet5KkcgwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMBAf8wHwYD\nVR0jBBgwFoAUC4tdmLVuf9hwfK4AGliaet5KkcgwDQYJKoZIhvcNAQENBQADggIB\nAGzL+GRnYu99zFoy0bXJKOGCF5XUXP/3gIXPRDqQf5g7Cu/jYMID9dB3No4Zmf7v\nqHjiSXiS8jx1j/6/Luk6PpFbT7QYm4QLs1f4BlfZOti2KE8r7KRDPIecUsUXW6P/\n3GJAVYH/+7OjA39za9AieM7+H5BELGccGrM5wfl7JeEz8in+V2ZWDzHQO4hMkiTQ\n4ZckuaL201F68YpiItBNnJ9N5nHr1MRiGyApHmLXY/wvlrOpclh95qn+lG6/2jk7\n3AmihLOKYMlPwPakJg4PYczm3icFLgTpjV5sq2md9bRyAg3oPGfAuWHmKj2Ikqch\nTd5CHKGxEEWbGUWEMP0s1A/JHWiCbDigc4Cfxhy56CWG4q0tYtnc2GMw8OAUO6Wf\nXu5pYKNkzKSEtT/MrNJt44tTZWbKV/Pi/N2Fx36my7TgTUj7g3xcE9eF4JV2H/sg\ntsK3pwE0FEqGnT4qMFbixQmc8bGyuakr23wjMvfO7eZUxBuWYR2SkcP26sozF9PF\ntGhbZHQVGZUTVPyvwahMUEhbPGVerOW0IYpxkm0x/eaWdTc4vPpf/rIlgbAjarnJ\nUN9SaWRlWKSdP4haujnzCoJbM7dU9bjvlGZNyXEekgeT0W2qFeGGp+yyUWw8tNsp\n0BuC1b7uW/bBn/xKm319wXVDvBgZgcktMolak39V7DVO\n-----END CERTIFICATE-----",
- "cert":"-----BEGIN CERTIFICATE-----\nMIIEnDCCAoSgAwIBAgIRAIO8Bvjp207KpTPf+yH071gwDQYJKoZIhvcNAQELBQAwdTEYMBYGA1UE\nCgwPUmlzZXVwIE5ldHdvcmtzMRswGQYDVQQLDBJodHRwczovL3Jpc2V1cC5uZXQxPDA6BgNVBAMM\nM1Jpc2V1cCBOZXR3b3JrcyBSb290IENBIChjbGllbnQgY2VydGlmaWNhdGVzIG9ubHkhKTAeFw0x\nOTA1MTAwMDAwMDBaFw0xOTA4MTAwMDAwMDBaMC0xKzApBgNVBAMMIlVOTElNSVRFRGMwd2ZxOWhp\ndzA1OGthd3pkeTJuc3BnOGgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPG1Iphzfb\nYDwC7fwF7bF2JFGw4Rye/6fDp1U0rUEbSz06d57S/hxNXdEoM9OBtUm97ucSoUsemTNabTvGMc8y\nyidwtzhtzTOkq9S/lBu9UlA7Btsz3bWqvVVdVVB+ZOVh/SJREb0TMPQQCW499D0DMJfHFu9xHl9w\nzr+KZxuHxnWr94p8IG4BhssT2PnwK+TeuS3lBPXvG+ctbXCDipg0GJQU7EnshVS+6ECdcyFmAsK8\nJxH3bYAvKSIKxFXVToTRhHJjx/QjF3tgCBN8QNyLv/1AFZxn9cQq2MF0pqwdqfgARpcW2Cg3DXTW\nQMn2/upsxNrzj594/gmPgj2h3kFLAgMBAAGjbzBtMB0GA1UdDgQWBBTHUj4H4e88Pf69piaRFWpP\nmA1MijALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCQYDVR0TBAIwADAfBgNVHSME\nGDAWgBQX9BvV5SoBAU1rol02CikJlmWARjANBgkqhkiG9w0BAQsFAAOCAgEApbPfHKaYV1JJhf3Y\ng8WVQ4Y3FlSSATmWt1dfWqPaEwgR/q5/Wuw1xTnv357F88PQh3xn5BRIDVEPEzd94FXXEjYmzRL3\nWPu36HtqF7IXVwU6qXIIeCZJs5sMUlSjVyaHdTY/IEQarMLUDiLaTZ+9oU/IBBjSpDuyWlnbKYNn\nIM/d1FbOeIZFZpJmw33BcNNa8csjs0jBOmftP9dPIvcFaj3Fb4w5G0rKi5lfA2p4y/faVWFucwcl\nmGlHtwpvoyRPVqVoHrTpcvapOTXORpGSGPzRR4y+Cl1xyeMWor/AF58FGshLkI5gGTXQ0Vth9g+x\nEgeXRJxmSGVw031uGuz1EuUUVDOcYE465PiK7EufPt3zbF7VD76atd7/FdkBcn3pI6BTSWBN0mtw\nt2npAqJuBZhS7tu89FU2SOvj3ieeqzoNuvEPzc55LUEFGTOb1W1KX70AhbaKV9zg3bE11B3B8Byk\nS2el4vw3h3smCyn2wj1TsNZBT0B/htdcHGSPFK8SfgtW209LGlOwqLrCiWKNmhofgZJN3vqettpC\nHD19hUTVfSY1p2AVbTsyJa4mj2tP0++JWfbFbPVtYCIDJxFOeQ+sl4Uqd5l8tr7f89PKgU4dxiol\ndw74HzGJOBTUlv6dozT22y1HQrOIevWMJvvJ4UoJ70nVBZx00jKwevaeook=\n-----END CERTIFICATE-----",
- "Constants.PROVIDER_PRIVATE_KEY":"-----BEGIN RSA PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDPG1IphzfbYDwC7fwF7bF2JFGw\n4Rye/6fDp1U0rUEbSz06d57S/hxNXdEoM9OBtUm97ucSoUsemTNabTvGMc8yyidwtzhtzTOkq9S/\nlBu9UlA7Btsz3bWqvVVdVVB+ZOVh/SJREb0TMPQQCW499D0DMJfHFu9xHl9wzr+KZxuHxnWr94p8\nIG4BhssT2PnwK+TeuS3lBPXvG+ctbXCDipg0GJQU7EnshVS+6ECdcyFmAsK8JxH3bYAvKSIKxFXV\nToTRhHJjx/QjF3tgCBN8QNyLv/1AFZxn9cQq2MF0pqwdqfgARpcW2Cg3DXTWQMn2/upsxNrzj594\n/gmPgj2h3kFLAgMBAAECggEAOk4EuXA5x2a2PlTlSH38IbhjzxnwxspOXoRzNls4Iwjxec5HRjsH\nmLg6s8izWKbC1de18ca6sSiMDn8F/uvy2ueSZucN2cuVKFy/jheSH6BWuedaOqXGCQU4TQhBmvOo\nqAdta8lEo2x6qTEeeg6SRp2dfQz157CXSdjKj5orY/N3MPUz09IqHifyQFqKZDEl4ZYzFiqeeDnp\nPHNlvtWRp/LaRCr45ppqU2SPCC1y2pGLgJPZOAAsqWA7KiB2wZq2SBFNtspBTZkhG+LBBcZYjnU4\nIuKPnPW1YsSPpAWUZv79Pct6wzwsidPzBmkaJ8Fpkqy8SIbUM4K4am0yFDH14QKBgQD1TfNfwj0Y\nZhC+LOmiU/+Pwfpo1XgU8FQ03diiLNMdcv2G6vXph6/NWBTIVEZoIrz/Y8X4klo/KQ8tyw9d+hYh\nAqJ6S+IFhf+UwbPjk8s8iUZbvn+Nl/DWjq5lu1IYwQl9BzXoptWq9itNSqB8KCyd7WEjn+Tb3Df3\narBAKRYqOQKBgQDYIwNLtR1x9smoVFhI8pFCuyw1h3cO2vn14PVR9P0EEkTzs8+CwU8QYbUpBQpF\nUfmPCJPNcXz5knOxOdtOr+/El3hol+J9XXuZZumjwoFb5fpw+AQxgfAxkJgbR16BJj52MFy8/ymX\n1qzAFf1Cx2sFJkAD9OkqUB0R/Tm3E6hXowKBgQC+Al9d8Ur5tzWI2akvP/lZFVwuEAwvy+it+plv\nJWFyEjwnYaCR/7RBTtTqR70xtJbJDDOw00xsWBWV1xBULv8tGqlYKactuBm81D3PLg/jGEITln+e\n4e5/g42651o0KnJ7EjbDu1cOUhhAimm9QjEtM05nFddkJjSDxXQ4fprYoQKBgFYmDog8lpH4NgS8\nKbxZwwCALmzfo9rt+TfCBMY4Cil3RriEcS/C8UqsR1MkSSW8OOaEGrWGiLPJZge78ef5RG5tmXbH\nI2Wovz0zweid/IWusxYYJUO+cQiwg5BL8CU2Iytkt3I1mlSFIrIlkZ7ucX/J8TYihlVxPUUQU9Lf\nKPhVAoGAd1/wvawIclsAGqXQzINziH4jjRvIV85R59fLEccfTEAqao9blBxDqoMe6biUuodYFQvq\nT+CDj7zzVPNZVbK5FEqu5W6ezIWp+y+tbTWpApdOxhf2lsZZVgm0KtV2uYvNYW0djOW0ci4TaHj5\nfvWaxEkf0ZOSdkEaN4f2mJGIXLM=\n-----END RSA PRIVATE KEY-----"
+ "cert":"-----BEGIN CERTIFICATE-----\nMIIEnDCCAoSgAwIBAgIRAMBASoEmbFNubIm2CUzfS7cwDQYJKoZIhvcNAQELBQAwdTEYMBYGA1UE\nCgwPUmlzZXVwIE5ldHdvcmtzMRswGQYDVQQLDBJodHRwczovL3Jpc2V1cC5uZXQxPDA6BgNVBAMM\nM1Jpc2V1cCBOZXR3b3JrcyBSb290IENBIChjbGllbnQgY2VydGlmaWNhdGVzIG9ubHkhKTAeFw0x\nOTA1MTIwMDAwMDBaFw0xOTA4MTIwMDAwMDBaMC0xKzApBgNVBAMMIlVOTElNSVRFRGN2Nnc3NTc5\nNHphdmk4bmxtcnd6MGs0ZzYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKtjI8XcFk\n61loMX2Y3EMKu6Y6/UwUzcxeUNjA19YJgJh85RUGD2NrhVQDSaB38jsX3xRKYGRaZ7k50S1MYv5M\nOLBmPL2pB6Nm5Ki+fRgr1sKSkQqXEZdHnS1/W5odBdO5JnZxVEjVBnM77FHuMyJ4rhAqswHLjrMo\nWBuJc4L3k04DH6t0zB+oRRsnYFze7FAfi9Vy9o409kYCF82ZXLZ0e4fZKaYbteUiMJlos93Esfp/\nWe3gxM/661/e3nL1H433l65+BbKYQp/ojb3VawaK/ZuD5/YhjbiQ9vttt3sWuG0k3PtDQEeBg6GH\n6JsCZ0U+/wmrorcDs007O5QlCgepAgMBAAGjbzBtMB0GA1UdDgQWBBT888ieEhIJhzB9sHkP72+Y\ng6hqFDALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCQYDVR0TBAIwADAfBgNVHSME\nGDAWgBQX9BvV5SoBAU1rol02CikJlmWARjANBgkqhkiG9w0BAQsFAAOCAgEAje/LV2Oo/Qz7pGcM\nvQhnlxemL6p+3XI9UpyjkbDG9s45RxZoqEMGyOhqq4aQikoHOBZoasw5ChCVYz0dPCoKvmVuixD+\nzmSfEDfTO1dN1vgCeExbLpZFIMUqifjORPxXqfxCsJOzO5RHF05Q4ywgPJIF8pRIaSjswAbYAxBa\nS+d/2cp3wKj6WjRc0VOf2LZ95jV4PTnOHD5Ls3hyCIXsM4dvjxY2mcaVps4DX/GziaS9S6+wISEe\nx2sGk+uAJs11ixs26zefg4XHU4qDc3RnxG0sLEANTSNgulZAnffE4OQVGrLDJ/lJn77EfnggF9NF\nOBJR4U/xY/0nQNR8fvnjlp+ViebbyBWgn3EcuT1W8jxbUDMcdF+575gLtxbJ6/5EqKp6r2E1EKGW\nYutUgQW4C2c4gfWl1T0hVT3ykqDid1qzZvWiXPQCgE84LdViWaY6I4kuELLMZxWIKEKXo4y19K+z\nOOnlK70+SeOKdx9W9CuCHArlCDSKyWjNVxhf+M6ILLy6+LpJ618bsg18+FJvovdxmWl4jOuQNU6v\n6j4OwKd3sCjQ6zvIZk6CLkRZjxWdDNwwvb3O9YG99PcxXyR0SmX21ycnDKut6Sclk/sqhP+VrZbG\nCPHMcbuS+Jk6t4q5R3BGNmLeBpVMQOHN29++55Snd7qFTXEWUdrBTQUYc+c=\n-----END CERTIFICATE-----",
+ "Constants.PROVIDER_PRIVATE_KEY":"-----BEGIN RSA PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDKtjI8XcFk61loMX2Y3EMKu6Y6\n/UwUzcxeUNjA19YJgJh85RUGD2NrhVQDSaB38jsX3xRKYGRaZ7k50S1MYv5MOLBmPL2pB6Nm5Ki+\nfRgr1sKSkQqXEZdHnS1/W5odBdO5JnZxVEjVBnM77FHuMyJ4rhAqswHLjrMoWBuJc4L3k04DH6t0\nzB+oRRsnYFze7FAfi9Vy9o409kYCF82ZXLZ0e4fZKaYbteUiMJlos93Esfp/We3gxM/661/e3nL1\nH433l65+BbKYQp/ojb3VawaK/ZuD5/YhjbiQ9vttt3sWuG0k3PtDQEeBg6GH6JsCZ0U+/wmrorcD\ns007O5QlCgepAgMBAAECggEBAK6YdPZXjl4c83nxvortk/TnoQqH5oK4qwDFQ5v9iwXONAjGyu/Y\nSzptsOnP/Z2yDkHGS1SwZ18SnY/14b08OmluHklAod63jH7wDYNcfXgs1pOkx2lMpm7xKyHZxQig\nXzbGsRd1j/GjR5diOUMf2d31lkkguzgXZaonETi3PCN9vLEuA6nOhOF9tqyp5URngklF8VILBVs5\nagz5LLsS1jwn5KOhvP01Twi3fESvWdUKUK1aCOBeujsplPtYpl+hdnOzIWbrkBFisrbECvsn67A3\n7TTvld7Qyki/RV00xKO2SymkfL5RFHgpINzrgEY4xPh8pTrYKICOSkzxCL2BUz0CgYEA78pXyIVB\nYEcAfqXZR+5PBB8GeVjk1RusbL87lwZEn+Xp8yxab3Wi/EAkpt3349Y1S4o/kOSV1CZZtfgwI3/5\nX95JAQMgmRvg9Wv6Cm3eR+i1gvw4ONeccIj1Iip7/74Rwb2PGvtuQZPNQvxpU5QzKXdN3/dqaNOD\nvMAC2SqULZMCgYEA2GoxhY5iCnFFJ6LPIh4vd/srF6pR1fNm99coFsEZ9bL/5Fxz2mAOw25T9l5v\nl3YA5nO1r0ZkBmcHzkKl3feAW7DV8eTMFCln8mGpVuqsOEgdLVH0PF+IH2JWXd7agqHZlSPwhEVP\nBinOVC1acEDZ3+/CC1fLdoH4csrtPQmEW1MCgYBV5xEnnsVa7lS5CkUaxb685Th2hGgGCFHu61s3\nsWEoPz9ehEcpouTupTP8K4zArF6PX0mCaMFcLRj6XZ0xOoll1MYmfK5S62/du/7peY6mCDHuaNjj\nVCqRDh9zS/D8H2VRGM2JhwVqrL5d/vrknDTv5/OYBpSyVQPevJLIpb5LzQKBgDQ18nqZLjf8ucVl\nNvmxNJyKoQvVkGbAkS/r3YUX0y5+n9O1JlIh6I3nmSQQBnYRBwiSE9wUbF9LDgwJ8kBJzNLSJ9ty\n6nVWw/gq7ZLFjQULCNb9NaI3Hf0MWW/OKwNnDro3cHhIzFbdUSTnyDDaxHWNP1BDPxf5JTp0kKWw\nHRl3AoGABj4yBH9wqwMu0Hsmv5IZ0mRPj81g5imeQL+TnF4KAoyWe3VjPfWUllu5nMELOXmk69Nb\n2xFP6dp9g6EyuQqwYGHxR0ZhNLnvvj03hYmo3r8rulTY5KqpmQ1mNb/pqShuN9KxdvXpcp2Xj2Hg\nD/J37vgYH7L99/B8hBJqC4arjCk=\n-----END RSA PRIVATE KEY-----"
} \ No newline at end of file
diff --git a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
index dc12c6a8..f139fdc9 100644
--- a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
+++ b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
@@ -174,6 +174,7 @@ public class VpnProfile implements Serializable, Cloneable {
// timestamp when the profile was last used
public long mLastUsed;
public String importedProfileHash;
+ //TODO: cleanup here
/* Options no longer used in new profiles */
public String mServerName = "openvpn.example.com";
public String mServerPort = "1194";
@@ -184,6 +185,7 @@ public class VpnProfile implements Serializable, Cloneable {
// set members to default values
private UUID mUuid;
private int mProfileVersion;
+ public String mGatewayIp;
public boolean mUsePluggableTransports;
public VpnProfile(String name, Connection.TransportType transportType) {
diff --git a/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java b/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
index a5434871..1d702ec1 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
@@ -53,6 +53,8 @@ import se.leap.bitmaskclient.R;
import static android.app.Activity.RESULT_CANCELED;
import static android.app.Activity.RESULT_OK;
import static android.content.Intent.CATEGORY_DEFAULT;
+import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
+import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
import static se.leap.bitmaskclient.Constants.BROADCAST_EIP_EVENT;
import static se.leap.bitmaskclient.Constants.BROADCAST_GATEWAY_SETUP_OBSERVER_EVENT;
import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_CODE;
@@ -203,7 +205,7 @@ public final class EIP extends JobIntentService implements Observer {
GatewaysManager gatewaysManager = gatewaysFromPreferences();
Gateway gateway = gatewaysManager.select(nClosestGateway);
- if (gateway != null && gateway.getProfile() != null) {
+ if (gateway != null && !gateway.getProfiles().isEmpty()) {
launchActiveGateway(gateway, nClosestGateway);
tellToReceiverOrBroadcast(EIP_ACTION_START, RESULT_OK);
} else
@@ -218,7 +220,7 @@ public final class EIP extends JobIntentService implements Observer {
GatewaysManager gatewaysManager = gatewaysFromPreferences();
Gateway gateway = gatewaysManager.select(0);
- if (gateway != null && gateway.getProfile() != null) {
+ if (gateway != null && !gateway.getProfiles().isEmpty()) {
launchActiveGateway(gateway, 0);
} else {
Log.d(TAG, "startEIPAlwaysOnVpn no active profile available!");
@@ -242,7 +244,7 @@ public final class EIP extends JobIntentService implements Observer {
*/
private void launchActiveGateway(@NonNull Gateway gateway, int nClosestGateway) {
Intent intent = new Intent(BROADCAST_GATEWAY_SETUP_OBSERVER_EVENT);
- intent.putExtra(PROVIDER_PROFILE, gateway.getProfile());
+ intent.putExtra(PROVIDER_PROFILE, gateway.getProfile(OPENVPN));
intent.putExtra(Gateway.KEY_N_CLOSEST_GATEWAY, nClosestGateway);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java b/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
index 50fe74b7..9bc07764 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
@@ -16,16 +16,21 @@
*/
package se.leap.bitmaskclient.eip;
+import android.support.annotation.NonNull;
+
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
+import java.util.HashMap;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.core.ConfigParser;
+import de.blinkt.openvpn.core.connection.Connection;
+import static se.leap.bitmaskclient.Constants.IP_ADDRESS;
import static se.leap.bitmaskclient.Constants.LOCATION;
import static se.leap.bitmaskclient.Constants.LOCATIONS;
import static se.leap.bitmaskclient.Constants.NAME;
@@ -54,7 +59,7 @@ public class Gateway {
private String name;
private int timezone;
private int apiVersion;
- private VpnProfile vpnProfile;
+ private HashMap<Connection.TransportType, VpnProfile> vpnProfiles;
/**
* Build a gateway object from a JSON OpenVPN gateway definition in eip-service.json
@@ -69,9 +74,13 @@ public class Gateway {
timezone = getTimezone(eipDefinition);
name = locationAsName(eipDefinition);
apiVersion = getApiVersion(eipDefinition);
- vpnProfile = createVPNProfile();
- if (vpnProfile != null) {
- vpnProfile.mName = name;
+ vpnProfiles = createVPNProfiles();
+ }
+
+ private void addProfileInfos(HashMap<Connection.TransportType, VpnProfile> profiles) {
+ for (VpnProfile profile : profiles.values()) {
+ profile.mName = name;
+ profile.mGatewayIp = gateway.optString(IP_ADDRESS);
}
}
@@ -92,6 +101,10 @@ public class Gateway {
return eipDefinition.optInt(VERSION);
}
+ public String getRemoteIP() {
+ return gateway.optString(IP_ADDRESS);
+ }
+
private String locationAsName(JSONObject eipDefinition) {
JSONObject location = getLocationInfo(eipDefinition);
return location.optString(NAME);
@@ -110,23 +123,29 @@ public class Gateway {
/**
* Create and attach the VpnProfile to our gateway object
*/
- private VpnProfile createVPNProfile() {
+ private @NonNull HashMap<Connection.TransportType, VpnProfile> createVPNProfiles() {
+ HashMap<Connection.TransportType, VpnProfile> profiles = new HashMap<>();
try {
VpnConfigGenerator vpnConfigurationGenerator = new VpnConfigGenerator(generalConfiguration, secrets, gateway, apiVersion);
- return vpnConfigurationGenerator.generateVpnProfile();
+ profiles = vpnConfigurationGenerator.generateVpnProfiles();
+ addProfileInfos(profiles);
} catch (ConfigParser.ConfigParseError | IOException | JSONException e) {
// FIXME We didn't get a VpnProfile! Error handling! and log level
e.printStackTrace();
- return null;
}
+ return profiles;
}
public String getName() {
return name;
}
- public VpnProfile getProfile() {
- return vpnProfile;
+ public HashMap<Connection.TransportType, VpnProfile> getProfiles() {
+ return vpnProfiles;
+ }
+
+ public VpnProfile getProfile(Connection.TransportType transportType) {
+ return vpnProfiles.get(transportType);
}
public int getTimezone() {
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
index cd3ec1c6..f7038bab 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
@@ -28,20 +28,14 @@ import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.ArrayList;
-import java.util.List;
+import java.util.LinkedHashMap;
-import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.connection.Connection;
import se.leap.bitmaskclient.Provider;
import se.leap.bitmaskclient.utils.PreferenceHelper;
-import static se.leap.bitmaskclient.Constants.CAPABILITIES;
import static se.leap.bitmaskclient.Constants.GATEWAYS;
import static se.leap.bitmaskclient.Constants.PROVIDER_PRIVATE_KEY;
import static se.leap.bitmaskclient.Constants.PROVIDER_VPN_CERTIFICATE;
-import static se.leap.bitmaskclient.Constants.TRANSPORT;
-import static se.leap.bitmaskclient.Constants.TYPE;
-import static se.leap.bitmaskclient.Constants.VERSION;
/**
* @author parmegv
@@ -52,7 +46,7 @@ public class GatewaysManager {
private Context context;
private SharedPreferences preferences;
- private List<Gateway> gateways = new ArrayList<>();
+ private LinkedHashMap<String, Gateway> gateways = new LinkedHashMap<>();
private Type listType = new TypeToken<ArrayList<Gateway>>() {}.getType();
GatewaysManager(Context context, SharedPreferences preferences) {
@@ -65,7 +59,7 @@ public class GatewaysManager {
* @return the n closest Gateway
*/
public Gateway select(int nClosest) {
- GatewaySelector gatewaySelector = new GatewaySelector(gateways);
+ GatewaySelector gatewaySelector = new GatewaySelector(new ArrayList<>(gateways.values()));
return gatewaySelector.select(nClosest);
}
@@ -96,52 +90,20 @@ public class GatewaysManager {
void fromEipServiceJson(JSONObject eipDefinition) {
try {
JSONArray gatewaysDefined = eipDefinition.getJSONArray(GATEWAYS);
- int apiVersion = eipDefinition.getInt(VERSION);
for (int i = 0; i < gatewaysDefined.length(); i++) {
JSONObject gw = gatewaysDefined.getJSONObject(i);
JSONObject secrets = secretsConfiguration();
Gateway aux = new Gateway(eipDefinition, secrets, gw);
- if (!gateways.contains(aux)) {
+ if (gateways.get(aux.getRemoteIP()) == null) {
addGateway(aux);
}
}
- } catch (JSONException e) {
+ } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- /**
- * check if a gateway is an OpenVpn gateway
- * @param gateway to check
- * @return true if gateway is an OpenVpn gateway otherwise false
- */
- private boolean isOpenVpnGateway(JSONObject gateway, int apiVersion) {
- switch (apiVersion) {
- default:
- case 1:
- try {
- String transport = gateway.getJSONObject(CAPABILITIES).getJSONArray(TRANSPORT).toString();
- return transport.contains("openvpn");
- } catch (JSONException e) {
- return false;
- }
- case 2:
- try {
- JSONArray transports = gateway.getJSONObject(CAPABILITIES).getJSONArray(TRANSPORT);
- for (int i = 0; i < transports.length(); i++) {
- JSONObject transport = transports.getJSONObject(i);
- if (transport.optString(TYPE).equals("openvpn")) {
- return true;
- }
- }
- return false;
- } catch (JSONException e) {
- return false;
- }
- }
- }
-
private JSONObject secretsConfiguration() {
JSONObject result = new JSONObject();
try {
@@ -160,7 +122,7 @@ public class GatewaysManager {
}
private void addGateway(Gateway gateway) {
- gateways.add(gateway);
+ gateways.put(gateway.getRemoteIP(), gateway);
}
/**
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java
index 18c557dc..6b76e8d9 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java
@@ -22,6 +22,7 @@ import org.json.JSONObject;
import java.io.IOException;
import java.io.StringReader;
+import java.util.HashMap;
import java.util.Iterator;
import de.blinkt.openvpn.VpnProfile;
@@ -52,8 +53,6 @@ public class VpnConfigGenerator {
private JSONObject obfs4Transport;
private int apiVersion;
- private ConfigParser icsOpenvpnConfigParser = new ConfigParser();
-
public final static String TAG = VpnConfigGenerator.class.getSimpleName();
private final String newLine = System.getProperty("line.separator"); // Platform new line
@@ -85,16 +84,17 @@ public class VpnConfigGenerator {
}
}
- public VpnProfile generateVpnProfile() throws IllegalStateException,
- IOException,
+ public HashMap<Connection.TransportType, VpnProfile> generateVpnProfiles() throws
ConfigParser.ConfigParseError,
- NumberFormatException, JSONException {
-
+ NumberFormatException,
+ JSONException,
+ IOException {
+ HashMap<Connection.TransportType, VpnProfile> profiles = new HashMap<>();
+ profiles.put(OPENVPN, createProfile(OPENVPN));
if (supportsObfs4()) {
- return createProfile(OBFS4);
+ profiles.put(OBFS4, createProfile(OBFS4));
}
-
- return createProfile(OPENVPN);
+ return profiles;
}
private boolean supportsObfs4(){
@@ -113,6 +113,7 @@ public class VpnConfigGenerator {
private VpnProfile createProfile(Connection.TransportType transportType) throws IOException, ConfigParser.ConfigParseError, JSONException {
String configuration = getConfigurationString(transportType);
+ ConfigParser icsOpenvpnConfigParser = new ConfigParser();
icsOpenvpnConfigParser.parseConfig(new StringReader(configuration));
if (transportType == OBFS4) {
icsOpenvpnConfigParser.setDispatcherOptions(getDispatcherOptions());
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/EipStatusTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/EipStatusTest.java
index 8495f962..8ba7f5fc 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/EipStatusTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/EipStatusTest.java
@@ -10,6 +10,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.VpnStatus;
+import de.blinkt.openvpn.core.connection.Connection;
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.testutils.MockHelper;
import se.leap.bitmaskclient.testutils.TestSetupHelper;
@@ -23,6 +24,7 @@ import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_START;
import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_VPNPAUSED;
import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT;
import static de.blinkt.openvpn.core.ConnectionStatus.UNKNOWN_LEVEL;
+import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.powermock.api.mockito.PowerMockito.doNothing;
@@ -61,7 +63,7 @@ public class EipStatusTest {
public void testUpdateState_LEVEL_VPNPAUSED_hasPersistentTun() throws Exception {
mockStatic(PreferenceHelper.class);
- VpnProfile mockVpnProfile = new VpnProfile("mockProfile");
+ VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OPENVPN);
mockVpnProfile.mPersistTun = true;
doNothing().when(PreferenceHelper.class);
VpnStatus.setLastConnectedVpnProfile(null, mockVpnProfile);
@@ -74,7 +76,7 @@ public class EipStatusTest {
public void testUpdateState_LEVEL_VPNPAUSED_hasNotPersistentTun() throws Exception {
mockStatic(PreferenceHelper.class);
- VpnProfile mockVpnProfile = new VpnProfile("mockProfile");
+ VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OPENVPN);
mockVpnProfile.mPersistTun = false;
doNothing().when(PreferenceHelper.class);
VpnStatus.setLastConnectedVpnProfile(null, mockVpnProfile);
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
index 160e5ddd..0412b11a 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
@@ -57,6 +57,15 @@ public class GatewaysManagerTest {
assertEquals(0, gatewaysManager.size());
}
+ @Test
+ public void testFromEipServiceJson_ignoreDuplicateGateways_apiv3() throws Exception {
+ String eipServiceJson = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_three_mixed_gateways.json"));
+ gatewaysManager.fromEipServiceJson(new JSONObject(eipServiceJson));
+ assertEquals(3, gatewaysManager.size());
+ eipServiceJson = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service.json"));
+ gatewaysManager.fromEipServiceJson(new JSONObject(eipServiceJson));
+ assertEquals(3, gatewaysManager.size());
+ }
@Test
public void testFromEipServiceJson_ignoreDuplicateGateways() throws Exception {
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java
index 20a5968d..40da8e43 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java
@@ -16,11 +16,16 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.File;
+import java.util.HashMap;
import de.blinkt.openvpn.VpnProfile;
+import de.blinkt.openvpn.core.connection.Connection;
import se.leap.bitmaskclient.testutils.MockHelper;
import se.leap.bitmaskclient.testutils.TestSetupHelper;
+import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
+import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
+import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -44,7 +49,7 @@ public class VpnConfigGeneratorTest {
private JSONObject gateway;
private JSONObject secrets;
- String expectedVPNConfig_tcp_udp = "# Config for OpenVPN 2.x\n" +
+ String expectedVPNConfig_v1_tcp_udp = "# Config for OpenVPN 2.x\n" +
"# Enables connection to GUI\n" +
"management /data/data/se.leap.bitmask/mgmtsocket unix\n" +
"management-client\n" +
@@ -162,7 +167,7 @@ public class VpnConfigGeneratorTest {
"keepalive 10 30 \n" +
"tls-cipher DHE-RSA-AES128-SHA";
- String expectedVPNConfig_udp_tcp = "# Config for OpenVPN 2.x\n" +
+ String expectedVPNConfig_v1_udp_tcp = "# Config for OpenVPN 2.x\n" +
"# Enables connection to GUI\n" +
"management /data/data/se.leap.bitmask/mgmtsocket unix\n" +
"management-client\n" +
@@ -280,7 +285,7 @@ public class VpnConfigGeneratorTest {
"keepalive 10 30 \n" +
"tls-cipher DHE-RSA-AES128-SHA";
- String expectedVPNConfig_pt_tcp = "# Config for OpenVPN 2.x\n" +
+ String expectedVPNConfig_v3_obfs4 = "# Config for OpenVPN 2.x\n" +
"# Enables connection to GUI\n" +
"management /data/data/se.leap.bitmask/mgmtsocket unix\n" +
"management-client\n" +
@@ -297,8 +302,7 @@ public class VpnConfigGeneratorTest {
"connect-retry 2 300\n" +
"resolv-retry 60\n" +
"dev tun\n" +
- "remote 127.0.0.1 1234 tcp-client\n" +
- "remote 37.218.247.60 1195 tcp-client\n" +
+ "remote 127.0.0.1 4430 tcp-client\n" +
"<ca>\n" +
"-----BEGIN CERTIFICATE-----\n" +
"MIIFbzCCA1egAwIBAgIBATANBgkqhkiG9w0BAQ0FADBKMRgwFgYDVQQDDA9CaXRt\n" +
@@ -386,6 +390,7 @@ public class VpnConfigGeneratorTest {
"-----END CERTIFICATE-----\n" +
"</cert>\n" +
"crl-verify file missing in config profile\n" +
+ "route 37.218.247.60 255.255.255.255 net_gateway\n"+
"remote-cert-tls server\n" +
"cipher AES-128-CBC\n" +
"auth SHA1\n" +
@@ -398,7 +403,7 @@ public class VpnConfigGeneratorTest {
"keepalive 10 30 \n" +
"tls-cipher DHE-RSA-AES128-SHA \n";
- String expectedVPNConfig_pt_tcp_udp = "# Config for OpenVPN 2.x\n" +
+ String expectedVPNConfig_v3_ovpn_tcp_udp = "# Config for OpenVPN 2.x\n" +
"# Enables connection to GUI\n" +
"management /data/data/se.leap.bitmask/mgmtsocket unix\n" +
"management-client\n" +
@@ -415,7 +420,6 @@ public class VpnConfigGeneratorTest {
"connect-retry 2 300\n" +
"resolv-retry 60\n" +
"dev tun\n" +
- "remote 127.0.0.1 1234 tcp-client\n" +
"remote 37.218.247.60 1195 tcp-client\n" +
"remote 37.218.247.60 1195 udp\n" +
"<ca>\n" +
@@ -517,7 +521,7 @@ public class VpnConfigGeneratorTest {
"keepalive 10 30 \n" +
"tls-cipher DHE-RSA-AES128-SHA \n";
- String expectedVPNConfig_pt_udp_tcp = "# Config for OpenVPN 2.x\n" +
+ String expectedVPNConfig_v3_ovpn_udp_tcp = "# Config for OpenVPN 2.x\n" +
"# Enables connection to GUI\n" +
"management /data/data/se.leap.bitmask/mgmtsocket unix\n" +
"management-client\n" +
@@ -534,7 +538,6 @@ public class VpnConfigGeneratorTest {
"connect-retry 2 300\n" +
"resolv-retry 60\n" +
"dev tun\n" +
- "remote 127.0.0.1 1234 tcp-client\n" +
"remote 37.218.247.60 1195 udp\n" +
"remote 37.218.247.60 1195 tcp-client\n" +
"<ca>\n" +
@@ -655,45 +658,69 @@ public class VpnConfigGeneratorTest {
public void testGenerateVpnProfile_v1_tcp_udp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_tcp_udp.json")));
vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 1);
- VpnProfile vpnProfile = vpnConfigGenerator.generateVpnProfile();
- assertTrue(vpnProfile.getConfigFile(context, false).trim().equals(expectedVPNConfig_tcp_udp.trim()));
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim().equals(expectedVPNConfig_v1_tcp_udp.trim()));
}
@Test
public void testGenerateVpnProfile_v1_udp_tcp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_udp_tcp.json")));
vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 1);
- VpnProfile vpnConfig = vpnConfigGenerator.generateVpnProfile();
- assertTrue(vpnConfig.getConfigFile(context, false).trim().equals(expectedVPNConfig_udp_tcp.trim()));
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim().equals(expectedVPNConfig_v1_udp_tcp.trim()));
}
@Test
- public void testGenerateVpnProfile_v2_pt_tcp() throws Exception {
- gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
+ public void testGenerateVpnProfile_v2_tcp_udp() throws Exception {
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_tcp_udp.json")));
vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 2);
- VpnProfile vpnProfile = vpnConfigGenerator.generateVpnProfile();
- vpnProfile.mConnections[0].setServerPort("1234");
- System.out.println(vpnProfile.getConfigFile(context, false));
- assertTrue(vpnProfile.getConfigFile(context, false).trim().equals(expectedVPNConfig_pt_tcp.trim()));
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim().equals(expectedVPNConfig_v1_tcp_udp.trim()));
}
@Test
- public void testGenerateVpnProfile_v2_pt_tcp_udp() throws Exception {
- gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_pt_tcp_udp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
+ public void testGenerateVpnProfile_v2_udp_tcp() throws Exception {
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_udp_tcp.json")));
vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 2);
- VpnProfile vpnProfile = vpnConfigGenerator.generateVpnProfile();
- vpnProfile.mConnections[0].setServerPort("1234");
- System.out.println(vpnProfile.getConfigFile(context, false));
- assertTrue(vpnProfile.getConfigFile(context, false).trim().equals(expectedVPNConfig_pt_tcp_udp.trim()));
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim().equals(expectedVPNConfig_v1_udp_tcp.trim()));
}
+
@Test
- public void testGenerateVpnProfile_v2_pt_udp_tcp() throws Exception {
+ public void testGenerateVpnProfile_v3_obfs4() throws Exception {
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 3);
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.containsKey(OPENVPN));
+ System.out.println(vpnProfiles.get(OBFS4).getConfigFile(context, false));
+ assertTrue(vpnProfiles.get(OBFS4).getConfigFile(context, false).trim().equals(expectedVPNConfig_v3_obfs4.trim()));
+ }
+
+ @Test
+ public void testGenerateVpnProfile_v3_ovpn_tcp_udp() throws Exception {
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_pt_tcp_udp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 3);
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.containsKey(OPENVPN));
+ System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
+ assertTrue(vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim().equals(expectedVPNConfig_v3_ovpn_tcp_udp.trim()));
+ }
+
+ @Test
+ public void testGenerateVpnProfile_v3_ovpn_udp_tcp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_pt_udp_tcp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 2);
- VpnProfile vpnProfile = vpnConfigGenerator.generateVpnProfile();
- vpnProfile.mConnections[0].setServerPort("1234");
- System.out.println(vpnProfile.getConfigFile(context, false));
- assertTrue(vpnProfile.getConfigFile(context, false).trim().equals(expectedVPNConfig_pt_udp_tcp.trim()));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, 3);
+ HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(vpnProfiles.containsKey(OBFS4));
+ assertTrue(vpnProfiles.containsKey(OPENVPN));
+ System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
+ assertTrue(vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim().equals(expectedVPNConfig_v3_ovpn_udp_tcp.trim()));
}
} \ No newline at end of file
diff --git a/app/src/test/resources/ptdemo.bitmask.eip-service.json b/app/src/test/resources/ptdemo.bitmask.eip-service.json
index 38146a40..e5ede239 100644
--- a/app/src/test/resources/ptdemo.bitmask.eip-service.json
+++ b/app/src/test/resources/ptdemo.bitmask.eip-service.json
@@ -15,7 +15,7 @@
"23049"
],
"options": {
- "cert": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "cert": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1",
"iat-mode": "0"
}
},
@@ -60,5 +60,5 @@
"verb" : "3"
},
"serial":2,
- "version":2
+ "version":3
} \ No newline at end of file
diff --git a/app/src/test/resources/ptdemo_pt_tcp_udp.eip-service.json b/app/src/test/resources/ptdemo_pt_tcp_udp.eip-service.json
index 4337547b..f39a1597 100644
--- a/app/src/test/resources/ptdemo_pt_tcp_udp.eip-service.json
+++ b/app/src/test/resources/ptdemo_pt_tcp_udp.eip-service.json
@@ -61,5 +61,5 @@
"verb" : "3"
},
"serial":2,
- "version":2
+ "version":3
} \ No newline at end of file
diff --git a/app/src/test/resources/ptdemo_pt_udp_tcp.eip-service.json b/app/src/test/resources/ptdemo_pt_udp_tcp.eip-service.json
index 4161fced..71c9857a 100644
--- a/app/src/test/resources/ptdemo_pt_udp_tcp.eip-service.json
+++ b/app/src/test/resources/ptdemo_pt_udp_tcp.eip-service.json
@@ -61,5 +61,5 @@
"verb" : "3"
},
"serial":2,
- "version":2
+ "version":3
} \ No newline at end of file
diff --git a/app/src/test/resources/ptdemo_three_mixed_gateways.json b/app/src/test/resources/ptdemo_three_mixed_gateways.json
new file mode 100644
index 00000000..f81da6b3
--- /dev/null
+++ b/app/src/test/resources/ptdemo_three_mixed_gateways.json
@@ -0,0 +1,133 @@
+{
+ "gateways":[
+ {
+ "capabilities":{
+ "adblock":false,
+ "filter_dns":false,
+ "limited":false,
+ "transport":[
+ {
+ "type":"obfs4",
+ "protocols":[
+ "tcp"
+ ],
+ "ports":[
+ "23049"
+ ],
+ "options": {
+ "cert": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1",
+ "iat-mode": "0"
+ }
+ },
+ {
+ "type":"openvpn",
+ "protocols":[
+ "tcp"
+ ],
+ "ports":[
+ "1195"
+ ]
+ }
+ ],
+ "user_ips":false
+ },
+ "host":"pt.demo.bitmask.net",
+ "ip_address":"37.218.247.60",
+ "location":"Amsterdam"
+ },
+ {
+ "capabilities":{
+ "adblock":false,
+ "filter_dns":false,
+ "limited":false,
+ "transport":[
+ {
+ "type":"obfs4",
+ "protocols":[
+ "tcp"
+ ],
+ "ports":[
+ "443"
+ ],
+ "options": {
+ "cert": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2",
+ "iat-mode": "0"
+ }
+ },
+ {
+ "type":"openvpn",
+ "protocols":[
+ "tcp"
+ ],
+ "ports":[
+ "1195"
+ ]
+ }
+ ],
+ "user_ips":false
+ },
+ "host":"moscow.bitmask.net",
+ "ip_address":"3.21.247.89",
+ "location":"moscow"
+ },
+ {
+ "capabilities":{
+ "adblock":false,
+ "filter_dns":false,
+ "limited":false,
+ "transport":[
+ {
+ "type":"openvpn",
+ "protocols":[
+ "tcp",
+ "udp"
+ ],
+ "ports":[
+ "1195"
+ ]
+ }
+ ],
+ "user_ips":false
+ },
+ "host":"manila.bitmask.net",
+ "ip_address":"37.12.247.10",
+ "location":"manila"
+ }
+ ],
+ "locations":{
+ "Amsterdam":{
+ "country_code":"NL",
+ "hemisphere":"N",
+ "name":"Amsterdam",
+ "timezone":"-1"
+ },
+ "moscow": {
+ "country_code": "RU",
+ "hemisphere": "N",
+ "name": "Moscow",
+ "timezone": "+3"
+ },
+ "manila": {
+ "country_code": "PH",
+ "hemisphere": "N",
+ "name": "Manila",
+ "timezone": "+8"
+ }
+ },
+ "openvpn_configuration":{
+ "auth":"SHA1",
+ "cipher":"AES-256-CBC",
+ "keepalive":"10 30",
+ "tls-cipher":"DHE-RSA-AES128-SHA",
+ "tun-ipv6":true,
+ "dev" : "tun",
+ "sndbuf" : "0",
+ "rcvbuf" : "0",
+ "nobind" : true,
+ "persist-key" : true,
+ "key-direction" : "1",
+ "verb" : "3"
+ },
+ "serial":2,
+ "version":3
+} \ No newline at end of file