diff options
34 files changed, 362 insertions, 113 deletions
diff --git a/res/layout/client_dashboard.xml b/res/layout/client_dashboard.xml index 16e152be..9bda6d2e 100644 --- a/res/layout/client_dashboard.xml +++ b/res/layout/client_dashboard.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical" tools:context=".Dashboard" > - + <LinearLayout android:id="@+id/providerLine" android:layout_width="match_parent" @@ -68,4 +68,4 @@ android:orientation="vertical" > </LinearLayout> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/res/menu/client_dashboard.xml b/res/menu/client_dashboard.xml index 2ce8b87c..806147eb 100644 --- a/res/menu/client_dashboard.xml +++ b/res/menu/client_dashboard.xml @@ -3,8 +3,6 @@ <item android:id="@+id/menu_settings" android:orderInCategory="100" - android:showAsAction="ifRoom" - android:icon="@drawable/ic_menu_settings_holo_light" android:title="@string/menu_settings"/> <item android:id="@+id/about_leap" @@ -17,11 +15,10 @@ <item android:id="@+id/switch_provider" android:orderInCategory="501" - android:title="@string/switch_provider_menu_option"/> + android:title="@string/switch_provider_menu_option"/> <item android:id="@+id/login_button" android:showAsAction="ifRoom" - android:icon="@drawable/ic_menu_login" android:title="@string/login_button" android:visible="false"> </item> @@ -32,4 +29,4 @@ android:visible="false"> </item> -</menu>
\ No newline at end of file +</menu> diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 5131250a..0840c365 100755 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP per Android</string> <string name="address">Adreá del servidor:</string> <string name="port">Port del servidor:</string> <string name="location">Lloc</string> @@ -15,7 +14,7 @@ <string name="client_pkcs12_title">Fitxer PKCS12</string> <string name="ca_title">Certificat CA</string> <string name="about">Quan a</string> - <string name="about_summary">Quan a LEAP per Android</string> + <string name="about_summary">Quan a Bitmask per Android</string> <string name="vpn_list_summary">Llista de VPNs configurades</string> <string name="vpn_list_title">Perfils VPN</string> <string name="vpn_type">Tipus</string> diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 37ae7f40..3bb898d6 100755 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP pro Android</string> <string name="address">Adresa serveru:</string> <string name="port">Port serveru:</string> <string name="location">Lokace</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Zdrojové kódy a seznam problémů je na https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Tento program používá následující komponenty; viz zdrojový kód pro detaily o licenci</string> <string name="about">O programu</string> - <string name="about_summary">O programu LEAP pro Android</string> + <string name="about_summary">O programu Bitmask pro Android</string> <string name="vpn_list_summary">Seznam všech nakonfigurovaných VPN</string> <string name="vpn_list_title">Všechny VPN</string> <string name="vpn_type">Typ</string> @@ -235,7 +234,7 @@ <string name="minidump_generated">OpenVPN neočekávaně havarovalo. Zvaž možnost použití volby poslat Minidump z hlavního menu</string> <string name="send_minidump">Poslat Minidump vývojáři</string> <string name="send_minidump_summary">Poslat ladící informace o poslední havárii vývojáři</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$s - %2$s</string> <string name="session_ipv6string">%1$s - %3$s, %2$s</string> <string name="state_connecting">Připojuji se</string> diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index df50b594..46a7322e 100755 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP für Android</string> <string name="address">Server:</string> <string name="port">Server Port:</string> <string name="location">Ort</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Quellcode und Issue Tracker sind verfügbar unter https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Dieses Programm nutzt die folgenden Komponenten. Die kompletten Lizenzdetails sind im Quelltext verfügbar.</string> <string name="about">Über</string> - <string name="about_summary">Über LEAP für Android</string> + <string name="about_summary">Über Bitmask für Android</string> <string name="vpn_list_summary">Alle konfigurierten VPN Profile</string> <string name="vpn_list_title">VPN Liste</string> <string name="vpn_type">Typ</string> @@ -235,7 +234,7 @@ <string name="minidump_generated">Der OpenVPN Prozess ist unerwartet abgestürzt. Bitte erwägen Sie die Option \"Minidump senden\" im Hauptmenü</string> <string name="send_minidump">Minidump an Entwickler senden</string> <string name="send_minidump_summary">Sendet Debugging Informationen des letzten Absturzes an den Entwickler</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$s - %2$s</string> <string name="session_ipv6string">%1$s - %3$s, %2$s</string> <string name="state_connecting">Verbinde</string> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 36fcc199..e8398560 100755 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP para Android</string> <string name="address">Dirección del servidor:</string> <string name="port">Puerto del servidor:</string> <string name="location">Ubicación</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Codigo fuente y sistema de reporte de errores disponibles en https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">El programa utiliza los siguientes componentes. Vea los códigos fuentes para obtener más información sobre las licencias</string> <string name="about">Acerca de</string> - <string name="about_summary">Acerca de LEAP para Android</string> + <string name="about_summary">Acerca de Bitmask para Android</string> <string name="vpn_list_summary">Lista de todas las VPN configuradas</string> <string name="vpn_list_title">Perfiles VPN</string> <string name="vpn_type">Tipo</string> diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index b0758d74..dba6caa4 100755 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP Androidile</string> <string name="address">Serveri aadress:</string> <string name="port">Serveri port:</string> <string name="location">Asukoht</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Lähtetekst ja probleemihaldur asuvad veebilehel https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Programmis kasutatakse järgnevaid komponente. Detailse litsenseerimisinfo leiate lähtekoodist</string> <string name="about">Lähemalt</string> - <string name="about_summary">Täpsemalt programmist LEAP Androidile</string> + <string name="about_summary">Täpsemalt programmist Bitmask Androidile</string> <string name="vpn_list_summary">Kõigi seadistatud VPN kanalite nimekiri</string> <string name="vpn_list_title">VPN profiilid</string> <string name="vpn_type">Tüüp</string> diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ec36bc8b..6ed418ff 100755 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">"LEAP pour Android"</string> <string name="address">"Adresse du serveur:"</string> <string name="port">"Port:"</string> <string name="location">"Emplacement"</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">"Le code source et le tracker de bugs est disponible ici: https://github.com/leapcode/bitmask_android/ "</string> <string name="copyright_others">"Le programme utilise les composants suivants. Voir le code source pour plus de détails sur les licences."</string> <string name="about">"À propos"</string> - <string name="about_summary">"À propos d\'LEAP pour Android"</string> + <string name="about_summary">"À propos d\'Bitmask pour Android"</string> <string name="vpn_list_summary">"Liste de tous les VPN configurés"</string> <string name="vpn_list_title">"Vos VPNs"</string> <string name="vpn_type">"Type"</string> diff --git a/res/values-id/strings.xml b/res/values-id/strings.xml index 0166b7ea..43b36768 100755 --- a/res/values-id/strings.xml +++ b/res/values-id/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP untuk Android</string> <string name="address">Alamat Server:</string> <string name="port">Port server:</string> <string name="location">Lokasi</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Kode program dan perekam masalah tersedia di</string> <string name="copyright_others">Aplikasi memakai komponen berikut; lihat kode program untuk lebih jelas mengenai lisensi</string> <string name="about">Tentang...</string> - <string name="about_summary">Tentang LEAP untuk Android</string> + <string name="about_summary">Tentang Bitmask untuk Android</string> <string name="vpn_list_summary">Daftar konfigurasi VPN</string> <string name="vpn_list_title">Profil VPN</string> <string name="vpn_type">Tipe</string> @@ -235,7 +234,7 @@ <string name="minidump_generated">OpenVPN crash tak terduga. Silakan mempertimbangkan mengirim menggunakan pilihan Minidump di Menu Utama</string> <string name="send_minidump">Mengirim MiniDump untuk pengembang</string> <string name="send_minidump_summary">Kirim informasi kesalahan tentang kegagalan aplikasi yang terakhir ke pengembang</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$ s - %2$ s</string> <string name="session_ipv6string">%1$ s - %3$ s, %2$ s</string> <string name="state_connecting">Menghubungkan</string> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 1e935bf2..341d4d50 100755 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP per Android</string> <string name="address">Indirizzo server:</string> <string name="port">Porta del server:</string> <string name="location">Posizione</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Il codice sorgente e il bug tracker sono disponibili all\'indirizzo https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Questo programma usa i seguenti componenti; guarda il codice sorgente per i dettagli completi sulle licenze</string> <string name="about">Informazioni</string> - <string name="about_summary">Informazioni su LEAP per Android</string> + <string name="about_summary">Informazioni su Bitmask per Android</string> <string name="vpn_list_summary">Elenco connessioni VPN configurate</string> <string name="vpn_list_title">Profili VPN</string> <string name="vpn_type">Tipo</string> diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index db7602f7..a85dc726 100755 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP Android</string> <string name="address">サーバアドレス</string> <string name="port">ポート番号</string> <string name="location">場所</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">ソースコードと問題管理は以下で: https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">プログラムは、次のコンポーネントを使用します。完全な詳細についてはソース上のライセンスを参照してください。</string> <string name="about">バージョン情報</string> - <string name="about_summary">LEAP Androidについて</string> + <string name="about_summary">Bitmask Androidについて</string> <string name="vpn_list_summary">設定されたすべてのVPN</string> <string name="vpn_list_title">VPNプロファイル</string> <string name="vpn_type">種別</string> @@ -274,7 +273,7 @@ TCP keepaliveと長いタイムアウト時間は動作しますが、TCP over T <string name="minidump_generated">OpenVPN は予期せず終了しました。メイン メニューでミニダンプの送信オプションを検討してください。</string> <string name="send_minidump">ミニダンプを開発者に送信</string> <string name="send_minidump_summary">最後にクラッシュした時のデバッグ情報を作者に送信します。</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$s - %2$s</string> <string name="session_ipv6string">%1$s - %3$s, %2$s</string> <string name="state_connecting">接続中</string> diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 4cd9da70..08c1bc26 100755 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">안드로이드용 LEAP</string> <string name="address">서버 주소:</string> <string name="port">서버 포트:</string> <string name="location">위치</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">소스 코드와 문제 추적기는 https://github.com/leapcode/bitmask_android/에서 사용할 수 있습니다</string> <string name="copyright_others">프로그램은 다음 구성 요소를 사용합니다. 라이선스에 대 한 자세한 내용은 소스를 참조 하십시오</string> <string name="about">소개</string> - <string name="about_summary">안드로이드용 LEAP 소개</string> + <string name="about_summary">안드로이드용 Bitmask 소개</string> <string name="vpn_list_summary">설정된 VPN의 목록</string> <string name="vpn_list_title">VPN 프로파일</string> <string name="vpn_type">유형</string> diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 459c80ec..01eefb86 100755 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP voor Android</string> <string name="address">Server Adres:</string> <string name="port">Server Poort:</string> <string name="location">Locatie</string> @@ -15,7 +14,7 @@ <string name="client_pkcs12_title">PKCS12 Bestand</string> <string name="ca_title">CA Certificaat</string> <string name="about">Over</string> - <string name="about_summary">Over LEAP voor Android</string> + <string name="about_summary">Over Bitmask voor Android</string> <string name="vpn_list_summary">Lijst van alle geconfigureerde VPN verbindingen</string> <string name="vpn_list_title">VPN Profielen</string> <string name="vpn_type">Type</string> diff --git a/res/values-no/strings.xml b/res/values-no/strings.xml index 99b97277..a5551578 100755 --- a/res/values-no/strings.xml +++ b/res/values-no/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP Android</string> <string name="address">Server adresse:</string> <string name="port">Server port:</string> <string name="location">Plassering</string> @@ -15,7 +14,7 @@ <string name="client_pkcs12_title">PKCS12 fil</string> <string name="ca_title">CA-sertifikat</string> <string name="about">Om</string> - <string name="about_summary">Om LEAP Android</string> + <string name="about_summary">Om Bitmask Android</string> <string name="vpn_list_summary">Liste over alle konfigurerte VPN-tilkoblinger</string> <string name="vpn_list_title">VPN-profiler</string> <string name="vpn_type">Type</string> diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 308a47ac..0b669803 100755 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP pentru Android</string> <string name="address">Adresa server:</string> <string name="port">Port server:</string> <string name="location">Locaţie</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Cod sursă şi tracker probleme disponibile la https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Acest program utilizează următoarele componente; a se vedea codul sursă pentru mai multe detalii despre licente</string> <string name="about">Despre</string> - <string name="about_summary">Despre LEAP pentru Android</string> + <string name="about_summary">Despre Bitmask pentru Android</string> <string name="vpn_list_summary">Lista tuturor VPN-urilor configurate</string> <string name="vpn_list_title">Profile VPN</string> <string name="vpn_type">Tip</string> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 1d3c10a3..596bd913 100755 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP для Android</string> <string name="address">Адрес сервера:</string> <string name="port">Порт сервера:</string> <string name="location">Расположение</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Исходники и информация о версиях находятся по адресу https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Данная программа использует следующие компоненты; смотрите исходный код для получения подробной информации о лицензии</string> <string name="about">О программе</string> - <string name="about_summary">Описание LEAP для Android</string> + <string name="about_summary">Описание Bitmask для Android</string> <string name="vpn_list_summary">Список всех туннелей VPN</string> <string name="vpn_list_title">Профили VPN</string> <string name="vpn_type">Тип</string> @@ -234,7 +233,7 @@ <string name="minidump_generated">OpenVPN завершилась неожиданно. Пожалуйста, посмотрите опцию \"Отправить Minidump\" в главном меню</string> <string name="send_minidump">Отправить Minidump разработчику</string> <string name="send_minidump_summary">Отправка отладочной информации разработчику о последнем неудачном завершении</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$s - %2$s</string> <string name="session_ipv6string">%1$s - %3$s, %2$s</string> <string name="state_connecting">Подключение</string> diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 14d9ce90..0a668bf9 100755 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP для Android</string> <string name="address">Адреса сервера:</string> <string name="port">Порт сервера:</string> <string name="location">Розташування</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">Початковий код і відстеження проблем доступні по https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">Ця програма використовує такі компоненти; перегляньте вихідний код для повної інформації про ліцензії</string> <string name="about">Про</string> - <string name="about_summary">Про LEAP для Android</string> + <string name="about_summary">Про Bitmask для Android</string> <string name="vpn_list_summary">Список всіх налаштованих VPN</string> <string name="vpn_list_title">VPN профілі</string> <string name="vpn_type">Тип</string> @@ -235,7 +234,7 @@ <string name="minidump_generated">OpenVPN впав несподівано. Будь ласка, розгляньте використання параметру \"Надіслати Мінідамп\" в головному меню</string> <string name="send_minidump">Надіслати мінідамп розробнику</string> <string name="send_minidump_summary">Надіслати налагоджувальну інформацію про останній збій розробнику</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$s - %2$s</string> <string name="session_ipv6string">%1$s - %3$s, %2$s</string> <string name="state_connecting">Підключення</string> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 89d3aeab..5dfc1b68 100755 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP Android版</string> <string name="address">服务器地址:</string> <string name="port">服务器端口:</string> <string name="location">地点</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">请前往 https://github.com/leapcode/bitmask_android/ 源码或提供问题反馈</string> <string name="copyright_others">本程序使用以下组件,请在 Licenses 查看源码获取更详细内容。</string> <string name="about">关于</string> - <string name="about_summary">关于 LEAP Android</string> + <string name="about_summary">关于 Bitmask Android</string> <string name="vpn_list_summary">已完成配置的 VPN 列表</string> <string name="vpn_list_title">VPN 配置文件</string> <string name="vpn_type">类型</string> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 2d2f31ca..3d178545 100755 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!--Generated by crowdin.net--> <resources> - <string name="app">LEAP Android</string> <string name="address">伺服器地址:</string> <string name="port">伺服器端口:</string> <string name="location">位置</string> @@ -19,7 +18,7 @@ <string name="repository_url_text">取得原始碼與個案追蹤,可上 https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">本程序使用了以下元件,其作者和授權資訊如下</string> <string name="about">關於</string> - <string name="about_summary">關於 LEAP Android</string> + <string name="about_summary">關於 Bitmask Android</string> <string name="vpn_list_summary">列出所有已設置的VPN</string> <string name="vpn_list_title">VPN設定檔</string> <string name="vpn_type">類型</string> diff --git a/res/values/strings.xml b/res/values/strings.xml index c94997af..a5bb6b83 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2,8 +2,6 @@ <!-- Generated by crowdin.net --> <resources> - <string name="app">Bitmask</string> - <string name="app_name">Bitmask</string> <string name="address">Server Address:</string> <string name="port">Server Port:</string> <string name="location">Location</string> @@ -11,6 +9,7 @@ <string name="select">Select</string> <string name="cancel">Cancel</string> <string name="ok">OK</string> + <string name="retry">Retry</string> <string name="no_data">No Data</string> <string name="useLZO">LZO Compression</string> <string name="client_no_certificate">No Certificate</string> @@ -21,7 +20,7 @@ <string name="no_certificate">You must select a certificate</string> <string name="repository_url_text">Source code and issue tracker available at https://github.com/leapcode/bitmask_android/</string> <string name="copyright_others">This program uses the following components; see the source code for full details on the licenses</string> - <string name="about">About LEAP</string> + <string name="about">About Bitmask</string> <string name="switch_provider_menu_option">Switch provider</string> <string name="about_summary">About Bitmask for Android</string> <string name="vpn_list_summary">List of all configured VPNs</string> @@ -239,7 +238,7 @@ <string name="minidump_generated">OpenVPN crashed unexpectedly. Please consider using the send Minidump option in the main menu</string> <string name="send_minidump">Send Minidump to developer</string> <string name="send_minidump_summary">Send debugging information about last crash to developer</string> - <string name="notifcation_title">OpenVPN - %s</string> + <string name="notifcation_title">Bitmask - %s</string> <string name="session_ipv4string">%1$s - %2$s</string> <string name="session_ipv6string">%1$s - %3$s, %2$s</string> <string name="state_connecting">Connecting</string> diff --git a/res/values/untranslatable.xml b/res/values/untranslatable.xml index c86fad1b..9edbc247 100644 --- a/res/values/untranslatable.xml +++ b/res/values/untranslatable.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - + <string name="app" translatable="false">Bitmask</string> + <string name="app_name" translatable="false">Bitmask</string> + <string name="copyright_leapgui" translatable="false">Copyright 2012\nLEAP Encryption Access Project <info@leap.se></string> <string name="opevpn_copyright" translatable="false">Copyright © 2002–2010 OpenVPN Technologies, Inc. <sales@openvpn.net>\n diff --git a/res/xml/main_headers.xml b/res/xml/main_headers.xml index 1ee238ea..d1cca3ea 100644 --- a/res/xml/main_headers.xml +++ b/res/xml/main_headers.xml @@ -12,9 +12,9 @@ android:fragment="se.leap.openvpn.FaqFragment" android:summary="@string/faq_summary" android:title="@string/faq" /> - <header + <!-- <header android:fragment="se.leap.openvpn.AboutFragment" android:summary="@string/about_summary" android:title="@string/about" /> - + --> </preference-headers>
\ No newline at end of file diff --git a/src/se/leap/bitmaskclient/ConfigHelper.java b/src/se/leap/bitmaskclient/ConfigHelper.java index dd7049a7..6b49d7d7 100644 --- a/src/se/leap/bitmaskclient/ConfigHelper.java +++ b/src/se/leap/bitmaskclient/ConfigHelper.java @@ -168,6 +168,9 @@ public class ConfigHelper { return shared_preferences.getInt(shared_preferences_key, 0); } + protected static boolean sharedPrefContainsKey(String shared_preferences_key) { + return shared_preferences.contains(shared_preferences_key); + } /* * This method defaults to false. * If you use this method, be sure to fail-closed on false! diff --git a/src/se/leap/bitmaskclient/ConfigurationWizard.java b/src/se/leap/bitmaskclient/ConfigurationWizard.java index 444be843..cf027660 100644 --- a/src/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/src/se/leap/bitmaskclient/ConfigurationWizard.java @@ -22,9 +22,15 @@ import java.util.Iterator; import org.json.JSONException;
import org.json.JSONObject;
-import se.leap.bitmaskclient.R;
-import se.leap.bitmaskclient.ProviderAPIResultReceiver.Receiver;
-import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
+ +import se.leap.bitmaskclient.R; +import se.leap.bitmaskclient.ProviderAPIResultReceiver.Receiver; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; + +import se.leap.bitmaskclient.DownloadFailedDialog.DownloadFailedDialogInterface; +import se.leap.bitmaskclient.NewProviderDialog.NewProviderDialogInterface; +import se.leap.bitmaskclient.ProviderDetailFragment.ProviderDetailFragmentInterface; + import android.app.Activity;
import android.app.DialogFragment;
import android.app.Fragment;
@@ -61,7 +67,7 @@ import android.widget.TextView; *
*/
public class ConfigurationWizard extends Activity
-implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogInterface, ProviderDetailFragment.ProviderDetailFragmentInterface, Receiver {
+implements ProviderListFragment.Callbacks, NewProviderDialogInterface, ProviderDetailFragmentInterface, DownloadFailedDialogInterface, Receiver {
private ProgressBar mProgressBar;
private TextView progressbar_description;
@@ -78,7 +84,7 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn public ProviderAPIResultReceiver providerAPI_result_receiver;
private ProviderAPIBroadcastReceiver_Update providerAPI_broadcast_receiver_update;
-
+ @Override
protected void onCreate(Bundle savedInstanceState) {
@@ -192,9 +198,15 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn // resetOldConnection();
ProviderItem selected_provider = getProvider(id);
int provider_index = getProviderIndex(id);
- startProgressBar(provider_index);
+ + + startProgressBar(provider_index+1); provider_list_fragment.hideAllBut(provider_index); - setUpProvider(selected_provider.providerMainUrl(), true); + + boolean danger_on = true; + if(ConfigHelper.sharedPrefContainsKey(ProviderItem.DANGER_ON)) + danger_on = ConfigHelper.getBoolFromSharedPref(ProviderItem.DANGER_ON); + setUpProvider(selected_provider.providerMainUrl(), danger_on); }
@Override
@@ -238,6 +250,13 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn }
return "";
}
+ +
+ private void startProgressBar() {
+ mProgressBar.setVisibility(ProgressBar.VISIBLE);
+ mProgressBar.setProgress(0);
+ mProgressBar.setMax(3);
+ }
private void startProgressBar(int list_item_index) {
mProgressBar.setVisibility(ProgressBar.VISIBLE);
@@ -256,8 +275,12 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn ProviderItem provider = providers_iterator.next();
if(provider.name().equalsIgnoreCase(id)) {
break;
- }
- index++;
+//<<<<<<< HEAD +// }
+// index++;
+//======= + } else index++;
+//>>>>>>> bug/more-detailed-response-to-CW-errors }
return index;
}
@@ -343,6 +366,24 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn }
/**
+ * Open the new provider dialog with data
+ */
+ public void addAndSelectNewProvider(String main_url, boolean danger_on) {
+ FragmentTransaction fragment_transaction = getFragmentManager().beginTransaction();
+ Fragment previous_new_provider_dialog = getFragmentManager().findFragmentByTag(NewProviderDialog.TAG);
+ if (previous_new_provider_dialog != null) {
+ fragment_transaction.remove(previous_new_provider_dialog);
+ }
+
+ DialogFragment newFragment = NewProviderDialog.newInstance();
+ Bundle data = new Bundle();
+ data.putString(Provider.MAIN_URL, main_url);
+ data.putBoolean(ProviderItem.DANGER_ON, danger_on);
+ newFragment.setArguments(data);
+ newFragment.show(fragment_transaction, NewProviderDialog.TAG);
+ }
+
+ /**
* Once selected a provider, this fragment offers the user to log in,
* use it anonymously (if possible)
* or cancel his/her election pressing the back button.
@@ -391,6 +432,8 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn }
private void autoSelectProvider(String provider_main_url, boolean danger_on) {
+ + ConfigHelper.saveSharedPref(ProviderItem.DANGER_ON, danger_on);
onItemSelected(getId(provider_main_url));
}
@@ -409,10 +452,24 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn provider_API_command.setAction(ProviderAPI.SET_UP_PROVIDER);
provider_API_command.putExtra(ProviderAPI.PARAMETERS, parameters);
provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
-
- startService(provider_API_command);
- }
-
+ + startService(provider_API_command); + } + + public void retrySetUpProvider() { + cancelSettingUpProvider(); + if(!ProviderAPI.caCertDownloaded()) { + addAndSelectNewProvider(ProviderAPI.lastProviderMainUrl(), ProviderAPI.lastDangerOn()); + } else { + Intent provider_API_command = new Intent(this, ProviderAPI.class); + + provider_API_command.setAction(ProviderAPI.SET_UP_PROVIDER); + provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver); + + startService(provider_API_command); + } + } + @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.configuration_wizard_activity, menu);
@@ -438,6 +495,18 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn if(provider_list_fragment != null)
provider_list_fragment.unhideAll();
}
+
+ public void cancelSettingUpProvider() {
+ provider_list_fragment = (ProviderListFragment) getFragmentManager().findFragmentByTag(ProviderListFragment.TAG);
+ if(provider_list_fragment != null && ConfigHelper.sharedPrefContainsKey(ProviderItem.DANGER_ON)) {
+ provider_list_fragment.removeLastItem();
+ }
+
+ ConfigHelper.removeFromSharedPref(Provider.KEY);
+ ConfigHelper.removeFromSharedPref(ProviderItem.DANGER_ON);
+ ConfigHelper.removeFromSharedPref(EIP.ALLOWED_ANON);
+ ConfigHelper.removeFromSharedPref(EIP.KEY);
+ }
@Override
public void login() {
diff --git a/src/se/leap/bitmaskclient/Dashboard.java b/src/se/leap/bitmaskclient/Dashboard.java index 0ef50f4a..44cf8247 100644 --- a/src/se/leap/bitmaskclient/Dashboard.java +++ b/src/se/leap/bitmaskclient/Dashboard.java @@ -112,6 +112,7 @@ public class Dashboard extends Activity implements LogInDialog.LogInDialogInterf if ( resultCode == RESULT_OK ){ ConfigHelper.saveSharedPref(EIP.PARSED_SERIAL, 0); ConfigHelper.saveSharedPref(EIP.AUTHED_EIP, authed_eip); + startService( new Intent(EIP.ACTION_UPDATE_EIP_SERVICE) ); buildDashboard(); @@ -166,6 +167,8 @@ public class Dashboard extends Activity implements LogInDialog.LogInDialogInterf providerNameTV = (TextView) findViewById(R.id.providerName); providerNameTV.setText(provider.getDomain()); providerNameTV.setTextSize(28); + + mProgressBar = (ProgressBar) findViewById(R.id.eipProgress); FragmentManager fragMan = getFragmentManager(); if ( provider.hasEIP()){ diff --git a/src/se/leap/bitmaskclient/DownloadFailedDialog.java b/src/se/leap/bitmaskclient/DownloadFailedDialog.java index 3ce101a6..f78002b0 100644 --- a/src/se/leap/bitmaskclient/DownloadFailedDialog.java +++ b/src/se/leap/bitmaskclient/DownloadFailedDialog.java @@ -14,9 +14,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - package se.leap.bitmaskclient; +package se.leap.bitmaskclient; import se.leap.bitmaskclient.R; +import se.leap.bitmaskclient.NewProviderDialog.NewProviderDialogInterface; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; @@ -42,18 +45,50 @@ public class DownloadFailedDialog extends DialogFragment { return dialog_fragment; } - @Override + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - + builder.setMessage(reason_to_fail) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + .setPositiveButton(R.string.retry, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dismiss(); + interface_with_ConfigurationWizard.retrySetUpProvider(); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { + interface_with_ConfigurationWizard.cancelSettingUpProvider(); dialog.dismiss(); } }); - + // Create the AlertDialog object and return it return builder.create(); } + + public interface DownloadFailedDialogInterface { + public void retrySetUpProvider(); + public void cancelSettingUpProvider(); + } + + DownloadFailedDialogInterface interface_with_ConfigurationWizard; + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + interface_with_ConfigurationWizard = (DownloadFailedDialogInterface) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement NoticeDialogListener"); + } + } + + @Override + public void onCancel(DialogInterface dialog) { + interface_with_ConfigurationWizard.cancelSettingUpProvider(); + dialog.dismiss(); + } + } diff --git a/src/se/leap/bitmaskclient/EIP.java b/src/se/leap/bitmaskclient/EIP.java index ec2f6972..2b7fd39f 100644 --- a/src/se/leap/bitmaskclient/EIP.java +++ b/src/se/leap/bitmaskclient/EIP.java @@ -58,10 +58,10 @@ import android.util.Log; */ public final class EIP extends IntentService { + public final static String AUTHED_EIP = "authed eip"; public final static String ACTION_START_EIP = "se.leap.bitmaskclient.START_EIP"; public final static String ACTION_STOP_EIP = "se.leap.bitmaskclient.STOP_EIP"; public final static String ACTION_UPDATE_EIP_SERVICE = "se.leap.bitmaskclient.UPDATE_EIP_SERVICE"; - public final static String AUTHED_EIP = "authed_eip"; public final static String ACTION_IS_EIP_RUNNING = "se.leap.bitmaskclient.IS_RUNNING"; public final static String EIP_NOTIFICATION = "EIP_NOTIFICATION"; public final static String ALLOWED_ANON = "allow_anonymous"; @@ -439,7 +439,8 @@ public final class EIP extends IntentService { String ports = "ports"; String protos = "protocols"; String capabilities = "capabilities"; - String location = "location"; + String location_key = "location"; + String locations = "locations"; Vector<String> arg = new Vector<String>(); Vector<Vector<String>> args = new Vector<Vector<String>>(); @@ -456,7 +457,6 @@ public final class EIP extends IntentService { arg.add(word); value.add( (Vector<String>) arg.clone() ); options.put(key, (Vector<Vector<String>>) value.clone()); - value.clear(); arg.clear(); } @@ -477,16 +477,22 @@ public final class EIP extends IntentService { arg.clear(); args.clear(); + try { - arg.add(location); - arg.add(mGateway.getString(location)); + + arg.add(location_key); + String locationText = ""; + locationText = eipDefinition.getJSONObject(locations).getJSONObject(mGateway.getString(location_key)).getString("name"); + arg.add(locationText); + } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } args.add((Vector<String>) arg.clone()); options.put("location", (Vector<Vector<String>>) args.clone() ); + arg.clear(); args.clear(); JSONArray protocolsJSON = null; diff --git a/src/se/leap/bitmaskclient/EipServiceFragment.java b/src/se/leap/bitmaskclient/EipServiceFragment.java index e182b3fd..b409394b 100644 --- a/src/se/leap/bitmaskclient/EipServiceFragment.java +++ b/src/se/leap/bitmaskclient/EipServiceFragment.java @@ -202,7 +202,10 @@ public class EipServiceFragment extends Fragment implements StateListener, OnCli switchState = false; } else if (state.equals("NOPROCESS")){ statusMessage = logmessage; - } else { + } else if (state.equals("ASSIGN_IP")){ //don't show assigning message in eipStatus + statusMessage = (String) eipStatus.getText(); + } + else { statusMessage = prefix + " " + logmessage; } diff --git a/src/se/leap/bitmaskclient/LeapSRPSession.java b/src/se/leap/bitmaskclient/LeapSRPSession.java index 14a8bff2..0849f777 100644 --- a/src/se/leap/bitmaskclient/LeapSRPSession.java +++ b/src/se/leap/bitmaskclient/LeapSRPSession.java @@ -35,9 +35,12 @@ import org.jboss.security.srp.SRPParameters; */ public class LeapSRPSession { + private static String token = ""; + final public static String SALT = "salt"; final public static String M1 = "M1"; final public static String M2 = "M2"; + final public static String TOKEN = "token"; private SRPParameters params; private String username; @@ -312,6 +315,14 @@ public class LeapSRPSession { boolean valid = Arrays.equals(M2, myM2); return valid; } + + protected static void setToken(String token) { + LeapSRPSession.token = token; + } + + protected static String getToken() { + return token; + } /** * @return a new SHA-256 digest. diff --git a/src/se/leap/bitmaskclient/NewProviderDialog.java b/src/se/leap/bitmaskclient/NewProviderDialog.java index 98686bd2..cf09c64b 100644 --- a/src/se/leap/bitmaskclient/NewProviderDialog.java +++ b/src/se/leap/bitmaskclient/NewProviderDialog.java @@ -16,6 +16,7 @@ */ package se.leap.bitmaskclient; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; import se.leap.bitmaskclient.R; import android.app.Activity; import android.app.AlertDialog; @@ -71,7 +72,14 @@ public class NewProviderDialog extends DialogFragment { LayoutInflater inflater = getActivity().getLayoutInflater(); View new_provider_dialog_view = inflater.inflate(R.layout.new_provider_dialog, null); final EditText url_input_field = (EditText)new_provider_dialog_view.findViewById(R.id.new_provider_url); + if(getArguments() != null && getArguments().containsKey(Provider.MAIN_URL)) { + url_input_field.setText(getArguments().getString(Provider.MAIN_URL)); + } final CheckBox danger_checkbox = (CheckBox)new_provider_dialog_view.findViewById(R.id.danger_checkbox); + if(getArguments() != null && getArguments().containsKey(ProviderItem.DANGER_ON)) { + danger_checkbox.setActivated(getArguments().getBoolean(ProviderItem.DANGER_ON)); + } + builder.setView(new_provider_dialog_view) .setMessage(R.string.introduce_new_provider) .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { diff --git a/src/se/leap/bitmaskclient/ProviderAPI.java b/src/se/leap/bitmaskclient/ProviderAPI.java index 2a1cd29b..ff6dd852 100644 --- a/src/se/leap/bitmaskclient/ProviderAPI.java +++ b/src/se/leap/bitmaskclient/ProviderAPI.java @@ -27,6 +27,7 @@ import java.net.CookieManager; import java.net.CookiePolicy; import java.net.MalformedURLException; import java.net.SocketTimeoutException; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; @@ -58,7 +59,6 @@ import org.apache.http.client.ClientProtocolException; import org.jboss.security.srp.SRPParameters; import org.json.JSONException; import org.json.JSONObject; -import org.json.JSONStringer; import se.leap.bitmaskclient.R; import se.leap.bitmaskclient.ProviderListContent.ProviderItem; @@ -69,7 +69,7 @@ import android.os.Handler; import android.os.ResultReceiver; import android.util.Base64; import android.util.Log; -import android.widget.Toast; + /** * Implements HTTP api methods used to manage communications with the provider server. @@ -97,8 +97,8 @@ public class ProviderAPI extends IntentService { SESSION_ID_COOKIE_KEY = "session_id_cookie_key", SESSION_ID_KEY = "session_id", ERRORS = "errors", - UPDATE_PROGRESSBAR = "update_action", - CURRENT_PROGRESS = "update data", + UPDATE_PROGRESSBAR = "update_progressbar", + CURRENT_PROGRESS = "current_progress", TAG = "provider_api_tag" ; @@ -118,6 +118,15 @@ public class ProviderAPI extends IntentService { INCORRECTLY_DOWNLOADED_ANON_CERTIFICATE = 14 ; + private static boolean + CA_CERT_DOWNLOADED = false, + PROVIDER_JSON_DOWNLOADED = false, + EIP_SERVICE_JSON_DOWNLOADED = false + ; + + private static String last_provider_main_url; + private static boolean last_danger_on = false; + public ProviderAPI() { super("ProviderAPI"); Log.v("ClassName", "Provider API"); @@ -130,22 +139,30 @@ public class ProviderAPI extends IntentService { CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER) ); } + public static String lastProviderMainUrl() { + return last_provider_main_url; + } + + public static boolean lastDangerOn() { + return last_danger_on; + } + private String formatErrorMessage(final int toast_string_id) { return "{ \"" + ERRORS + "\" : \""+getResources().getString(toast_string_id)+"\" }"; } @Override protected void onHandleIntent(Intent command) { - final ResultReceiver receiver = command.getParcelableExtra("receiver"); + final ResultReceiver receiver = command.getParcelableExtra(RECEIVER_KEY); String action = command.getAction(); Bundle parameters = command.getBundleExtra(PARAMETERS); if(action.equalsIgnoreCase(SET_UP_PROVIDER)) { Bundle result = setUpProvider(parameters); if(result.getBoolean(RESULT_KEY)) { - receiver.send(PROVIDER_OK, result); + receiver.send(PROVIDER_OK, Bundle.EMPTY); } else { - receiver.send(PROVIDER_NOK, Bundle.EMPTY); + receiver.send(PROVIDER_NOK, result); } } else if (action.equalsIgnoreCase(SRP_AUTH)) { Bundle session_id_bundle = authenticateBySRP(parameters); @@ -343,6 +360,9 @@ public class ProviderAPI extends IntentService { session_idAndM2.put(ConfigHelper.SESSION_ID_COOKIE_KEY, session_id_cookie.getName()); session_idAndM2.put(ConfigHelper.SESSION_ID_KEY, session_id_cookie.getValue());*/ session_idAndM2.put(LeapSRPSession.M2, ConfigHelper.trim(M2_not_trimmed)); + CookieHandler.setDefault(null); // we don't need cookies anymore + String token = json_response.getString(LeapSRPSession.TOKEN); + LeapSRPSession.setToken(token); } return session_idAndM2; } @@ -414,38 +434,85 @@ public class ProviderAPI extends IntentService { return result.toString(); } + + + + /** * Downloads a provider.json from a given URL, adding a new provider using the given name. * @param task containing a boolean meaning if the provider is custom or not, another boolean meaning if the user completely trusts this provider, the provider name and its provider.json url. * @return a bundle with a boolean value mapped to a key named RESULT_KEY, and which is true if the update was successful. */ private Bundle setUpProvider(Bundle task) { - Bundle result = new Bundle(); +//<<<<<<< HEAD +// Bundle result = new Bundle(); +// int progress = 0; +// boolean danger_on = task.getBoolean(ProviderItem.DANGER_ON); +// String provider_main_url = task.getString(Provider.MAIN_URL); +// if(downloadCACert(provider_main_url, danger_on)) { +// broadcast_progress(progress++); +// result.putBoolean(RESULT_KEY, true); +// if(getAndSetProviderJson(provider_main_url)) { +// broadcast_progress(progress++); +// if(getAndSetEipServiceJson()) +// broadcast_progress(progress++); +// } +// } +// return result; +// } +// +// +//======= int progress = 0; - boolean danger_on = task.getBoolean(ProviderItem.DANGER_ON); - String provider_main_url = task.getString(Provider.MAIN_URL); - if(downloadCACert(provider_main_url, danger_on)) { + Bundle current_download = new Bundle(); + + if(task != null && task.containsKey(ProviderItem.DANGER_ON) && task.containsKey(Provider.MAIN_URL)) { + last_danger_on = task.getBoolean(ProviderItem.DANGER_ON); + last_provider_main_url = task.getString(Provider.MAIN_URL); + CA_CERT_DOWNLOADED = PROVIDER_JSON_DOWNLOADED = EIP_SERVICE_JSON_DOWNLOADED = false; + } + + if(!CA_CERT_DOWNLOADED) + current_download = downloadCACert(last_provider_main_url, last_danger_on); + if(CA_CERT_DOWNLOADED || (current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY))) { broadcast_progress(progress++); - result.putBoolean(RESULT_KEY, true); - if(getAndSetProviderJson(provider_main_url)) { + CA_CERT_DOWNLOADED = true; + if(!PROVIDER_JSON_DOWNLOADED) + current_download = getAndSetProviderJson(last_provider_main_url); + if(PROVIDER_JSON_DOWNLOADED || (current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY))) { broadcast_progress(progress++); - if(getAndSetEipServiceJson()) + PROVIDER_JSON_DOWNLOADED = true; + current_download = getAndSetEipServiceJson(); + if(current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY)) { broadcast_progress(progress++); + EIP_SERVICE_JSON_DOWNLOADED = true; + } } } - return result; + + return current_download; } - private boolean downloadCACert(String provider_main_url, boolean danger_on) { + private Bundle downloadCACert(String provider_main_url, boolean danger_on) { + Bundle result = new Bundle(); String cert_string = downloadWithCommercialCA(provider_main_url + "/ca.crt", danger_on); - if(validCertificate(cert_string)) + if(validCertificate(cert_string)) { ConfigHelper.saveSharedPref(Provider.CA_CERT, cert_string); - else - return false; + result.putBoolean(RESULT_KEY, true); + } else { + String reason_to_fail = pickErrorMessage(cert_string); + result.putString(ERRORS, reason_to_fail); + result.putBoolean(RESULT_KEY, false); + } - return true; + return result; } + + public static boolean caCertDownloaded() { + return CA_CERT_DOWNLOADED; + } + private boolean validCertificate(String cert_string) { boolean result = false; if(!ConfigHelper.checkErroneousDownload(cert_string)) { @@ -461,8 +528,8 @@ public class ProviderAPI extends IntentService { return result; } - private boolean getAndSetProviderJson(String provider_main_url) { - boolean result = false; + private Bundle getAndSetProviderJson(String provider_main_url) { + Bundle result = new Bundle(); String provider_dot_json_string = downloadWithProviderCA(provider_main_url + "/provider.json", true); @@ -473,31 +540,67 @@ public class ProviderAPI extends IntentService { ConfigHelper.saveSharedPref(Provider.KEY, provider_json); ConfigHelper.saveSharedPref(EIP.ALLOWED_ANON, provider_json.getJSONObject(Provider.SERVICE).getBoolean(EIP.ALLOWED_ANON)); - ProviderItem added_provider = new ProviderItem(name, provider_main_url); - - result = true; + + result.putBoolean(RESULT_KEY, true); } catch (JSONException e) { + //TODO Error message should be contained in that provider_dot_json_string + String reason_to_fail = pickErrorMessage(provider_dot_json_string); + result.putString(ERRORS, reason_to_fail); + result.putBoolean(RESULT_KEY, false); } return result; } + - private boolean getAndSetEipServiceJson() { - boolean result = false; + public static boolean providerJsonDownloaded() { + return PROVIDER_JSON_DOWNLOADED; + } + private Bundle getAndSetEipServiceJson() { + Bundle result = new Bundle(); + String eip_service_json_string = ""; try { JSONObject provider_json = ConfigHelper.getJsonFromSharedPref(Provider.KEY); String eip_service_url = provider_json.getString(Provider.API_URL) + "/" + provider_json.getString(Provider.API_VERSION) + "/" + EIP.SERVICE_API_PATH; - String eip_service_json_string = downloadWithProviderCA(eip_service_url, true); + eip_service_json_string = downloadWithProviderCA(eip_service_url, true); JSONObject eip_service_json = new JSONObject(eip_service_json_string); eip_service_json.getInt(Provider.API_RETURN_SERIAL); ConfigHelper.saveSharedPref(EIP.KEY, eip_service_json); - result = true; + + result.putBoolean(RESULT_KEY, true); } catch (JSONException e) { + String reason_to_fail = pickErrorMessage(eip_service_json_string); + result.putString(ERRORS, reason_to_fail); + result.putBoolean(RESULT_KEY, false); } return result; } + + public static boolean eipServiceDownloaded() { + return EIP_SERVICE_JSON_DOWNLOADED; + } + + /** + * Interprets the error message as a JSON object and extract the "errors" keyword pair. + * If the error message is not a JSON object, then it is returned untouched. + * @param string_json_error_message + * @return final error message + */ + private String pickErrorMessage(String string_json_error_message) { + String error_message = ""; + try { + JSONObject json_error_message = new JSONObject(string_json_error_message); + error_message = json_error_message.getString(ERRORS); + } catch (JSONException e) { + // TODO Auto-generated catch block + error_message = string_json_error_message; + } + + return error_message; + } + /** * Tries to download the contents of the provided url using commercially validated CA certificate from chosen provider. * @@ -516,6 +619,8 @@ public class ProviderAPI extends IntentService { provider_url = new URL(string_url); URLConnection url_connection = provider_url.openConnection(); url_connection.setConnectTimeout(seconds_of_timeout*1000); + if(!LeapSRPSession.getToken().isEmpty()) + url_connection.addRequestProperty(LeapSRPSession.TOKEN, LeapSRPSession.getToken()); json_file_content = new Scanner(url_connection.getInputStream()).useDelimiter("\\A").next(); } catch (MalformedURLException e) { json_file_content = formatErrorMessage(R.string.malformed_url); @@ -551,6 +656,8 @@ public class ProviderAPI extends IntentService { HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection(); urlConnection.setSSLSocketFactory(getProviderSSLSocketFactory()); + if(!LeapSRPSession.getToken().isEmpty()) + urlConnection.addRequestProperty(LeapSRPSession.TOKEN, LeapSRPSession.getToken()); json_file_content = new Scanner(urlConnection.getInputStream()).useDelimiter("\\A").next(); } catch (CertificateException e) { // TODO Auto-generated catch block @@ -670,6 +777,7 @@ public class ProviderAPI extends IntentService { int responseCode = urlConnection.getResponseCode(); broadcast_progress(progress++); + LeapSRPSession.setToken(""); Log.d("logout", Integer.toString(responseCode)); } catch (ClientProtocolException e) { // TODO Auto-generated catch block @@ -710,11 +818,13 @@ public class ProviderAPI extends IntentService { try { String type_of_certificate = task.getString(ConfigurationWizard.TYPE_OF_CERTIFICATE); JSONObject provider_json = ConfigHelper.getJsonFromSharedPref(Provider.KEY); - URL provider_main_url = new URL(provider_json.getString(Provider.API_URL)); - String new_cert_string_url = provider_main_url.toString() + "/" + provider_json.getString(Provider.API_VERSION) + "/" + EIP.CERTIFICATE; + String provider_main_url = provider_json.getString(Provider.API_URL); + URL new_cert_string_url = new URL(provider_main_url + "/" + provider_json.getString(Provider.API_VERSION) + "/" + EIP.CERTIFICATE); boolean danger_on = ConfigHelper.getBoolFromSharedPref(ProviderItem.DANGER_ON); - String cert_string = downloadWithProviderCA(new_cert_string_url, true); + + String cert_string = downloadWithProviderCA(new_cert_string_url.toString(), danger_on); + if(!cert_string.isEmpty()) { if(ConfigHelper.checkErroneousDownload(cert_string)) { String reason_to_fail = provider_json.getString(ERRORS); diff --git a/src/se/leap/bitmaskclient/ProviderListAdapter.java b/src/se/leap/bitmaskclient/ProviderListAdapter.java index 4abf15a2..c5e8b64d 100644 --- a/src/se/leap/bitmaskclient/ProviderListAdapter.java +++ b/src/se/leap/bitmaskclient/ProviderListAdapter.java @@ -86,6 +86,14 @@ public class ProviderListAdapter<T> extends ArrayAdapter<T> { new_hidden[hidden.length] = false; hidden = new_hidden; } + + @Override + public void remove(T item) { + super.remove(item); + boolean[] new_hidden = new boolean[hidden.length-1]; + System.arraycopy(hidden, 0, new_hidden, 0, hidden.length-1); + hidden = new_hidden; + } @Override public View getView(int index, View convertView, ViewGroup parent) { diff --git a/src/se/leap/bitmaskclient/ProviderListFragment.java b/src/se/leap/bitmaskclient/ProviderListFragment.java index 501da609..45047982 100644 --- a/src/se/leap/bitmaskclient/ProviderListFragment.java +++ b/src/se/leap/bitmaskclient/ProviderListFragment.java @@ -19,7 +19,6 @@ import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
import android.app.Activity;
-import android.app.DialogFragment;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -156,6 +155,11 @@ public class ProviderListFragment extends ListFragment { // Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mCallbacks.onItemSelected(ProviderListContent.ITEMS.get(position).name());
+
+ for(int item_position = 0; item_position < listView.getCount(); item_position++) {
+ if(item_position != position)
+ content_adapter.hide(item_position);
+ }
}
@Override
@@ -192,6 +196,12 @@ public class ProviderListFragment extends ListFragment { mActivatedPosition = position;
}
+ public void removeLastItem() {
+ unhideAll();
+ content_adapter.remove(content_adapter.getItem(content_adapter.getCount()-1));
+ content_adapter.notifyDataSetChanged();
+ }
+
public void addItem(ProviderItem provider) {
content_adapter.add(provider);
content_adapter.notifyDataSetChanged();
@@ -206,7 +216,7 @@ public class ProviderListFragment extends ListFragment { real_count--;
} else {
i++;
- }
+ } }
public void unhideAll() {
diff --git a/src/se/leap/openvpn/OpenVpnService.java b/src/se/leap/openvpn/OpenVpnService.java index 69dd56f4..b5c9c798 100644 --- a/src/se/leap/openvpn/OpenVpnService.java +++ b/src/se/leap/openvpn/OpenVpnService.java @@ -114,7 +114,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac android.app.Notification.Builder nbuilder = new Notification.Builder(this); - nbuilder.setContentTitle(getString(R.string.notifcation_title,mProfile.mName)); + nbuilder.setContentTitle(getString(R.string.notifcation_title,mProfile.mLocation)); nbuilder.setContentText(msg); nbuilder.setOnlyAlertOnce(true); nbuilder.setOngoing(persistant); @@ -482,6 +482,8 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac if (("NOPROCESS".equals(state) ) || ("EXITING").equals(state)){ showNotification(state, getString(R.string.eip_state_not_connected), ticker, false, 0, persist); } + else if (state.equals("GET_CONFIG") || state.equals("ASSIGN_IP")){ //don't show them in the notification message + } else{ persist = true; showNotification(state, getString(resid) +" " + logmessage,ticker,false,0,persist); |