summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.rst26
-rw-r--r--changes/backend-frontend-certificates3
-rw-r--r--changes/bug-6123_forward-right-env-data1
-rw-r--r--changes/bug-6150_better-missing-polkit-msg1
-rw-r--r--changes/bug_6146_handle_removals_release1
-rw-r--r--data/translations/es.qmbin12111 -> 2417 bytes
-rw-r--r--data/translations/es.ts1655
-rw-r--r--data/translations/vi.qmbin32946 -> 14837 bytes
-rw-r--r--data/translations/vi.ts1443
-rw-r--r--data/ts/en_US.ts425
-rw-r--r--pkg/requirements.pip7
-rw-r--r--relnotes.txt116
-rw-r--r--src/leap/bitmask/config/tests/test_providerconfig.py12
-rw-r--r--src/leap/bitmask/crypto/tests/test_srpauth.py60
-rw-r--r--src/leap/bitmask/gui/advanced_key_management.py8
-rw-r--r--src/leap/bitmask/gui/app.py1
-rw-r--r--src/leap/bitmask/gui/eip_preferenceswindow.py6
-rw-r--r--src/leap/bitmask/gui/eip_status.py8
-rw-r--r--src/leap/bitmask/gui/login.py13
-rw-r--r--src/leap/bitmask/gui/mail_status.py12
-rw-r--r--src/leap/bitmask/gui/mainwindow.py200
-rw-r--r--src/leap/bitmask/gui/passwordwindow.py7
-rw-r--r--src/leap/bitmask/gui/preferences_account_page.py3
-rw-r--r--src/leap/bitmask/gui/preferences_vpn_page.py4
-rw-r--r--src/leap/bitmask/gui/preferenceswindow.py2
-rw-r--r--src/leap/bitmask/gui/providers.py1
-rw-r--r--src/leap/bitmask/gui/signaltracker.py1
-rw-r--r--src/leap/bitmask/gui/wizard.py49
-rw-r--r--src/leap/bitmask/provider/providerbootstrapper.py41
-rw-r--r--src/leap/bitmask/provider/tests/test_providerbootstrapper.py3
-rw-r--r--src/leap/bitmask/services/eip/conductor.py5
-rw-r--r--src/leap/bitmask/services/eip/eipbootstrapper.py11
-rw-r--r--src/leap/bitmask/services/eip/eipconfig.py2
-rw-r--r--src/leap/bitmask/util/polkit_agent.py18
34 files changed, 2713 insertions, 1432 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 82b86918..796e5f84 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -3,6 +3,32 @@
History
-------
+2015
+====
+
+0.8.0 January xx -- "Charlie and the code refactory"
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Features
+--------
+- #5873: Allow frontend and backend to be run separately.
+- Refactor login widgets/logic.
+- Improved changelog :).
+
+Bugfixes
+--------
+- #6058: Support 'nobody' (used on Arch) as well as 'nogroup' as group names.
+- #6123: Forward the right environment data to subprocess call.
+- #6150: Do not allow Bitmask to start if there is no polkit agent running.
+- #6631: Fix failing tests.
+- #6638: Fix set initialization to support python 2.6.
+- #6652: Fix regression: polkit agent is not automatically launched.
+- #6654: Login attempt is made against previously selected provider.
+- Create zmq certificates if they don't exist.
+- Disable '--offline' flag temporarily.
+- Make pkg/tuf/release.py handle removals in the repo.
+- Reduce the wait for running threads timeout on quit.
+
2014
====
diff --git a/changes/backend-frontend-certificates b/changes/backend-frontend-certificates
deleted file mode 100644
index 2b3c1990..00000000
--- a/changes/backend-frontend-certificates
+++ /dev/null
@@ -1,3 +0,0 @@
-- Allow frontend and backend to be run separately. Closes #5873.
-- Reduce the wait for running threads timeout on quit.
-- Create zmq certificates if they don't exist.
diff --git a/changes/bug-6123_forward-right-env-data b/changes/bug-6123_forward-right-env-data
deleted file mode 100644
index 10bd8604..00000000
--- a/changes/bug-6123_forward-right-env-data
+++ /dev/null
@@ -1 +0,0 @@
-- Forward the right environment data to subprocess call. Closes #6123.
diff --git a/changes/bug-6150_better-missing-polkit-msg b/changes/bug-6150_better-missing-polkit-msg
deleted file mode 100644
index ee317135..00000000
--- a/changes/bug-6150_better-missing-polkit-msg
+++ /dev/null
@@ -1 +0,0 @@
-- Do not allow Bitmask to start if there is no polkit agent running. Closes #6150.
diff --git a/changes/bug_6146_handle_removals_release b/changes/bug_6146_handle_removals_release
deleted file mode 100644
index 6fe67d62..00000000
--- a/changes/bug_6146_handle_removals_release
+++ /dev/null
@@ -1 +0,0 @@
-- Make pkg/tuf/release.py handle removals in the repo
diff --git a/data/translations/es.qm b/data/translations/es.qm
index d75644ba..596af5b3 100644
--- a/data/translations/es.qm
+++ b/data/translations/es.qm
Binary files differ
diff --git a/data/translations/es.ts b/data/translations/es.ts
index f6102bfa..02f9083a 100644
--- a/data/translations/es.ts
+++ b/data/translations/es.ts
@@ -1,496 +1,1591 @@
-<?xml version="1.0" ?><!DOCTYPE TS><TS language="es" version="2.0">
+<?xml version="1.0" ?><!DOCTYPE TS><TS language="es" version="1.1">
<context>
- <name>MainWindow</name>
+ <name>AdvancedKeyManagement</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="14"/>
+ <source>Advanced Key Management</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="24"/>
+ <source>My key pair</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="30"/>
+ <source>User:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="40"/>
+ <source>user_name@provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="53"/>
+ <source>Key ID:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="63"/>
+ <source>key ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="76"/>
+ <source>Key fingerprint:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="86"/>
+ <source>fingerprint</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="101"/>
+ <source>Export current key pair</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="121"/>
+ <source>Import custom key pair</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="139"/>
+ <source>Stored public keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="164"/>
+ <source>Email</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="169"/>
+ <source>Key ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="119"/>
+ <source>Open keys file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="237"/>
+ <source>Input/Output error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="158"/>
+ <source>There was an error accessing the file.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="169"/>
+ <source>Data mismatch</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="172"/>
+ <source>The public and private key should have the same address and fingerprint.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="183"/>
+ <source>Missing key</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="186"/>
+ <source>You need to provide the public AND private key in the same file.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="197"/>
+ <source>Address mismatch</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="200"/>
+ <source>The identity for the key needs to be the same as your user address.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="144"/>
+ <source>Import Successful</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="145"/>
+ <source>The key pair was imported successfully.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="207"/>
+ <source>Save keys file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="224"/>
+ <source>Export Successful</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="226"/>
+ <source>The key pair was exported successfully.
+Please, store your private key in a safe place.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="239"/>
+ <source>There was an error accessing the file.
+Export canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="59"/>
+ <source>The provider that you are using does not support {0}.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="65"/>
+ <source>To use this, you need to enable/start {0}.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="110"/>
+ <source>&lt;span style=&apos;color:#0000FF;&apos;&gt;NOTE&lt;/span&gt;: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="125"/>
+ <source>Are you sure that you want to replace the current key pair with the imported?</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>App</name>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="592"/>
- <source>Encryption is OFF</source>
- <translation>Cifrado APAGADO</translation>
+ <location filename="../src/leap/bitmask/gui/app.py" line="63"/>
+ <source>Application error</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="155"/>
- <source>Stop</source>
- <translation>Detener</translation>
+ <location filename="../src/leap/bitmask/gui/app.py" line="65"/>
+ <source>There is a problem contacting the backend, please restart Bitmask.</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ComplainDialog</name>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="257"/>
- <source>Hide</source>
- <translation>Ocultar</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="417"/>
+ <source>Ok, thanks</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>EIPPreferencesWindow</name>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="259"/>
- <source>Show</source>
- <translation>Mostrar</translation>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="48"/>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="288"/>
- <source>About LEAP</source>
- <translation>Acerca de LEAP</translation>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="159"/>
+ <source>Gateway settings for provider &apos;{0}&apos; saved.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="288"/>
- <source>LEAP is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. &lt;a href=&quot;https://leap.se&quot;&gt;More about LEAP&lt;/a&gt;</source>
- <translation>LEAP es una empresa sin fines de lucro dedicada a proveer comunicaciones seguras a todos sus usuarios. Nuestro objetivo es la adatación de tecnologías de cifrado para que sean fáciles de utilizar, y estén ampliamente disponibles. &lt;a href=&quot;https://leap.se&quot;&gt;Más acerca de LEAP&lt;/a&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="236"/>
+ <source>There was a problem with configuration files.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="433"/>
- <source>Could not load provider configuration</source>
- <translation>No fue posible cargar la configuración del proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="125"/>
+ <source> (uninitialized)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="459"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="251"/>
+ <source>This is an uninitialized provider, please log in first.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EIPStatus</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="20"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="34"/>
+ <source>Turn On</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="79"/>
+ <source>...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="95"/>
+ <source>Traffic is being routed in the clear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="213"/>
+ <source>0.0 KB/s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="245"/>
+ <source>Turn Off</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="259"/>
+ <source>Cancel</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>EIPStatusWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="429"/>
+ <source>Turn ON</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="569"/>
+ <source>Authenticating...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="578"/>
+ <source>Retrieving configuration...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="580"/>
+ <source>Waiting to start...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="582"/>
+ <source>Assigning IP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="584"/>
+ <source>Reconnecting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="592"/>
+ <source>Unable to start VPN, it&apos;s already running.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="320"/>
+ <source>disabled</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="614"/>
+ <source>{0}: OFF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="317"/>
+ <source>You must login to use {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="619"/>
+ <source>{0}: Starting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="622"/>
+ <source>{0}: ON</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="576"/>
+ <source>Encrypted Internet is starting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="415"/>
+ <source>Retry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="478"/>
+ <source>Traffic is being routed in the clear.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="479"/>
+ <source>Network is unreachable.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="481"/>
+ <source>Error connecting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="497"/>
+ <source>Error connecting.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="500"/>
+ <source>Bitmask is blocking unencrypted traffic.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="644"/>
+ <source>Routing traffic through: &lt;b&gt;{0}&lt;/b&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="690"/>
+ <source>Could not load {0} configuration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="699"/>
+ <source>Another openvpn instance is already running, and could not be stopped.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="709"/>
+ <source>Another openvpn instance is already running, and could not be stopped because it was not launched by Bitmask. Please stop it and try again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="717"/>
+ <source>We could not find openvpn binary.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="754"/>
+ <source>We could not find &lt;b&gt;pkexec&lt;/b&gt; in your system.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="764"/>
+ <source>{0} cannot be started because the tuntap extension is not installed properly in your system.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="784"/>
+ <source>Network is unreachable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="315"/>
+ <source>&lt;font color=red&gt;Disabled: missing helper files&lt;/font&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="731"/>
+ <source>VPN Launcher error. See the logs for more info.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="734"/>
+ <source>Encrypted Internet failed to start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="746"/>
+ <source>We could not find any authentication agent in your system.&lt;br/&gt;Make sure you have &lt;b&gt;polkit-gnome-authentication-agent-1&lt;/b&gt; running and try again.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Form</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/logout.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/logout.ui" line="27"/>
+ <source>...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/logout.ui" line="50"/>
+ <source>Logout</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>LoggerWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="14"/>
+ <source>Logs</source>
+ <translation>Logs</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="49"/>
+ <source>Debug</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="69"/>
+ <source>Info</source>
+ <translation>Info</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="89"/>
+ <source>Warning</source>
+ <translation>Warning</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="109"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="129"/>
+ <source>Critical</source>
+ <translation>Critical</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="149"/>
+ <source>Save to file</source>
+ <translation>Guardar como</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="164"/>
+ <source>Save As</source>
+ <translation>Guardar como</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="24"/>
+ <source>Filter by:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="34"/>
+ <source>Case Insensitive</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="195"/>
+ <source>Send to Pastebin.com</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="192"/>
+ <source>Sending to pastebin...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="207"/>
+ <source>Your pastebin link &lt;a href=&apos;{0}&apos;&gt;{0}&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="212"/>
+ <source>Pastebin OK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="227"/>
+ <source>Sending logs to Pastebin failed!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="233"/>
+ <source>Pastebin Error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="232"/>
+ <source>Maximum posts per day reached</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>LoginWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="26"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="90"/>
+ <source>Remember username and password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="112"/>
+ <source>&lt;b&gt;Username:&lt;/b&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="125"/>
+ <source>&lt;b&gt;Password:&lt;/b&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="208"/>
+ <source>Log In</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="203"/>
+ <source>Cancel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="214"/>
+ <source>...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="314"/>
+ <source>Logout</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="240"/>
<source>Please select a valid provider</source>
- <translation>Por favor, selectione un proveedor válido</translation>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="463"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="245"/>
<source>Please provide a valid username</source>
- <translation>Por favor, provea un nombre de usuario válido</translation>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="467"/>
- <source>Please provide a valid Password</source>
- <translation>Por favor, provea una contraseña válida</translation>
+ <location filename="../src/leap/bitmask/gui/login.py" line="250"/>
+ <source>Please provide a valid password</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="470"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="253"/>
<source>Logging in...</source>
- <translation>Ingresando...</translation>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="549"/>
- <source>Stop EIP</source>
- <translation>Detener EIP</translation>
+ <location filename="../src/leap/bitmask/gui/login.py" line="307"/>
+ <source>Logging out...</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>MailStatusWidget</name>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="558"/>
- <source>EIP has stopped</source>
- <translation>EIP se ha detenido</translation>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="20"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="560"/>
- <source>Start EIP</source>
- <translation>Comenzar EIP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="47"/>
+ <source>You must login to use encrypted email.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="573"/>
- <source>Checking configuration, please wait...</source>
- <translation>Corroborando la configuración, por favor espere...</translation>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="79"/>
+ <source>Email</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="581"/>
- <source>%s does not support EIP</source>
- <translation>%s no soporta EIP</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="196"/>
+ <source>There was an unexpected problem with Soledad.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="596"/>
- <source>Encryption is ON</source>
- <translation>Cifrado ENCENDIDO</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="432"/>
+ <source>OFF</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="614"/>
- <source>VPN: Authenticating...</source>
- <translation>VPN: Autorizando...</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="224"/>
+ <source>Mail is OFF</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="616"/>
- <source>VPN: Retrieving configuration...</source>
- <translation>VPN: Obteniendo configuración...</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
+ <source>Mail is starting</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="618"/>
- <source>VPN: Connected!</source>
- <translation>VPN: Conectado!</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="455"/>
+ <source>ON</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="672"/>
- <source>Signing out...</source>
- <translation>Saliendo...</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="237"/>
+ <source>Mail is ON</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="14"/>
- <source>LEAP</source>
- <translation>LEAP</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="240"/>
+ <source>Mail is disabled</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="80"/>
- <source>Remember</source>
- <translation>Recordar</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="441"/>
+ <source>Starting...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="103"/>
- <source>Login</source>
- <translation>Acceder</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="270"/>
+ <source>Soledad has started...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="123"/>
- <source>&lt;b&gt;Provider:&lt;/b&gt;</source>
- <translation>&lt;b&gt;Proveedor:&lt;/b&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="272"/>
+ <source>Soledad is starting, please wait...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="133"/>
- <source>&lt;b&gt;Password:&lt;/b&gt;</source>
- <translation>&lt;b&gt;Contraseña:&lt;/b&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="312"/>
+ <source>Found key! Starting mail...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="153"/>
- <source>&lt;b&gt;User:&lt;/b&gt;</source>
- <translation>&lt;b&gt;Usuario:&lt;/b&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="317"/>
+ <source>Finished generating key!</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="219"/>
- <source>0.0 Kb</source>
- <translation>0.0 Kb</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="319"/>
+ <source>Starting mail...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="272"/>
- <source>Disconnected</source>
- <translation>Desconectado</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="352"/>
+ <source>SMTP failed to start, check the logs.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="332"/>
- <source>&amp;Session</source>
- <translation>&amp;Sesión</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="409"/>
+ <source>About to start, please wait...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="340"/>
- <source>Help</source>
- <translation>Ayuda</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="416"/>
+ <source>Disabled</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="348"/>
- <source>S&amp;ettings</source>
- <translation>C&amp;onfiguración</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="166"/>
+ <source>{0}: OFF</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="359"/>
- <source>&amp;Sign out</source>
- <translation>&amp;Desconectarse</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="463"/>
+ <source>You must be logged in to use {0}.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="364"/>
- <source>&amp;Quit</source>
- <translation>&amp;Salir</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="315"/>
+ <source>Generating new key, this may take a few minutes.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="392"/>
+ <source>{0} Unread Emails in your Inbox</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="396"/>
+ <source>1 Unread Email in your Inbox</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="448"/>
+ <source>Disconnecting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="474"/>
+ <source>Invalid auth token, try logging in again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="308"/>
+ <source>Initial sync in progress, please wait...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="237"/>
+ <source>There are new updates available, please restart.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="279"/>
+ <source>More...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="889"/>
+ <source>Help</source>
+ <translation>Ayuda</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="369"/>
- <source>About &amp;LEAP</source>
- <translation>Acerca de &amp;LEAP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="345"/>
+ <source>&amp;Quit</source>
+ <translation>&amp;Salir</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="374"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="355"/>
<source>&amp;Help</source>
<translation>&amp;Ayuda</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="379"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="360"/>
<source>&amp;Wizard</source>
<translation>&amp;Asistente</translation>
</message>
<message>
- <location filename="../src/leap/gui/mainwindow.py" line="620"/>
- <source>VPN: Waiting to start...</source>
- <translation>VPN: Esperando para comenzar...</translation>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="744"/>
+ <source> The following components will be updated:
+%s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="747"/>
+ <source>Updates available</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="236"/>
+ <source>Show Main Window</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1650"/>
+ <source>Starting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1674"/>
+ <source>Not supported</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1678"/>
+ <source>Disabled</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="32"/>
+ <source>Bitmask</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/mainwindow.ui" line="176"/>
- <source>Automatically login</source>
- <translation>Ingresar automáticamente</translation>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="350"/>
+ <source>About &amp;Bitmask</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="230"/>
+ <source>Mail is OFF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="735"/>
+ <source>The Bitmask app is ready to update, please restart the application.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1007"/>
+ <source>About Bitmask - %s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1163"/>
+ <source>Unable to login: Problem with provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1342"/>
+ <source>Log in cancelled by the user.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1696"/>
+ <source>There was a problem with the provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1751"/>
+ <source>Something went wrong with the logout.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1718"/>
+ <source>Unable to connect: Problem with provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="314"/>
+ <source>&amp;Bitmask</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="365"/>
+ <source>Show &amp;Log</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="370"/>
+ <source>Create a new account...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="223"/>
+ <source>File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="378"/>
+ <source>Advanced Key Management</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="897"/>
+ <source>OFF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1021"/>
+ <source>Version: &lt;b&gt;%s&lt;/b&gt; (%s)&lt;br&gt;&lt;br&gt;%sBitmask is the Desktop client application for the LEAP platform, supporting encrypted internet proxy, secure email, and secure chat (coming soon).&lt;br&gt;&lt;br&gt;LEAP is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. &lt;br&gt;&lt;br&gt;&lt;a href=&apos;https://leap.se&apos;&gt;More about LEAP&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1068"/>
+ <source>Bitmask Help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1080"/>
+ <source>The current client version is not supported by this provider.&lt;br&gt;Please update to latest version.&lt;br&gt;&lt;br&gt;You can get the latest version from &lt;a href=&apos;{0}&apos;&gt;{1}&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1081"/>
+ <source>Update Needed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1091"/>
+ <source>This provider is not compatible with the client.&lt;br&gt;&lt;br&gt;Error: API version incompatible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1091"/>
+ <source>Incompatible Provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="307"/>
+ <source>Application error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="309"/>
+ <source>You are trying to do an operation that requires logging in first.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="367"/>
+ <source>Unknown error.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="371"/>
+ <source>There was a server problem with authentication.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="375"/>
+ <source>Could not establish a connection.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="379"/>
+ <source>Invalid username or password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="916"/>
+ <source>Hello!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="917"/>
+ <source>Bitmask has started in the tray.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1376"/>
+ <source>Succeeded</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1604"/>
+ <source>The server at {0} can&apos;t be found, because the DNS lookup failed. DNS is the network service that translates a website&apos;s name to its Internet address. Either your computer is having trouble connecting to the network, or you are missing some helper files that are needed to securely use DNS while {1} is active. To install these helper files, quit this application and start it again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1606"/>
+ <source>Connection Error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1863"/>
+ <source>Quitting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1864"/>
+ <source>Bitmask is quitting, please wait.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1035"/>
+ <source>bitmask.net/help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1043"/>
+ <source>Email quick reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1047"/>
+ <source>For Thunderbird, you can use the Bitmask extension. Search for &quot;Bitmask&quot; in the add-on manager or download it from &lt;a href=&apos;{0}&apos;&gt;addons.mozilla.org&lt;/a&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1051"/>
+ <source>Alternately, you can manually configure your mail client to use Bitmask Email with these options:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1051"/>
+ <source>IMAP: localhost, port {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1052"/>
+ <source>SMTP: localhost, port {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1054"/>
+ <source>Username: your full email address</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1056"/>
+ <source>Password: any non-empty text</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1065"/>
+ <source>&lt;p&gt;&lt;strong&gt;{0}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;{1}&lt;/p&gt;&lt;p&gt;{2}&lt;ul&gt;&lt;li&gt;&amp;nbsp;{3}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{4}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{5}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{6}&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1230"/>
+ <source>Stop services</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1230"/>
+ <source>Do you want to stop all services?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1234"/>
+ <source>In order to change the provider, the running services needs to be stopped.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1673"/>
+ <source>Disabled: missing helper files</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="340"/>
+ <source>Pr&amp;eferences...</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
- <name>Wizard</name>
+ <name>PasswordChange</name>
<message>
- <location filename="../src/leap/gui/wizard.py" line="152"/>
- <source>Passwords don&apos;t match</source>
- <translation>Las contraseñas no son iguales</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="20"/>
+ <source>Change Password</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="155"/>
- <source>Password too short</source>
- <translation>Contraseña muy corta</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="28"/>
+ <source>Username:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="158"/>
- <source>Password too easy</source>
- <translation>Contraseña demsiado simple</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="35"/>
+ <source>New password:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="161"/>
- <source>Password equal to username</source>
- <translation>Contraseña es igual al usuario</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="52"/>
+ <source>Re-enter new password:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="189"/>
- <source>Starting registration...</source>
- <translation>Comenzando el registro...</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="62"/>
+ <source>Current password:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="195"/>
- <source>&lt;font color=&apos;green&apos;&gt;&lt;b&gt;User registration OK&lt;/b&gt;&lt;/font&gt;</source>
- <translation>&lt;font color=&apos;green&apos;&gt;&lt;b&gt;Registro realizado con éxito!&lt;/b&gt;&lt;/font&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="112"/>
+ <source>&lt;flash_label&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="202"/>
- <source>Unknown error</source>
- <translation>Error desconocido</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="150"/>
+ <source>Close</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/wizard.py" line="303"/>
- <source>Unable to load provider configuration</source>
- <translation>No fue posible carga la configuración del proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="160"/>
+ <source>OK</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PasswordWindow</name>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="14"/>
- <source>LEAP First run</source>
- <translation>Primera ejecución de LEAP</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="72"/>
+ <source>Please log in to change your password.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="31"/>
- <source>Welcome</source>
- <translation>Bienvenido</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="78"/>
+ <source>Please wait for data storage to be ready.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="34"/>
- <source>This is the LEAP Client first run wizard</source>
- <translation>Este es el asistente de primera ejecución de LEAP</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="107"/>
+ <source>Changing password...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="43"/>
- <source>Log In with my credentials</source>
- <translation>Acceder con mis credenciales</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="122"/>
+ <source>Password changed successfully.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="50"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Now we will guide you through some configuration that is needed before you can connect for the first time.&lt;/p&gt;&lt;p&gt;If you ever need to modify these options again, you can find the wizard in the &lt;span style=&quot; font-style:italic;&quot;&gt;&apos;Settings&apos;&lt;/span&gt; menu from the main window.&lt;/p&gt;&lt;p&gt;Do you want to &lt;span style=&quot; font-weight:600;&quot;&gt;sign up&lt;/span&gt; for a new account, or &lt;span style=&quot; font-weight:600;&quot;&gt;log in&lt;/span&gt; with an already existing username?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ahora le guiaremos para configurar lo necesario para que ud. pueda ingresar por primera vez.&lt;/p&gt;&lt;p&gt;Si necesita alguna vez modificar estas opciones, podrá ejecutar este asistente desde el menú &lt;span style=&quot; font-style:italic;&quot;&gt;&apos;Configuración&apos;&lt;/span&gt; desde la ventana principal.&lt;/p&gt;&lt;p&gt;Desea &lt;span style=&quot; font-weight:600;&quot;&gt;crear&lt;/span&gt; una nueva cuenta, o &lt;span style=&quot; font-weight:600;&quot;&gt;acceder&lt;/span&gt; con un usuario existente?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="167"/>
+ <source>Password is empty.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="63"/>
- <source>Sign up for a new account</source>
- <translation>Crear una nueva cuenta</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="222"/>
+ <source>There was a problem changing the password.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="100"/>
- <source>Provider selection</source>
- <translation>Selección de proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="235"/>
+ <source>You did not enter a correct current password.</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>Preferences</name>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="103"/>
- <source>Please enter the domain of the provider you want to user for your connection</source>
- <translation>Por favor, ingrese el dominio del proveedor que desea utilizar</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="14"/>
+ <source>Preferences</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="128"/>
- <source>https://</source>
- <translation>https://</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="33"/>
+ <source>user@example.org</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="368"/>
- <source>Checking provider</source>
- <translation>Corroborando proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="106"/>
+ <source>Close</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PreferencesAccountPage</name>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="147"/>
- <source>Download provider information</source>
- <translation>Descargando información del proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="154"/>
- <source>HTTPS Connection</source>
- <translation>Conexión HTTPS</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="20"/>
+ <source>Services</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="209"/>
- <source>Name resolution</source>
- <translation>Resolución de nombre</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="32"/>
+ <source>&lt;provider_services_label&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="232"/>
- <source>Check</source>
- <translation>Corroborar</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="61"/>
+ <source>Password</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="253"/>
- <source>Provider Information</source>
- <translation>Información de proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="73"/>
+ <source>Change Password</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="256"/>
- <source>Services offered by this provider</source>
- <translation>Servicios ofrecidos por este proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="80"/>
+ <source>&lt;change_password_label&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="278"/>
- <source>&lt;b&gt;Enrollment policy:&lt;/b&gt;</source>
- <translation>&lt;b&gt;Política de ingreso:&lt;/b&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/preferences_account_page.py" line="62"/>
+ <source>You must be logged in to change your password.</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PreferencesEmailPage</name>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="285"/>
- <source>URL</source>
- <translation>URL</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_email_page.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>PreferencesVpnPage</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="292"/>
- <source>Name</source>
- <translation>Nombre</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="20"/>
+ <source>&lt;flash_label&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="325"/>
- <source>policy</source>
- <translation>política</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="30"/>
+ <source>Default VPN Gateway:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="50"/>
+ <source>You must reconnect for changes to take effect.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="47"/>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="129"/>
+ <source>Error loading configuration file.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="332"/>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="142"/>
+ <source>This is an uninitialized provider, please log in first.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>PreferencesWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="88"/>
+ <source>Account</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="99"/>
+ <source>VPN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="109"/>
+ <source>Email</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ProviderBootstrapper</name>
+ <message>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="154"/>
+ <source>Provider certificate could not be verified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="161"/>
+ <source>Provider does not support HTTPS</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Providers</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/providers.py" line="57"/>
+ <source>Other...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Wizard</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="55"/>
+ <source>Log In with my credentials</source>
+ <translation>Acceder con mis credenciales</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="75"/>
+ <source>Sign up for a new account</source>
+ <translation>Crear una nueva cuenta</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="367"/>
+ <source>Check</source>
+ <translation>Corroborar</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="342"/>
+ <source>https://</source>
+ <translation>https://</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="153"/>
+ <source>Checking for a valid provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="266"/>
+ <source>Can we reach this provider?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="392"/>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="424"/>
<source>Desc</source>
<translation>Desc</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="356"/>
- <source>Provider setup</source>
- <translation>Configuración de proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="434"/>
+ <source>&lt;b&gt;Services offered:&lt;/b&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="359"/>
- <source>Gathering configuration options for this provider</source>
- <translation>Obteniendo opciones de configuración para este proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="444"/>
+ <source>services</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="406"/>
- <source>Download CA Certificate</source>
- <translation>Descargando certificado de autoridad</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="464"/>
+ <source>&lt;b&gt;Enrollment policy:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Política de ingreso:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="413"/>
- <source>Check CA Certificate Fingerprint</source>
- <translation>Corroborando el fingerprint del certificado</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="474"/>
+ <source>policy</source>
+ <translation>política</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="420"/>
- <source>Check API Certificate</source>
- <translation>Corroborando certificado de API</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="494"/>
+ <source>&lt;b&gt;URL:&lt;/b&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="486"/>
- <source>Register new user</source>
- <translation>Registrar un nuevo usuario</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="504"/>
+ <source>URL</source>
+ <translation>URL</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="489"/>
- <source>Register a new user with provider</source>
- <translation>Registrar un nuevo usuario con el proveedor</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="511"/>
+ <source>&lt;b&gt;Description:&lt;/b&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="524"/>
- <source>&lt;b&gt;User:&lt;/b&gt;</source>
- <translation>&lt;b&gt;Usuario:&lt;/b&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="522"/>
+ <source>Provider setup</source>
+ <translation>Configuración de proveedor</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="534"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="570"/>
+ <source>Setting up provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="720"/>
+ <source>Register new user</source>
+ <translation>Registrar un nuevo usuario</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="738"/>
<source>&lt;b&gt;Password:&lt;/b&gt;</source>
<translation>&lt;b&gt;Contraseña:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="553"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="765"/>
<source>&lt;b&gt;Re-enter password:&lt;/b&gt;</source>
<translation>&lt;b&gt;Re-introduzca contraseña:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="563"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="775"/>
<source>Register</source>
<translation>Registrar</translation>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="584"/>
- <source>EIP Setup</source>
- <translation>Configuración de EIP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="821"/>
+ <source>Remember my username and password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="845"/>
+ <source>Service selection</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="132"/>
+ <source>&amp;Next &gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="134"/>
+ <source>Connect</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="325"/>
+ <source>Starting registration...</source>
+ <translation>Comenzando el registro...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="370"/>
+ <source>User %s successfully registered.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="539"/>
+ <source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Non-existent provider&lt;/b&gt;&lt;/font&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="558"/>
+ <source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;%s&lt;/b&gt;&lt;/font&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="586"/>
+ <source>Unable to load provider configuration</source>
+ <translation>No fue posible carga la configuración del proveedor</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="592"/>
+ <source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Not a valid provider&lt;/b&gt;&lt;/font&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="698"/>
+ <source>Something went wrong while trying to load service %s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="166"/>
+ <source>Can we establish a secure connection?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="808"/>
+ <source>&lt;b&gt;Username:&lt;/b&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="296"/>
+ <source>Configure or select a provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="302"/>
+ <source>Configure new provider:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="332"/>
+ <source>Use existing one:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="397"/>
+ <source>Something has gone wrong. Please try again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="411"/>
+ <source>The requested username is taken, choose another.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="677"/>
+ <source>Services by {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="739"/>
+ <source>Register a new user with {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="26"/>
+ <source>Bitmask Provider Setup</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="43"/>
+ <source>Welcome to Bitmask</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="112"/>
+ <source>Choose a provider</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="587"/>
- <source>Setting up Encrypted Internet</source>
- <translation>Configurando Internet Cifrado</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="159"/>
+ <source>Getting provider information.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="609"/>
- <source>Checking EIP</source>
- <translation>Corroborando EIP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="380"/>
+ <source>About this provider</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="615"/>
- <source>Download EIP configuration</source>
- <translation>Descargando configuración de EIP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="547"/>
+ <source>Bitmask is attempting to establish a secure connection with this provider for the first time.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="622"/>
- <source>Download client certificate</source>
- <translation>Descargando certificado de cliente</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="638"/>
+ <source>Fetching provider credentials.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="691"/>
- <source>Congratulations!</source>
- <translation>Felicitaciones!</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="645"/>
+ <source>Do we trust these credentials?</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/gui/ui/wizard.ui" line="694"/>
- <source>You have successfully configured the LEAP client.</source>
- <translation>Ha configurado correctamente el cliente de LEAP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="652"/>
+ <source>Connecting to provider.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
- <name>__impl</name>
+ <name>msg</name>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="161"/>
- <source>Unknown user</source>
- <translation>Usuario desconocido</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="222"/>
+ <source>TAP Driver</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="167"/>
- <source>The server did not send the salt parameter</source>
- <translation>El servidor no ha envíado el parámetro salt</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="229"/>
+ <source>Encrypted Internet uses VPN, which needs a TAP device installed and none has been found. This will ask for administrative privileges.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="171"/>
- <source>The server did not send the B parameter</source>
- <translation>El servidor no ha mandado el parámetro B</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="347"/>
+ <source>TUN Driver</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="199"/>
- <source>The data sent from the server had errors</source>
- <translation>Los datos enviados por el servidor contanían errores</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="355"/>
+ <source>Encrypted Internet uses VPN, which needs a kernel extension for a TUN device installed, and none has been found. This will ask for administrative privileges.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="220"/>
- <source>Could not connect to the server</source>
- <translation>No se pudo conectar al servidor</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="156"/>
+ <source>Problem installing files</source>
+ <translation>Hubo un problema instalando los archivos</translation>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="228"/>
- <source>Wrong password</source>
- <translation>Password incorrecto</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="157"/>
+ <source>Some of the files could not be copied.</source>
+ <translation>Algunos de los archivos no pudieron ser copiados</translation>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="234"/>
- <source>Unknown error (%s)</source>
- <translation>Error desconocido (%s)</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="350"/>
+ <source>Bitmask needs to install the necessary drivers for Encrypted Internet to work. Would you like to proceed?</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="243"/>
- <source>Problem getting data from server</source>
- <translation>Problemas obteniendo datos desde el servidor</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="102"/>
+ <source>Missing helper files</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="264"/>
- <source>Bad data from server</source>
- <translation>Datos incorrectos desde el servidor</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="430"/>
+ <source>Missing Bitmask helpers</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>msgstr</name>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="270"/>
- <source>Auth verification failed</source>
- <translation>Verificación de autenticación falló</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="399"/>
+ <source>Some essential helper files are missing in your system.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/crypto/srpauth.py" line="400"/>
- <source>Succeeded</source>
- <translation>Exitoso!</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="402"/>
+ <source>Reinstall your debian packages, or make sure you place them by hand.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>self._eip_status</name>
+ <message>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="202"/>
+ <source>{0} is restarting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="313"/>
+ <source>{0} could not be launched because you did not authenticate properly.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="327"/>
+ <source>{0} finished in an unexpected manner!</source>
+ <translation type="unfinished"/>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/data/translations/vi.qm b/data/translations/vi.qm
index 819654d6..5ccbdc7c 100644
--- a/data/translations/vi.qm
+++ b/data/translations/vi.qm
Binary files differ
diff --git a/data/translations/vi.ts b/data/translations/vi.ts
index 4d6d343b..6da859e1 100644
--- a/data/translations/vi.ts
+++ b/data/translations/vi.ts
@@ -1,84 +1,221 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="vi" version="1.1">
<context>
- <name>EIPPreferences</name>
+ <name>AdvancedKeyManagement</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="14"/>
- <source>EIP Preferences</source>
- <translation>Tùy biến EIP</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="14"/>
+ <source>Advanced Key Management</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="27"/>
- <source>Select gateway for provider</source>
- <translation>Chọn gateway cho nhà cung cấp</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="24"/>
+ <source>My key pair</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="36"/>
- <source>&amp;Select provider:</source>
- <translation>&amp;Chọn nhà cung cấp:</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="30"/>
+ <source>User:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="140"/>
- <source>&lt;Select provider&gt;</source>
- <translation>&lt;Chọn nhà cung cấp&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="40"/>
+ <source>user_name@provider</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="55"/>
- <source>Save this provider settings</source>
- <translation>Chọn thiết lập cho nhà cung cấp này</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="53"/>
+ <source>Key ID:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="62"/>
- <source>&lt; Providers Gateway Status &gt;</source>
- <translation>&lt;Trạng thái gateway của nhà cung cấp&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="63"/>
+ <source>key ID</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="72"/>
- <source>Select gateway:</source>
- <translation>Chọn gateway:</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="76"/>
+ <source>Key fingerprint:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="80"/>
- <source>Automatic</source>
- <translation>Tự động</translation>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="86"/>
+ <source>fingerprint</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="101"/>
+ <source>Export current key pair</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="121"/>
+ <source>Import custom key pair</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="139"/>
+ <source>Stored public keys</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="164"/>
+ <source>Email</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/advanced_key_management.ui" line="169"/>
+ <source>Key ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="119"/>
+ <source>Open keys file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="237"/>
+ <source>Input/Output error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="158"/>
+ <source>There was an error accessing the file.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="169"/>
+ <source>Data mismatch</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="172"/>
+ <source>The public and private key should have the same address and fingerprint.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="183"/>
+ <source>Missing key</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="186"/>
+ <source>You need to provide the public AND private key in the same file.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="197"/>
+ <source>Address mismatch</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="200"/>
+ <source>The identity for the key needs to be the same as your user address.
+Import canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="144"/>
+ <source>Import Successful</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="145"/>
+ <source>The key pair was imported successfully.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="207"/>
+ <source>Save keys file</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="224"/>
+ <source>Export Successful</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="226"/>
+ <source>The key pair was exported successfully.
+Please, store your private key in a safe place.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="239"/>
+ <source>There was an error accessing the file.
+Export canceled.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="59"/>
+ <source>The provider that you are using does not support {0}.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="65"/>
+ <source>To use this, you need to enable/start {0}.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="110"/>
+ <source>&lt;span style=&apos;color:#0000FF;&apos;&gt;NOTE&lt;/span&gt;: </source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="91"/>
- <source>Automatic EIP start</source>
- <translation>Tự động khởi động EIP</translation>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="125"/>
+ <source>Are you sure that you want to replace the current key pair with the imported?</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>App</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="109"/>
- <source>&lt;font color=&apos;green&apos;&gt;&lt;b&gt;Automatic EIP start saved!&lt;/b&gt;&lt;/font&gt;</source>
- <translation>&lt;font color=&apos;green&apos;&gt;&lt;b&gt;Đã lưu lại phần tự động khởi động EIP!&lt;/b&gt;&lt;/font&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/app.py" line="63"/>
+ <source>Application error</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="119"/>
- <source>Save auto start setting</source>
- <translation>Lưu lại thiết lập về tự động khởi động</translation>
+ <location filename="../src/leap/bitmask/gui/app.py" line="65"/>
+ <source>There is a problem contacting the backend, please restart Bitmask.</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>ComplainDialog</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="129"/>
- <source>Enable Automatic start of EIP</source>
- <translation>Tự động cho phép khởi động của EIP</translation>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="417"/>
+ <source>Ok, thanks</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>EIPPreferencesWindow</name>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="47"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="48"/>
<source>Automatic</source>
<translation>Tự động</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="156"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="159"/>
<source>Gateway settings for provider &apos;{0}&apos; saved.</source>
<translation>Thiết lập gateway dành cho nhà cung cấp &apos;{0}&apos; đã được lưu lại.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="198"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="236"/>
<source>There was a problem with configuration files.</source>
<translation>Xảy ra lỗi với tập tin cấu hình.</translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="125"/>
+ <source> (uninitialized)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="251"/>
+ <source>This is an uninitialized provider, please log in first.</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>EIPStatus</name>
@@ -88,107 +225,210 @@
<translation>Đơn mẫu</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="31"/>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="34"/>
<source>Turn On</source>
<translation>Mở lên</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="63"/>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="79"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="86"/>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="95"/>
<source>Traffic is being routed in the clear</source>
<translation>Lưu lượng mạng đang được điều hướng rỗng</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="253"/>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="213"/>
<source>0.0 KB/s</source>
<translation>0.0 KB/giây</translation>
</message>
-</context>
-<context>
- <name>EIPStatusWidget</name>
- <message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="191"/>
- <source>All services are OFF</source>
- <translation>Tất cả các dịch vụ hiện đang bị TẮT</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="197"/>
- <source>Encrypted Internet: {0}</source>
- <translation>Internet đã được mã hóa: {0}</translation>
- </message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="249"/>
- <source>You must login to use Encrypted Internet</source>
- <translation>Bạn phải đăng nhập để sử dụng phần mã hóa internet</translation>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="245"/>
+ <source>Turn Off</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="300"/>
- <source>Turn OFF</source>
- <translation>Bật TẮT</translation>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="259"/>
+ <source>Cancel</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>EIPStatusWidget</name>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="314"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="429"/>
<source>Turn ON</source>
<translation>Bật LÊN</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="321"/>
- <source>Traffic is being routed in the clear</source>
- <translation>Lưu lượng mạng đang được điều hướng rỗng</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="378"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="569"/>
<source>Authenticating...</source>
<translation>Đang xác nhận...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="380"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="578"/>
<source>Retrieving configuration...</source>
<translation>Đang đọc lại cấu hình...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="382"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="580"/>
<source>Waiting to start...</source>
<translation>Đang đợi để bắt đầu...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="384"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="582"/>
<source>Assigning IP</source>
<translation>Đang gán IP</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="386"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="584"/>
<source>Reconnecting...</source>
<translation>Đang thực hiện việc kết nối lại...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="395"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="592"/>
<source>Unable to start VPN, it&apos;s already running.</source>
<translation>Không thể khởi động VPN, phần VPN này đã được chạy.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="418"/>
- <source>Encrypted Internet: OFF</source>
- <translation>Chức năng mã hóa internet: TẮT</translation>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="320"/>
+ <source>disabled</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="614"/>
+ <source>{0}: OFF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="317"/>
+ <source>You must login to use {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="619"/>
+ <source>{0}: Starting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="622"/>
+ <source>{0}: ON</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="576"/>
+ <source>Encrypted Internet is starting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="415"/>
+ <source>Retry</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="423"/>
- <source>Encrypted Internet: Starting...</source>
- <translation>Mã hóa internet: Đang bắt đầu...</translation>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="478"/>
+ <source>Traffic is being routed in the clear.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="425"/>
- <source>Encrypted Internet: ON</source>
- <translation>Mã hóa internet: MỞ</translation>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="479"/>
+ <source>Network is unreachable.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="481"/>
+ <source>Error connecting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="497"/>
+ <source>Error connecting.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="500"/>
+ <source>Bitmask is blocking unencrypted traffic.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="644"/>
+ <source>Routing traffic through: &lt;b&gt;{0}&lt;/b&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="690"/>
+ <source>Could not load {0} configuration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="699"/>
+ <source>Another openvpn instance is already running, and could not be stopped.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="709"/>
+ <source>Another openvpn instance is already running, and could not be stopped because it was not launched by Bitmask. Please stop it and try again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="717"/>
+ <source>We could not find openvpn binary.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="754"/>
+ <source>We could not find &lt;b&gt;pkexec&lt;/b&gt; in your system.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="764"/>
+ <source>{0} cannot be started because the tuntap extension is not installed properly in your system.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="784"/>
+ <source>Network is unreachable</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="435"/>
- <source>Route traffic through: {0}</source>
- <translation>Điều hướng lưu lượng mạng qua: {0}</translation>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="315"/>
+ <source>&lt;font color=red&gt;Disabled: missing helper files&lt;/font&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="731"/>
+ <source>VPN Launcher error. See the logs for more info.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="734"/>
+ <source>Encrypted Internet failed to start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="746"/>
+ <source>We could not find any authentication agent in your system.&lt;br/&gt;Make sure you have &lt;b&gt;polkit-gnome-authentication-agent-1&lt;/b&gt; running and try again.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>Form</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/logout.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/logout.ui" line="27"/>
+ <source>...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/logout.ui" line="50"/>
+ <source>Logout</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -229,7 +469,7 @@
<translation>Lưu vào tập tin</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="148"/>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="164"/>
<source>Save As</source>
<translation>Lưu dưới dạng</translation>
</message>
@@ -243,6 +483,41 @@
<source>Case Insensitive</source>
<translation>Phân biệt chữ hoa chữ thường</translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="195"/>
+ <source>Send to Pastebin.com</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="192"/>
+ <source>Sending to pastebin...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="207"/>
+ <source>Your pastebin link &lt;a href=&apos;{0}&apos;&gt;{0}&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="212"/>
+ <source>Pastebin OK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="227"/>
+ <source>Sending logs to Pastebin failed!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="233"/>
+ <source>Pastebin Error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="232"/>
+ <source>Maximum posts per day reached</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>LoginWidget</name>
@@ -252,74 +527,64 @@
<translation>Biểu mẫu</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="153"/>
- <source>&lt;b&gt;Provider:&lt;/b&gt;</source>
- <translation>&lt;b&gt;Nhà cung cấp:&lt;/b&gt;</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="172"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="90"/>
<source>Remember username and password</source>
<translation>Ghi nhớ tên người dùng và mật khẩu</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="197"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="112"/>
<source>&lt;b&gt;Username:&lt;/b&gt;</source>
<translation>&lt;b&gt;Tên người dùng:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="210"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="125"/>
<source>&lt;b&gt;Password:&lt;/b&gt;</source>
<translation>&lt;b&gt;Mật khẩu:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="234"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="208"/>
<source>Log In</source>
<translation>Đăng nhập</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="121"/>
- <source>Other...</source>
- <translation>Các phần khác...</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/login.py" line="229"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="203"/>
<source>Cancel</source>
<translation>Hủy bỏ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="63"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="214"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="365"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="314"/>
<source>Logout</source>
<translation>Đăng xuất</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="283"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="240"/>
<source>Please select a valid provider</source>
<translation>Vui lòng chọn một nhà cung cấp hợp lệ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="288"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="245"/>
<source>Please provide a valid username</source>
<translation>Vui lòng cung cấp một tên người dùng hợp lệ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="293"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="250"/>
<source>Please provide a valid password</source>
<translation>Xin vui lòng cung cấp một mật khẩu hợp lệ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="296"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="253"/>
<source>Logging in...</source>
<translation>Đang đăng nhập...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="358"/>
- <source>Loggin out...</source>
- <translation>Đang Đăng xuất...</translation>
+ <location filename="../src/leap/bitmask/gui/login.py" line="307"/>
+ <source>Logging out...</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -330,364 +595,525 @@
<translation>Biểu mẫu</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="31"/>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="47"/>
<source>You must login to use encrypted email.</source>
<translation>Bạn phải đăng nhập để sử dụng email được mã hóa.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="44"/>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="79"/>
<source>Email</source>
<translation>Email</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="171"/>
- <source>All services are OFF</source>
- <translation>Tất cả các dịch vụ hiện đang bị TẮT</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="204"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="196"/>
<source>There was an unexpected problem with Soledad.</source>
<translation>Xảy ra lỗi với phần Soledad.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="418"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="432"/>
<source>OFF</source>
<translation>TẮT</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="221"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="224"/>
<source>Mail is OFF</source>
<translation>Tắt tính năng mail</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="224"/>
- <source>You must be logged in to use encrypted email.</source>
- <translation>Bạn phải đăng nhập để sử dụng dịch vụ email mã hóa.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="228"/>
- <source>Starting..</source>
- <translation>Đang khởi chạy...</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="229"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
<source>Mail is starting</source>
<translation>Mail đang được bắt đầu</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="383"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="455"/>
<source>ON</source>
<translation>MỞ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="237"/>
<source>Mail is ON</source>
<translation>Mail hiện đang MỞ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="236"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="240"/>
<source>Mail is disabled</source>
<translation>Mail hiện đang bị vô hiệu hóa</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="298"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="441"/>
<source>Starting...</source>
<translation>Đang khởi chạy...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="265"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="270"/>
<source>Soledad has started...</source>
<translation>Soledad đã được khởi chạy...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="267"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="272"/>
<source>Soledad is starting, please wait...</source>
<translation>Soledad hiện đang khởi động, xin vui lòng chờ trong giây lát..</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="304"/>
- <source>Looking for key for this user</source>
- <translation>Đang tìm kiếm phần khóa dữ liệu đối với người dùng này</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="308"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="312"/>
<source>Found key! Starting mail...</source>
<translation>Đã tìm thấy khóa! Đang khởi động mail...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="310"/>
- <source>Generating new key, please wait...</source>
- <translation>Đang tạo các khóa mới, xin vui lòng đợi trong giây lát...</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="312"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="317"/>
<source>Finished generating key!</source>
<translation>Đã hoàn tất thao tác tạo các khóa dữ liệu!</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="314"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="319"/>
<source>Starting mail...</source>
<translation>Đang khởi động mail...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="344"/>
- <source>SMTP has started...</source>
- <translation>Dịch vụ SMTP đã được bắt đầu...</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="350"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="352"/>
<source>SMTP failed to start, check the logs.</source>
<translation>Không thể khởi động dịch vụ SMTP, kiểm tra nhật trình.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="387"/>
- <source>Failed</source>
- <translation>Gặp lỗi</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="409"/>
+ <source>About to start, please wait...</source>
+ <translation>Chuẩn bị khởi chạy, xin vui lòng đợi trong giây lát...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="381"/>
- <source>IMAP has started...</source>
- <translation>Dịch vụ IMAP đã được bắt đầu...</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="416"/>
+ <source>Disabled</source>
+ <translation>Vô Hiệu Hóa</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="387"/>
- <source>IMAP failed to start, check the logs.</source>
- <translation>Không thể khởi động dịch vụ IMAP, kiểm tra phần nhật trình.</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="166"/>
+ <source>{0}: OFF</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="391"/>
- <source>%s Unread Emails</source>
- <translation>%s email chưa đọc</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="463"/>
+ <source>You must be logged in to use {0}.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="405"/>
- <source>About to start, please wait...</source>
- <translation>Chuẩn bị khởi chạy, xin vui lòng đợi trong giây lát...</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="315"/>
+ <source>Generating new key, this may take a few minutes.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="412"/>
- <source>Disabled</source>
- <translation>Vô Hiệu Hóa</translation>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="392"/>
+ <source>{0} Unread Emails in your Inbox</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="396"/>
+ <source>1 Unread Email in your Inbox</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="448"/>
+ <source>Disconnecting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="474"/>
+ <source>Invalid auth token, try logging in again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="308"/>
+ <source>Initial sync in progress, please wait...</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="257"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="237"/>
<source>There are new updates available, please restart.</source>
<translation>Hiện có một phiên bản mới vừa được phát hành, xin vui lòng khởi động lại.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="299"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="279"/>
<source>More...</source>
<translation>Thêm...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="626"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="889"/>
<source>Help</source>
<translation>Trợ giúp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="360"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="345"/>
<source>&amp;Quit</source>
<translation>&amp;Thoát</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="370"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="355"/>
<source>&amp;Help</source>
<translation>&amp;Trợ giúp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="375"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="360"/>
<source>&amp;Wizard</source>
<translation>&amp;Phần hướng dẫn</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="672"/>
- <source>Hide Main Window</source>
- <translation>Ẩn cửa sổ chính</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="527"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="744"/>
<source> The following components will be updated:
%s</source>
<translation>Các thành phần sau đây sẽ được cập nhật:
%s</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="530"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="747"/>
<source>Updates available</source>
<translation>Đã có phiên bản mới</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="671"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="236"/>
<source>Show Main Window</source>
<translation>Hiện cửa sổ chính</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1314"/>
- <source>We could not find any authentication agent in your system.&lt;br/&gt;Make sure you have &lt;b&gt;polkit-gnome-authentication-agent-1&lt;/b&gt; running and try again.</source>
- <translation>Chúng tôi không tìm thấy phần trợ lý xác nhận nào trong hệ thống của bạn.&lt;br/&gt;Hãy chắc chắn rằng bạn có&lt;b&gt;phần polkit-gnome-authentication-agent-1&lt;/b&gt; đang được chạy và hãy thử lại lần nữa.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1326"/>
- <source>We could not find &lt;b&gt;pkexec&lt;/b&gt; in your system.</source>
- <translation>Chúng tôi không tìm thấy &lt;b&gt;pkexec&lt;/b&gt; trong hệ thống của bạn.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1331"/>
- <source>We could not find openvpn binary.</source>
- <translation>Không tìm thấy phần nhị phân của openconnect.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1493"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1650"/>
<source>Starting...</source>
<translation>Đang khởi chạy...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1501"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1674"/>
<source>Not supported</source>
<translation>Không được hỗ trợ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1504"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1678"/>
<source>Disabled</source>
<translation>Vô Hiệu Hóa</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1537"/>
- <source>Could not load Encrypted Internet Configuration.</source>
- <translation>Không thể nạp mã hóa cấu hình của Internet.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1459"/>
- <source>Encrypted Internet could not be launched because you did not authenticate properly.</source>
- <translation>Không thể chạy được phần mã hóa Internet vì bạn đã không được xác thực đúng cách.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1467"/>
- <source>Encrypted Internet finished in an unexpected manner!</source>
- <translation>Tiến trình mã hóa Internet đã được hoàn tất một cách bất ngờ!</translation>
- </message>
- <message>
<location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="32"/>
<source>Bitmask</source>
<translation>Bitmask</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="365"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="350"/>
<source>About &amp;Bitmask</source>
<translation>Dịch bởi Vietnamesel10n</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="283"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="230"/>
<source>Mail is OFF</source>
<translation>Tắt tính năng mail</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="518"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="735"/>
<source>The Bitmask app is ready to update, please restart the application.</source>
<translation>Bitmask hiện đã sẵn sàng để cài đặt bản cập nhật mới, vui lòng khởi động khởi động lại ứng dụng.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="734"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1007"/>
<source>About Bitmask - %s</source>
<translation>Thông tin về Bitmask - %s</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="748"/>
- <source>Version: &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;&lt;br&gt;Bitmask is the Desktop client application for the LEAP platform, supporting encrypted internet proxy, secure email, and secure chat (coming soon).&lt;br&gt;&lt;br&gt;LEAP is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. &lt;br&gt;&lt;br&gt;&lt;a href=&apos;https://leap.se&apos;&gt;More about LEAP&lt;/a&gt;</source>
- <translation>Phiên bản: &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;&lt;br&gt;Bitmask là một chương trình trên nền desktop dựa trên nền tảng LEAP, hỗ trợ proxy trên internet được mã hóa, bảo mật email, và bảo mật các nội dung chat (tính năng này hiện đang được phát triển và sẽ được phát hành trong phiên bản sắp tới).&lt;br&gt;&lt;br&gt;LEAP là một nền tảng phi lợi nhuận nhằm cung cấp cho người dùng tính năng bảo mật khi giao tiếp trên các hệ thống internet. Mục tiêu của chúng tôi là đưa các kỹ thuật mã hóa đến với người dùng theo cách dễ sử dụng nhất. &lt;br&gt;&lt;br&gt;&lt;a href=&apos;https://leap.se&apos;&gt;Thông tin thêm về LEAP&lt;/a&gt;</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="836"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1163"/>
<source>Unable to login: Problem with provider</source>
<translation>Không thể đăng nhập: Xảy ra lỗi với nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="874"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1342"/>
<source>Log in cancelled by the user.</source>
<translation>Người dùng đã hủy bỏ thao tác đăng nhập.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1321"/>
- <source>Encrypted Internet cannot be started because the tuntap extension is not installed properly in your system.</source>
- <translation>Không thể khởi động phần mã hóa dành cho Internet vì phần tiện ích tuntap vẫn chưa được cài đặt trên hệ thống của bạn.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1337"/>
- <source>Another openvpn instance is already running, and could not be stopped.</source>
- <translation>Một tiến trình khác thuộc openvpn hiện đang được thực thi, và không thể bị dừng lại</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1344"/>
- <source>Another openvpn instance is already running, and could not be stopped because it was not launched by Bitmask. Please stop it and try again.</source>
- <translation>Một tiếng trình khác thuộc openvpn hiện đang được thực thi và không thể được dừng lại vì đây là tiến trình được sử dụng bởi Bitmask. Xin vui lòng thử thao tác dừng lại và thử lại</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1519"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1696"/>
<source>There was a problem with the provider</source>
<translation>Xảy ra lỗi với nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1618"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1751"/>
<source>Something went wrong with the logout.</source>
<translation>Xảy ra lỗi với thao tác đăng xuất.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1639"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1718"/>
<source>Unable to connect: Problem with provider</source>
<translation>Không thể kết nối: Xảy ra lỗi với nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="113"/>
- <source>Encrypted Internet</source>
- <translation>Internet đã được mã hóa</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="194"/>
- <source>Login</source>
- <translation>Đăng nhập</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="334"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="314"/>
<source>&amp;Bitmask</source>
<translation>&amp;Bitmask</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="355"/>
- <source>Preferences...</source>
- <translation>Tùy Biến...</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="380"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="365"/>
<source>Show &amp;Log</source>
<translation>Hiển thị &amp;nhật trình</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="385"/>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="370"/>
<source>Create a new account...</source>
<translation>Tạo một tài khoản mới...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="272"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="223"/>
<source>File</source>
<translation>Tập tin</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="633"/>
- <source>Encrypted Internet: OFF</source>
- <translation>Chức năng mã hóa internet: TẮT</translation>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="378"/>
+ <source>Advanced Key Management</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1395"/>
- <source>Network is unreachable</source>
- <translation>Không thể truy cập mạng</translation>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="897"/>
+ <source>OFF</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1021"/>
+ <source>Version: &lt;b&gt;%s&lt;/b&gt; (%s)&lt;br&gt;&lt;br&gt;%sBitmask is the Desktop client application for the LEAP platform, supporting encrypted internet proxy, secure email, and secure chat (coming soon).&lt;br&gt;&lt;br&gt;LEAP is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. &lt;br&gt;&lt;br&gt;&lt;a href=&apos;https://leap.se&apos;&gt;More about LEAP&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1068"/>
+ <source>Bitmask Help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1080"/>
+ <source>The current client version is not supported by this provider.&lt;br&gt;Please update to latest version.&lt;br&gt;&lt;br&gt;You can get the latest version from &lt;a href=&apos;{0}&apos;&gt;{1}&lt;/a&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1081"/>
+ <source>Update Needed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1091"/>
+ <source>This provider is not compatible with the client.&lt;br&gt;&lt;br&gt;Error: API version incompatible.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1091"/>
+ <source>Incompatible Provider</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="307"/>
+ <source>Application error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="309"/>
+ <source>You are trying to do an operation that requires logging in first.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="367"/>
+ <source>Unknown error.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="371"/>
+ <source>There was a server problem with authentication.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="375"/>
+ <source>Could not establish a connection.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="379"/>
+ <source>Invalid username or password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="916"/>
+ <source>Hello!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="917"/>
+ <source>Bitmask has started in the tray.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1376"/>
+ <source>Succeeded</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1604"/>
+ <source>The server at {0} can&apos;t be found, because the DNS lookup failed. DNS is the network service that translates a website&apos;s name to its Internet address. Either your computer is having trouble connecting to the network, or you are missing some helper files that are needed to securely use DNS while {1} is active. To install these helper files, quit this application and start it again.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1606"/>
+ <source>Connection Error</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1863"/>
+ <source>Quitting...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1864"/>
+ <source>Bitmask is quitting, please wait.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1035"/>
+ <source>bitmask.net/help</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1043"/>
+ <source>Email quick reference</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1047"/>
+ <source>For Thunderbird, you can use the Bitmask extension. Search for &quot;Bitmask&quot; in the add-on manager or download it from &lt;a href=&apos;{0}&apos;&gt;addons.mozilla.org&lt;/a&gt;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1051"/>
+ <source>Alternately, you can manually configure your mail client to use Bitmask Email with these options:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1051"/>
+ <source>IMAP: localhost, port {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1052"/>
+ <source>SMTP: localhost, port {0}</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1054"/>
+ <source>Username: your full email address</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1056"/>
+ <source>Password: any non-empty text</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1065"/>
+ <source>&lt;p&gt;&lt;strong&gt;{0}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;{1}&lt;/p&gt;&lt;p&gt;{2}&lt;ul&gt;&lt;li&gt;&amp;nbsp;{3}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{4}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{5}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{6}&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1230"/>
+ <source>Stop services</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1230"/>
+ <source>Do you want to stop all services?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1234"/>
+ <source>In order to change the provider, the running services needs to be stopped.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1673"/>
+ <source>Disabled: missing helper files</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="340"/>
+ <source>Pr&amp;eferences...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>PasswordChange</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="20"/>
+ <source>Change Password</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="28"/>
+ <source>Username:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="35"/>
+ <source>New password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="52"/>
+ <source>Re-enter new password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="62"/>
+ <source>Current password:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="112"/>
+ <source>&lt;flash_label&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="150"/>
+ <source>Close</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/password_change.ui" line="160"/>
+ <source>OK</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>PasswordWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="72"/>
+ <source>Please log in to change your password.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="78"/>
+ <source>Please wait for data storage to be ready.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="107"/>
+ <source>Changing password...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="122"/>
+ <source>Password changed successfully.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="167"/>
+ <source>Password is empty.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="222"/>
+ <source>There was a problem changing the password.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1418"/>
- <source>EIP has stopped</source>
- <translation>EIP đã dừng lại</translation>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="235"/>
+ <source>You did not enter a correct current password.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -698,159 +1124,158 @@
<translation>Tùy Biến</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="40"/>
- <source>Password Change</source>
- <translation>Thay đổi mật khẩu</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="33"/>
+ <source>user@example.org</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="49"/>
- <source>&amp;Current password:</source>
- <translation>&amp;Mật khẩu hiện tại:</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="106"/>
+ <source>Close</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PreferencesAccountPage</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="66"/>
- <source>&amp;New password:</source>
- <translation>&amp;Mật khẩu mới:</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="83"/>
- <source>&amp;Re-enter new password:</source>
- <translation>&amp;Nhập lại mật khẩu:</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="20"/>
+ <source>Services</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="100"/>
- <source>Change</source>
- <translation>Thay đổi</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="32"/>
+ <source>&lt;provider_services_label&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="107"/>
- <source>&lt;Password change status&gt;</source>
- <translation>&lt;Trạng thái thay đổi mật khẩu&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="61"/>
+ <source>Password</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="120"/>
- <source>Enabled services</source>
- <translation>Các dịch vụ đã được cho phép</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="73"/>
+ <source>Change Password</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="126"/>
- <source>Save this provider settings</source>
- <translation>Lưu lại thiết lập dành cho nhà cung cấp này</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_account_page.ui" line="80"/>
+ <source>&lt;change_password_label&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="133"/>
- <source>Services</source>
- <translation>Dịch vụ</translation>
+ <location filename="../src/leap/bitmask/gui/preferences_account_page.py" line="62"/>
+ <source>You must be logged in to change your password.</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PreferencesEmailPage</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="149"/>
- <source>&lt;Select provider&gt;</source>
- <translation>&lt;Chọn nhà cung cấp&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_email_page.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PreferencesVpnPage</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="157"/>
- <source>Select provider:</source>
- <translation>Chọn nhà cung cấp:</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="164"/>
- <source>&lt; Providers Services Status &gt;</source>
- <translation>&lt;Trạng thái dịch vụ từ nhà cung cấp&gt;</translation>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="20"/>
+ <source>&lt;flash_label&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="30"/>
+ <source>Default VPN Gateway:</source>
+ <translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>PreferencesWindow</name>
<message>
- <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="53"/>
+ <location filename="../src/leap/bitmask/gui/ui/preferences_vpn_page.ui" line="50"/>
+ <source>You must reconnect for changes to take effect.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="47"/>
<source>Automatic</source>
- <translation>Tự động</translation>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="115"/>
- <source>Changing password...</source>
- <translation>Đang thay đổi mật khẩu...</translation>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="129"/>
+ <source>Error loading configuration file.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="166"/>
- <source>Password changed successfully.</source>
- <translation>Đã thay đổi thành công mật khẩu.</translation>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="142"/>
+ <source>This is an uninitialized provider, please log in first.</source>
+ <translation type="unfinished"/>
</message>
+</context>
+<context>
+ <name>PreferencesWindow</name>
<message>
- <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="181"/>
- <source>There was a problem changing the password.</source>
- <translation>Xảy ra lỗi với tiến trình thay đổi mật khẩu.</translation>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="88"/>
+ <source>Account</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="184"/>
- <source>You did not enter a correct current password.</source>
- <translation>Bjan chưa điền vào chính xác mật khẩu hiện tại.</translation>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="99"/>
+ <source>VPN</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="317"/>
- <source>Services settings for provider &apos;{0}&apos; saved.</source>
- <translation>Đã lưu lại thông tin về thiết lập của dịch vụ từ nhà cung cấp &apos;{0}&apos;</translation>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="109"/>
+ <source>Email</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>ProviderBootstrapper</name>
<message>
- <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="137"/>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="154"/>
<source>Provider certificate could not be verified</source>
<translation>Không thể xác nhận nơi cung cấp chứng chỉ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="144"/>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="161"/>
<source>Provider does not support HTTPS</source>
<translation>Nhà cung cấp không hỗ trợ HTTPS</translation>
</message>
</context>
<context>
- <name>SRPAuth</name>
+ <name>Providers</name>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="711"/>
- <source>Succeeded</source>
- <translation>Đã thành công</translation>
+ <location filename="../src/leap/bitmask/gui/providers.py" line="57"/>
+ <source>Other...</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>Wizard</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="43"/>
- <source>Welcome</source>
- <translation>Chào mừng bạn</translation>
- </message>
- <message>
<location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="55"/>
<source>Log In with my credentials</source>
<translation>Đăng nhập với thông tin đăng nhập của tôi</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="62"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Now we will guide you through some configuration that is needed before you can connect for the first time.&lt;/p&gt;&lt;p&gt;If you ever need to modify these options again, you can find the wizard in the &lt;span style=&quot; font-style:italic;&quot;&gt;&apos;Settings&apos;&lt;/span&gt; menu from the main window.&lt;/p&gt;&lt;p&gt;Do you want to &lt;span style=&quot; font-weight:600;&quot;&gt;sign up&lt;/span&gt; for a new account, or &lt;span style=&quot; font-weight:600;&quot;&gt;log in&lt;/span&gt; with an already existing username?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;Bây giờ chúng tôi sẽ hướng dẫn bạn thông qua một số cấu hình đó là cần thiết trước khi bạn có thể kết nối lần đầu tiên.&lt;/p&gt;&lt;p&gt;Nếu bạn đã bao giờ cần phải sửa đổi các tùy chọn này một lần nữa, bạn có thể tìm thấy thuật sĩ trong trình đơn &lt;span style=&quot; font-style:italic;&quot;&gt;&apos;Cài đặt&apos;&lt;/span&gt; từ cửa sổ chính của.&lt;/p&gt;&lt;p&gt;Bạn có muốn &lt;span style=&quot; font-weight:600;&quot;&gt;đăng ký&lt;/span&gt; cho một tài khoản mới, hoặc &lt;span style=&quot; font-weight:600;&quot;&gt;đăng nhập&lt;/span&gt; với tên người dùng đã tồn tại?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
- </message>
- <message>
<location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="75"/>
<source>Sign up for a new account</source>
<translation>Đăng ký một tài khoản mới</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="112"/>
- <source>Provider selection</source>
- <translation>Chọn nhà cung cấp</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="115"/>
- <source>Please enter the domain of the provider you want to use for your connection</source>
- <translation>Vui lòng nhập tên miền của các nhà cung cấp bạn muốn sử dụng cho kết nối của bạn</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="305"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="367"/>
<source>Check</source>
<translation>Kiểm tra</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="312"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="342"/>
<source>https://</source>
<translation>https://</translation>
</message>
@@ -860,358 +1285,308 @@
<translation>Đang kiểm tra tính hợp lệ của nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="159"/>
- <source>Getting provider information</source>
- <translation>Đang tiếp nhận thông tin từ nhà cung cấp</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="239"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="266"/>
<source>Can we reach this provider?</source>
<translation>Bạn có muốn liên lạc với nhà cung cấp hay không?</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="333"/>
- <source>Provider Information</source>
- <translation>Thông tin về nhà cung cấp</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="336"/>
- <source>Description of services offered by this provider</source>
- <translation>Mô tả về dịch vụ được cung cấp bởi nhà cung cấp này\</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="345"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="392"/>
<source>Name</source>
<translation>Tên</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="377"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="424"/>
<source>Desc</source>
<translation>Mô tả</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="387"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="434"/>
<source>&lt;b&gt;Services offered:&lt;/b&gt;</source>
<translation>&lt;b&gt;Dịch vụ cung cấp:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="397"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="444"/>
<source>services</source>
<translation>dịch vụ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="417"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="464"/>
<source>&lt;b&gt;Enrollment policy:&lt;/b&gt;</source>
<translation>&lt;b&gt;Chính sách đăng ký:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="427"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="474"/>
<source>policy</source>
<translation>chính sách</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="447"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="494"/>
<source>&lt;b&gt;URL:&lt;/b&gt;</source>
<translation>&lt;b&gt;Đường dẫn liên kết :&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="457"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="504"/>
<source>URL</source>
<translation>Đường dẫn liên kết</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="464"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="511"/>
<source>&lt;b&gt;Description:&lt;/b&gt;</source>
<translation>&lt;b&gt;Mô tả:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="475"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="522"/>
<source>Provider setup</source>
<translation>Thiết lập nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="478"/>
- <source>Gathering configuration options for this provider</source>
- <translation>Đang thu thập các tùy chọn cấu hình cho nhà cung cấp này</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="500"/>
- <source>We are downloading some bits that we need to establish a secure connection with the provider for the first time.</source>
- <translation>Chúng tôi đang tải xuống một số bit dữ liệu mà chúng ta cần phải thiết lập một kết nối an toàn với các nhà cung cấp cho lần khởi chạy đầu tiên.</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="523"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="570"/>
<source>Setting up provider</source>
<translation>Đang thiết lập nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="573"/>
- <source>Getting info from the Certificate Authority</source>
- <translation>Đang nhận thông tin từ bộ phận xác nhận chứng chỉ an toàn</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="580"/>
- <source>Do we trust this Certificate Authority?</source>
- <translation>Bạn có tin tưởng vào bộ phân xác nhận chứng chỉ an toàn này không?</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="587"/>
- <source>Establishing a trust relationship with this provider</source>
- <translation>Đang thiết lập một mối quan hệ tin tưởng dạng dữ liệu với nhà cung cấp này</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="646"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="720"/>
<source>Register new user</source>
<translation>Đăng ký người dùng mới</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="649"/>
- <source>Register a new user with provider</source>
- <translation>Đăng ký một người dùng mới với nhà cung cấp</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="664"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="738"/>
<source>&lt;b&gt;Password:&lt;/b&gt;</source>
<translation>&lt;b&gt;Mật khẩu:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="691"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="765"/>
<source>&lt;b&gt;Re-enter password:&lt;/b&gt;</source>
<translation>&lt;b&gt;Nhập lại mật khẩu:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="701"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="775"/>
<source>Register</source>
<translation>Đăng ký</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="747"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="821"/>
<source>Remember my username and password</source>
<translation>Ghi nhớ tên người dùng và mật khẩu</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="771"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="845"/>
<source>Service selection</source>
<translation>Lựa chọn dịch vụ</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="774"/>
- <source>Please select the services you would like to have</source>
- <translation>Vui lòng chọn dịch vụ bạn muốn sử dụng</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="141"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="132"/>
<source>&amp;Next &gt;</source>
<translation>&amp;Tiếp theo &gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="143"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="134"/>
<source>Connect</source>
<translation>Kết nối</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="238"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="325"/>
<source>Starting registration...</source>
<translation>Đang bắt đầu đăng ký...</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="269"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="370"/>
<source>User %s successfully registered.</source>
<translation>Người dùng %s đã đăng ký thành công.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="289"/>
- <source>Unknown error</source>
- <translation>Lỗi không rõ nguyên nhân</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="414"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="539"/>
<source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Non-existent provider&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Nhà cung cấp không tồn tại&lt;/b&gt;&lt;/font&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="432"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="558"/>
<source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;%s&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;%s&lt;/b&gt;&lt;/font&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="460"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="586"/>
<source>Unable to load provider configuration</source>
<translation>Không thể tải cấu hình của nhà cung cấp.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="466"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="592"/>
<source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Not a valid provider&lt;/b&gt;&lt;/font&gt;</source>
<translation>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Không phải là một nhà cung cấp hợp lệ&lt;/b&gt;&lt;/font&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="532"/>
- <source>Services by %s</source>
- <translation>Dịch vụ của %s</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="552"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="698"/>
<source>Something went wrong while trying to load service %s</source>
<translation>Xảy ra lỗi khi cố tải dịch vụ %s</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="569"/>
- <source>Gathering configuration options for %s</source>
- <translation>Đang thu thập các tùy chọn cấu hình cho nhà cung cấp %s</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="578"/>
- <source>Description of services offered by %s</source>
- <translation>Mô tả về dịch vụ được cung cấp bởi nhà cung cấp %s</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="599"/>
- <source>Register a new user with %s</source>
- <translation>Đăng ký một người dùng mới với %s</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="26"/>
- <source>Bitmask first run</source>
- <translation>Bitmask được ưu tiên chạy trước</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="46"/>
- <source>This is the Bitmask first run wizard</source>
- <translation>Đây là phần hướng dẫn khởi chạy Bitmask</translation>
- </message>
- <message>
<location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="166"/>
<source>Can we establish a secure connection?</source>
<translation>Liệu chúng ta có thể thiết lập một kết nối an toàn không?</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="734"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="808"/>
<source>&lt;b&gt;Username:&lt;/b&gt;</source>
<translation>&lt;b&gt;Tên tài khoản:&lt;/b&gt;</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="269"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="296"/>
<source>Configure or select a provider</source>
<translation>Cấu hình hoặc lựa chọn một nhà cung cấp</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="275"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="302"/>
<source>Configure new provider:</source>
<translation>Cấu hình một nhà cung cấp mới:</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="285"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="332"/>
<source>Use existing one:</source>
<translation>Sử dụng phần đã tồn tại:</translation>
</message>
-</context>
-<context>
- <name>__impl</name>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="288"/>
- <source>The server did not send the salt parameter</source>
- <translation>Các máy chủ đã không gửi tham số salt</translation>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="397"/>
+ <source>Something has gone wrong. Please try again.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="292"/>
- <source>The server did not send the B parameter</source>
- <translation>Các máy chủ đã không gửi tham số B</translation>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="411"/>
+ <source>The requested username is taken, choose another.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="324"/>
- <source>The data sent from the server had errors</source>
- <translation>Dữ liệu được gửi từ các máy chủ chứa lỗi</translation>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="677"/>
+ <source>Services by {0}</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="346"/>
- <source>Could not connect to the server</source>
- <translation>Không thể kết nối tới máy chủ</translation>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="739"/>
+ <source>Register a new user with {0}</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="372"/>
- <source>Unknown error (%s)</source>
- <translation>Lỗi không rõ nguyên nhân (%s)</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="26"/>
+ <source>Bitmask Provider Setup</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="403"/>
- <source>Problem getting data from server</source>
- <translation>Xảy ra lỗi khi nhận dữ liệu từ máy chủ</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="43"/>
+ <source>Welcome to Bitmask</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="429"/>
- <source>Bad data from server</source>
- <translation>Dữ liệu không chuẩn từ máy chủ</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="112"/>
+ <source>Choose a provider</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="436"/>
- <source>Auth verification failed</source>
- <translation>Xác nhận thất bại</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="159"/>
+ <source>Getting provider information.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="444"/>
- <source>Session cookie verification failed</source>
- <translation>Xác nhận phiên làm việc cookie gặp lỗi</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="380"/>
+ <source>About this provider</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="279"/>
- <source>There was a problem with authentication</source>
- <translation>Xảy ra lỗi với tiến trình xác nhận</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="547"/>
+ <source>Bitmask is attempting to establish a secure connection with this provider for the first time.</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="174"/>
- <source>Invalid username or password.</source>
- <translation>Tên tài khoản hoặc mật khẩu không đúng.</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="638"/>
+ <source>Fetching provider credentials.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="645"/>
+ <source>Do we trust these credentials?</source>
+ <translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>kls</name>
<message>
- <location filename="../src/leap/bitmask/services/eip/vpnlauncher.py" line="167"/>
- <source>No gateway was found!</source>
- <translation>Không tìm thấ gateway nào hết!</translation>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="652"/>
+ <source>Connecting to provider.</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
<name>msg</name>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="93"/>
- <source>Missing up/down scripts</source>
- <translation>Thiếu phần mã lên/xuống</translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="184"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="222"/>
<source>TAP Driver</source>
<translation>Trình điều khiển TAP</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="191"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="229"/>
<source>Encrypted Internet uses VPN, which needs a TAP device installed and none has been found. This will ask for administrative privileges.</source>
<translation>Internet được mã hóa sử dụng VPN, cần một thiết bị TAP được cài đặt và hiện không tìm thấy đối tượng nào về phần này. Tiến trình này yêu cầu quyền quản trị.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="310"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="347"/>
<source>TUN Driver</source>
<translation>Trình điều khiển TUN</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="318"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="355"/>
<source>Encrypted Internet uses VPN, which needs a kernel extension for a TUN device installed, and none has been found. This will ask for administrative privileges.</source>
<translation>Internet được mã hóa sử dụng VPN, cần một thiết bị TUN được cài đặt và hiện không tìm thấy đối tượng nào về phần này. Tiến trình này yêu cầu quyền quản trị.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="132"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="156"/>
<source>Problem installing files</source>
<translation>Xảy ra lỗi khi đang thực hiện thao tác cài đặt tập tin</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="133"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="157"/>
<source>Some of the files could not be copied.</source>
<translation>Một số tập tin không thể được sao chép.</translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="313"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="350"/>
<source>Bitmask needs to install the necessary drivers for Encrypted Internet to work. Would you like to proceed?</source>
<translation>Bitmask cần cài đặt một vài driver thiết yếu để tiến trình mã hóa Internet hoạt động. Bạn có muốn tiếp tục hay không?</translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="102"/>
+ <source>Missing helper files</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="430"/>
+ <source>Missing Bitmask helpers</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>msgstr</name>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="399"/>
+ <source>Some essential helper files are missing in your system.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="402"/>
+ <source>Reinstall your debian packages, or make sure you place them by hand.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>self._eip_status</name>
+ <message>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="202"/>
+ <source>{0} is restarting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="313"/>
+ <source>{0} could not be launched because you did not authenticate properly.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="327"/>
+ <source>{0} finished in an unexpected manner!</source>
+ <translation type="unfinished"/>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/data/ts/en_US.ts b/data/ts/en_US.ts
index 8b457988..fcbe3554 100644
--- a/data/ts/en_US.ts
+++ b/data/ts/en_US.ts
@@ -73,77 +73,77 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="237"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="230"/>
<source>Input/Output error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="158"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="156"/>
<source>There was an error accessing the file.
Import canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="169"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="166"/>
<source>Data mismatch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="172"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="169"/>
<source>The public and private key should have the same address and fingerprint.
Import canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="183"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="179"/>
<source>Missing key</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="186"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="182"/>
<source>You need to provide the public AND private key in the same file.
Import canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="197"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="192"/>
<source>Address mismatch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="200"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="195"/>
<source>The identity for the key needs to be the same as your user address.
Import canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="144"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="143"/>
<source>Import Successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="145"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="144"/>
<source>The key pair was imported successfully.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="207"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="202"/>
<source>Save keys file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="224"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="218"/>
<source>Export Successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="226"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="220"/>
<source>The key pair was exported successfully.
Please, store your private key in a safe place.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="239"/>
+ <location filename="../src/leap/bitmask/gui/advanced_key_management.py" line="232"/>
<source>There was an error accessing the file.
Export canceled.</source>
<translation type="unfinished"></translation>
@@ -185,7 +185,7 @@ Export canceled.</source>
<context>
<name>ComplainDialog</name>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="417"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="455"/>
<source>Ok, thanks</source>
<translation type="unfinished"></translation>
</message>
@@ -198,22 +198,22 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="159"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="157"/>
<source>Gateway settings for provider &apos;{0}&apos; saved.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="236"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="231"/>
<source>There was a problem with configuration files.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="125"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="124"/>
<source> (uninitialized)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="251"/>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="245"/>
<source>This is an uninitialized provider, please log in first.</source>
<translation type="unfinished"></translation>
</message>
@@ -259,157 +259,157 @@ Export canceled.</source>
<context>
<name>EIPStatusWidget</name>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="429"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="426"/>
<source>Turn ON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="569"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="563"/>
<source>Authenticating...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="578"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="572"/>
<source>Retrieving configuration...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="580"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="574"/>
<source>Waiting to start...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="582"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="576"/>
<source>Assigning IP</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="584"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="578"/>
<source>Reconnecting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="592"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="586"/>
<source>Unable to start VPN, it&apos;s already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="320"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="318"/>
<source>disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="614"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="608"/>
<source>{0}: OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="317"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="315"/>
<source>You must login to use {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="619"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="613"/>
<source>{0}: Starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="622"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="616"/>
<source>{0}: ON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="576"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="570"/>
<source>Encrypted Internet is starting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="415"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="412"/>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="478"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="474"/>
<source>Traffic is being routed in the clear.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="479"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="475"/>
<source>Network is unreachable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="481"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="477"/>
<source>Error connecting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="497"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="493"/>
<source>Error connecting.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="500"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="496"/>
<source>Bitmask is blocking unencrypted traffic.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="644"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="638"/>
<source>Routing traffic through: &lt;b&gt;{0}&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="690"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="683"/>
<source>Could not load {0} configuration.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="699"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="692"/>
<source>Another openvpn instance is already running, and could not be stopped.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="709"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="702"/>
<source>Another openvpn instance is already running, and could not be stopped because it was not launched by Bitmask. Please stop it and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="717"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="710"/>
<source>We could not find openvpn binary.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="754"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="747"/>
<source>We could not find &lt;b&gt;pkexec&lt;/b&gt; in your system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="764"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="757"/>
<source>{0} cannot be started because the tuntap extension is not installed properly in your system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="784"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="776"/>
<source>Network is unreachable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="315"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="313"/>
<source>&lt;font color=red&gt;Disabled: missing helper files&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="731"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="724"/>
<source>VPN Launcher error. See the logs for more info.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="734"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="727"/>
<source>Encrypted Internet failed to start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/eip_status.py" line="746"/>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="739"/>
<source>We could not find any authentication agent in your system.&lt;br/&gt;Make sure you have &lt;b&gt;polkit-gnome-authentication-agent-1&lt;/b&gt; running and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -516,7 +516,7 @@ Export canceled.</source>
</message>
<message>
<location filename="../src/leap/bitmask/gui/loggerwindow.py" line="232"/>
- <source>Maximum posts per day reached</source>
+ <source>Maximum amount of submissions reached for today.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -528,65 +528,110 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="90"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="93"/>
<source>Remember username and password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="112"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="115"/>
<source>&lt;b&gt;Username:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="125"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="128"/>
<source>&lt;b&gt;Password:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="208"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="298"/>
<source>Log In</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="203"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="293"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="214"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="220"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="314"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="602"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="240"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="326"/>
<source>Please select a valid provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="245"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="330"/>
<source>Please provide a valid username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="250"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="334"/>
<source>Please provide a valid password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="253"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="343"/>
<source>Logging in...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="307"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="599"/>
<source>Logging out...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="401"/>
+ <source>Waiting...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="440"/>
+ <source>Log in cancelled by the user.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="460"/>
+ <source>Unable to login: Problem with provider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="531"/>
+ <source>Succeeded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="614"/>
+ <source>Something went wrong with the logout.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="689"/>
+ <source>Unknown error.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="693"/>
+ <source>There was a server problem with authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="697"/>
+ <source>Could not establish a connection.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="701"/>
+ <source>Invalid username or password.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MailStatusWidget</name>
@@ -606,82 +651,82 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="196"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="195"/>
<source>There was an unexpected problem with Soledad.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="432"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="425"/>
<source>OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="224"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="222"/>
<source>Mail is OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="231"/>
<source>Mail is starting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="455"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="445"/>
<source>ON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="237"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="235"/>
<source>Mail is ON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="240"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="238"/>
<source>Mail is disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="441"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="433"/>
<source>Starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="270"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="267"/>
<source>Soledad has started...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="272"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="269"/>
<source>Soledad is starting, please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="312"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="308"/>
<source>Found key! Starting mail...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="317"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="313"/>
<source>Finished generating key!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="319"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="315"/>
<source>Starting mail...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="352"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="347"/>
<source>SMTP failed to start, check the logs.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="409"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="403"/>
<source>About to start, please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="416"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="410"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
</message>
@@ -691,37 +736,37 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="463"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="452"/>
<source>You must be logged in to use {0}.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="315"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="311"/>
<source>Generating new key, this may take a few minutes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="392"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="386"/>
<source>{0} Unread Emails in your Inbox</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="396"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="390"/>
<source>1 Unread Email in your Inbox</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="448"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="439"/>
<source>Disconnecting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="474"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="462"/>
<source>Invalid auth token, try logging in again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mail_status.py" line="308"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="304"/>
<source>Initial sync in progress, please wait...</source>
<translation type="unfinished"></translation>
</message>
@@ -739,7 +784,7 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="889"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="851"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
@@ -759,33 +804,33 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="744"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="731"/>
<source> The following components will be updated:
%s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="747"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="734"/>
<source>Updates available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="236"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="239"/>
<source>Show Main Window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1650"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1491"/>
<source>Starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1674"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1514"/>
<source>Not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1678"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1518"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
</message>
@@ -800,42 +845,27 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="230"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="233"/>
<source>Mail is OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="735"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="722"/>
<source>The Bitmask app is ready to update, please restart the application.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1007"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="964"/>
<source>About Bitmask - %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1163"/>
- <source>Unable to login: Problem with provider</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1342"/>
- <source>Log in cancelled by the user.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1696"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1535"/>
<source>There was a problem with the provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1751"/>
- <source>Something went wrong with the logout.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1718"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1556"/>
<source>Unable to connect: Problem with provider</source>
<translation type="unfinished"></translation>
</message>
@@ -855,7 +885,7 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="223"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="226"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
@@ -865,167 +895,137 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="897"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="859"/>
<source>OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1021"/>
- <source>Version: &lt;b&gt;%s&lt;/b&gt; (%s)&lt;br&gt;&lt;br&gt;%sBitmask is the Desktop client application for the LEAP platform, supporting encrypted internet proxy, secure email, and secure chat (coming soon).&lt;br&gt;&lt;br&gt;LEAP is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available. &lt;br&gt;&lt;br&gt;&lt;a href=&apos;https://leap.se&apos;&gt;More about LEAP&lt;/a&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1068"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1025"/>
<source>Bitmask Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1080"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1037"/>
<source>The current client version is not supported by this provider.&lt;br&gt;Please update to latest version.&lt;br&gt;&lt;br&gt;You can get the latest version from &lt;a href=&apos;{0}&apos;&gt;{1}&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1081"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1038"/>
<source>Update Needed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1091"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1048"/>
<source>This provider is not compatible with the client.&lt;br&gt;&lt;br&gt;Error: API version incompatible.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1091"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1048"/>
<source>Incompatible Provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="307"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="305"/>
<source>Application error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="309"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="307"/>
<source>You are trying to do an operation that requires logging in first.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="367"/>
- <source>Unknown error.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="371"/>
- <source>There was a server problem with authentication.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="375"/>
- <source>Could not establish a connection.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="379"/>
- <source>Invalid username or password.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="916"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="878"/>
<source>Hello!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="917"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="879"/>
<source>Bitmask has started in the tray.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1376"/>
- <source>Succeeded</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1604"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1445"/>
<source>The server at {0} can&apos;t be found, because the DNS lookup failed. DNS is the network service that translates a website&apos;s name to its Internet address. Either your computer is having trouble connecting to the network, or you are missing some helper files that are needed to securely use DNS while {1} is active. To install these helper files, quit this application and start it again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1606"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1447"/>
<source>Connection Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1863"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1637"/>
<source>Quitting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1864"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1638"/>
<source>Bitmask is quitting, please wait.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1035"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="992"/>
<source>bitmask.net/help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1043"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1000"/>
<source>Email quick reference</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1047"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1004"/>
<source>For Thunderbird, you can use the Bitmask extension. Search for &quot;Bitmask&quot; in the add-on manager or download it from &lt;a href=&apos;{0}&apos;&gt;addons.mozilla.org&lt;/a&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1051"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1008"/>
<source>Alternately, you can manually configure your mail client to use Bitmask Email with these options:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1051"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1008"/>
<source>IMAP: localhost, port {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1052"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1009"/>
<source>SMTP: localhost, port {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1054"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1011"/>
<source>Username: your full email address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1056"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1013"/>
<source>Password: any non-empty text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1065"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1022"/>
<source>&lt;p&gt;&lt;strong&gt;{0}&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;{1}&lt;/p&gt;&lt;p&gt;{2}&lt;ul&gt;&lt;li&gt;&amp;nbsp;{3}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{4}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{5}&lt;/li&gt;&lt;li&gt;&amp;nbsp;{6}&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1230"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1129"/>
<source>Stop services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1230"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1129"/>
<source>Do you want to stop all services?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1234"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1133"/>
<source>In order to change the provider, the running services needs to be stopped.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1673"/>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1513"/>
<source>Disabled: missing helper files</source>
<translation type="unfinished"></translation>
</message>
@@ -1034,6 +1034,11 @@ Export canceled.</source>
<source>Pr&amp;eferences...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="978"/>
+ <source>Version: &lt;b&gt;{ver}&lt;/b&gt; ({ver_hash})&lt;br&gt;&lt;br&gt;{greet}Bitmask is the Desktop client application for the LEAP platform, supporting encrypted internet proxy.&lt;br&gt;&lt;br&gt;LEAP is a non-profit dedicated to giving all internet users access to secure communication. Our focus is on adapting encryption technology to make it easy to use and widely available.&lt;br&gt;&lt;br&gt;&lt;a href=&apos;https://leap.se&apos;&gt;More about LEAP&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PasswordChange</name>
@@ -1101,17 +1106,17 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="167"/>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="166"/>
<source>Password is empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="222"/>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="219"/>
<source>There was a problem changing the password.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="235"/>
+ <location filename="../src/leap/bitmask/gui/passwordwindow.py" line="231"/>
<source>You did not enter a correct current password.</source>
<translation type="unfinished"></translation>
</message>
@@ -1208,12 +1213,12 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="129"/>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="126"/>
<source>Error loading configuration file.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="142"/>
+ <location filename="../src/leap/bitmask/gui/preferences_vpn_page.py" line="138"/>
<source>This is an uninitialized provider, please log in first.</source>
<translation type="unfinished"></translation>
</message>
@@ -1239,12 +1244,12 @@ Export canceled.</source>
<context>
<name>ProviderBootstrapper</name>
<message>
- <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="154"/>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="153"/>
<source>Provider certificate could not be verified</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="161"/>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="159"/>
<source>Provider does not support HTTPS</source>
<translation type="unfinished"></translation>
</message>
@@ -1375,47 +1380,47 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="132"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="122"/>
<source>&amp;Next &gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="134"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="124"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="325"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="301"/>
<source>Starting registration...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="370"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="345"/>
<source>User %s successfully registered.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="539"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="509"/>
<source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Non-existent provider&lt;/b&gt;&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="558"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="527"/>
<source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;%s&lt;/b&gt;&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="586"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="554"/>
<source>Unable to load provider configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="592"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="560"/>
<source>&lt;font color=&apos;red&apos;&gt;&lt;b&gt;Not a valid provider&lt;/b&gt;&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="698"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="661"/>
<source>Something went wrong while trying to load service %s</source>
<translation type="unfinished"></translation>
</message>
@@ -1445,22 +1450,22 @@ Export canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="397"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="371"/>
<source>Something has gone wrong. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="411"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="384"/>
<source>The requested username is taken, choose another.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="677"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="640"/>
<source>Services by {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="739"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="701"/>
<source>Register a new user with {0}</source>
<translation type="unfinished"></translation>
</message>
@@ -1513,60 +1518,70 @@ Export canceled.</source>
<context>
<name>msg</name>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="222"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="259"/>
<source>TAP Driver</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="229"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="266"/>
<source>Encrypted Internet uses VPN, which needs a TAP device installed and none has been found. This will ask for administrative privileges.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="347"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="384"/>
<source>TUN Driver</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="355"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="392"/>
<source>Encrypted Internet uses VPN, which needs a kernel extension for a TUN device installed, and none has been found. This will ask for administrative privileges.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="156"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="161"/>
<source>Problem installing files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="157"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="162"/>
<source>Some of the files could not be copied.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="350"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="387"/>
<source>Bitmask needs to install the necessary drivers for Encrypted Internet to work. Would you like to proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="102"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="107"/>
<source>Missing helper files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="430"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="468"/>
<source>Missing Bitmask helpers</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="209"/>
+ <source>No polkit agent running</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="214"/>
+ <source>There is no polkit agent running and it is needed to run the Bitmask services.&lt;br&gt;Take a look at the &lt;a href=&quot;https://leap.se/en/docs/client/known-issues&quot;&gt;known issues&lt;/a&gt; page</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>msgstr</name>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="399"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="437"/>
<source>Some essential helper files are missing in your system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="402"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="440"/>
<source>Reinstall your debian packages, or make sure you place them by hand.</source>
<translation type="unfinished"></translation>
</message>
@@ -1574,17 +1589,17 @@ Export canceled.</source>
<context>
<name>self._eip_status</name>
<message>
- <location filename="../src/leap/bitmask/services/eip/conductor.py" line="202"/>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="200"/>
<source>{0} is restarting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/services/eip/conductor.py" line="313"/>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="308"/>
<source>{0} could not be launched because you did not authenticate properly.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/services/eip/conductor.py" line="327"/>
+ <location filename="../src/leap/bitmask/services/eip/conductor.py" line="322"/>
<source>{0} finished in an unexpected manner!</source>
<translation type="unfinished"></translation>
</message>
diff --git a/pkg/requirements.pip b/pkg/requirements.pip
index 8ce1793e..37cc18a3 100644
--- a/pkg/requirements.pip
+++ b/pkg/requirements.pip
@@ -10,15 +10,14 @@ requests>=1.1.0
srp>=1.0.2
pyopenssl
-# This won't be needed after we refactor leap.common.events
-# to use zmq.
-python-dateutil==1.4 # See https://leap.se/code/issues/6099
+# This won't be needed after we refactor leap.common.events to use zmq.
+python-dateutil
psutil
ipaddr
twisted
-python-daemon # this should not be needed for Windows.
+python-daemon==1.6.1 # this should not be needed for Windows.
keyring
zope.proxy
diff --git a/relnotes.txt b/relnotes.txt
index c4104fc5..a229baee 100644
--- a/relnotes.txt
+++ b/relnotes.txt
@@ -1,112 +1,46 @@
-ANNOUNCING Bitmask, the Internet Encryption Toolkit, release 0.7.0.
+ANNOUNCING Bitmask, the Internet Encryption Toolkit, release 0.8.0.
-The LEAP team is pleased to announce the immediate availability of
-version 0.7.0 of Bitmask, the Internet Encryption Toolkit, codename
-"One window to rule them all, and in the darkness bind them."
+The LEAP team is pleased to announce the immediate availability of version
+0.8.0 of Bitmask, the Internet Encryption Toolkit, codename "Charlie and the
+code refactory"
-https://downloads.leap.se/client/
+This release focused on fixing bugs, particularly with the UI, and refactoring
+much of the core backend code for the client. There are no new features in this
+version.
-LEAP (LEAP Encryption Access Project) develops a plan to secure
-everyday communication, breaking down into discrete services.
+Currently, Bitmask desktop client only support Debian and Ubuntu Linux. Support
+for Mac, Windows, and other Linux distributions is coming.
-Bitmask is the desktop client to connect to the services offered by
-the LEAP Platform. In the current phase the supported services are
-Encrypted Internet Proxy and Encrypted Mail.
+Upgrading:
-The Encrypted Internet Proxy provides circumvention, location
-anonymization, and traffic encryption in a hassle-free, automatically
-self-configuring fashion.
+* From bundle: if you are running bundle version 0.7 or new then Bitmask should
+ update automatically.
-Encrypted Mail offers automatic encryption and decryption for both
-outgoing and incoming email, adding public key cryptography to your
-mail without you ever having to worry about key distribution or
-signature verification.
+* From package: if you have added deb.bitmask.net to your sources.list, then
+ Bitmask should update automatically (make sure it is not commented out).
-You can read about this and many other cool things in the user manual
-and the developer notes, which can be found online at:
-
-https://leap.se/en/docs/client
-
-WARNING: This is still part of a beta release of our software, a lot
-of testing and auditing is still needed, so indeed use it, and feed us
-back, fork it and contribute to its development, but by any means DO
-NOT trust your life to it.
-
-WHAT CAN THIS VERSION OF BITMASK DO FOR ME?
-
-Bitmask 0.7.0 brings with tremendous joy automatic and secure updates
-through The Update Framework. Right beside TUF there are some bug
-fixes and a new settings panel.
-
-You can read more about TUF in http://theupdateframework.com/
-
-Encrypted Internet on Linux avoids leaking traffic outside of the
-secure connection it establishes. This will be added to other
-platforms in the future.
-
-The Encrypted Mail services will run local SMTP and IMAP proxies that,
-once you configure the mail client of your choice, will automatically
-encrypt and decrypt your email using GPG encryption under the hood.
-
-If it is the first time you run Bitmask, the first run wizard will
-help you registering an user with your selected provider, downloading
-all the config files needed to connect to the various LEAP services.
+If you have a bundle version older than 0.7, please reinstall Bitmask.
LICENSE
-You may use Bitmask under the GNU General Public License, version 3
-or, at your option, any later version. See the file "LICENSE" for the
-terms of the GNU General Public License, version 3.
-
-In addition, as a special exception, the copyright holders give
-permission to link the code of portions of this program with the
-OpenSSL library under certain conditions as described in each
-individual source file, and distribute linked combinations including
-the two.
-
-INSTALLATION
-
-We distribute the current version of Bitmask as standalone bundles for
-GNU/Linux, OSX and Windows, but it is likely that you are able to run
-it under other systems, specially if you are skillful and patience is
-one of your virtues.
-
-Have a look at "docs/user/install.rst".
-
-Packages are also provided for debian and ubuntu, add the leap
-repository to your apt sources:
-
-deb http://deb.leap.se/debian wheezy main
-
-We will love to hear if you want to make packages available for any
-other system.
-
-BUGS
-
-You can send the bugs our way by pointing your telnet session to port
-443 on https://leap.se/code. We will do our best to make them follow
-our intensive bug-reeducation program.
-
-
-LINUX ONLY: If you ever run into the situation where you cannot
-access internet, open the terminal and run the following command:
-
-$ pkexec /usr/local/sbin/bitmask-root firewall stop
+You may use Bitmask under the GNU General Public License, version 3 or, at your
+option, any later version. See the file "LICENSE" for the terms of the GNU
+General Public License, version 3.
-If for some reason that doesn't work, you will need to reboot your
-computer.
+USAGE
+See https://bitmask.net/help
HACKING
-You can find us in the #leap channel on the freenode network.
+See https://leap.se/en/docs/get-involved for tips on contacting the developers,
+getting start hacking on Bitmask, and reporting bugs.
-If you are lucky enough, you can also spot us drinking mate, sleepless
-in night trains, rooftops, rainforests, lonely islands and, always,
-beyond any border.
+If you are lucky enough, you can also spot us drinking mate, sleepless in night
+trains, rooftops, rainforests, lonely islands and, always, beyond any border.
The LEAP team,
-December 12, 2014
+February 4, 2015
Somewhere in the middle of the intertubes.
EOF
diff --git a/src/leap/bitmask/config/tests/test_providerconfig.py b/src/leap/bitmask/config/tests/test_providerconfig.py
index fe27e683..7bc30f9c 100644
--- a/src/leap/bitmask/config/tests/test_providerconfig.py
+++ b/src/leap/bitmask/config/tests/test_providerconfig.py
@@ -258,18 +258,6 @@ class ProviderConfigTest(BaseLeapTest):
pc.load(data=json_string)
self.assertTrue('unknown' in pc.get_services())
- def test_get_services_string(self):
- pc = self._provider_config
- config = copy.deepcopy(sample_config)
- config['services'] = [
- 'openvpn', 'asdf', 'openvpn', 'not_supported_service']
- json_string = json.dumps(config)
- pc.load(data=json_string)
-
- self.assertEqual(pc.get_services_string(),
- "Encrypted Internet, asdf, Encrypted Internet,"
- " not_supported_service")
-
if __name__ == "__main__":
unittest.main()
diff --git a/src/leap/bitmask/crypto/tests/test_srpauth.py b/src/leap/bitmask/crypto/tests/test_srpauth.py
index 511a12ed..d420ef93 100644
--- a/src/leap/bitmask/crypto/tests/test_srpauth.py
+++ b/src/leap/bitmask/crypto/tests/test_srpauth.py
@@ -27,6 +27,7 @@ import sys
import binascii
import requests
import mock
+import shutil
from functools import partial
@@ -42,6 +43,7 @@ from leap.bitmask.crypto import srpregister, srpauth
from leap.bitmask.crypto.tests import fake_provider
from leap.bitmask.util.request_helpers import get_content
from leap.common.testing.https_server import where
+from leap.common.files import mkdir_p
log.startLogging(sys.stdout)
@@ -118,6 +120,10 @@ class SRPAuthTestCase(unittest.TestCase):
self.old_cookie_get = self.auth_backend._session.cookies.get
self.old_auth = self.auth_backend.authenticate
+ # HACK: this is needed since it seems that the backend settings path is
+ # not using the right path
+ mkdir_p('config/leap')
+
def tearDown(self):
self.auth_backend._session.post = self.old_post
self.auth_backend._session.put = self.old_put
@@ -132,6 +138,10 @@ class SRPAuthTestCase(unittest.TestCase):
self.auth_backend._session.cookies.get = self.old_cookie_get
self.auth_backend.authenticate = self.old_auth
+ # HACK: see 'setUp'
+ if os.path.exists('config'):
+ shutil.rmtree('config')
+
# helper methods
def _get_https_uri(self):
@@ -711,56 +721,6 @@ class SRPAuthSingletonTestCase(unittest.TestCase):
self.assertEqual(obj1._SRPAuth__instance, obj2._SRPAuth__instance)
@deferred()
- def test_authenticate_notifies_gui(self):
- auth = srpauth.SRPAuth(ProviderConfig())
- auth._SRPAuth__instance.authenticate = mock.create_autospec(
- auth._SRPAuth__instance.authenticate,
- return_value=threads.deferToThread(lambda: None))
- auth._gui_notify = mock.create_autospec(
- auth._gui_notify)
-
- d = auth.authenticate("", "")
-
- def check(*args):
- auth._gui_notify.assert_called_once_with(None)
-
- d.addCallback(check)
- return d
-
- @deferred()
- def test_authenticate_errsback(self):
- auth = srpauth.SRPAuth(ProviderConfig())
- auth._SRPAuth__instance.authenticate = mock.create_autospec(
- auth._SRPAuth__instance.authenticate,
- return_value=threads.deferToThread(MagicMock(
- side_effect=Exception())))
- auth._gui_notify = mock.create_autospec(
- auth._gui_notify)
- auth._errback = mock.create_autospec(
- auth._errback)
-
- d = auth.authenticate("", "")
-
- def check(*args):
- self.assertFalse(auth._gui_notify.called)
- self.assertEqual(auth._errback.call_count, 1)
-
- d.addCallback(check)
- return d
-
- @deferred()
- def test_authenticate_runs_cleanly_when_raises(self):
- auth = srpauth.SRPAuth(ProviderConfig())
- auth._SRPAuth__instance.authenticate = mock.create_autospec(
- auth._SRPAuth__instance.authenticate,
- return_value=threads.deferToThread(MagicMock(
- side_effect=Exception())))
-
- d = auth.authenticate("", "")
-
- return d
-
- @deferred()
def test_authenticate_runs_cleanly(self):
auth = srpauth.SRPAuth(ProviderConfig())
auth._SRPAuth__instance.authenticate = mock.create_autospec(
diff --git a/src/leap/bitmask/gui/advanced_key_management.py b/src/leap/bitmask/gui/advanced_key_management.py
index 48a1db93..7d147b7b 100644
--- a/src/leap/bitmask/gui/advanced_key_management.py
+++ b/src/leap/bitmask/gui/advanced_key_management.py
@@ -132,7 +132,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
else:
logger.debug('Import canceled by the user.')
- @QtCore.Slot()
def _keymanager_import_ok(self):
"""
TRIGGERS:
@@ -144,7 +143,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
self, self.tr("Import Successful"),
self.tr("The key pair was imported successfully."))
- @QtCore.Slot()
def _import_ioerror(self):
"""
TRIGGERS:
@@ -157,7 +155,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
self.tr("There was an error accessing the file.\n"
"Import canceled."))
- @QtCore.Slot()
def _import_datamismatch(self):
"""
TRIGGERS:
@@ -171,7 +168,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
"same address and fingerprint.\n"
"Import canceled."))
- @QtCore.Slot()
def _import_missingkey(self):
"""
TRIGGERS:
@@ -185,7 +181,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
"key in the same file.\n"
"Import canceled."))
- @QtCore.Slot()
def _import_addressmismatch(self):
"""
TRIGGERS:
@@ -212,7 +207,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
else:
logger.debug('Export canceled by the user.')
- @QtCore.Slot()
def _keymanager_export_ok(self):
"""
TRIGGERS:
@@ -225,7 +219,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
self.tr("The key pair was exported successfully.\n"
"Please, store your private key in a safe place."))
- @QtCore.Slot()
def _keymanager_export_error(self):
"""
TRIGGERS:
@@ -238,7 +231,6 @@ class AdvancedKeyManagement(QtGui.QDialog):
self.tr("There was an error accessing the file.\n"
"Export canceled."))
- @QtCore.Slot()
def _keymanager_keys_list(self, keys):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/app.py b/src/leap/bitmask/gui/app.py
index 75dc4a38..5fe031b1 100644
--- a/src/leap/bitmask/gui/app.py
+++ b/src/leap/bitmask/gui/app.py
@@ -50,7 +50,6 @@ class App(QtGui.QWidget):
self._backend_checker.timeout.connect(self._check_backend_status)
self._backend_checker.start(2000)
- @QtCore.Slot()
def _check_backend_status(self):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/eip_preferenceswindow.py b/src/leap/bitmask/gui/eip_preferenceswindow.py
index b5788f3c..8939c709 100644
--- a/src/leap/bitmask/gui/eip_preferenceswindow.py
+++ b/src/leap/bitmask/gui/eip_preferenceswindow.py
@@ -99,7 +99,6 @@ class EIPPreferencesWindow(QtGui.QDialog):
self._backend.eip_get_initialized_providers(domains=providers)
- @QtCore.Slot(list)
def _load_providers_in_combo(self, providers):
"""
TRIGGERS:
@@ -132,7 +131,6 @@ class EIPPreferencesWindow(QtGui.QDialog):
domain, QtCore.Qt.MatchStartsWith)
self.ui.cbProvidersGateway.setCurrentIndex(provider_index)
- @QtCore.Slot(str)
def _save_selected_gateway(self, provider):
"""
TRIGGERS:
@@ -159,7 +157,6 @@ class EIPPreferencesWindow(QtGui.QDialog):
"Gateway settings for provider '{0}' saved.").format(provider)
self._set_providers_gateway_status(msg, success=True)
- @QtCore.Slot(int)
def _populate_gateways(self, domain_idx):
"""
TRIGGERS:
@@ -182,7 +179,6 @@ class EIPPreferencesWindow(QtGui.QDialog):
self._backend.eip_get_gateways_list(domain=domain)
- @QtCore.Slot(list)
def _update_gateways_list(self, gateways):
"""
TRIGGERS:
@@ -223,7 +219,6 @@ class EIPPreferencesWindow(QtGui.QDialog):
self.ui.cbGateways.setCurrentIndex(index)
- @QtCore.Slot()
def _gateways_list_error(self):
"""
TRIGGERS:
@@ -238,7 +233,6 @@ class EIPPreferencesWindow(QtGui.QDialog):
self.ui.pbSaveGateway.setEnabled(False)
self.ui.cbGateways.setEnabled(False)
- @QtCore.Slot()
def _gateways_list_uninitialized(self):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/eip_status.py b/src/leap/bitmask/gui/eip_status.py
index 14ff5972..83490cac 100644
--- a/src/leap/bitmask/gui/eip_status.py
+++ b/src/leap/bitmask/gui/eip_status.py
@@ -137,7 +137,6 @@ class EIPStatusWidget(QtGui.QWidget):
self.ui.btnUpload.clicked.connect(onclicked)
self.ui.btnDownload.clicked.connect(onclicked)
- @QtCore.Slot()
def _on_VPN_status_clicked(self):
"""
TRIGGERS:
@@ -295,7 +294,6 @@ class EIPStatusWidget(QtGui.QWidget):
msg = self.tr("Encrypted Internet is starting")
self.set_eip_message(msg)
- @QtCore.Slot()
def disable_eip_start(self):
"""
Triggered when a default provider_config has not been found.
@@ -327,7 +325,6 @@ class EIPStatusWidget(QtGui.QWidget):
self._eip_disabled_action)
self._eip_status_menu.menuAction().setVisible(False)
- @QtCore.Slot()
def enable_eip_start(self):
"""
Triggered after a successful login.
@@ -452,7 +449,6 @@ class EIPStatusWidget(QtGui.QWidget):
self.user_cancelled = True
self.hide_eip_cancel_button()
- @QtCore.Slot(dict)
def eip_stopped(self, restart=False, failed=False):
"""
TRIGGERS:
@@ -500,7 +496,6 @@ class EIPStatusWidget(QtGui.QWidget):
"unencrypted traffic."))
self.show_fw_down_button()
- @QtCore.Slot(dict)
def update_vpn_status(self, data=None):
"""
TRIGGERS:
@@ -535,7 +530,6 @@ class EIPStatusWidget(QtGui.QWidget):
self.ui.btnUpload.setText(upload_str)
self.ui.btnDownload.setText(download_str)
- @QtCore.Slot(dict)
def update_vpn_state(self, vpn_state):
"""
TRIGGERS:
@@ -674,7 +668,6 @@ class EIPStatusWidget(QtGui.QWidget):
# Slots for signals
#
- @QtCore.Slot()
def _on_eip_connection_aborted(self):
"""
TRIGGERS:
@@ -773,7 +766,6 @@ class EIPStatusWidget(QtGui.QWidget):
"""
self.eip_conductor.reconnect_stop_signal()
- @QtCore.Slot()
def _on_eip_network_unreachable(self):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/login.py b/src/leap/bitmask/gui/login.py
index 7487e888..90df0b73 100644
--- a/src/leap/bitmask/gui/login.py
+++ b/src/leap/bitmask/gui/login.py
@@ -133,7 +133,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self._set_logged_out()
- @QtCore.Slot(int)
def _remember_state_changed(self, state):
"""
Save the remember state in the LeapSettings.
@@ -145,7 +144,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
# are: Checked, Unchecked and PartiallyChecked
self._settings.set_remember(state == QtCore.Qt.Checked)
- @QtCore.Slot(unicode)
def _credentials_changed(self, text):
"""
TRIGGER:
@@ -431,7 +429,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self._backend.user_cancel_login()
self._set_logged_out()
- @QtCore.Slot()
def _set_login_cancelled(self):
"""
TRIGGERS:
@@ -443,7 +440,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self.set_status(self.tr("Log in cancelled by the user."))
self.set_enabled(True)
- @QtCore.Slot(dict)
def _provider_setup_intermediate(self, data):
"""
TRIGGERS:
@@ -457,7 +453,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
logger.error(data[ERROR_KEY])
self._login_problem_provider()
- @QtCore.Slot()
def _login_problem_provider(self):
"""
Warn the user about a problem with the provider during login.
@@ -465,7 +460,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self.set_status(self.tr("Unable to login: Problem with provider"))
self.set_enabled(True)
- @QtCore.Slot(dict)
def _load_provider_config(self, data):
"""
TRIGGERS:
@@ -485,7 +479,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self._backend.provider_bootstrap(provider=self._provider)
- @QtCore.Slot(dict)
def _provider_config_loaded(self, data):
"""
TRIGGERS:
@@ -528,7 +521,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self.ui.logged_widget.show()
self.ui.lblUser.setText(fullname)
- @QtCore.Slot()
def _authentication_finished(self):
"""
TRIGGERS:
@@ -538,11 +530,11 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
"""
self.set_status(self.tr("Succeeded"), error=False)
self._set_logged_in()
+ self.disconnect_and_untrack()
if not flags.OFFLINE:
self.login_finished.emit()
- @QtCore.Slot(unicode)
def _authentication_error(self, msg):
"""
TRIGGERS:
@@ -574,7 +566,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self.set_enabled(True)
self.set_status("", error=False)
- @QtCore.Slot()
def do_logout(self):
"""
TRIGGER:
@@ -612,7 +603,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self.ui.btnLogout.setEnabled(True)
self.ui.clblErrorMsg.hide()
- @QtCore.Slot()
def _logout_error(self):
"""
TRIGGER:
@@ -623,7 +613,6 @@ class LoginWidget(QtGui.QWidget, SignalTracker):
self._set_logging_out(False)
self.set_status(self.tr("Something went wrong with the logout."))
- @QtCore.Slot()
def _logout_ok(self):
"""
TRIGGER:
diff --git a/src/leap/bitmask/gui/mail_status.py b/src/leap/bitmask/gui/mail_status.py
index 92e1e4c4..bbfbafb5 100644
--- a/src/leap/bitmask/gui/mail_status.py
+++ b/src/leap/bitmask/gui/mail_status.py
@@ -184,7 +184,6 @@ class MailStatusWidget(QtGui.QWidget):
leap_assert_type(action_mail_status, QtGui.QAction)
self._action_mail_status = action_mail_status
- @QtCore.Slot()
def set_soledad_failed(self):
"""
TRIGGERS:
@@ -195,7 +194,6 @@ class MailStatusWidget(QtGui.QWidget):
msg = self.tr("There was an unexpected problem with Soledad.")
self._set_mail_status(msg, ready=-1)
- @QtCore.Slot()
def set_soledad_invalid_auth_token(self):
"""
TRIGGERS:
@@ -250,7 +248,6 @@ class MailStatusWidget(QtGui.QWidget):
"""
self._soledad_event.emit(req)
- @QtCore.Slot(object)
def _mail_handle_soledad_events_slot(self, req):
"""
TRIGGERS:
@@ -285,7 +282,6 @@ class MailStatusWidget(QtGui.QWidget):
"""
self._keymanager_event.emit(req)
- @QtCore.Slot(object)
def _mail_handle_keymanager_events_slot(self, req):
"""
TRIGGERS:
@@ -332,7 +328,6 @@ class MailStatusWidget(QtGui.QWidget):
"""
self._smtp_event.emit(req)
- @QtCore.Slot(object)
def _mail_handle_smtp_events_slot(self, req):
"""
TRIGGERS:
@@ -367,7 +362,6 @@ class MailStatusWidget(QtGui.QWidget):
"""
self._imap_event.emit(req)
- @QtCore.Slot(object)
def _mail_handle_imap_events_slot(self, req):
"""
TRIGGERS:
@@ -419,7 +413,6 @@ class MailStatusWidget(QtGui.QWidget):
# XXX make the signal emit the label and state.
- @QtCore.Slot()
def mail_state_disconnected(self):
"""
Display the correct UI for the disconnected state.
@@ -431,7 +424,6 @@ class MailStatusWidget(QtGui.QWidget):
else:
self._set_mail_status(self.tr("OFF"), -1)
- @QtCore.Slot()
def mail_state_connecting(self):
"""
Display the correct UI for the connecting state.
@@ -440,21 +432,18 @@ class MailStatusWidget(QtGui.QWidget):
self._started = True
self._set_mail_status(self.tr("Starting..."), 1)
- @QtCore.Slot()
def mail_state_disconnecting(self):
"""
Display the correct UI for the connecting state.
"""
self._set_mail_status(self.tr("Disconnecting..."), 1)
- @QtCore.Slot()
def mail_state_connected(self):
"""
Display the correct UI for the connected state.
"""
self._set_mail_status(self.tr("ON"), 2)
- @QtCore.Slot()
def mail_state_disabled(self):
"""
Display the correct UI for the disabled state.
@@ -464,7 +453,6 @@ class MailStatusWidget(QtGui.QWidget):
self._service_name)
self._set_mail_status(status, -1)
- @QtCore.Slot()
def soledad_invalid_auth_token(self):
"""
Display the correct UI for the invalid token state
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index b0826303..f5983abb 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -207,7 +207,7 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self.ui.action_preferences.triggered.connect(self._show_preferences)
self.ui.action_about_leap.triggered.connect(self._about)
self.ui.action_quit.triggered.connect(self.quit)
- self.ui.action_wizard.triggered.connect(self._launch_wizard)
+ self.ui.action_wizard.triggered.connect(self._show_wizard)
self.ui.action_show_logs.triggered.connect(self._show_logger_window)
# XXX hide the help menu since it only shows email information and
@@ -288,17 +288,7 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
if self._first_run():
self._wizard_firstrun = True
-
- # HACK FIX: disconnection of signals triggers a reconnection later
- # chich segfaults on wizard quit
- # self.disconnect_and_untrack()
-
- self._wizard = Wizard(backend=self._backend,
- leap_signaler=self._leap_signaler)
- # Give this window time to finish init and then show the wizard
- QtDelayedCall(1, self._launch_wizard)
- self._wizard.accepted.connect(self._finish_init)
- self._wizard.rejected.connect(self._rejected_wizard)
+ self._show_wizard()
else:
# during finish_init, we disable the eip start button
# so this has to be done after eip_machine is started
@@ -346,7 +336,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# XXX does this goes in here? this will be triggered when the login or
# wizard requests provider data
- # XXX - here segfaults if we did a disconnect_and_untrack
conntrack(sig.prov_check_api_certificate, self._get_provider_details)
conntrack(sig.prov_get_details, self._provider_get_details)
@@ -402,54 +391,26 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# TODO: connect this with something
# sig.soledad_cancelled_bootstrap.connect()
- @QtCore.Slot()
- def _rejected_wizard(self):
- """
- TRIGGERS:
- self._wizard.rejected
-
- Called if the wizard has been cancelled or closed before
- finishing.
- This is executed for the first run wizard only. Any other execution of
- the wizard won't reach this point.
- """
- providers = self._settings.get_configured_providers()
- has_provider_on_disk = len(providers) != 0
- if not has_provider_on_disk:
- # if we don't have any provider configured (included a pinned
- # one) we can't use the application, so quit.
- self.quit()
- else:
- # This happens if the user finishes the provider
- # setup but does not register
- self._wizard = None
-
- # HACK FIX: disconnection of signals triggers a reconnection later
- # chich segfaults on wizard quit
- # self._backend_connect(only_tracked=True)
-
- if self._wizard_firstrun:
- self._finish_init()
-
- @QtCore.Slot()
- def _launch_wizard(self):
+ def _show_wizard(self):
"""
TRIGGERS:
self.ui.action_wizard.triggered
- Also called in first run.
+ This is called during the Bitmask's first run.
- Launches the wizard, creating the object itself if not already
- there.
+ Open the wizard window, hiding the mainwindow window.
+ This reuses an existing wizard object or creates a new one if needed.
"""
+ # Disconnect signals to avoid conflicts between mainwindow and wizard
+ # connections
+ self.disconnect_and_untrack()
+
if self._wizard is None:
- # HACK FIX: disconnection of signals triggers a reconnection later
- # chich segfaults on wizard quit
- # self.disconnect_and_untrack()
self._wizard = Wizard(backend=self._backend,
leap_signaler=self._leap_signaler)
- self._wizard.accepted.connect(self._finish_init)
- self._wizard.rejected.connect(self._rejected_wizard)
+ self._wizard.accepted.connect(self._wizard_accepted)
+ self._wizard.rejected.connect(self._wizard_rejected)
+ self._wizard.finished.connect(self._wizard_finished)
self.setVisible(False)
# Do NOT use exec_, it will use a child event loop!
@@ -457,10 +418,8 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self._wizard.show()
if IS_MAC:
self._wizard.raise_()
- self._wizard.finished.connect(self._wizard_finished)
self._settings.set_skip_first_run(True)
- @QtCore.Slot()
def _wizard_finished(self):
"""
TRIGGERS:
@@ -469,6 +428,72 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
Called when the wizard has finished.
"""
self.setVisible(True)
+ self._backend_connect(only_tracked=True)
+
+ def _wizard_rejected(self):
+ """
+ TRIGGERS:
+ self._wizard.rejected
+
+ Called if the wizard has been cancelled or closed before finishing.
+ """
+ # NOTE: We need to verify if we have configured providers.
+ # If not then we should quit
+ # see self._rejected_wizard()
+ providers = self._settings.get_configured_providers()
+ has_provider_on_disk = len(providers) != 0
+ if not has_provider_on_disk:
+ # if we don't have any provider configured (included a pinned
+ # one) we can't use the application, so quit.
+ self._wizard = None
+ self.quit()
+ else:
+ # This happens if the user finishes the provider
+ # setup but does not register
+ self._wizard = None
+
+ # self._backend_connect(only_tracked=True)
+ # if self._wizard_firstrun:
+ # self._finish_init()
+
+ def _wizard_accepted(self):
+ """
+ TRIGGERS:
+ self._wizard.accepted
+
+ Called when the wizard has accepted.
+ """
+ self.setVisible(True)
+ self._finish_init()
+
+ def _load_from_wizard(self):
+ """
+ Load the resulting information of the user going through the Wizard.
+ Trigger the login sequence if needed.
+ """
+ possible_username = self._wizard.get_username()
+ possible_password = self._wizard.get_password()
+
+ # select the configured provider in the combo box
+ domain = self._wizard.get_domain()
+ self._providers.select_provider_by_name(domain)
+ self._login_widget.set_provider(domain)
+
+ self._login_widget.set_remember(self._wizard.get_remember())
+ self._enabled_services = list(self._wizard.get_services())
+ self._settings.set_enabled_services(
+ self._providers.get_selected_provider(),
+ self._enabled_services)
+
+ if possible_username is not None:
+ self._login_widget.set_user(possible_username)
+ if possible_password is not None:
+ self._login_widget.set_password(possible_password)
+ self._login()
+ else:
+ self.eip_needs_login.emit()
+
+ self._wizard = None
def _get_leap_logging_handler(self):
"""
@@ -485,7 +510,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
return h
return None
- @QtCore.Slot()
def _show_logger_window(self):
"""
TRIGGERS:
@@ -502,7 +526,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
lw = LoggerWindow(self, handler=leap_log_handler)
lw.show()
- @QtCore.Slot()
def _show_AKM(self):
"""
TRIGGERS:
@@ -522,7 +545,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self._backend, self._soledad_started)
akm.show()
- @QtCore.Slot()
def _show_preferences(self):
"""
TRIGGERS:
@@ -542,7 +564,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
pref_win = PreferencesWindow(self, account, self.app)
pref_win.show()
- @QtCore.Slot(object, list)
def _update_eip_enabled_status(self, account=None, services=None):
"""
TRIGGER:
@@ -649,7 +670,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# so we must update it, otherwise we're in a deadlock.
self._trying_to_start_eip = False
- @QtCore.Slot()
def _disable_eip_missing_helpers(self):
"""
TRIGGERS:
@@ -672,7 +692,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
"""
self.new_updates.emit(req)
- @QtCore.Slot(object)
def _react_to_new_updates(self, req):
"""
TRIGGERS:
@@ -688,7 +707,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self.ui.btnMore.setVisible(True)
self._updates_content = req.content
- @QtCore.Slot()
def _updates_details(self):
"""
TRIGGERS:
@@ -716,7 +734,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self.tr("Updates available"),
msg)
- @QtCore.Slot()
def _finish_init(self):
"""
TRIGGERS:
@@ -729,7 +746,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
the wizard has been executed.
"""
# XXX: May be this can be divided into two methods?
-
providers = self._settings.get_configured_providers()
self._providers.set_providers(providers)
@@ -755,30 +771,7 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
QtDelayedCall(1, self._update_eip_enabled_status)
if self._wizard:
- possible_username = self._wizard.get_username()
- possible_password = self._wizard.get_password()
-
- # select the configured provider in the combo box
- domain = self._wizard.get_domain()
- self._providers.select_provider_by_name(domain)
-
- self._login_widget.set_remember(self._wizard.get_remember())
- self._enabled_services = list(self._wizard.get_services())
- self._settings.set_enabled_services(
- self._providers.get_selected_provider(),
- self._enabled_services)
- if possible_username is not None:
- self._login_widget.set_user(possible_username)
- if possible_password is not None:
- self._login_widget.set_password(possible_password)
- self._login()
- else:
- self.eip_needs_login.emit()
-
- self._wizard = None
- # HACK FIX: disconnection of signals triggers a reconnection later
- # chich segfaults on wizard quit
- # self._backend_connect(only_tracked=True)
+ self._load_from_wizard()
else:
domain = self._settings.get_provider()
if domain is not None:
@@ -887,7 +880,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# we wait for the systray to be ready
QtDelayedCall(1000, hello)
- @QtCore.Slot(int)
def _tray_activated(self, reason=None):
"""
TRIGGERS:
@@ -906,7 +898,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# this works however.
context_menu.exec_(self._systray.geometry().center())
- @QtCore.Slot()
def _ensure_visible(self):
"""
TRIGGERS:
@@ -925,7 +916,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self.activateWindow()
self.raise_()
- @QtCore.Slot()
def _ensure_invisible(self):
"""
TRIGGERS:
@@ -961,7 +951,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
if state is not None:
self.restoreState(state)
- @QtCore.Slot()
def _about(self):
"""
TRIGGERS:
@@ -989,7 +978,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
msg = msg.format(ver=VERSION, ver_hash=VERSION_HASH[:10], greet=greet)
QtGui.QMessageBox.about(self, title, msg)
- @QtCore.Slot()
def _help(self):
"""
TRIGGERS:
@@ -1091,7 +1079,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
skip_first_run = self._settings.get_skip_first_run()
return not (has_provider_on_disk and skip_first_run)
- @QtCore.Slot()
def _disconnect_login_wait(self):
"""
Disconnect the EIP finishing signal to the wait flag on the login
@@ -1109,7 +1096,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# signal not connected
pass
- @QtCore.Slot(object)
def _on_provider_changed(self, wizard=True):
"""
TRIGGERS:
@@ -1132,7 +1118,7 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
if not something_runing:
if wizard:
- self._launch_wizard()
+ self._show_wizard()
else:
self._settings.set_provider(provider)
self._settings.set_defaultprovider(provider)
@@ -1161,13 +1147,12 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self._update_eip_enabled_status()
self._eip_conductor.qtsigs.do_disconnect_signal.emit()
if wizard:
- self._launch_wizard()
+ self._show_wizard()
else:
if not wizard:
# if wizard, the widget restores itself
self._providers.restore_previous_provider()
- @QtCore.Slot()
def _login(self):
"""
TRIGGERS:
@@ -1195,7 +1180,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self._soledad_started = False
- @QtCore.Slot()
def _on_user_logged_in(self):
"""
TRIGGERS:
@@ -1224,7 +1208,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
if MX_SERVICE not in self._provider_details['services']:
self._set_mx_visible(False)
- @QtCore.Slot()
def _on_user_logged_out(self):
"""
TRIGGER:
@@ -1253,8 +1236,7 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self._maybe_start_eip()
- @QtCore.Slot()
- def _get_provider_details(self):
+ def _get_provider_details(self, data):
"""
TRIGGERS:
prov_check_api_certificate
@@ -1267,7 +1249,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
lang = QtCore.QLocale.system().name()
self._backend.provider_get_details(domain=domain, lang=lang)
- @QtCore.Slot()
def _provider_get_details(self, details):
"""
Set the details for the just downloaded provider.
@@ -1311,7 +1292,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
return eip_enabled and eip_provided
- @QtCore.Slot()
def _maybe_run_soledad_setup_checks(self):
"""
TRIGGERS:
@@ -1352,7 +1332,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
###################################################################
# Service control methods: soledad
- @QtCore.Slot()
def _on_soledad_ready(self):
"""
TRIGGERS:
@@ -1367,7 +1346,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
###################################################################
# Service control methods: mail
- @QtCore.Slot()
def _start_mail_service(self):
if self._provides_mx_and_enabled() or flags.OFFLINE:
self._mail_conductor.start_mail_service(download_if_needed=True,
@@ -1376,14 +1354,12 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
###################################################################
# Service control methods: eip
- @QtCore.Slot()
def _disable_eip_start_action(self):
"""
Disable the EIP start action in the systray menu.
"""
self._action_eip_startstop.setEnabled(False)
- @QtCore.Slot()
def _enable_eip_start_action(self):
"""
Enable the EIP start action in the systray menu.
@@ -1391,7 +1367,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self._action_eip_startstop.setEnabled(True)
self._eip_status.enable_eip_start()
- @QtCore.Slot()
def _on_eip_connecting(self):
"""
TRIGGERS:
@@ -1415,7 +1390,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
eip_sigs.connection_aborted_signal.connect(slot)
eip_sigs.connection_died_signal.connect(slot)
- @QtCore.Slot()
def _on_eip_connection_connected(self):
"""
TRIGGERS:
@@ -1435,7 +1409,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# check for connectivity
self._backend.eip_check_dns(domain=domain)
- @QtCore.Slot()
def _on_eip_connection_disconnected(self):
"""
TRIGGERS:
@@ -1445,7 +1418,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
"""
self._already_started_eip = False
- @QtCore.Slot()
def _set_eip_provider(self, country_code=None):
"""
TRIGGERS:
@@ -1457,7 +1429,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
domain = self._providers.get_selected_provider()
self._eip_status.set_provider(domain, country_code)
- @QtCore.Slot()
def _eip_dns_error(self):
"""
Trigger this if we don't have a working DNS resolver.
@@ -1549,7 +1520,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# eip will not start, so we start soledad anyway
self._maybe_run_soledad_setup_checks()
- @QtCore.Slot(dict)
def _finish_eip_bootstrap(self, data):
"""
TRIGGERS:
@@ -1570,7 +1540,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# DO START EIP Connection!
self._eip_conductor.do_connect()
- @QtCore.Slot(dict)
def _eip_intermediate_stage(self, data):
# TODO missing param documentation
"""
@@ -1604,7 +1573,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
locks.raise_window_ack()
self.raise_window.emit()
- @QtCore.Slot()
def _do_raise_mainwindow(self):
"""
TRIGGERS:
@@ -1707,7 +1675,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
logger.debug("Killing backend")
psutil.Process(self._backend_pid).kill()
- @QtCore.Slot()
def _remove_service(self, service):
"""
Remove the given service from the waiting list and check if we have
@@ -1724,7 +1691,6 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
logger.debug("All services stopped.")
self.all_services_stopped.emit()
- @QtCore.Slot()
def final_quit(self):
"""
Final steps to quit the app, starting from here we don't care about
diff --git a/src/leap/bitmask/gui/passwordwindow.py b/src/leap/bitmask/gui/passwordwindow.py
index f7ef079e..88565829 100644
--- a/src/leap/bitmask/gui/passwordwindow.py
+++ b/src/leap/bitmask/gui/passwordwindow.py
@@ -149,7 +149,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
self._soledad_ready = False
sig.soledad_bootstrap_finished.connect(self._on_soledad_ready)
- @QtCore.Slot()
def _change_password(self):
"""
TRIGGERS:
@@ -194,7 +193,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
PasswordWindow._current_window = None
self.deleteLater()
- @QtCore.Slot()
def _srp_change_password_ok(self):
"""
TRIGGERS:
@@ -210,7 +208,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
else:
self._change_password_success()
- @QtCore.Slot()
def _srp_password_change_error(self):
"""
TRIGGERS:
@@ -223,7 +220,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
self._enable_password_widgets(True)
self.flash_error(msg)
- @QtCore.Slot()
def _srp_password_change_badpw(self):
"""
TRIGGERS:
@@ -237,7 +233,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
self.flash_error(msg)
self.ui.current_password_lineedit.setFocus()
- @QtCore.Slot()
def _soledad_change_password_ok(self):
"""
TRIGGERS:
@@ -248,7 +243,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
logger.debug("Soledad password changed successfully.")
self._change_password_success()
- @QtCore.Slot(unicode)
def _soledad_change_password_problem(self, msg):
"""
TRIGGERS:
@@ -263,7 +257,6 @@ class PasswordWindow(QtGui.QDialog, Flashable):
self._enable_password_widgets(True)
self.flash_error(msg)
- @QtCore.Slot()
def _on_soledad_ready(self):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/preferences_account_page.py b/src/leap/bitmask/gui/preferences_account_page.py
index ec6a7716..cab90eec 100644
--- a/src/leap/bitmask/gui/preferences_account_page.py
+++ b/src/leap/bitmask/gui/preferences_account_page.py
@@ -63,7 +63,6 @@ class PreferencesAccountPage(QtGui.QWidget):
self.ui.change_password_label.setVisible(True)
self.ui.change_password_button.setEnabled(False)
- @QtCore.Slot(str, int)
def _service_selection_changed(self, service, state):
"""
TRIGGERS:
@@ -94,7 +93,6 @@ class PreferencesAccountPage(QtGui.QWidget):
# emit signal alerting change
self.app.service_selection_changed.emit(self.account, services)
- @QtCore.Slot(str)
def _load_services(self, services):
"""
TRIGGERS:
@@ -133,7 +131,6 @@ class PreferencesAccountPage(QtGui.QWidget):
logger.error("Something went wrong while trying to "
"load service %s" % (service,))
- @QtCore.Slot()
def _show_change_password(self):
change_password_window = PasswordWindow(self, self.account, self.app)
change_password_window.show()
diff --git a/src/leap/bitmask/gui/preferences_vpn_page.py b/src/leap/bitmask/gui/preferences_vpn_page.py
index 901116b4..5b5c9604 100644
--- a/src/leap/bitmask/gui/preferences_vpn_page.py
+++ b/src/leap/bitmask/gui/preferences_vpn_page.py
@@ -64,7 +64,6 @@ class PreferencesVpnPage(QtGui.QWidget, Flashable):
# Trigger update
self.app.backend.eip_get_gateways_list(domain=self.account.domain)
- @QtCore.Slot(str)
def _save_selected_gateway(self, index):
"""
TRIGGERS:
@@ -86,7 +85,6 @@ class PreferencesVpnPage(QtGui.QWidget, Flashable):
provider=self.account.domain,
gateway=gateway)
- @QtCore.Slot(list)
def _update_gateways_list(self, gateways):
"""
TRIGGERS:
@@ -116,7 +114,6 @@ class PreferencesVpnPage(QtGui.QWidget, Flashable):
index = idx + 1
self.ui.gateways_list.setCurrentRow(index)
- @QtCore.Slot()
def _gateways_list_error(self):
"""
TRIGGERS:
@@ -129,7 +126,6 @@ class PreferencesVpnPage(QtGui.QWidget, Flashable):
self.tr("Error loading configuration file."))
self.ui.gateways_list.setEnabled(False)
- @QtCore.Slot()
def _gateways_list_uninitialized(self):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/preferenceswindow.py b/src/leap/bitmask/gui/preferenceswindow.py
index f1252301..daad08b0 100644
--- a/src/leap/bitmask/gui/preferenceswindow.py
+++ b/src/leap/bitmask/gui/preferenceswindow.py
@@ -152,7 +152,6 @@ class PreferencesWindow(QtGui.QDialog):
self._email_page.deleteLater()
self.deleteLater()
- @QtCore.Slot()
def _change_page(self, current, previous):
"""
TRIGGERS:
@@ -170,7 +169,6 @@ class PreferencesWindow(QtGui.QDialog):
current = previous
self.ui.pages_widget.setCurrentIndex(self.ui.nav_widget.row(current))
- @QtCore.Slot(object, list)
def _update_icons(self, account, services):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/providers.py b/src/leap/bitmask/gui/providers.py
index 6954411f..4a6f961a 100644
--- a/src/leap/bitmask/gui/providers.py
+++ b/src/leap/bitmask/gui/providers.py
@@ -98,7 +98,6 @@ class Providers(QtCore.QObject):
self._combo.setCurrentIndex(prev_provider)
self._combo.blockSignals(False)
- @QtCore.Slot(int)
def _current_provider_changed(self, idx):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/gui/signaltracker.py b/src/leap/bitmask/gui/signaltracker.py
index c83359c4..0e3b2dce 100644
--- a/src/leap/bitmask/gui/signaltracker.py
+++ b/src/leap/bitmask/gui/signaltracker.py
@@ -57,7 +57,6 @@ class SignalTracker(QtCore.QObject):
try:
signal.disconnect(method)
except (TypeError, RuntimeError) as e:
- # most likely the signal was not connected
logger.warning("Disconnect error: {0!r}".format(e))
logger.warning("Signal: {0!r} -> {1!r}".format(signal, method))
diff --git a/src/leap/bitmask/gui/wizard.py b/src/leap/bitmask/gui/wizard.py
index 35043a68..5da021d1 100644
--- a/src/leap/bitmask/gui/wizard.py
+++ b/src/leap/bitmask/gui/wizard.py
@@ -82,9 +82,8 @@ class Wizard(QtGui.QWizard, SignalTracker):
self._use_existing_provider = False
self.ui.grpCheckProvider.setVisible(False)
- conntrack = self.connect_and_track
- conntrack(self.ui.btnCheck.clicked, self._check_provider)
- conntrack(self.ui.lnProvider.returnPressed, self._check_provider)
+ self.ui.btnCheck.clicked.connect(self._check_provider)
+ self.ui.lnProvider.returnPressed.connect(self._check_provider)
self._leap_signaler = leap_signaler
@@ -96,22 +95,19 @@ class Wizard(QtGui.QWizard, SignalTracker):
# this details are set when the provider download is complete.
self._provider_details = None
- conntrack(self.currentIdChanged, self._current_id_changed)
+ self.currentIdChanged.connect(self._current_id_changed)
- conntrack(self.ui.lnProvider.textChanged, self._enable_check)
- conntrack(self.ui.rbNewProvider.toggled,
- lambda x: self._enable_check())
- conntrack(self.ui.cbProviders.currentIndexChanged[int],
- self._reset_provider_check)
+ self.ui.lnProvider.textChanged.connect(self._enable_check)
+ self.ui.rbNewProvider.toggled.connect(lambda x: self._enable_check())
+ self.ui.cbProviders.currentIndexChanged[int].connect(
+ self._reset_provider_check)
- conntrack(self.ui.lblUser.returnPressed, self._focus_password)
- conntrack(self.ui.lblPassword.returnPressed,
- self._focus_second_password)
- conntrack(self.ui.lblPassword2.returnPressed, self._register)
- conntrack(self.ui.btnRegister.clicked, self._register)
+ self.ui.lblUser.returnPressed.connect(self._focus_password)
+ self.ui.lblPassword.returnPressed.connect(self._focus_second_password)
+ self.ui.lblPassword2.returnPressed.connect(self._register)
+ self.ui.btnRegister.clicked.connect(self._register)
- conntrack(self.ui.rbExistingProvider.toggled,
- self._skip_provider_checks)
+ self.ui.rbExistingProvider.toggled.connect(self._skip_provider_checks)
usernameRe = QtCore.QRegExp(USERNAME_REGEX)
self.ui.lblUser.setValidator(
@@ -136,9 +132,8 @@ class Wizard(QtGui.QWizard, SignalTracker):
self._provider_checks_ok = False
self._provider_setup_ok = False
- conntrack(self.finished, self._wizard_finished)
+ self.finished.connect(self._wizard_finished)
- @QtCore.Slot()
def _wizard_finished(self):
"""
TRIGGERS:
@@ -152,8 +147,7 @@ class Wizard(QtGui.QWizard, SignalTracker):
self._provider_setup_ok = False
self.ui.lnProvider.setText('')
self.ui.grpCheckProvider.setVisible(False)
- # HACK FIX: disconnection of signals triggers a segfault on quit
- # self.disconnect_and_untrack()
+ self.disconnect_and_untrack()
def _load_configured_providers(self):
"""
@@ -250,7 +244,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
def get_services(self):
return self._selected_services
- @QtCore.Slot(unicode)
def _enable_check(self, reset=True):
"""
TRIGGERS:
@@ -340,7 +333,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
# register button
self.ui.btnRegister.setVisible(visible)
- @QtCore.Slot()
def _registration_finished(self):
"""
TRIGGERS:
@@ -366,7 +358,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self.page(self.REGISTER_USER_PAGE).set_completed()
self.button(QtGui.QWizard.BackButton).setEnabled(False)
- @QtCore.Slot()
def _registration_failed(self):
"""
TRIGGERS:
@@ -380,7 +371,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self._set_register_status(error_msg, error=True)
self.ui.btnRegister.setEnabled(True)
- @QtCore.Slot()
def _registration_taken(self):
"""
TRIGGERS:
@@ -427,7 +417,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self.ui.lblCheckCaFpr.setPixmap(None)
self.ui.lblCheckApiCert.setPixmap(None)
- @QtCore.Slot()
def _check_provider(self):
"""
TRIGGERS:
@@ -461,7 +450,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self.ui.lblNameResolution.setPixmap(self.QUESTION_ICON)
self._backend.provider_setup(provider=self._domain)
- @QtCore.Slot(bool)
def _skip_provider_checks(self, skip):
"""
TRIGGERS:
@@ -505,7 +493,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
label.setPixmap(self.ERROR_ICON)
logger.error(error)
- @QtCore.Slot(dict)
def _name_resolution(self, data):
"""
TRIGGERS:
@@ -525,7 +512,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self.ui.btnCheck.setEnabled(not passed)
self.ui.lnProvider.setEnabled(not passed)
- @QtCore.Slot(dict)
def _https_connection(self, data):
"""
TRIGGERS:
@@ -545,7 +531,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self.ui.btnCheck.setEnabled(not passed)
self.ui.lnProvider.setEnabled(not passed)
- @QtCore.Slot(dict)
def _download_provider_info(self, data):
"""
TRIGGERS:
@@ -581,7 +566,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
else:
self.ui.cbProviders.setEnabled(True)
- @QtCore.Slot()
def _provider_get_details(self, details):
"""
Set the details for the just downloaded provider.
@@ -591,7 +575,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
"""
self._provider_details = details
- @QtCore.Slot(dict)
def _download_ca_cert(self, data):
"""
TRIGGERS:
@@ -604,7 +587,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
if passed:
self.ui.lblCheckCaFpr.setPixmap(self.QUESTION_ICON)
- @QtCore.Slot(dict)
def _check_ca_fingerprint(self, data):
"""
TRIGGERS:
@@ -617,7 +599,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
if passed:
self.ui.lblCheckApiCert.setPixmap(self.QUESTION_ICON)
- @QtCore.Slot(dict)
def _check_api_certificate(self, data):
"""
TRIGGERS:
@@ -631,7 +612,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
True, self.SETUP_PROVIDER_PAGE)
self._provider_setup_ok = True
- @QtCore.Slot(str, int)
def _service_selection_changed(self, service, state):
"""
TRIGGERS:
@@ -680,7 +660,6 @@ class Wizard(QtGui.QWizard, SignalTracker):
self.tr("Something went wrong while trying to "
"load service %s" % (service,)))
- @QtCore.Slot(int)
def _current_id_changed(self, pageId):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/provider/providerbootstrapper.py b/src/leap/bitmask/provider/providerbootstrapper.py
index 8eefb9d9..efba29f9 100644
--- a/src/leap/bitmask/provider/providerbootstrapper.py
+++ b/src/leap/bitmask/provider/providerbootstrapper.py
@@ -225,8 +225,9 @@ class ProviderBootstrapper(AbstractBootstrapper):
if flags.APP_VERSION_CHECK:
# TODO split
if not provider.supports_client(min_client_version):
- self._signaler.signal(
- self._signaler.prov_unsupported_client)
+ if self._signaler is not None:
+ self._signaler.signal(
+ self._signaler.prov_unsupported_client)
raise UnsupportedClientVersionError()
provider_definition, mtime = get_content(res)
@@ -248,7 +249,9 @@ class ProviderBootstrapper(AbstractBootstrapper):
'Found: {1}.').format(api_supported, api_version)
logger.error(error)
- self._signaler.signal(self._signaler.prov_unsupported_api)
+ if self._signaler is not None:
+ self._signaler.signal(
+ self._signaler.prov_unsupported_api)
raise UnsupportedProviderAPI(error)
def run_provider_select_checks(self, domain, download_if_needed=False):
@@ -267,12 +270,18 @@ class ProviderBootstrapper(AbstractBootstrapper):
self._domain = ProviderConfig.sanitize_path_component(domain)
self._download_if_needed = download_if_needed
+ name_resolution = None
+ https_connection = None
+ down_provider_info = None
+ if self._signaler is not None:
+ name_resolution = self._signaler.prov_name_resolution
+ https_connection = self._signaler.prov_https_connection
+ down_provider_info = self._signaler.prov_download_provider_info
+
cb_chain = [
- (self._check_name_resolution,
- self._signaler.prov_name_resolution),
- (self._check_https, self._signaler.prov_https_connection),
- (self._download_provider_info,
- self._signaler.prov_download_provider_info)
+ (self._check_name_resolution, name_resolution),
+ (self._check_https, https_connection),
+ (self._download_provider_info, down_provider_info)
]
return self.addCallbackChain(cb_chain)
@@ -398,12 +407,18 @@ class ProviderBootstrapper(AbstractBootstrapper):
self._provider_config = provider_config
self._download_if_needed = download_if_needed
+ download_ca_cert = None
+ check_ca_fingerprint = None
+ check_api_certificate = None
+ if self._signaler is not None:
+ download_ca_cert = self._signaler.prov_download_ca_cert
+ check_ca_fingerprint = self._signaler.prov_check_ca_fingerprint
+ check_api_certificate = self._signaler.prov_check_api_certificate
+
cb_chain = [
- (self._download_ca_cert, self._signaler.prov_download_ca_cert),
- (self._check_ca_fingerprint,
- self._signaler.prov_check_ca_fingerprint),
- (self._check_api_certificate,
- self._signaler.prov_check_api_certificate)
+ (self._download_ca_cert, download_ca_cert),
+ (self._check_ca_fingerprint, check_ca_fingerprint),
+ (self._check_api_certificate, check_api_certificate)
]
return self.addCallbackChain(cb_chain)
diff --git a/src/leap/bitmask/provider/tests/test_providerbootstrapper.py b/src/leap/bitmask/provider/tests/test_providerbootstrapper.py
index 6cf3e469..e694e456 100644
--- a/src/leap/bitmask/provider/tests/test_providerbootstrapper.py
+++ b/src/leap/bitmask/provider/tests/test_providerbootstrapper.py
@@ -38,7 +38,6 @@ from requests.models import Response
from leap.bitmask import provider
from leap.bitmask import util
-from leap.bitmask.backend import Signaler
from leap.bitmask.config.providerconfig import ProviderConfig
from leap.bitmask.crypto.tests import fake_provider
from leap.bitmask.provider.providerbootstrapper import ProviderBootstrapper
@@ -51,7 +50,7 @@ from leap.common.testing.https_server import where
class ProviderBootstrapperTest(BaseLeapTest):
def setUp(self):
- self.pb = ProviderBootstrapper(Signaler())
+ self.pb = ProviderBootstrapper()
def tearDown(self):
pass
diff --git a/src/leap/bitmask/services/eip/conductor.py b/src/leap/bitmask/services/eip/conductor.py
index 01dd7449..3fc88724 100644
--- a/src/leap/bitmask/services/eip/conductor.py
+++ b/src/leap/bitmask/services/eip/conductor.py
@@ -130,7 +130,6 @@ class EIPConductor(object):
"""
self.qtsigs.do_disconnect_signal.emit()
- @QtCore.Slot()
def _start_eip(self):
"""
Start EIP.
@@ -174,7 +173,6 @@ class EIPConductor(object):
self.qtsigs.disconnecting_signal.disconnect()
self.qtsigs.disconnecting_signal.connect(do_stop)
- @QtCore.Slot()
def _stop_eip(self, restart=False, failed=False):
"""
TRIGGERS:
@@ -244,7 +242,6 @@ class EIPConductor(object):
if restart:
QtDelayedCall(2000, self.reconnect_stop_signal)
- @QtCore.Slot()
def _do_eip_restart(self):
"""
TRIGGERS:
@@ -266,7 +263,6 @@ class EIPConductor(object):
self.qtsigs.disconnecting_signal.connect(do_stop)
self.qtsigs.do_disconnect_signal.emit()
- @QtCore.Slot()
def _do_eip_failed(self):
"""
Stop EIP after a failure to start.
@@ -278,7 +274,6 @@ class EIPConductor(object):
self.qtsigs.connection_died_signal.emit()
QtDelayedCall(1000, self._eip_status.eip_failed_to_connect)
- @QtCore.Slot(int)
def _eip_finished(self, exitCode):
"""
TRIGGERS:
diff --git a/src/leap/bitmask/services/eip/eipbootstrapper.py b/src/leap/bitmask/services/eip/eipbootstrapper.py
index 264eac2e..f78113bc 100644
--- a/src/leap/bitmask/services/eip/eipbootstrapper.py
+++ b/src/leap/bitmask/services/eip/eipbootstrapper.py
@@ -115,10 +115,15 @@ class EIPBootstrapper(AbstractBootstrapper):
self._provider_config = provider_config
self._download_if_needed = download_if_needed
+ eip_config_ready = None
+ eip_certificate_ready = None
+ if self._signaler is not None:
+ eip_config_ready = self._signaler.eip_config_ready
+ eip_certificate_ready = self._signaler.eip_client_certificate_ready
+
cb_chain = [
- (self._download_config, self._signaler.eip_config_ready),
- (self._download_client_certificates,
- self._signaler.eip_client_certificate_ready)
+ (self._download_config, eip_config_ready),
+ (self._download_client_certificates, eip_certificate_ready)
]
return self.addCallbackChain(cb_chain)
diff --git a/src/leap/bitmask/services/eip/eipconfig.py b/src/leap/bitmask/services/eip/eipconfig.py
index 659ca1b1..f4d6b216 100644
--- a/src/leap/bitmask/services/eip/eipconfig.py
+++ b/src/leap/bitmask/services/eip/eipconfig.py
@@ -118,6 +118,8 @@ class VPNGatewaySelector(object):
"""
gateways_timezones = []
locations = self._eipconfig.get_locations()
+ if not locations:
+ locations = {}
gateways = self._eipconfig.get_gateways()
for idx, gateway in enumerate(gateways):
diff --git a/src/leap/bitmask/util/polkit_agent.py b/src/leap/bitmask/util/polkit_agent.py
index af5e431c..e512bffa 100644
--- a/src/leap/bitmask/util/polkit_agent.py
+++ b/src/leap/bitmask/util/polkit_agent.py
@@ -23,22 +23,18 @@ import subprocess
import daemon
+# TODO --- logger won't work when daemoninzed. Log to syslog instead?
logger = logging.getLogger(__name__)
-AUTH_FILE = "polkit-%s-authentication-agent-1"
-BASE_PATH_GNO = "/usr/lib/policykit-1-gnome/"
-BASE_PATH_KDE = "/usr/lib/kde4/libexec/"
-GNO_PATH = BASE_PATH_GNO + AUTH_FILE % ("gnome",)
-KDE_PATH = BASE_PATH_KDE + AUTH_FILE % ("kde",)
-
-POLKIT_PATHS = {
+POLKIT_PATHS = (
'/usr/lib/lxpolkit/lxpolkit',
- '/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1',
+ '/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1',
'/usr/lib/mate-polkit/polkit-mate-authentication-agent-1',
'/usr/lib/kde4/libexec/polkit-kde-authentication-agent-1',
-}
+)
+# TODO write tests for this piece.
def _get_polkit_agent():
"""
Return a valid polkit agent to use.
@@ -62,7 +58,7 @@ def _launch_agent():
polkit_agent = _get_polkit_agent()
if polkit_agent is None:
- logger.erro("No usable polkit was found.")
+ logger.error("No usable polkit was found.")
return
logger.debug('Launching polkit auth agent')
@@ -81,4 +77,6 @@ def launch():
_launch_agent()
if __name__ == "__main__":
+ # TODO pass a --nodaemon flag so that we can launch this in the foreground
+ # and debug this module, getting errors to stderr.
launch()