summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomás Touceda <chiiph@leap.se>2013-10-18 09:34:47 -0300
committerTomás Touceda <chiiph@leap.se>2013-10-18 09:34:47 -0300
commita06b5719f028e619a4b3800fb346ed3c984e4d25 (patch)
treeb177a28201d647731797efb25c19fd9b3a311c9a
parent932dcf596177b93c0b0f9e876be74be314fb6037 (diff)
parentf673b84a9a9b0fea3f6bbfefbb38cbd3d311cf3c (diff)
Merge branch 'release-0.3.5'0.3.5
-rw-r--r--.gitignore2
-rw-r--r--CHANGELOG38
-rw-r--r--Makefile1
-rw-r--r--data/bitmask.pro61
-rw-r--r--data/bitmask.pro.template9
-rw-r--r--data/images/mask-icon.pngbin16575 -> 8907 bytes
-rwxr-xr-xdata/make_project_file.py74
-rw-r--r--data/resources/locale.qrc4
-rw-r--r--data/translations/en_GB.qmbin0 -> 29879 bytes
-rw-r--r--data/translations/en_GB.ts1217
-rw-r--r--data/translations/vi.qmbin0 -> 32946 bytes
-rw-r--r--data/translations/vi.ts1217
-rw-r--r--data/ts/en_US.ts798
-rw-r--r--docs/dev/internationalization.rst13
-rw-r--r--pkg/requirements-dev.pip4
-rw-r--r--pkg/requirements.pip4
-rwxr-xr-xpkg/scripts/bitmask_bootstrap.sh51
-rw-r--r--relnotes.txt22
-rw-r--r--src/leap/bitmask/app.py19
-rw-r--r--src/leap/bitmask/config/__init__.py0
-rw-r--r--src/leap/bitmask/config/leapsettings.py63
-rw-r--r--src/leap/bitmask/crypto/srpauth.py18
-rw-r--r--src/leap/bitmask/gui/eip_status.py2
-rw-r--r--src/leap/bitmask/gui/login.py4
-rw-r--r--src/leap/bitmask/gui/mail_status.py19
-rw-r--r--src/leap/bitmask/gui/mainwindow.py337
-rw-r--r--src/leap/bitmask/gui/ui/eip_status.ui4
-rw-r--r--src/leap/bitmask/gui/ui/eippreferences.ui10
-rw-r--r--src/leap/bitmask/gui/ui/login.ui230
-rw-r--r--src/leap/bitmask/gui/ui/mail_status.ui73
-rw-r--r--src/leap/bitmask/gui/ui/mainwindow.ui44
-rw-r--r--src/leap/bitmask/gui/ui/wizard.ui8
-rw-r--r--src/leap/bitmask/gui/wizard.py3
-rw-r--r--src/leap/bitmask/services/eip/connection.py1
-rw-r--r--src/leap/bitmask/services/eip/linuxvpnlauncher.py10
-rw-r--r--src/leap/bitmask/services/eip/vpnlauncher.py26
-rw-r--r--src/leap/bitmask/services/eip/vpnprocess.py96
-rw-r--r--src/leap/bitmask/services/soledad/soledadbootstrapper.py8
-rw-r--r--src/leap/bitmask/util/leap_argparse.py3
-rw-r--r--src/leap/bitmask/util/leap_log_handler.py3
40 files changed, 3784 insertions, 712 deletions
diff --git a/.gitignore b/.gitignore
index ecec4091..579d3541 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,5 @@ MANIFEST
_trial_temp*
config/*
CHANGELOG~
+
+data/bitmask.pro
diff --git a/CHANGELOG b/CHANGELOG
index 4791f18b..25e90051 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,41 @@
+0.3.5 Oct 18 -- the "I can stand on one foot" release:
+ o In case of Soledad failure, display to the user that there was a
+ problem. Closes #4025.
+ o Widget squashing problem in wizard checking a new provider. Closes
+ #4058.
+ o Remember last domain used to login. Closes #4116.
+ o Display first run wizard, regardless of pinned providers. Closes
+ #4143.
+ o Show EIP status 'ON' in the systray tooltip when is
+ connected. Related to #3998.
+ o Catch u1db errors during soledad initialization.
+ o Disable --danger flag on release versions. Closes #4124.
+ o Display mail status in the tray icon as an enabled item. Fixes
+ #4036.
+ o Only show N unread Emails when N > 0. Fixes #4098.
+ o Hide login error message when the user interacts with the widgets
+ to fix the potential problem. Fixes #4022.
+ o Add call to `make` to the bootstrap script.
+ o Improve GUI based on QA rounds. Fixes #4041 and #4042.
+ o Increase the amount of retries for the authentication request
+ session. Fixes #4037.
+ o Rename EIP to Encrypted Internet in its preference panel. Fixes
+ #4057.
+ o Disable stdout redirection on Windows for the time being since it
+ breaks the bundle.
+ o Default UP_SCRIPT and DOWN_SCRIPT to None and only add that
+ parameter to the vpn command if not None.
+ o Look for gpg on windows with the .exe extension.
+ o Change the Util menu to be named File in OSX. Fixes #4039.
+ o Show more context information in the logs. Closes #3923.
+ o Automate internationalization process, create project file
+ dynamically on make. Closes #3925.
+ o Add support for running lxde polkit agent. Closes #4028.
+ o Added Vietnamese and English (United Kingdom) translations.
+ o Implements openvpn observer. Closes: #3901
+ o Reconnect EIP if network down. Closes #3790
+ o Reconnect if tls-restart. Closes: #3262
+
0.3.4 Oct 4 -- the "look at my new makeup" release:
o Fixes a bug where you cannot login to a different provider once
you logged in to another one. Fixes #3695.
diff --git a/Makefile b/Makefile
index 766544f4..1b4eed5d 100644
--- a/Makefile
+++ b/Makefile
@@ -48,6 +48,7 @@ resources : $(COMPILED_RESOURCES)
ui : $(COMPILED_UI)
translations:
+ data/make_project_file.py
$(PYLUP) $(PROJFILE)
$(LRELE) $(TRANSLAT_DIR)/*.ts
diff --git a/data/bitmask.pro b/data/bitmask.pro
deleted file mode 100644
index 0f9aaf90..00000000
--- a/data/bitmask.pro
+++ /dev/null
@@ -1,61 +0,0 @@
-# qmake file
-
-# is not there a f*** way of expanding this? other to template with python I mean...
-
-# to get a list of python files we can use:
-# find . -iname "*.py" | grep -Ev "__init__.py|/build/|/docs/|/gui/ui_[a-z]*.py|/gui/[a-z]*_rc.py|./.venv/|/tests/"
-# and remove by hand the few files that we do not want.
-
-SOURCES += ../src/leap/bitmask/app.py \
- ../src/leap/bitmask/config/leapsettings.py \
- ../src/leap/bitmask/config/providerconfig.py \
- ../src/leap/bitmask/crypto/srpauth.py \
- ../src/leap/bitmask/crypto/srpregister.py \
- ../src/leap/bitmask/gui/loggerwindow.py \
- ../src/leap/bitmask/gui/login.py \
- ../src/leap/bitmask/gui/mainwindow.py \
- ../src/leap/bitmask/gui/twisted_main.py \
- ../src/leap/bitmask/gui/wizardpage.py \
- ../src/leap/bitmask/gui/wizard.py \
- ../src/leap/bitmask/gui/eip_status.py \
- ../src/leap/bitmask/gui/mail_status.py \
- ../src/leap/bitmask/gui/eippreferences.py \
- ../src/leap/bitmask/gui/preferences.py \
- ../src/leap/bitmask/platform_init/initializers.py \
- ../src/leap/bitmask/platform_init/locks.py \
- ../src/leap/bitmask/provider/supportedapis.py \
- ../src/leap/bitmask/services/abstractbootstrapper.py \
- ../src/leap/bitmask/services/eip/eipbootstrapper.py \
- ../src/leap/bitmask/services/eip/eipconfig.py \
- ../src/leap/bitmask/services/eip/providerbootstrapper.py \
- ../src/leap/bitmask/services/eip/udstelnet.py \
- ../src/leap/bitmask/services/eip/vpnlaunchers.py \
- ../src/leap/bitmask/services/eip/vpnprocess.py \
- ../src/leap/bitmask/services/mail/smtpbootstrapper.py \
- ../src/leap/bitmask/services/mail/smtpconfig.py \
- ../src/leap/bitmask/services/soledad/soledadbootstrapper.py \
- ../src/leap/bitmask/services/soledad/soledadconfig.py \
- ../src/leap/bitmask/services/tx.py \
- ../src/leap/bitmask/util/constants.py \
- ../src/leap/bitmask/util/keyring_helpers.py \
- ../src/leap/bitmask/util/leap_argparse.py \
- ../src/leap/bitmask/util/leap_log_handler.py \
- ../src/leap/bitmask/util/privilege_policies.py \
- ../src/leap/bitmask/util/pyside_tests_helper.py \
- ../src/leap/bitmask/util/request_helpers.py \
- ../src/leap/bitmask/util/requirement_checker.py
-
-FORMS += ../src/leap/bitmask/gui/ui/loggerwindow.ui \
- ../src/leap/bitmask/gui/ui/login.ui \
- ../src/leap/bitmask/gui/ui/mainwindow.ui \
- ../src/leap/bitmask/gui/ui/wizard.ui \
- ../src/leap/bitmask/gui/ui/eip_status.ui \
- ../src/leap/bitmask/gui/ui/mail_status.ui \
- ../src/leap/bitmask/gui/ui/eippreferences.ui \
- ../src/leap/bitmask/gui/ui/preferences.ui \
-
-# where to generate ts files -- tx will pick from here
-
-# original file, english
-
-TRANSLATIONS += ts/en_US.ts
diff --git a/data/bitmask.pro.template b/data/bitmask.pro.template
new file mode 100644
index 00000000..564103a3
--- /dev/null
+++ b/data/bitmask.pro.template
@@ -0,0 +1,9 @@
+{header}
+
+SOURCES += {sources}
+
+FORMS += {forms}
+
+# where to generate ts files -- tx will pick from here
+# original file, english
+TRANSLATIONS += ts/en_US.ts
diff --git a/data/images/mask-icon.png b/data/images/mask-icon.png
index 3504bae9..97c5d7ec 100644
--- a/data/images/mask-icon.png
+++ b/data/images/mask-icon.png
Binary files differ
diff --git a/data/make_project_file.py b/data/make_project_file.py
new file mode 100755
index 00000000..d1567837
--- /dev/null
+++ b/data/make_project_file.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+import fnmatch
+import os
+import os.path
+import re
+
+
+# thanks to http://stackoverflow.com/a/5141829/687989
+def list_files(includes, excludes, start='.'):
+ """
+ Returns a list of files matching the glob expressions of the included
+ parameter and excluding the files and directories matching the parameter
+ excludes.
+
+ :param includes: the files to match, using glob's format.
+ :type includes: list of str
+ :param excludes: the files and directories to exclude, using glob's format.
+ :type excludes: list of str
+ """
+ # transform glob patterns to regular expressions
+ includes = r'|'.join([fnmatch.translate(x) for x in includes])
+ excludes = r'|'.join([fnmatch.translate(x) for x in excludes]) or r'$.'
+
+ files_list = []
+
+ for root, dirs, files in os.walk(start):
+ # exclude dirs
+ if excludes:
+ dirs[:] = [d for d in dirs if not re.match(excludes, d)]
+
+ # exclude/include files
+ if excludes:
+ files = [f for f in files if not re.match(excludes, f)]
+ files = [f for f in files if re.match(includes, f)]
+ files = [os.path.join(root, f) for f in files]
+
+ for fname in files:
+ files_list.append(fname)
+
+ return files_list
+
+
+if __name__ == '__main__':
+ SOURCE_ROOT = 'src'
+ TEMPLATE = 'data/bitmask.pro.template'
+ PROJECT = 'data/bitmask.pro'
+
+ HEADER = ("# DO NOT EDIT MANUALLY.\n"
+ "# qmake file generated by script, any changes will be lost.")
+
+ # Source files
+ includes = ["*.py"]
+ excludes = ['__init__.py', '_version.py', 'ui_*.py', '*_rc.py']
+ sources = list_files(includes, excludes, SOURCE_ROOT)
+ sources = " \\\n".join(["../{0}".format(f) for f in sources])
+
+ # Form files
+ includes = ["*.ui"]
+ excludes = []
+ forms = list_files(includes, excludes, SOURCE_ROOT)
+ forms = " \\\n".join(["../{0}".format(f) for f in forms])
+
+ # Load template and write project
+ template = file(TEMPLATE).read()
+ project = template.format(header=HEADER, sources=sources, forms=forms)
+
+ try:
+ with open(PROJECT, 'w') as output:
+ output.write(project)
+ print "Project file generated successfully"
+ except IOError, e:
+ print "Error saving project file: {0}".format(e)
diff --git a/data/resources/locale.qrc b/data/resources/locale.qrc
index 47fb5243..ba466c36 100644
--- a/data/resources/locale.qrc
+++ b/data/resources/locale.qrc
@@ -1,6 +1,6 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
-<file>../translations/es.qm</file>
-<file>../translations/de.qm</file>
+<file>../translations/vi.qm</file>
+<file>../translations/en_GB.qm</file>
</qresource>
</RCC>
diff --git a/data/translations/en_GB.qm b/data/translations/en_GB.qm
new file mode 100644
index 00000000..d95163c1
--- /dev/null
+++ b/data/translations/en_GB.qm
Binary files differ
diff --git a/data/translations/en_GB.ts b/data/translations/en_GB.ts
new file mode 100644
index 00000000..7a719acf
--- /dev/null
+++ b/data/translations/en_GB.ts
@@ -0,0 +1,1217 @@
+<?xml version="1.0" ?><!DOCTYPE TS><TS language="en_GB" version="1.1">
+<context>
+ <name>EIPPreferences</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="14"/>
+ <source>EIP Preferences</source>
+ <translation>EIP Preferences</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="27"/>
+ <source>Select gateway for provider</source>
+ <translation>Select gateway for provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="36"/>
+ <source>&amp;Select provider:</source>
+ <translation>&amp;Select provider:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="140"/>
+ <source>&lt;Select provider&gt;</source>
+ <translation>&lt;Select provider&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="55"/>
+ <source>Save this provider settings</source>
+ <translation>Save this provider settings</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="62"/>
+ <source>&lt; Providers Gateway Status &gt;</source>
+ <translation>&lt; Providers Gateway Status &gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="72"/>
+ <source>Select gateway:</source>
+ <translation>Select gateway:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="80"/>
+ <source>Automatic</source>
+ <translation>Automatic</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="91"/>
+ <source>Automatic EIP start</source>
+ <translation>Automatic EIP start</translation>
+ </message>
+ <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;Automatic EIP start saved!&lt;/b&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="119"/>
+ <source>Save auto start setting</source>
+ <translation>Save auto start setting</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="129"/>
+ <source>Enable Automatic start of EIP</source>
+ <translation>Enable Automatic start of EIP</translation>
+ </message>
+</context>
+<context>
+ <name>EIPPreferencesWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="47"/>
+ <source>Automatic</source>
+ <translation>Automatic</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="156"/>
+ <source>Gateway settings for provider &apos;{0}&apos; saved.</source>
+ <translation>Gateway settings for provider &apos;{0}&apos; saved.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="198"/>
+ <source>There was a problem with configuration files.</source>
+ <translation>There was a problem with configuration files.</translation>
+ </message>
+</context>
+<context>
+ <name>EIPStatus</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="20"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="31"/>
+ <source>Turn On</source>
+ <translation>Turn On</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="63"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="86"/>
+ <source>Traffic is being routed in the clear</source>
+ <translation>Traffic is being routed in the clear</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="253"/>
+ <source>0.0 KB/s</source>
+ <translation>0.0 KB/s</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>All services are OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="197"/>
+ <source>Encrypted Internet: {0}</source>
+ <translation>Encrypted Internet: {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>You must login to use Encrypted Internet</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="300"/>
+ <source>Turn OFF</source>
+ <translation>Turn OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="314"/>
+ <source>Turn ON</source>
+ <translation>Turn ON</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="321"/>
+ <source>Traffic is being routed in the clear</source>
+ <translation>Traffic is being routed in the clear</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="378"/>
+ <source>Authenticating...</source>
+ <translation>Authenticating...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="380"/>
+ <source>Retrieving configuration...</source>
+ <translation>Retrieving configuration...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="382"/>
+ <source>Waiting to start...</source>
+ <translation>Waiting to start...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="384"/>
+ <source>Assigning IP</source>
+ <translation>Assigning IP</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="386"/>
+ <source>Reconnecting...</source>
+ <translation>Reconnecting...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="395"/>
+ <source>Unable to start VPN, it&apos;s already running.</source>
+ <translation>Unable to start VPN, it&apos;s already running.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="418"/>
+ <source>Encrypted Internet: OFF</source>
+ <translation>Encrypted Internet: OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="423"/>
+ <source>Encrypted Internet: Starting...</source>
+ <translation>Encrypted Internet: Starting...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="425"/>
+ <source>Encrypted Internet: ON</source>
+ <translation>Encrypted Internet: ON</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="435"/>
+ <source>Route traffic through: {0}</source>
+ <translation>Route traffic through: {0}</translation>
+ </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>Debug</translation>
+ </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>Save to file</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="148"/>
+ <source>Save As</source>
+ <translation>Save As</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="24"/>
+ <source>Filter by:</source>
+ <translation>Filter by:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="34"/>
+ <source>Case Insensitive</source>
+ <translation>Case Insensitive</translation>
+ </message>
+</context>
+<context>
+ <name>LoginWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="26"/>
+ <source>Form</source>
+ <translation>Form</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;Provider:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="172"/>
+ <source>Remember username and password</source>
+ <translation>Remember username and password</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="197"/>
+ <source>&lt;b&gt;Username:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Username:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="210"/>
+ <source>&lt;b&gt;Password:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Password:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="234"/>
+ <source>Log In</source>
+ <translation>Log In</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="121"/>
+ <source>Other...</source>
+ <translation>Other...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="229"/>
+ <source>Cancel</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="63"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="365"/>
+ <source>Logout</source>
+ <translation>Logout</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="283"/>
+ <source>Please select a valid provider</source>
+ <translation>Please select a valid provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="288"/>
+ <source>Please provide a valid username</source>
+ <translation>Please provide a valid username</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="293"/>
+ <source>Please provide a valid password</source>
+ <translation>Please provide a valid password</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="296"/>
+ <source>Logging in...</source>
+ <translation>Logging in...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="358"/>
+ <source>Loggin out...</source>
+ <translation>Loggin out...</translation>
+ </message>
+</context>
+<context>
+ <name>MailStatusWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="20"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="31"/>
+ <source>You must login to use encrypted email.</source>
+ <translation>You must login to use encrypted email.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="44"/>
+ <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>All services are OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="204"/>
+ <source>There was an unexpected problem with Soledad.</source>
+ <translation>There was an unexpected problem with Soledad.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="418"/>
+ <source>OFF</source>
+ <translation>OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="221"/>
+ <source>Mail is OFF</source>
+ <translation>Mail is OFF</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>You must be logged in to use encrypted email.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="228"/>
+ <source>Starting..</source>
+ <translation>Starting..</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="229"/>
+ <source>Mail is starting</source>
+ <translation>Mail is starting</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="383"/>
+ <source>ON</source>
+ <translation>ON</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
+ <source>Mail is ON</source>
+ <translation>Mail is ON</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="236"/>
+ <source>Mail is disabled</source>
+ <translation>Mail is disabled</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="298"/>
+ <source>Starting...</source>
+ <translation>Starting...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="265"/>
+ <source>Soledad has started...</source>
+ <translation>Soledad has started...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="267"/>
+ <source>Soledad is starting, please wait...</source>
+ <translation>Soledad is starting, please wait...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="304"/>
+ <source>Looking for key for this user</source>
+ <translation>Looking for key for this user</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="308"/>
+ <source>Found key! Starting mail...</source>
+ <translation>Found key! Starting mail...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="310"/>
+ <source>Generating new key, please wait...</source>
+ <translation>Generating new key, please wait...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="312"/>
+ <source>Finished generating key!</source>
+ <translation>Finished generating key!</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="314"/>
+ <source>Starting mail...</source>
+ <translation>Starting mail...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="344"/>
+ <source>SMTP has started...</source>
+ <translation>SMTP has started...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="350"/>
+ <source>SMTP failed to start, check the logs.</source>
+ <translation>SMTP failed to start, check the logs.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="387"/>
+ <source>Failed</source>
+ <translation>Failed</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="381"/>
+ <source>IMAP has started...</source>
+ <translation>IMAP has started...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="387"/>
+ <source>IMAP failed to start, check the logs.</source>
+ <translation>IMAP failed to start, check the logs.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="391"/>
+ <source>%s Unread Emails</source>
+ <translation>%s Unread Emails</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="405"/>
+ <source>About to start, please wait...</source>
+ <translation>About to start, please wait...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="412"/>
+ <source>Disabled</source>
+ <translation>Disabled</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="257"/>
+ <source>There are new updates available, please restart.</source>
+ <translation>There are new updates available, please restart.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="299"/>
+ <source>More...</source>
+ <translation>More...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="626"/>
+ <source>Help</source>
+ <translation>Help</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="360"/>
+ <source>&amp;Quit</source>
+ <translation>&amp;Quit</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="370"/>
+ <source>&amp;Help</source>
+ <translation>&amp;Help</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="375"/>
+ <source>&amp;Wizard</source>
+ <translation>&amp;Wizard</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="672"/>
+ <source>Hide Main Window</source>
+ <translation>Hide Main Window</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="527"/>
+ <source> The following components will be updated:
+%s</source>
+ <translation> The following components will be updated:
+%s</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="530"/>
+ <source>Updates available</source>
+ <translation>Updates available</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="671"/>
+ <source>Show Main Window</source>
+ <translation>Show Main Window</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>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.</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>We could not find &lt;b&gt;pkexec&lt;/b&gt; in your system.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1331"/>
+ <source>We could not find openvpn binary.</source>
+ <translation>We could not find openvpn binary.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1493"/>
+ <source>Starting...</source>
+ <translation>Starting...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1501"/>
+ <source>Not supported</source>
+ <translation>Not supported</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1504"/>
+ <source>Disabled</source>
+ <translation>Disabled</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1537"/>
+ <source>Could not load Encrypted Internet Configuration.</source>
+ <translation>Could not load Encrypted Internet Configuration.</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>Encrypted Internet could not be launched because you did not authenticate properly.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1467"/>
+ <source>Encrypted Internet finished in an unexpected manner!</source>
+ <translation>Encrypted Internet finished in an unexpected manner!</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"/>
+ <source>About &amp;Bitmask</source>
+ <translation>About &amp;Bitmask</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="283"/>
+ <source>Mail is OFF</source>
+ <translation>Mail is OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="518"/>
+ <source>The Bitmask app is ready to update, please restart the application.</source>
+ <translation>The Bitmask app is ready to update, please restart the application.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="734"/>
+ <source>About Bitmask - %s</source>
+ <translation>About 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>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;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="836"/>
+ <source>Unable to login: Problem with provider</source>
+ <translation>Unable to login: Problem with provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="874"/>
+ <source>Log in cancelled by the user.</source>
+ <translation>Log in cancelled by the user.</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>Encrypted Internet cannot be started because the tuntap extension is not installed properly in your system.</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>Another openvpn instance is already running, and could not be stopped.</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>Another openvpn instance is already running, and could not be stopped because it was not launched by Bitmask. Please stop it and try again.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1519"/>
+ <source>There was a problem with the provider</source>
+ <translation>There was a problem with the provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1618"/>
+ <source>Something went wrong with the logout.</source>
+ <translation>Something went wrong with the logout.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1639"/>
+ <source>Unable to connect: Problem with provider</source>
+ <translation>Unable to connect: Problem with provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="113"/>
+ <source>Encrypted Internet</source>
+ <translation>Encrypted Internet</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="194"/>
+ <source>Login</source>
+ <translation>Login</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="334"/>
+ <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>Preferences...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="380"/>
+ <source>Show &amp;Log</source>
+ <translation>Show &amp;Log</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="385"/>
+ <source>Create a new account...</source>
+ <translation>Create a new account...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="272"/>
+ <source>File</source>
+ <translation>File</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="633"/>
+ <source>Encrypted Internet: OFF</source>
+ <translation>Encrypted Internet: OFF</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1395"/>
+ <source>Network is unreachable</source>
+ <translation>Network is unreachable</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1418"/>
+ <source>EIP has stopped</source>
+ <translation>EIP has stopped</translation>
+ </message>
+</context>
+<context>
+ <name>Preferences</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="14"/>
+ <source>Preferences</source>
+ <translation>Preferences</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="40"/>
+ <source>Password Change</source>
+ <translation>Password Change</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="49"/>
+ <source>&amp;Current password:</source>
+ <translation>&amp;Current password:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="66"/>
+ <source>&amp;New password:</source>
+ <translation>&amp;New password:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="83"/>
+ <source>&amp;Re-enter new password:</source>
+ <translation>&amp;Re-enter new password:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="100"/>
+ <source>Change</source>
+ <translation>Change</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="107"/>
+ <source>&lt;Password change status&gt;</source>
+ <translation>&lt;Password change status&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="120"/>
+ <source>Enabled services</source>
+ <translation>Enabled services</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="126"/>
+ <source>Save this provider settings</source>
+ <translation>Save this provider settings</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="133"/>
+ <source>Services</source>
+ <translation>Services</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="149"/>
+ <source>&lt;Select provider&gt;</source>
+ <translation>&lt;Select provider&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="157"/>
+ <source>Select provider:</source>
+ <translation>Select provider:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="164"/>
+ <source>&lt; Providers Services Status &gt;</source>
+ <translation>&lt; Providers Services Status &gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PreferencesWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="53"/>
+ <source>Automatic</source>
+ <translation>Automatic</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="115"/>
+ <source>Changing password...</source>
+ <translation>Changing password...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="166"/>
+ <source>Password changed successfully.</source>
+ <translation>Password changed successfully.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="181"/>
+ <source>There was a problem changing the password.</source>
+ <translation>There was a problem changing the password.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="184"/>
+ <source>You did not enter a correct current password.</source>
+ <translation>You did not enter a correct current password.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="317"/>
+ <source>Services settings for provider &apos;{0}&apos; saved.</source>
+ <translation>Services settings for provider &apos;{0}&apos; saved.</translation>
+ </message>
+</context>
+<context>
+ <name>ProviderBootstrapper</name>
+ <message>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="137"/>
+ <source>Provider certificate could not be verified</source>
+ <translation>Provider certificate could not be verified</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="144"/>
+ <source>Provider does not support HTTPS</source>
+ <translation>Provider does not support HTTPS</translation>
+ </message>
+</context>
+<context>
+ <name>SRPAuth</name>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="711"/>
+ <source>Succeeded</source>
+ <translation>Succeeded</translation>
+ </message>
+</context>
+<context>
+ <name>Wizard</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="43"/>
+ <source>Welcome</source>
+ <translation>Welcome</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="55"/>
+ <source>Log In with my credentials</source>
+ <translation>Log In with my credentials</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;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;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="75"/>
+ <source>Sign up for a new account</source>
+ <translation>Sign up for a new account</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="112"/>
+ <source>Provider selection</source>
+ <translation>Provider selection</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>Please enter the domain of the provider you want to use for your connection</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="305"/>
+ <source>Check</source>
+ <translation>Check</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="312"/>
+ <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>Checking for a valid provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="159"/>
+ <source>Getting provider information</source>
+ <translation>Getting provider information</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="239"/>
+ <source>Can we reach this provider?</source>
+ <translation>Can we reach this provider?</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="333"/>
+ <source>Provider Information</source>
+ <translation>Provider Information</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="336"/>
+ <source>Description of services offered by this provider</source>
+ <translation>Description of services offered by this provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="345"/>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="377"/>
+ <source>Desc</source>
+ <translation>Desc</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="387"/>
+ <source>&lt;b&gt;Services offered:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Services offered:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="397"/>
+ <source>services</source>
+ <translation>services</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="417"/>
+ <source>&lt;b&gt;Enrollment policy:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Enrollment policy:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="427"/>
+ <source>policy</source>
+ <translation>policy</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="447"/>
+ <source>&lt;b&gt;URL:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;URL:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="457"/>
+ <source>URL</source>
+ <translation>URL</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="464"/>
+ <source>&lt;b&gt;Description:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Description:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="475"/>
+ <source>Provider setup</source>
+ <translation>Provider setup</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="478"/>
+ <source>Gathering configuration options for this provider</source>
+ <translation>Gathering configuration options for this provider</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>We are downloading some bits that we need to establish a secure connection with the provider for the first time.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="523"/>
+ <source>Setting up provider</source>
+ <translation>Setting up provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="573"/>
+ <source>Getting info from the Certificate Authority</source>
+ <translation>Getting info from the Certificate Authority</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="580"/>
+ <source>Do we trust this Certificate Authority?</source>
+ <translation>Do we trust this Certificate Authority?</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="587"/>
+ <source>Establishing a trust relationship with this provider</source>
+ <translation>Establishing a trust relationship with this provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="646"/>
+ <source>Register new user</source>
+ <translation>Register new user</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="649"/>
+ <source>Register a new user with provider</source>
+ <translation>Register a new user with provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="664"/>
+ <source>&lt;b&gt;Password:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Password:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="691"/>
+ <source>&lt;b&gt;Re-enter password:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Re-enter password:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="701"/>
+ <source>Register</source>
+ <translation>Register</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="747"/>
+ <source>Remember my username and password</source>
+ <translation>Remember my username and password</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="771"/>
+ <source>Service selection</source>
+ <translation>Service selection</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>Please select the services you would like to have</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="141"/>
+ <source>&amp;Next &gt;</source>
+ <translation>&amp;Next &gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="143"/>
+ <source>Connect</source>
+ <translation>Connect</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="238"/>
+ <source>Starting registration...</source>
+ <translation>Starting registration...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="269"/>
+ <source>User %s successfully registered.</source>
+ <translation>User %s successfully registered.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="289"/>
+ <source>Unknown error</source>
+ <translation>Unknown error</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="414"/>
+ <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;Non-existent provider&lt;/b&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="432"/>
+ <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"/>
+ <source>Unable to load provider configuration</source>
+ <translation>Unable to load provider configuration</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="466"/>
+ <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;Not a valid provider&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>Services by %s</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="552"/>
+ <source>Something went wrong while trying to load service %s</source>
+ <translation>Something went wrong while trying to load service %s</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="569"/>
+ <source>Gathering configuration options for %s</source>
+ <translation>Gathering configuration options for %s</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="578"/>
+ <source>Description of services offered by %s</source>
+ <translation>Description of services offered by %s</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="599"/>
+ <source>Register a new user with %s</source>
+ <translation>Register a new user with %s</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="26"/>
+ <source>Bitmask first run</source>
+ <translation>Bitmask first run</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="46"/>
+ <source>This is the Bitmask first run wizard</source>
+ <translation>This is the Bitmask first run wizard</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="166"/>
+ <source>Can we establish a secure connection?</source>
+ <translation>Can we establish a secure connection?</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="734"/>
+ <source>&lt;b&gt;Username:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Username:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="269"/>
+ <source>Configure or select a provider</source>
+ <translation>Configure or select a provider</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="275"/>
+ <source>Configure new provider:</source>
+ <translation>Configure new provider:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="285"/>
+ <source>Use existing one:</source>
+ <translation>Use existing one:</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>The server did not send the salt parameter</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="292"/>
+ <source>The server did not send the B parameter</source>
+ <translation>The server did not send the B parameter</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="324"/>
+ <source>The data sent from the server had errors</source>
+ <translation>The data sent from the server had errors</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="346"/>
+ <source>Could not connect to the server</source>
+ <translation>Could not connect to the server</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="372"/>
+ <source>Unknown error (%s)</source>
+ <translation>Unknown error (%s)</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="403"/>
+ <source>Problem getting data from server</source>
+ <translation>Problem getting data from server</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="429"/>
+ <source>Bad data from server</source>
+ <translation>Bad data from server</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="436"/>
+ <source>Auth verification failed</source>
+ <translation>Auth verification failed</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="444"/>
+ <source>Session cookie verification failed</source>
+ <translation>Session cookie verification failed</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="279"/>
+ <source>There was a problem with authentication</source>
+ <translation>There was a problem with authentication</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="174"/>
+ <source>Invalid username or password.</source>
+ <translation>Invalid username or password.</translation>
+ </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>No gateway was found!</translation>
+ </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>Missing up/down scripts</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="184"/>
+ <source>TAP Driver</source>
+ <translation>TAP Driver</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="191"/>
+ <source>Encrypted Internet uses VPN, which needs a TAP device installed and none has been found. This will ask for administrative privileges.</source>
+ <translation>Encrypted Internet uses VPN, which needs a TAP device installed and none has been found. This will ask for administrative privileges.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="310"/>
+ <source>TUN Driver</source>
+ <translation>TUN Driver</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="318"/>
+ <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>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.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="132"/>
+ <source>Problem installing files</source>
+ <translation>Problem installing files</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="133"/>
+ <source>Some of the files could not be copied.</source>
+ <translation>Some of the files could not be copied.</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="313"/>
+ <source>Bitmask needs to install the necessary drivers for Encrypted Internet to work. Would you like to proceed?</source>
+ <translation>Bitmask needs to install the necessary drivers for Encrypted Internet to work. Would you like to proceed?</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/data/translations/vi.qm b/data/translations/vi.qm
new file mode 100644
index 00000000..819654d6
--- /dev/null
+++ b/data/translations/vi.qm
Binary files differ
diff --git a/data/translations/vi.ts b/data/translations/vi.ts
new file mode 100644
index 00000000..4d6d343b
--- /dev/null
+++ b/data/translations/vi.ts
@@ -0,0 +1,1217 @@
+<?xml version="1.0" ?><!DOCTYPE TS><TS language="vi" version="1.1">
+<context>
+ <name>EIPPreferences</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="14"/>
+ <source>EIP Preferences</source>
+ <translation>Tùy biến EIP</translation>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="72"/>
+ <source>Select gateway:</source>
+ <translation>Chọn gateway:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="80"/>
+ <source>Automatic</source>
+ <translation>Tự động</translation>
+ </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>
+ </message>
+ <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>
+ </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>
+ </message>
+ <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>
+ </message>
+</context>
+<context>
+ <name>EIPPreferencesWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="47"/>
+ <source>Automatic</source>
+ <translation>Tự động</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="156"/>
+ <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"/>
+ <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>
+</context>
+<context>
+ <name>EIPStatus</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="20"/>
+ <source>Form</source>
+ <translation>Đơn mẫu</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="31"/>
+ <source>Turn On</source>
+ <translation>Mở lên</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="63"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="86"/>
+ <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"/>
+ <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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="300"/>
+ <source>Turn OFF</source>
+ <translation>Bật TẮT</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="314"/>
+ <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"/>
+ <source>Authenticating...</source>
+ <translation>Đang xác nhận...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="380"/>
+ <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"/>
+ <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"/>
+ <source>Assigning IP</source>
+ <translation>Đang gán IP</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="386"/>
+ <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"/>
+ <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>
+ </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>
+ </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>
+ </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>
+ </message>
+</context>
+<context>
+ <name>LoggerWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="14"/>
+ <source>Logs</source>
+ <translation>Nhật trình</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="49"/>
+ <source>Debug</source>
+ <translation>Gỡ lỗi</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="69"/>
+ <source>Info</source>
+ <translation>Thông tin</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="89"/>
+ <source>Warning</source>
+ <translation>Cảnh báo</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="109"/>
+ <source>Error</source>
+ <translation>Lỗi</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="129"/>
+ <source>Critical</source>
+ <translation>Nghiêm trọng</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="149"/>
+ <source>Save to file</source>
+ <translation>Lưu vào tập tin</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/loggerwindow.py" line="148"/>
+ <source>Save As</source>
+ <translation>Lưu dưới dạng</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="24"/>
+ <source>Filter by:</source>
+ <translation>Lọc dữ liệu theo:</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/loggerwindow.ui" line="34"/>
+ <source>Case Insensitive</source>
+ <translation>Phân biệt chữ hoa chữ thường</translation>
+ </message>
+</context>
+<context>
+ <name>LoginWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="26"/>
+ <source>Form</source>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <source>Cancel</source>
+ <translation>Hủy bỏ</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="63"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="365"/>
+ <source>Logout</source>
+ <translation>Đăng xuất</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="283"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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>
+ </message>
+</context>
+<context>
+ <name>MailStatusWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="20"/>
+ <source>Form</source>
+ <translation>Biểu mẫu</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="31"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <source>OFF</source>
+ <translation>TẮT</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="221"/>
+ <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"/>
+ <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"/>
+ <source>ON</source>
+ <translation>MỞ</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
+ <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"/>
+ <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"/>
+ <source>Starting...</source>
+ <translation>Đang khởi chạy...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="265"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="412"/>
+ <source>Disabled</source>
+ <translation>Vô Hiệu Hóa</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="257"/>
+ <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"/>
+ <source>More...</source>
+ <translation>Thêm...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="626"/>
+ <source>Help</source>
+ <translation>Trợ giúp</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="360"/>
+ <source>&amp;Quit</source>
+ <translation>&amp;Thoát</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="370"/>
+ <source>&amp;Help</source>
+ <translation>&amp;Trợ giúp</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="375"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <source>Starting...</source>
+ <translation>Đang khởi chạy...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1501"/>
+ <source>Not supported</source>
+ <translation>Không được hỗ trợ</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1504"/>
+ <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"/>
+ <source>About &amp;Bitmask</source>
+ <translation>Dịch bởi Vietnamesel10n</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="283"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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>
+ </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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1418"/>
+ <source>EIP has stopped</source>
+ <translation>EIP đã dừng lại</translation>
+ </message>
+</context>
+<context>
+ <name>Preferences</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="14"/>
+ <source>Preferences</source>
+ <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>
+ </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>
+ </message>
+ <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>
+ </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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="100"/>
+ <source>Change</source>
+ <translation>Thay đổi</translation>
+ </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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="133"/>
+ <source>Services</source>
+ <translation>Dịch vụ</translation>
+ </message>
+ <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>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="157"/>
+ <source>Select provider:</source>
+ <translation>Chọn nhà cung cấp:</translation>
+ </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>
+ </message>
+</context>
+<context>
+ <name>PreferencesWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="53"/>
+ <source>Automatic</source>
+ <translation>Tự động</translation>
+ </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>
+ </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>
+ </message>
+ <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>
+ </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>
+ </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>
+ </message>
+</context>
+<context>
+ <name>ProviderBootstrapper</name>
+ <message>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="137"/>
+ <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"/>
+ <source>Provider does not support HTTPS</source>
+ <translation>Nhà cung cấp không hỗ trợ HTTPS</translation>
+ </message>
+</context>
+<context>
+ <name>SRPAuth</name>
+ <message>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="711"/>
+ <source>Succeeded</source>
+ <translation>Đã thành công</translation>
+ </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"/>
+ <source>Check</source>
+ <translation>Kiểm tra</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="312"/>
+ <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>Đ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"/>
+ <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"/>
+ <source>Name</source>
+ <translation>Tên</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="377"/>
+ <source>Desc</source>
+ <translation>Mô tả</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="387"/>
+ <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"/>
+ <source>services</source>
+ <translation>dịch vụ</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="417"/>
+ <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"/>
+ <source>policy</source>
+ <translation>chính sách</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="447"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <source>Register</source>
+ <translation>Đăng ký</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="747"/>
+ <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"/>
+ <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"/>
+ <source>&amp;Next &gt;</source>
+ <translation>&amp;Tiếp theo &gt;</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="143"/>
+ <source>Connect</source>
+ <translation>Kết nối</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="238"/>
+ <source>Starting registration...</source>
+ <translation>Đang bắt đầu đăng ký...</translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="269"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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>
+</context>
+</TS> \ No newline at end of file
diff --git a/data/ts/en_US.ts b/data/ts/en_US.ts
index 224060f4..64a400ba 100644
--- a/data/ts/en_US.ts
+++ b/data/ts/en_US.ts
@@ -1,21 +1,194 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1">
<context>
- <name>DarwinVPNLauncher</name>
+ <name>EIPPreferences</name>
<message>
- <location filename="../src/leap/bitmask/services/eip/vpnlaunchers.py" line="691"/>
- <source>No gateway was found!</source>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="14"/>
+ <source>EIP Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="27"/>
+ <source>Select gateway for provider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="36"/>
+ <source>&amp;Select provider:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="140"/>
+ <source>&lt;Select provider&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="55"/>
+ <source>Save this provider settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="62"/>
+ <source>&lt; Providers Gateway Status &gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="72"/>
+ <source>Select gateway:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="80"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="91"/>
+ <source>Automatic EIP start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <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 type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="119"/>
+ <source>Save auto start setting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eippreferences.ui" line="129"/>
+ <source>Enable Automatic start of EIP</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EIPPreferencesWindow</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="47"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_preferenceswindow.py" line="156"/>
+ <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="198"/>
+ <source>There was a problem with configuration files.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>EIPBootstrapper</name>
+ <name>EIPStatus</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="20"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="31"/>
+ <source>Turn On</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="63"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="86"/>
+ <source>Traffic is being routed in the clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/eip_status.ui" line="253"/>
+ <source>0.0 KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
- <name>LinuxVPNLauncher</name>
+ <name>EIPStatusWidget</name>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="191"/>
+ <source>All services are OFF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="197"/>
+ <source>Encrypted Internet: {0}</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="249"/>
+ <source>You must login to use Encrypted Internet</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="300"/>
+ <source>Turn OFF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="314"/>
+ <source>Turn ON</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="321"/>
+ <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="378"/>
+ <source>Authenticating...</source>
+ <translation type="unfinished"></translation>
+ </message>
<message>
- <location filename="../src/leap/bitmask/services/eip/vpnlaunchers.py" line="435"/>
- <source>No gateway was found!</source>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="380"/>
+ <source>Retrieving configuration...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="382"/>
+ <source>Waiting to start...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="384"/>
+ <source>Assigning IP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="386"/>
+ <source>Reconnecting...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="395"/>
+ <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="418"/>
+ <source>Encrypted Internet: OFF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="423"/>
+ <source>Encrypted Internet: Starting...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="425"/>
+ <source>Encrypted Internet: ON</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/eip_status.py" line="437"/>
+ <source>Route traffic through: {0}</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -75,517 +248,567 @@
<context>
<name>LoginWidget</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="14"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="26"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="49"/>
- <source>Create a new account</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="56"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="75"/>
<source>&lt;b&gt;Provider:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="76"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="94"/>
<source>Remember username and password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/login.ui" line="83"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="119"/>
<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="93"/>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="132"/>
<source>&lt;b&gt;Password:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="217"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="234"/>
<source>Log In</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="107"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="121"/>
<source>Other...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/login.py" line="213"/>
+ <location filename="../src/leap/bitmask/gui/login.py" line="229"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/login.ui" line="250"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="366"/>
+ <source>Logout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="283"/>
+ <source>Please select a valid provider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="288"/>
+ <source>Please provide a valid username</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="293"/>
+ <source>Please provide a valid password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="296"/>
+ <source>Logging in...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/login.py" line="359"/>
+ <source>Loggin out...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
- <name>MainWindow</name>
+ <name>MailStatusWidget</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="62"/>
- <source>There are new updates available, please restart.</source>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="20"/>
+ <source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="78"/>
- <source>More...</source>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="47"/>
+ <source>You must login to use encrypted email.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="243"/>
- <source>Show Log</source>
+ <location filename="../src/leap/bitmask/gui/ui/mail_status.ui" line="79"/>
+ <source>Email</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="271"/>
- <source>&amp;Session</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="171"/>
+ <source>All services are OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="617"/>
- <source>Help</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="204"/>
+ <source>There was an unexpected problem with Soledad.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="296"/>
- <source>&amp;Quit</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="418"/>
+ <source>OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="306"/>
- <source>&amp;Help</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="221"/>
+ <source>Mail is OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="311"/>
- <source>&amp;Wizard</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="224"/>
+ <source>You must be logged in to use encrypted email.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="316"/>
- <source>Show &amp;logs</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="228"/>
+ <source>Starting..</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="667"/>
- <source>Hide Main Window</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="229"/>
+ <source>Mail is starting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="493"/>
- <source> The following components will be updated:
-%s</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="383"/>
+ <source>ON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="496"/>
- <source>Updates available</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="233"/>
+ <source>Mail is ON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="262"/>
- <source>Preferences</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="236"/>
+ <source>Mail is disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="666"/>
- <source>Show Main Window</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="298"/>
+ <source>Starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="856"/>
- <source>Please select a valid provider</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="265"/>
+ <source>Soledad has started...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="861"/>
- <source>Please provide a valid username</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="267"/>
+ <source>Soledad is starting, please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="866"/>
- <source>Please provide a valid Password</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="304"/>
+ <source>Looking for key for this user</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="869"/>
- <source>Logging in...</source>
+ <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/mainwindow.py" line="1265"/>
- <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>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="310"/>
+ <source>Generating new key, please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1277"/>
- <source>We could not find &lt;b&gt;pkexec&lt;/b&gt; in your system.</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="312"/>
+ <source>Finished generating key!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1282"/>
- <source>We could not find openvpn binary.</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="314"/>
+ <source>Starting mail...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1342"/>
- <source>OFF</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="344"/>
+ <source>SMTP has started...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1359"/>
- <source>Starting...</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="350"/>
+ <source>SMTP failed to start, check the logs.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1367"/>
- <source>Not supported</source>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="387"/>
+ <source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1370"/>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="381"/>
+ <source>IMAP has started...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="387"/>
+ <source>IMAP failed to start, check the logs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="391"/>
+ <source>%s Unread Emails</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="405"/>
+ <source>About to start, please wait...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/mail_status.py" line="412"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>MainWindow</name>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1407"/>
- <source>Could not load Encrypted Internet Configuration.</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="287"/>
+ <source>There are new updates available, please restart.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1540"/>
- <source>Encrypted Internet could not be launched because you did not authenticate properly.</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="329"/>
+ <source>More...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1546"/>
- <source>Encrypted Internet finished in an unexpected manner!</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="637"/>
+ <source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="14"/>
- <source>Bitmask</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="390"/>
+ <source>&amp;Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="291"/>
- <source>Log &amp;out</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="400"/>
+ <source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="301"/>
- <source>About &amp;Bitmask</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="405"/>
+ <source>&amp;Wizard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="255"/>
- <source>Mail is OFF</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="683"/>
+ <source>Hide Main Window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="484"/>
- <source>The Bitmask app is ready to update, please restart the application.</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="537"/>
+ <source> The following components will be updated:
+%s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="624"/>
- <source>Encrypted Internet is OFF</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="540"/>
+ <source>Updates available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="729"/>
- <source>About Bitmask - %s</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="682"/>
+ <source>Show Main Window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="743"/>
- <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>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1326"/>
+ <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>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="830"/>
- <source>Unable to login: Problem with provider</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1338"/>
+ <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/mainwindow.py" line="907"/>
- <source>Log in cancelled by the user.</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1343"/>
+ <source>We could not find openvpn binary.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1272"/>
- <source>Encrypted Internet cannot be started because the tuntap extension is not installed properly in your system.</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1505"/>
+ <source>Starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1288"/>
- <source>Another openvpn instance is already running, and could not be stopped.</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1513"/>
+ <source>Not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1295"/>
- <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>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1516"/>
+ <source>Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1385"/>
- <source>There was a problem with the provider</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1549"/>
+ <source>Could not load Encrypted Internet Configuration.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1469"/>
- <source>Something went wrong with the logout.</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1471"/>
+ <source>Encrypted Internet could not be launched because you did not authenticate properly.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1504"/>
- <source>Unable to connect: Problem with provider</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1479"/>
+ <source>Encrypted Internet finished in an unexpected manner!</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>ProviderBootstrapper</name>
<message>
- <location filename="../src/leap/bitmask/services/eip/providerbootstrapper.py" line="121"/>
- <source>Provider certificate could not be verified</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="32"/>
+ <source>Bitmask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/services/eip/providerbootstrapper.py" line="124"/>
- <source>Provider does not support HTTPS</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="395"/>
+ <source>About &amp;Bitmask</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>SRPAuth</name>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="690"/>
- <source>Succeeded</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="283"/>
+ <source>Mail is OFF</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>StatusPanel</name>
<message>
- <location filename="../src/leap/bitmask/gui/ui/statuspanel.ui" line="14"/>
- <source>Form</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="528"/>
+ <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/ui/statuspanel.ui" line="23"/>
- <source>user@domain.org</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="745"/>
+ <source>About Bitmask - %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/statuspanel.ui" line="326"/>
- <source>Encrypted Internet: </source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="759"/>
+ <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 type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/statuspanel.ui" line="336"/>
- <source>Off</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="847"/>
+ <source>Unable to login: Problem with provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/statuspanel.ui" line="365"/>
- <source>Turn On</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="885"/>
+ <source>Log in cancelled by the user.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/statuspanel.ui" line="311"/>
- <source>...</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1333"/>
+ <source>Encrypted Internet 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/ui/statuspanel.ui" line="44"/>
- <source>0 Unread Emails</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1349"/>
+ <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/ui/statuspanel.ui" line="54"/>
- <source>Disabled</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1356"/>
+ <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/ui/statuspanel.ui" line="67"/>
- <source>Encrypted Mail:</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1531"/>
+ <source>There was a problem with the provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/statuspanel.ui" line="198"/>
- <source>0.0 KB/s</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1631"/>
+ <source>Something went wrong with the logout.</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>StatusPanelWidget</name>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="389"/>
- <source>Turn OFF</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1652"/>
+ <source>Unable to connect: Problem with provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="403"/>
- <source>Turn ON</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="119"/>
+ <source>Encrypted Internet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="699"/>
- <source>ON</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1622"/>
+ <source>Login</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="461"/>
- <source>Authenticating...</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="364"/>
+ <source>&amp;Bitmask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="463"/>
- <source>Retrieving configuration...</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="385"/>
+ <source>Preferences...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="465"/>
- <source>Waiting to start...</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="410"/>
+ <source>Show &amp;Log</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="467"/>
- <source>Assigning IP</source>
+ <location filename="../src/leap/bitmask/gui/ui/mainwindow.ui" line="415"/>
+ <source>Create a new account...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="478"/>
- <source>Unable to start VPN, it&apos;s already running.</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="272"/>
+ <source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="270"/>
- <source>All services are OFF</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="644"/>
+ <source>Encrypted Internet: OFF</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="276"/>
- <source>Encrypted Internet is {0}</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1407"/>
+ <source>Network is unreachable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="278"/>
- <source>Mail is {0}</source>
+ <location filename="../src/leap/bitmask/gui/mainwindow.py" line="1430"/>
+ <source>EIP has stopped</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>Preferences</name>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="469"/>
- <source>Reconnecting...</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="14"/>
+ <source>Preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="501"/>
- <source>Encrypted Internet is OFF</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="40"/>
+ <source>Password Change</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="506"/>
- <source>Encrypted Internet is STARTING</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="49"/>
+ <source>&amp;Current password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="508"/>
- <source>Encrypted Internet is ON</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="66"/>
+ <source>&amp;New password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="534"/>
- <source>OFF</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="83"/>
+ <source>&amp;Re-enter new password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="536"/>
- <source>Mail is OFF</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="100"/>
+ <source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="542"/>
- <source>Mail is ON</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="107"/>
+ <source>&lt;Password change status&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="604"/>
- <source>Starting...</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="120"/>
+ <source>Enabled services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="571"/>
- <source>Soledad has started...</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="126"/>
+ <source>Save this provider settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="573"/>
- <source>Soledad is starting, please wait...</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="133"/>
+ <source>Services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="610"/>
- <source>Looking for key for this user</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="149"/>
+ <source>&lt;Select provider&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="614"/>
- <source>Found key! Starting mail...</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="157"/>
+ <source>Select provider:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="616"/>
- <source>Generating new key, please wait...</source>
+ <location filename="../src/leap/bitmask/gui/ui/preferences.ui" line="164"/>
+ <source>&lt; Providers Services Status &gt;</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>PreferencesWindow</name>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="618"/>
- <source>Finished generating key!</source>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="53"/>
+ <source>Automatic</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="620"/>
- <source>Starting mail...</source>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="115"/>
+ <source>Changing password...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="650"/>
- <source>SMTP has started...</source>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="166"/>
+ <source>Password changed successfully.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="656"/>
- <source>SMTP failed to start, check the logs.</source>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="181"/>
+ <source>There was a problem changing the password.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="693"/>
- <source>Failed</source>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="184"/>
+ <source>You did not enter a correct current password.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="687"/>
- <source>IMAP has started...</source>
+ <location filename="../src/leap/bitmask/gui/preferenceswindow.py" line="317"/>
+ <source>Services settings for provider &apos;{0}&apos; saved.</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>ProviderBootstrapper</name>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="693"/>
- <source>IMAP failed to start, check the logs.</source>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="137"/>
+ <source>Provider certificate could not be verified</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/statuspanel.py" line="697"/>
- <source>%s Unread Emails</source>
+ <location filename="../src/leap/bitmask/provider/providerbootstrapper.py" line="144"/>
+ <source>Provider does not support HTTPS</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>WindowsVPNLauncher</name>
+ <name>SRPAuth</name>
<message>
- <location filename="../src/leap/bitmask/services/eip/vpnlaunchers.py" line="871"/>
- <source>No gateway was found!</source>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="711"/>
+ <source>Succeeded</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -622,227 +845,227 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="143"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="305"/>
<source>Check</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="163"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="312"/>
<source>https://</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="173"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="153"/>
<source>Checking for a valid provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="179"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="159"/>
<source>Getting provider information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="259"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="239"/>
<source>Can we reach this provider?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="290"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="333"/>
<source>Provider Information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="293"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="336"/>
<source>Description of services offered by this provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="302"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="345"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="334"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="377"/>
<source>Desc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="344"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="387"/>
<source>&lt;b&gt;Services offered:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="354"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="397"/>
<source>services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="374"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="417"/>
<source>&lt;b&gt;Enrollment policy:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="384"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="427"/>
<source>policy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="404"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="447"/>
<source>&lt;b&gt;URL:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="414"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="457"/>
<source>URL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="421"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="464"/>
<source>&lt;b&gt;Description:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="432"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="475"/>
<source>Provider setup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="435"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="478"/>
<source>Gathering configuration options for this provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="457"/>
+ <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 type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="480"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="523"/>
<source>Setting up provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="530"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="573"/>
<source>Getting info from the Certificate Authority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="537"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="580"/>
<source>Do we trust this Certificate Authority?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="544"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="587"/>
<source>Establishing a trust relationship with this provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="603"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="646"/>
<source>Register new user</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="606"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="649"/>
<source>Register a new user with provider</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="621"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="664"/>
<source>&lt;b&gt;Password:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="640"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="691"/>
<source>&lt;b&gt;Re-enter password:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="650"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="701"/>
<source>Register</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="696"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="747"/>
<source>Remember my username and password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="720"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="771"/>
<source>Service selection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="723"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="774"/>
<source>Please select the services you would like to have</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="141"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="138"/>
<source>&amp;Next &gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="143"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="140"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="204"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="235"/>
<source>Starting registration...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="235"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="266"/>
<source>User %s successfully registered.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="255"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="286"/>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="361"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="411"/>
<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="379"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="429"/>
<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="407"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="457"/>
<source>Unable to load provider configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="413"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="463"/>
<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="479"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="529"/>
<source>Services by %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="499"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="549"/>
<source>Something went wrong while trying to load service %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="516"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="566"/>
<source>Gathering configuration options for %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="525"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="575"/>
<source>Description of services offered by %s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/wizard.py" line="546"/>
+ <location filename="../src/leap/bitmask/gui/wizard.py" line="596"/>
<source>Register a new user with %s</source>
<translation type="unfinished"></translation>
</message>
@@ -857,70 +1080,85 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="186"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="166"/>
<source>Can we establish a secure connection?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="683"/>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="734"/>
<source>&lt;b&gt;Username:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="269"/>
+ <source>Configure or select a provider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="275"/>
+ <source>Configure new provider:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/leap/bitmask/gui/ui/wizard.ui" line="285"/>
+ <source>Use existing one:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>__impl</name>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="281"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="288"/>
<source>The server did not send the salt parameter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="285"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="292"/>
<source>The server did not send the B parameter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="317"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="324"/>
<source>The data sent from the server had errors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="339"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="346"/>
<source>Could not connect to the server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="365"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="372"/>
<source>Unknown error (%s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="396"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="403"/>
<source>Problem getting data from server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="422"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="429"/>
<source>Bad data from server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="429"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="436"/>
<source>Auth verification failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="437"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="444"/>
<source>Session cookie verification failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="272"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="279"/>
<source>There was a problem with authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/crypto/srpauth.py" line="178"/>
+ <location filename="../src/leap/bitmask/crypto/srpauth.py" line="174"/>
<source>Invalid username or password.</source>
<translation type="unfinished"></translation>
</message>
@@ -928,42 +1166,42 @@
<context>
<name>msg</name>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="91"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="93"/>
<source>Missing up/down scripts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="182"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="184"/>
<source>TAP Driver</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="189"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="191"/>
<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="308"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="310"/>
<source>TUN Driver</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="316"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="318"/>
<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="130"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="132"/>
<source>Problem installing files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/leap/bitmask/platform_init/initializers.py" line="131"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="133"/>
<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="311"/>
+ <location filename="../src/leap/bitmask/platform_init/initializers.py" line="313"/>
<source>Bitmask needs to install the necessary drivers for Encrypted Internet to work. Would you like to proceed?</source>
<translation type="unfinished"></translation>
</message>
diff --git a/docs/dev/internationalization.rst b/docs/dev/internationalization.rst
index f9f522b9..c0f208de 100644
--- a/docs/dev/internationalization.rst
+++ b/docs/dev/internationalization.rst
@@ -65,19 +65,20 @@ If you do not already have it, install the ``transifex-client`` from the cheese
You can learn more about the transifex-client `here <http://help.transifex.com/features/client/index.html>`_.
-**1.** Add any new source files to the project file, ``data/bitmask.pro``. *We should automate this with some templating, it's tedious.*
-
-**2.** Update the source .ts file ``data/ts/en_US.ts``.::
+**1.** Update the source .ts file ``data/ts/en_US.ts``.::
$ make translations
-**3.** Push source .ts file to transifex::
+It automatically adds any new source files and forms to the project file, ``data/bitmask.pro``.
+If there is a file to be ignored in the translations you need to edit the ``data/make_project_file.py`` to set the excludes.
+
+**2.** Push source .ts file to transifex::
$ tx push -s
-**4.** Let the translation fairies do their work...
+**3.** Let the translation fairies do their work...
-**5.** *Et voila!* Get updated .ts files for each language from ``Transifex``. For instance, to pull updated spanish translations::
+**4.** *Et voila!* Get updated .ts files for each language from ``Transifex``. For instance, to pull updated spanish translations::
$ tx pull -l es
Pulling new translations for resource bitmask.bitmask (source: data/ts/en_US.ts)
diff --git a/pkg/requirements-dev.pip b/pkg/requirements-dev.pip
index 71ffdc37..8b5a8d85 100644
--- a/pkg/requirements-dev.pip
+++ b/pkg/requirements-dev.pip
@@ -13,5 +13,5 @@
sphinx
--e git+git://github.com/leapcode/leap_pycommon.git@develop#egg=leap.common
--e git+git://github.com/leapcode/soledad.git@develop#egg=leap.soledad
+-e git+https://github.com/leapcode/leap_pycommon.git@develop#egg=leap.common
+-e git+https://github.com/leapcode/soledad.git@develop#egg=leap.soledad
diff --git a/pkg/requirements.pip b/pkg/requirements.pip
index 35486dac..458db39c 100644
--- a/pkg/requirements.pip
+++ b/pkg/requirements.pip
@@ -19,8 +19,8 @@ keyring
leap.common>=0.3.4
leap.soledad.client>=0.4.0
-leap.keymanager>=0.3.3
-leap.mail>=0.3.4
+leap.keymanager>=0.3.4
+leap.mail>=0.3.5
# Remove this when u1db fixes its dependency on oauth
oauth
diff --git a/pkg/scripts/bitmask_bootstrap.sh b/pkg/scripts/bitmask_bootstrap.sh
index bd568ebd..70f9867e 100755
--- a/pkg/scripts/bitmask_bootstrap.sh
+++ b/pkg/scripts/bitmask_bootstrap.sh
@@ -1,10 +1,34 @@
#!/bin/bash
-
+######################################################################
+# bitmask_boostrap.sh
+# Copyright (C) 2013 LEAP
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+######################################################################
# Installs requirements, and
# clones the latest leap-client
# depends on:
-# openvpn git-core libgnutls-dev python-dev python-qt4 python-setuptools python-virtualenv
+# (authoritative list under docs/dev/quickstart.rst)
+
+# git python-dev python-setuptools python-virtualenv python-pip python-openssl libsqlite3-dev g++ openvpn
+# pyside-tools python-pyside python-qt4
+
+# Clone latest git (develop branch)
+# change "develop" for any other branch you want.
+BRANCH="develop"
+BITMASK_DIR="bitmask-develop"
# Escape code
esc=`echo -en "\033"`
@@ -23,27 +47,30 @@ echo "~~~~~~~~~~~~~~~~~~~~~~~"
echo ""
echo "${cc_green}Creating virtualenv...${cc_normal}"
-mkdir bitmask-testbuild
-virtualenv bitmask-testbuild
-source bitmask-testbuild/bin/activate
+mkdir ${BITMASK_DIR}
+virtualenv "${BITMASK_DIR}"
+source ./${BITMASK_DIR}/bin/activate
echo "${cc_green}Installing bitmask...${cc_normal}"
-# Clone latest git (develop branch)
-# change "develop" for any other branch you want.
-
+pip install -e 'git+https://leap.se/git/bitmask_client@'${BRANCH}'#egg=leap.bitmask'
-pip install -e 'git+https://leap.se/git/bitmask_client@develop#egg=leap.bitmask'
-
-cd bitmask-testbuild
+cd ${BITMASK_DIR}
# symlink the pyside libraries to the system libs
./src/leap.bitmask/pkg/postmkvenv.sh
+cd ./src/leap.bitmask
+make
+cd ../../
+source ./bin/activate
+
echo "${cc_green}bitmask installed! =)"
echo "${cc_yellow}"
echo "Launch it with: "
echo "~~~~~~~~~~~~~~~~~~~~~~"
-echo "bin/bitmask"
+echo "bin/bitmask --debug"
echo "~~~~~~~~~~~~~~~~~~~~~~"
+echo "If you are not inside the virtualenv, source it first with "
+echo "source "${BITMASK_DIR}"/bin/activate"
echo "${cc_normal}"
diff --git a/relnotes.txt b/relnotes.txt
index bea48e98..2e32ca6c 100644
--- a/relnotes.txt
+++ b/relnotes.txt
@@ -1,8 +1,8 @@
-ANNOUNCING Bitmask, the internet encryption toolkit, release 0.3.4
+ANNOUNCING Bitmask, the internet encryption toolkit, release 0.3.5
The LEAP team is pleased to announce the immediate availability of
-version 0.3.4 of Bitmask, the Internet Encryption Toolkit, codename
-"look at my new makeup".
+version 0.3.5 of Bitmask, the Internet Encryption Toolkit, codename
+"I can stand on one foot".
https://downloads.leap.se/client/
@@ -34,12 +34,14 @@ NOT trust your life to it (yet!).
WHAT CAN THIS VERSION OF BITMASK DO FOR ME?
-Bitmask 0.3.4 is a bugfix release but it also has a shiny new UI
-design, it's still a work in progress since it will change after
-testing in this release, but it's progressing nicely. We have better
-mail support, and we are using the new gnupg instead of python-gnupg
-for its security and better flexibility. You can refer to the
-CHANGELOG for the meat.
+Bitmask 0.3.5 is a bugfix release but it also has improvements to the
+UI design, it's still a work in progress since it will change after
+testing in this release, but it's progressing nicely. We have again,
+better mail support, with detached signatures and compliance with a
+couple of RFC. You can refer to the CHANGELOG for the meat.
+
+We also re-added support for Windows, although it might be a bumpy
+ride until we smooth the corners a little bit more.
As always, you can connect to the Encrypted Internet Proxy service
offered by a provider of your choice, and enjoy a encrypted internet
@@ -96,6 +98,6 @@ beyond any border.
The LEAP team,
-Oct 4, 2013
+Oct 18, 2013
Somewhere in the middle of the intertubes.
EOF
diff --git a/src/leap/bitmask/app.py b/src/leap/bitmask/app.py
index c1859478..40a77075 100644
--- a/src/leap/bitmask/app.py
+++ b/src/leap/bitmask/app.py
@@ -54,6 +54,7 @@ from leap.bitmask.util import leap_argparse
from leap.bitmask.util import log_silencer
from leap.bitmask.util.leap_log_handler import LeapLogHandler
from leap.bitmask.util.streamtologger import StreamToLogger
+from leap.bitmask.platform_init import IS_WIN
from leap.common.events import server as event_server
import codecs
@@ -99,7 +100,8 @@ def add_logger_handlers(debug=False, logfile=None):
logger = logging.getLogger(name='leap')
logger.setLevel(level)
- log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
+ log_format = ('%(asctime)s - %(name)s:%(funcName)s:L#%(lineno)s '
+ '- %(levelname)s - %(message)s')
formatter = logging.Formatter(log_format)
# Console handler
@@ -140,12 +142,15 @@ def replace_stdout_stderr_with_logging(logger):
- the twisted log output
with a custom one that writes to the logger.
"""
- sys.stdout = StreamToLogger(logger, logging.DEBUG)
- sys.stderr = StreamToLogger(logger, logging.ERROR)
-
- # Replace twisted's logger to use our custom output.
- from twisted.python import log
- log.startLogging(sys.stdout)
+ # Disabling this on windows since it breaks ALL THE THINGS
+ # The issue for this is #4149
+ if not IS_WIN:
+ sys.stdout = StreamToLogger(logger, logging.DEBUG)
+ sys.stderr = StreamToLogger(logger, logging.ERROR)
+
+ # Replace twisted's logger to use our custom output.
+ from twisted.python import log
+ log.startLogging(sys.stdout)
def main():
diff --git a/src/leap/bitmask/config/__init__.py b/src/leap/bitmask/config/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/leap/bitmask/config/__init__.py
diff --git a/src/leap/bitmask/config/leapsettings.py b/src/leap/bitmask/config/leapsettings.py
index 4660535a..c524425e 100644
--- a/src/leap/bitmask/config/leapsettings.py
+++ b/src/leap/bitmask/config/leapsettings.py
@@ -62,13 +62,14 @@ class LeapSettings(object):
GEOMETRY_KEY = "Geometry"
WINDOWSTATE_KEY = "WindowState"
USER_KEY = "User"
- PROPERPROVIDER_KEY = "ProperProvider"
+ PROVIDER_KEY = "Provider"
REMEMBER_KEY = "RememberUserAndPass"
DEFAULTPROVIDER_KEY = "DefaultProvider"
AUTOSTARTEIP_KEY = "AutoStartEIP"
ALERTMISSING_KEY = "AlertMissingScripts"
GATEWAY_KEY = "Gateway"
PINNED_KEY = "Pinned"
+ SKIPFIRSTRUN_KEY = "SkipFirstRun"
# values
GATEWAY_AUTOMATIC = "Automatic"
@@ -241,6 +242,24 @@ class LeapSettings(object):
leap_assert(len(user) > 0, "We cannot save an empty user")
self._settings.setValue(self.USER_KEY, user)
+ def get_provider(self):
+ """
+ Returns the configured provider to remember, None if there isn't one
+
+ :rtype: str or None
+ """
+ return self._settings.value(self.PROVIDER_KEY, None)
+
+ def set_provider(self, provider):
+ """
+ Saves the provider to remember
+
+ :param provider: provider name to remember
+ :type provider: str
+ """
+ leap_assert(len(provider) > 0, "We cannot save an empty provider")
+ self._settings.setValue(self.PROVIDER_KEY, provider)
+
def get_remember(self):
"""
Returns the value of the remember selection.
@@ -260,29 +279,6 @@ class LeapSettings(object):
leap_assert_type(remember, bool)
self._settings.setValue(self.REMEMBER_KEY, remember)
- # TODO: make this scale with multiple providers, we are assuming
- # just one for now
- def get_properprovider(self):
- """
- Returns True if there is a properly configured provider.
-
- .. note:: this assumes only one provider for now.
-
- :rtype: bool
- """
- return to_bool(self._settings.value(self.PROPERPROVIDER_KEY, False))
-
- def set_properprovider(self, properprovider):
- """
- Sets whether the app should automatically login.
-
- :param properprovider: True if the provider is properly configured,
- False otherwise.
- :type properprovider: bool
- """
- leap_assert_type(properprovider, bool)
- self._settings.setValue(self.PROPERPROVIDER_KEY, properprovider)
-
def get_defaultprovider(self):
"""
Returns the default provider to be used for autostarting EIP
@@ -338,3 +334,22 @@ class LeapSettings(object):
"""
leap_assert_type(value, bool)
self._settings.setValue(self.ALERTMISSING_KEY, value)
+
+ def get_skip_first_run(self):
+ """
+ Gets the setting for skip running the first run wizard.
+
+ :returns: if the first run wizard should be skipped or not
+ :rtype: bool
+ """
+ return to_bool(self._settings.value(self.SKIPFIRSTRUN_KEY, False))
+
+ def set_skip_first_run(self, skip):
+ """
+ Gets the setting for skip the first run wizard.
+
+ :param skip: if the first run wizard should be skipped or not
+ :type skip: bool
+ """
+ leap_assert_type(skip, bool)
+ self._settings.setValue(self.SKIPFIRSTRUN_KEY, skip)
diff --git a/src/leap/bitmask/crypto/srpauth.py b/src/leap/bitmask/crypto/srpauth.py
index cbff4b49..47ed21b0 100644
--- a/src/leap/bitmask/crypto/srpauth.py
+++ b/src/leap/bitmask/crypto/srpauth.py
@@ -25,6 +25,7 @@ import json
#this error is raised from requests
from simplejson.decoder import JSONDecodeError
from functools import partial
+from requests.adapters import HTTPAdapter
from PySide import QtCore
from twisted.internet import threads
@@ -154,7 +155,8 @@ class SRPAuth(QtCore.QObject):
self._ng = self._srp.NG_1024
# **************************************************** #
- self._session = self._fetcher.session()
+ self._reset_session()
+
self._session_id = None
self._session_id_lock = QtCore.QMutex()
self._uid = None
@@ -172,6 +174,18 @@ class SRPAuth(QtCore.QObject):
self._username = None
self._password = None
+ def _reset_session(self):
+ """
+ Resets the current session and sets max retries to 30.
+ """
+ self._session = self._fetcher.session()
+ # We need to bump the default retries, otherwise logout
+ # fails most of the times
+ # NOTE: This is a workaround for the moment, the server
+ # side seems to return correctly every time, but it fails
+ # on the client end.
+ self._session.mount('https://', HTTPAdapter(max_retries=30))
+
def _safe_unhexlify(self, val):
"""
Rounds the val to a multiple of 2 and returns the
@@ -508,7 +522,7 @@ class SRPAuth(QtCore.QObject):
self._username = username
self._password = password
- self._session = self._fetcher.session()
+ self._reset_session()
d = threads.deferToThread(self._authentication_preprocessing,
username=username,
diff --git a/src/leap/bitmask/gui/eip_status.py b/src/leap/bitmask/gui/eip_status.py
index 946eaa4e..77685cd3 100644
--- a/src/leap/bitmask/gui/eip_status.py
+++ b/src/leap/bitmask/gui/eip_status.py
@@ -424,6 +424,8 @@ class EIPStatusWidget(QtGui.QWidget):
tray_message = self.tr("Encrypted Internet: ON")
selected_pixmap = self.CONNECTED_ICON
selected_pixmap_tray = self.CONNECTED_ICON_TRAY
+ self._eip_status = 'ON'
+ self._update_systray_tooltip()
self.set_eip_icon(selected_pixmap)
self._systray.setIcon(QtGui.QIcon(selected_pixmap_tray))
diff --git a/src/leap/bitmask/gui/login.py b/src/leap/bitmask/gui/login.py
index 582f26be..ac34fe23 100644
--- a/src/leap/bitmask/gui/login.py
+++ b/src/leap/bitmask/gui/login.py
@@ -94,6 +94,9 @@ class LoginWidget(QtGui.QWidget):
self.ui.clblErrorMsg.hide()
self.ui.clblErrorMsg.clicked.connect(self.ui.clblErrorMsg.hide)
+ self.ui.lnUser.textEdited.connect(self.ui.clblErrorMsg.hide)
+ self.ui.lnPassword.textEdited.connect(self.ui.clblErrorMsg.hide)
+
def _remember_state_changed(self, state):
"""
Saves the remember state in the LeapSettings
@@ -294,6 +297,7 @@ class LoginWidget(QtGui.QWidget):
self.set_enabled(False)
self.ui.clblErrorMsg.hide()
+ self._settings.set_provider(provider)
if self.get_remember() and has_keyring():
# in the keyring and in the settings
# we store the value 'usename@provider'
diff --git a/src/leap/bitmask/gui/mail_status.py b/src/leap/bitmask/gui/mail_status.py
index ab9052d7..83533666 100644
--- a/src/leap/bitmask/gui/mail_status.py
+++ b/src/leap/bitmask/gui/mail_status.py
@@ -35,7 +35,6 @@ class MailStatusWidget(QtGui.QWidget):
"""
Status widget that displays the state of the LEAP Mail service
"""
- eip_connection_connected = QtCore.Signal()
_soledad_event = QtCore.Signal(object)
_smtp_event = QtCore.Signal(object)
_imap_event = QtCore.Signal(object)
@@ -193,6 +192,17 @@ class MailStatusWidget(QtGui.QWidget):
leap_assert_type(action_mail_status, QtGui.QAction)
self._action_mail_status = action_mail_status
+ def set_soledad_failed(self):
+ """
+ SLOT
+ TRIGGER:
+ SoledadBootstrapper.soledad_failed
+
+ This method is called whenever soledad has a failure.
+ """
+ msg = self.tr("There was an unexpected problem with Soledad.")
+ self._set_mail_status(msg, ready=-1)
+
def _set_mail_status(self, status, ready=0):
"""
Sets the Mail status in the label and in the tray icon.
@@ -377,8 +387,11 @@ class MailStatusWidget(QtGui.QWidget):
self._set_mail_status(self.tr("Failed"))
elif req.event == proto.IMAP_UNREAD_MAIL:
if self._smtp_started and self._imap_started:
- self._set_mail_status(self.tr("%s Unread Emails") %
- (req.content), ready=2)
+ if req.content != "0":
+ self._set_mail_status(self.tr("%s Unread Emails") %
+ (req.content,), ready=2)
+ else:
+ self._set_mail_status("", ready=2)
else:
leap_assert(False, # XXX ???
"Don't know how to handle this state: %s"
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index 84f09fd9..f5631c69 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -174,10 +174,12 @@ class MainWindow(QtGui.QMainWindow):
self._eip_connection = EIPConnection()
+ # XXX this should be handled by EIP Conductor
self._eip_connection.qtsigs.connecting_signal.connect(
self._start_eip)
self._eip_connection.qtsigs.disconnecting_signal.connect(
self._stop_eip)
+
self._eip_status.eip_connection_connected.connect(
self._on_eip_connected)
self.eip_needs_login.connect(
@@ -228,13 +230,22 @@ class MainWindow(QtGui.QMainWindow):
self._eip_intermediate_stage)
self._eip_bootstrapper.download_client_certificate.connect(
self._finish_eip_bootstrap)
+
self._vpn = VPN(openvpn_verb=openvpn_verb)
+
+ # connect vpn process signals
self._vpn.qtsigs.state_changed.connect(
self._eip_status.update_vpn_state)
self._vpn.qtsigs.status_changed.connect(
self._eip_status.update_vpn_status)
self._vpn.qtsigs.process_finished.connect(
self._eip_finished)
+ self._vpn.qtsigs.network_unreachable.connect(
+ self._on_eip_network_unreachable)
+ self._vpn.qtsigs.process_restart_tls.connect(
+ self._do_eip_restart)
+ self._vpn.qtsigs.process_restart_ping.connect(
+ self._do_eip_restart)
self._soledad_bootstrapper = SoledadBootstrapper()
self._soledad_bootstrapper.download_config.connect(
@@ -243,8 +254,8 @@ class MainWindow(QtGui.QMainWindow):
self._soledad_bootstrapped_stage)
self._soledad_bootstrapper.soledad_timeout.connect(
self._retry_soledad_connection)
- # XXX missing connect to soledad_failed (signal unrecoverable to user)
- # TODO wait until chiiph ui refactor.
+ self._soledad_bootstrapper.soledad_failed.connect(
+ self._mail_status.set_soledad_failed)
self._smtp_bootstrapper = SMTPBootstrapper()
self._smtp_bootstrapper.download_config.connect(
@@ -258,7 +269,7 @@ class MainWindow(QtGui.QMainWindow):
self._launch_wizard)
if IS_MAC:
- self.ui.menuFile.menuAction().setText(self.tr("Util"))
+ self.ui.menuFile.menuAction().setText(self.tr("File"))
self.raise_window.connect(self._do_raise_mainwindow)
@@ -267,8 +278,9 @@ class MainWindow(QtGui.QMainWindow):
self._systray = None
+ # XXX separate actions into a different
+ # module.
self._action_mail_status = QtGui.QAction(self.tr("Mail is OFF"), self)
- self._action_mail_status.setEnabled(False)
self._mail_status.set_action_mail_status(self._action_mail_status)
self._action_eip_startstop = QtGui.QAction("", self)
@@ -286,6 +298,11 @@ class MainWindow(QtGui.QMainWindow):
self.ui.lblNewUpdates.setVisible(False)
self.ui.btnMore.setVisible(False)
+ #########################################
+ # We hide this in height temporarily too
+ self.ui.lblNewUpdates.resize(0, 0)
+ self.ui.btnMore.resize(0, 0)
+ #########################################
self.ui.btnMore.clicked.connect(self._updates_details)
# Services signals/slots connection
@@ -352,8 +369,12 @@ class MainWindow(QtGui.QMainWindow):
finishing.
"""
if self._wizard_firstrun:
- self._settings.set_properprovider(False)
- self.quit()
+ 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:
self._finish_init()
@@ -381,6 +402,7 @@ class MainWindow(QtGui.QMainWindow):
if IS_MAC:
self._wizard.raise_()
self._wizard.finished.connect(self._wizard_finished)
+ self._settings.set_skip_first_run(True)
def _wizard_finished(self):
"""
@@ -399,6 +421,8 @@ class MainWindow(QtGui.QMainWindow):
:return: a logging handler or None
:rtype: LeapLogHandler or None
"""
+ # TODO this can be a function, does not need
+ # to be a method.
leap_logger = logging.getLogger('leap')
for h in leap_logger.handlers:
if isinstance(h, LeapLogHandler):
@@ -464,6 +488,10 @@ class MainWindow(QtGui.QMainWindow):
"""
self._soledad_ready = True
+ #
+ # updates
+ #
+
def _new_updates_available(self, req):
"""
Callback for the new updates event
@@ -553,9 +581,13 @@ class MainWindow(QtGui.QMainWindow):
self._login_widget.set_password(possible_password)
self._login()
self._wizard = None
- self._settings.set_properprovider(True)
else:
self._try_autostart_eip()
+
+ domain = self._settings.get_provider()
+ if domain is not None:
+ self._login_widget.select_provider_by_name(domain)
+
if not self._settings.get_remember():
# nothing to do here
return
@@ -573,9 +605,6 @@ class MainWindow(QtGui.QMainWindow):
# fill the username
self._login_widget.set_user(username)
- # select the configured provider in the combo box
- self._login_widget.select_provider_by_name(domain)
-
self._login_widget.set_remember(True)
saved_password = None
@@ -591,43 +620,9 @@ class MainWindow(QtGui.QMainWindow):
saved_password.decode("utf8"))
self._login()
- def _try_autostart_eip(self):
- """
- Tries to autostart EIP
- """
- settings = self._settings
-
- should_autostart = settings.get_autostart_eip()
- if not should_autostart:
- logger.debug('Will not autostart EIP since it is setup '
- 'to not to do it')
- self.eip_needs_login.emit()
- return
-
- default_provider = settings.get_defaultprovider()
-
- if default_provider is None:
- logger.info("Cannot autostart Encrypted Internet because there is "
- "no default provider configured")
- self.eip_needs_login.emit()
- return
-
- self._enabled_services = settings.get_enabled_services(
- default_provider)
-
- loaded = self._provisional_provider_config.load(
- provider.get_provider_path(default_provider))
- if loaded:
- # XXX I think we should not try to re-download config every time,
- # it adds some delay.
- # Maybe if it's the first run in a session,
- # or we can try only if it fails.
- self._download_eip_config()
- else:
- # XXX: Display a proper message to the user
- self.eip_needs_login.emit()
- logger.error("Unable to load %s config, cannot autostart." %
- (default_provider,))
+ #
+ # systray
+ #
def _show_systray(self):
"""
@@ -649,7 +644,7 @@ class MainWindow(QtGui.QMainWindow):
eip_menu = systrayMenu.addMenu(self.tr("Encrypted Internet: OFF"))
eip_menu.addAction(self._action_eip_startstop)
self._eip_status.set_eip_status_menu(eip_menu)
-
+ systrayMenu.addSeparator()
systrayMenu.addAction(self._action_mail_status)
systrayMenu.addSeparator()
systrayMenu.addAction(self.ui.action_quit)
@@ -799,8 +794,8 @@ class MainWindow(QtGui.QMainWindow):
"""
providers = self._settings.get_configured_providers()
has_provider_on_disk = len(providers) != 0
- is_proper_provider = self._settings.get_properprovider()
- return not (has_provider_on_disk and is_proper_provider)
+ skip_first_run = self._settings.get_skip_first_run()
+ return not (has_provider_on_disk and skip_first_run)
def _download_provider_config(self):
"""
@@ -951,6 +946,7 @@ class MainWindow(QtGui.QMainWindow):
"""
self._login_widget.logged_in()
+ self.ui.lblLoginProvider.setText(self._provider_config.get_name())
self._enabled_services = self._settings.get_enabled_services(
self._provider_config.get_domain())
@@ -971,7 +967,11 @@ class MainWindow(QtGui.QMainWindow):
self._download_eip_config()
+ ###################################################################
+ # Service control methods: soledad
+
def _soledad_intermediate_stage(self, data):
+ # TODO missing param docstring
"""
SLOT
TRIGGERS:
@@ -1222,16 +1222,53 @@ class MainWindow(QtGui.QMainWindow):
signal that currently is beeing processed under status_panel.
After the refactor to EIPConductor this should not be necessary.
"""
- logger.debug('EIP connected signal received ...')
self._eip_connection.qtsigs.connected_signal.emit()
+ def _try_autostart_eip(self):
+ """
+ Tries to autostart EIP
+ """
+ settings = self._settings
+
+ should_autostart = settings.get_autostart_eip()
+ if not should_autostart:
+ logger.debug('Will not autostart EIP since it is setup '
+ 'to not to do it')
+ self.eip_needs_login.emit()
+ return
+
+ default_provider = settings.get_defaultprovider()
+
+ if default_provider is None:
+ logger.info("Cannot autostart Encrypted Internet because there is "
+ "no default provider configured")
+ self.eip_needs_login.emit()
+ return
+
+ self._enabled_services = settings.get_enabled_services(
+ default_provider)
+
+ loaded = self._provisional_provider_config.load(
+ provider.get_provider_path(default_provider))
+ if loaded:
+ # XXX I think we should not try to re-download config every time,
+ # it adds some delay.
+ # Maybe if it's the first run in a session,
+ # or we can try only if it fails.
+ self._download_eip_config()
+ else:
+ # XXX: Display a proper message to the user
+ self.eip_needs_login.emit()
+ logger.error("Unable to load %s config, cannot autostart." %
+ (default_provider,))
+
@QtCore.Slot()
def _start_eip(self):
"""
SLOT
TRIGGERS:
- self._eip_status.start_eip
- self._action_eip_startstop.triggered
+ self._eip_connection.qtsigs.do_connect_signal
+ (via state machine)
or called from _finish_eip_bootstrap
Starts EIP
@@ -1332,8 +1369,8 @@ class MainWindow(QtGui.QMainWindow):
"""
SLOT
TRIGGERS:
- self._eip_status.stop_eip
- self._action_eip_startstop.triggered
+ self._eip_connection.qtsigs.do_disconnect_signal
+ (via state machine)
or called from _eip_finished
Stops vpn process and makes gui adjustments to reflect
@@ -1357,14 +1394,100 @@ class MainWindow(QtGui.QMainWindow):
self._get_best_provider_config().get_domain()))
self._eip_status.eip_stopped()
+ @QtCore.Slot()
+ def _on_eip_network_unreachable(self):
+ # XXX Should move to EIP Conductor
+ """
+ SLOT
+ TRIGGERS:
+ self._eip_connection.qtsigs.network_unreachable
+
+ Displays a "network unreachable" error in the EIP status panel.
+ """
+ self._eip_status.set_eip_status(self.tr("Network is unreachable"),
+ error=True)
+ self._eip_status.set_eip_status_icon("error")
+
+ @QtCore.Slot()
+ def _do_eip_restart(self):
+ # XXX Should move to EIP Conductor
+ """
+ SLOT
+ self._eip_connection.qtsigs.process_restart
+
+ Restart the connection.
+ """
+ # for some reason, emitting the do_disconnect/do_connect
+ # signals hangs the UI.
+ self._stop_eip()
+ QtCore.QTimer.singleShot(2000, self._start_eip)
+
def _set_eipstatus_off(self, error=True):
"""
Sets eip status to off
"""
+ # XXX this should be handled by the state machine.
self._eip_status.set_eip_status(self.tr("EIP has stopped"),
error=error)
self._eip_status.set_eip_status_icon("error")
+ def _eip_finished(self, exitCode):
+ """
+ SLOT
+ TRIGGERS:
+ self._vpn.process_finished
+
+ Triggered when the EIP/VPN process finishes to set the UI
+ accordingly.
+
+ Ideally we would have the right exit code here,
+ but the use of different wrappers (pkexec, cocoasudo) swallows
+ the openvpn exit code so we get zero exit in some cases where we
+ shouldn't. As a workaround we just use a flag to indicate
+ a purposeful switch off, and mark everything else as unexpected.
+
+ In the near future we should trigger a native notification from here,
+ since the user really really wants to know she is unprotected asap.
+ And the right thing to do will be to fail-close.
+
+ :param exitCode: the exit code of the eip process.
+ :type exitCode: int
+ """
+ # TODO move to EIPConductor.
+ # TODO Add error catching to the openvpn log observer
+ # so we can have a more precise idea of which type
+ # of error did we have (server side, local problem, etc)
+
+ logger.info("VPN process finished with exitCode %s..."
+ % (exitCode,))
+
+ qtsigs = self._eip_connection.qtsigs
+ signal = qtsigs.disconnected_signal
+
+ # XXX check if these exitCodes are pkexec/cocoasudo specific
+ if exitCode in (126, 127):
+ self._eip_status.set_eip_status(
+ self.tr("Encrypted Internet could not be launched "
+ "because you did not authenticate properly."),
+ error=True)
+ self._vpn.killit()
+ signal = qtsigs.connection_aborted_signal
+
+ elif exitCode != 0 or not self.user_stopped_eip:
+ self._eip_status.set_eip_status(
+ self.tr("Encrypted Internet finished in an "
+ "unexpected manner!"), error=True)
+ signal = qtsigs.connection_died_signal
+
+ if exitCode == 0 and IS_MAC:
+ # XXX remove this warning after I fix cocoasudo.
+ logger.warning("The above exit code MIGHT BE WRONG.")
+
+ # We emit signals to trigger transitions in the state machine:
+ signal.emit()
+
+ # eip boostrapping, config etc...
+
def _download_eip_config(self):
"""
Starts the EIP bootstrapping sequence
@@ -1426,7 +1549,25 @@ class MainWindow(QtGui.QMainWindow):
"Configuration."),
error=True)
- # end eip methods -------------------------------------------
+ def _eip_intermediate_stage(self, data):
+ # TODO missing param
+ """
+ SLOT
+ TRIGGERS:
+ self._eip_bootstrapper.download_config
+
+ If there was a problem, displays it, otherwise it does nothing.
+ This is used for intermediate bootstrapping stages, in case
+ they fail.
+ """
+ passed = data[self._provider_bootstrapper.PASSED_KEY]
+ if not passed:
+ self._login_widget.set_status(
+ self.tr("Unable to connect: Problem with provider"))
+ logger.error(data[self._provider_bootstrapper.ERROR_KEY])
+ self._already_started_eip = False
+
+ # end of EIP methods ---------------------------------------------
def _get_best_provider_config(self):
"""
@@ -1469,6 +1610,7 @@ class MainWindow(QtGui.QMainWindow):
self.logout.emit()
def _done_logging_out(self, ok, message):
+ # TODO missing params in docstring
"""
SLOT
TRIGGER: self._srp_auth.logout_finished
@@ -1477,6 +1619,7 @@ class MainWindow(QtGui.QMainWindow):
logging out
"""
self._login_widget.done_logout()
+ self.ui.lblLoginProvider.setText(self.tr("Login"))
if ok:
self._logged_user = None
@@ -1489,6 +1632,7 @@ class MainWindow(QtGui.QMainWindow):
error=True)
def _intermediate_stage(self, data):
+ # TODO this method name is confusing as hell.
"""
SLOT
TRIGGERS:
@@ -1508,80 +1652,9 @@ class MainWindow(QtGui.QMainWindow):
self.tr("Unable to connect: Problem with provider"))
logger.error(data[self._provider_bootstrapper.ERROR_KEY])
- def _eip_intermediate_stage(self, data):
- """
- SLOT
- TRIGGERS:
- self._eip_bootstrapper.download_config
-
- If there was a problem, displays it, otherwise it does nothing.
- This is used for intermediate bootstrapping stages, in case
- they fail.
- """
- passed = data[self._provider_bootstrapper.PASSED_KEY]
- if not passed:
- self._login_widget.set_status(
- self.tr("Unable to connect: Problem with provider"))
- logger.error(data[self._provider_bootstrapper.ERROR_KEY])
- self._already_started_eip = False
-
- def _eip_finished(self, exitCode):
- """
- SLOT
- TRIGGERS:
- self._vpn.process_finished
-
- Triggered when the EIP/VPN process finishes to set the UI
- accordingly.
- """
- # TODO move to EIPConductor.
- logger.info("VPN process finished with exitCode %s..."
- % (exitCode,))
-
- # Ideally we would have the right exit code here,
- # but the use of different wrappers (pkexec, cocoasudo) swallows
- # the openvpn exit code so we get zero exit in some cases where we
- # shouldn't. As a workaround we just use a flag to indicate
- # a purposeful switch off, and mark everything else as unexpected.
-
- # In the near future we should trigger a native notification from here,
- # since the user really really wants to know she is unprotected asap.
- # And the right thing to do will be to fail-close.
-
- # TODO we should have a way of parsing the latest lines in the vpn
- # log buffer so we can have a more precise idea of which type
- # of error did we have (server side, local problem, etc)
-
- qtsigs = self._eip_connection.qtsigs
- signal = qtsigs.disconnected_signal
-
- # XXX check if these exitCodes are pkexec/cocoasudo specific
- if exitCode in (126, 127):
- self._eip_status.set_eip_status(
- self.tr("Encrypted Internet could not be launched "
- "because you did not authenticate properly."),
- error=True)
- self._vpn.killit()
- signal = qtsigs.connection_aborted_signal
-
- elif exitCode != 0 or not self.user_stopped_eip:
- self._eip_status.set_eip_status(
- self.tr("Encrypted Internet finished in an "
- "unexpected manner!"), error=True)
- signal = qtsigs.connection_died_signal
-
- if exitCode == 0 and IS_MAC:
- # XXX remove this warning after I fix cocoasudo.
- logger.warning("The above exit code MIGHT BE WRONG.")
-
- # XXX verify that the logic kees the same w/o the abnormal flag
- # after the refactor to EIPConnection has been completed
- # (eipconductor taking the most of the logic under transitions
- # that right now are handled under status_panel)
- #self._stop_eip(abnormal)
-
- # We emit signals to trigger transitions in the state machine:
- signal.emit()
+ #
+ # window handling methods
+ #
def _on_raise_window_event(self, req):
"""
@@ -1607,6 +1680,10 @@ class MainWindow(QtGui.QMainWindow):
if IS_MAC:
self.raise_()
+ #
+ # cleanup and quit methods
+ #
+
def _cleanup_pidfiles(self):
"""
Removes lockfiles on a clean shutdown.
diff --git a/src/leap/bitmask/gui/ui/eip_status.ui b/src/leap/bitmask/gui/ui/eip_status.ui
index 27df3f31..25831118 100644
--- a/src/leap/bitmask/gui/ui/eip_status.ui
+++ b/src/leap/bitmask/gui/ui/eip_status.ui
@@ -94,8 +94,8 @@
<widget class="QLabel" name="lblVPNStatusIcon">
<property name="maximumSize">
<size>
- <width>16</width>
- <height>16</height>
+ <width>24</width>
+ <height>24</height>
</size>
</property>
<property name="text">
diff --git a/src/leap/bitmask/gui/ui/eippreferences.ui b/src/leap/bitmask/gui/ui/eippreferences.ui
index 9493d330..cc77c82e 100644
--- a/src/leap/bitmask/gui/ui/eippreferences.ui
+++ b/src/leap/bitmask/gui/ui/eippreferences.ui
@@ -6,12 +6,12 @@
<rect>
<x>0</x>
<y>0</y>
- <width>398</width>
- <height>262</height>
+ <width>435</width>
+ <height>273</height>
</rect>
</property>
<property name="windowTitle">
- <string>EIP Preferences</string>
+ <string>Encrypted Internet Preferences</string>
</property>
<property name="windowIcon">
<iconset resource="../../../../../data/resources/mainwindow.qrc">
@@ -88,7 +88,7 @@
<item row="0" column="0">
<widget class="QGroupBox" name="gbAutomaticEIP">
<property name="title">
- <string>Automatic EIP start</string>
+ <string>Automatic Encrypted Internet start</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0">
@@ -126,7 +126,7 @@
<enum>Qt::LeftToRight</enum>
</property>
<property name="text">
- <string>Enable Automatic start of EIP</string>
+ <string>Enable Automatic start:</string>
</property>
<property name="checked">
<bool>true</bool>
diff --git a/src/leap/bitmask/gui/ui/login.ui b/src/leap/bitmask/gui/ui/login.ui
index a1842608..e7ca1652 100644
--- a/src/leap/bitmask/gui/ui/login.ui
+++ b/src/leap/bitmask/gui/ui/login.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>468</width>
- <height>350</height>
+ <height>363</height>
</rect>
</property>
<property name="sizePolicy">
@@ -32,104 +32,26 @@
<property name="margin">
<number>0</number>
</property>
- <item row="2" column="2" colspan="2">
- <widget class="QWidget" name="logged_widget" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
+ <property name="verticalSpacing">
+ <number>-1</number>
+ </property>
+ <item row="2" column="0">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
</property>
- <layout class="QGridLayout" name="gridLayout_5">
- <property name="bottomMargin">
- <number>24</number>
- </property>
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="lblUser">
- <property name="font">
- <font>
- <pointsize>15</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QPushButton" name="btnLogout">
- <property name="text">
- <string>Logout</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="lblLoginStatus">
- <property name="styleSheet">
- <string notr="true">color: rgb(132, 132, 132);
-font: 75 12pt &quot;Lucida Grande&quot;;</string>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="1" rowspan="2">
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <property name="sizeType">
+ <enum>QSizePolicy::Maximum</enum>
</property>
- <property name="maximumSize">
+ <property name="sizeHint" stdset="0">
<size>
- <width>16777215</width>
- <height>800</height>
+ <width>12</width>
+ <height>0</height>
</size>
</property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../../../../../data/resources/mainwindow.qrc">:/images/black/32/user.png</pixmap>
- </property>
- <property name="scaledContents">
- <bool>false</bool>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- </widget>
+ </spacer>
</item>
- <item row="1" column="2" colspan="2">
+ <item row="2" column="2" colspan="2">
<widget class="QWidget" name="login_widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@@ -224,21 +146,36 @@ font: 75 12pt &quot;Lucida Grande&quot;;</string>
</layout>
</widget>
</item>
- <item row="1" column="0">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Maximum</enum>
+ <item row="2" column="1" rowspan="2">
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="sizeHint" stdset="0">
+ <property name="maximumSize">
<size>
- <width>12</width>
- <height>0</height>
+ <width>16777215</width>
+ <height>800</height>
</size>
</property>
- </spacer>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../../../../data/resources/mainwindow.qrc">:/images/black/32/user.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ </widget>
</item>
<item row="0" column="0" colspan="4">
<widget class="ClickableLabel" name="clblErrorMsg">
@@ -259,6 +196,91 @@ font: 75 12pt &quot;Lucida Grande&quot;;</string>
</property>
</widget>
</item>
+ <item row="3" column="2" colspan="2">
+ <widget class="QWidget" name="logged_widget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>24</number>
+ </property>
+ <item row="1" column="1">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="btnLogout">
+ <property name="text">
+ <string>Logout</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="lblUser">
+ <property name="font">
+ <font>
+ <pointsize>15</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLabel" name="lblLoginStatus">
+ <property name="styleSheet">
+ <string notr="true">color: rgb(132, 132, 132);
+font: 75 12pt &quot;Lucida Grande&quot;;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>5</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</widget>
<customwidgets>
diff --git a/src/leap/bitmask/gui/ui/mail_status.ui b/src/leap/bitmask/gui/ui/mail_status.ui
index 1327f9e7..22976f39 100644
--- a/src/leap/bitmask/gui/ui/mail_status.ui
+++ b/src/leap/bitmask/gui/ui/mail_status.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>400</width>
- <height>72</height>
+ <height>79</height>
</rect>
</property>
<property name="sizePolicy">
@@ -20,9 +20,25 @@
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
<item row="0" column="1" rowspan="2">
<layout class="QGridLayout" name="gridLayout_3">
- <item row="1" column="0" colspan="3">
+ <item row="1" column="1">
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" colspan="3">
<widget class="QLabel" name="lblMailStatus">
<property name="styleSheet">
<string notr="true">color: rgb(80, 80, 80);</string>
@@ -32,7 +48,26 @@
</property>
</widget>
</item>
- <item row="0" column="0">
+ <item row="1" column="3">
+ <widget class="QLabel" name="lblMailStatusIcon">
+ <property name="maximumSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../../../../data/resources/mainwindow.qrc">:/images/black/32/off.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -45,38 +80,22 @@
</property>
</widget>
</item>
- <item row="0" column="1">
- <spacer name="horizontalSpacer_4">
+ <item row="0" column="0">
+ <spacer name="verticalSpacer">
<property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>40</width>
- <height>20</height>
+ <width>0</width>
+ <height>5</height>
</size>
</property>
</spacer>
</item>
- <item row="0" column="3">
- <widget class="QLabel" name="lblMailStatusIcon">
- <property name="maximumSize">
- <size>
- <width>16</width>
- <height>16</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../../../../../data/resources/mainwindow.qrc">:/images/black/32/off.png</pixmap>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </item>
</layout>
</item>
<item row="0" column="0">
diff --git a/src/leap/bitmask/gui/ui/mainwindow.ui b/src/leap/bitmask/gui/ui/mainwindow.ui
index 920160b8..10c77057 100644
--- a/src/leap/bitmask/gui/ui/mainwindow.ui
+++ b/src/leap/bitmask/gui/ui/mainwindow.ui
@@ -86,13 +86,16 @@
<number>0</number>
</property>
<item>
- <widget class="QWidget" name="widget_2" native="true">
+ <widget class="QFrame" name="frame_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="styleSheet">
+ <string notr="true">QFrame{background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(160, 160, 160, 128), stop:1 rgba(255, 255, 255, 0));}</string>
+ </property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>24</number>
@@ -109,6 +112,9 @@
<bold>true</bold>
</font>
</property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgba(255, 255, 255, 0);</string>
+ </property>
<property name="text">
<string>Encrypted Internet</string>
</property>
@@ -122,6 +128,9 @@
<height>20</height>
</size>
</property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
<property name="text">
<string/>
</property>
@@ -167,13 +176,21 @@
</widget>
</item>
<item>
- <widget class="QWidget" name="widget" native="true">
+ <widget class="QFrame" name="frame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QFrame{
+background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(160, 160, 160, 128), stop:1 rgba(255, 255, 255, 0));
+}</string>
+ </property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>24</number>
@@ -190,6 +207,9 @@
<bold>true</bold>
</font>
</property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgba(255, 255, 255, 0);</string>
+ </property>
<property name="text">
<string>Login</string>
</property>
@@ -203,6 +223,9 @@
<height>20</height>
</size>
</property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
<property name="text">
<string/>
</property>
@@ -216,7 +239,11 @@
</widget>
</item>
<item>
- <layout class="QVBoxLayout" name="loginLayout"/>
+ <layout class="QVBoxLayout" name="loginLayout">
+ <property name="topMargin">
+ <number>12</number>
+ </property>
+ </layout>
</item>
<item>
<widget class="Line" name="line_2">
@@ -226,7 +253,10 @@
</widget>
</item>
<item>
- <layout class="QVBoxLayout" name="mailLayout">
+ <layout class="QVBoxLayout" name="mailLayout" stretch="">
+ <property name="spacing">
+ <number>-1</number>
+ </property>
<property name="margin">
<number>12</number>
</property>
@@ -269,7 +299,7 @@
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
- <height>20</height>
+ <height>0</height>
</size>
</property>
</spacer>
@@ -290,7 +320,7 @@
<item row="1" column="2">
<widget class="QPushButton" name="btnMore">
<property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -311,7 +341,7 @@
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
- <height>20</height>
+ <height>0</height>
</size>
</property>
</spacer>
diff --git a/src/leap/bitmask/gui/ui/wizard.ui b/src/leap/bitmask/gui/ui/wizard.ui
index 0f6eef6e..cf591470 100644
--- a/src/leap/bitmask/gui/ui/wizard.ui
+++ b/src/leap/bitmask/gui/ui/wizard.ui
@@ -7,19 +7,19 @@
<x>0</x>
<y>0</y>
<width>536</width>
- <height>490</height>
+ <height>510</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>536</width>
- <height>490</height>
+ <height>510</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>536</width>
- <height>490</height>
+ <height>510</height>
</size>
</property>
<property name="windowTitle">
@@ -124,7 +124,7 @@
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
+ <enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
diff --git a/src/leap/bitmask/gui/wizard.py b/src/leap/bitmask/gui/wizard.py
index e3f5904e..6ba65410 100644
--- a/src/leap/bitmask/gui/wizard.py
+++ b/src/leap/bitmask/gui/wizard.py
@@ -53,9 +53,6 @@ class Wizard(QtGui.QWizard):
REGISTER_USER_PAGE = 4
SERVICES_PAGE = 5
- WEAK_PASSWORDS = ("123456", "qweasd", "qwerty",
- "password")
-
BARE_USERNAME_REGEX = r"^[A-Za-z\d_]+$"
def __init__(self, bypass_checks=False):
diff --git a/src/leap/bitmask/services/eip/connection.py b/src/leap/bitmask/services/eip/connection.py
index 08b29070..962d9cf2 100644
--- a/src/leap/bitmask/services/eip/connection.py
+++ b/src/leap/bitmask/services/eip/connection.py
@@ -46,4 +46,5 @@ class EIPConnectionSignals(QtCore.QObject):
class EIPConnection(AbstractLEAPConnection):
def __init__(self):
+ # XXX this should be public instead
self._qtsigs = EIPConnectionSignals()
diff --git a/src/leap/bitmask/services/eip/linuxvpnlauncher.py b/src/leap/bitmask/services/eip/linuxvpnlauncher.py
index c2c28627..efb23285 100644
--- a/src/leap/bitmask/services/eip/linuxvpnlauncher.py
+++ b/src/leap/bitmask/services/eip/linuxvpnlauncher.py
@@ -61,9 +61,13 @@ def _is_auth_agent_running():
:return: True if it's running, False if it's not.
:rtype: boolean
"""
- ps = 'ps aux | grep polkit-%s-authentication-agent-1'
- opts = (ps % case for case in ['[g]nome', '[k]de'])
- is_running = map(lambda l: commands.getoutput(l), opts)
+ # the [x] thing is to avoid grep match itself
+ polkit_options = [
+ 'ps aux | grep polkit-[g]nome-authentication-agent-1',
+ 'ps aux | grep polkit-[k]de-authentication-agent-1',
+ 'ps aux | grep [l]xpolkit'
+ ]
+ is_running = [commands.getoutput(cmd) for cmd in polkit_options]
return any(is_running)
diff --git a/src/leap/bitmask/services/eip/vpnlauncher.py b/src/leap/bitmask/services/eip/vpnlauncher.py
index 935d75f1..bce3599b 100644
--- a/src/leap/bitmask/services/eip/vpnlauncher.py
+++ b/src/leap/bitmask/services/eip/vpnlauncher.py
@@ -102,6 +102,8 @@ class VPNLauncher(object):
UPDOWN_FILES = None
OTHER_FILES = None
+ UP_SCRIPT = None
+ DOWN_SCRIPT = None
@classmethod
@abstractmethod
@@ -164,7 +166,7 @@ class VPNLauncher(object):
if not gateways:
logger.error('No gateway was found!')
- raise VPNLauncherException(kls.tr('No gateway was found!'))
+ raise VPNLauncherException('No gateway was found!')
logger.debug("Using gateways ips: {0}".format(', '.join(gateways)))
@@ -211,15 +213,17 @@ class VPNLauncher(object):
'--script-security', '2'
]
- if _has_updown_scripts(kls.UP_SCRIPT):
- args += [
- '--up', '\"%s\"' % (kls.UP_SCRIPT,),
- ]
+ if kls.UP_SCRIPT is not None:
+ if _has_updown_scripts(kls.UP_SCRIPT):
+ args += [
+ '--up', '\"%s\"' % (kls.UP_SCRIPT,),
+ ]
- if _has_updown_scripts(kls.DOWN_SCRIPT):
- args += [
- '--down', '\"%s\"' % (kls.DOWN_SCRIPT,)
- ]
+ if kls.DOWN_SCRIPT is not None:
+ if _has_updown_scripts(kls.DOWN_SCRIPT):
+ args += [
+ '--down', '\"%s\"' % (kls.DOWN_SCRIPT,)
+ ]
###########################################################
# For the time being we are disabling the usage of the
@@ -241,6 +245,10 @@ class VPNLauncher(object):
'--ca', providerconfig.get_ca_cert_path()
]
+ args += [
+ '--ping', '10',
+ '--ping-restart', '30']
+
command_and_args = [openvpn] + args
logger.debug("Running VPN with command:")
logger.debug(" ".join(command_and_args))
diff --git a/src/leap/bitmask/services/eip/vpnprocess.py b/src/leap/bitmask/services/eip/vpnprocess.py
index 707967e0..19e1aa7b 100644
--- a/src/leap/bitmask/services/eip/vpnprocess.py
+++ b/src/leap/bitmask/services/eip/vpnprocess.py
@@ -24,6 +24,8 @@ import psutil.error
import shutil
import socket
+from itertools import chain, repeat
+
from PySide import QtCore
from leap.bitmask.config.providerconfig import ProviderConfig
@@ -50,14 +52,93 @@ class VPNSignals(QtCore.QObject):
They are instantiated in the VPN object and passed along
till the VPNProcess.
"""
+ # signals for the process
state_changed = QtCore.Signal(dict)
status_changed = QtCore.Signal(dict)
process_finished = QtCore.Signal(int)
+ # signals that come from parsing
+ # openvpn output
+ network_unreachable = QtCore.Signal()
+ process_restart_tls = QtCore.Signal()
+ process_restart_ping = QtCore.Signal()
+
def __init__(self):
QtCore.QObject.__init__(self)
+class VPNObserver(object):
+ """
+ A class containing different patterns in the openvpn output that
+ we can react upon.
+ """
+
+ # TODO this is i18n-sensitive, right?
+ # in that case, we should add the translations :/
+ # until we find something better.
+
+ _events = {
+ 'NETWORK_UNREACHABLE': (
+ 'Network is unreachable (code=101)',),
+ 'PROCESS_RESTART_TLS': (
+ "SIGUSR1[soft,tls-error]",),
+ 'PROCESS_RESTART_PING': (
+ "SIGUSR1[soft,ping-restart]",),
+ 'INITIALIZATION_COMPLETED': (
+ "Initialization Sequence Completed",),
+ }
+
+ def __init__(self, qtsigs):
+ """
+ Initializer. Keeps a reference to the passed qtsigs object
+ :param qtsigs: an object containing the different qt signals to
+ be used to communicate with different parts of
+ the application (the EIP state machine, for instance).
+ """
+ self._qtsigs = qtsigs
+
+ def watch(self, line):
+ """
+ Inspects line searching for the different patterns. If a match
+ is found, try to emit the corresponding signal.
+
+ :param line: a line of openvpn output
+ :type line: str
+ """
+ chained_iter = chain(*[
+ zip(repeat(key, len(l)), l)
+ for key, l in self._events.iteritems()])
+ for event, pattern in chained_iter:
+ if pattern in line:
+ logger.debug('pattern matched! %s' % pattern)
+ break
+ else:
+ return
+
+ sig = self._get_signal(event)
+ if sig:
+ sig.emit()
+ return
+ else:
+ logger.debug(
+ 'We got %s event from openvpn output but we '
+ 'could not find a matching signal for it.'
+ % event)
+
+ def _get_signal(self, event):
+ """
+ Tries to get the matching signal from the eip signals
+ objects based on the name of the passed event (in lowercase)
+
+ :param event: the name of the event that we want to get a signal
+ for
+ :type event: str
+ :returns: a QtSignal, or None
+ :rtype: QtSignal or None
+ """
+ return getattr(self._qtsigs, event.lower(), None)
+
+
class OpenVPNAlreadyRunning(Exception):
message = ("Another openvpn instance is already running, and could "
"not be stopped.")
@@ -160,10 +241,14 @@ class VPN(object):
tries += 1
reactor.callLater(self.TERMINATE_WAIT,
self._kill_if_left_alive, tries)
+ return
# after running out of patience, we try a killProcess
logger.debug("Process did not died. Sending a SIGKILL.")
- self.killit()
+ try:
+ self.killit()
+ except OSError:
+ logger.error("Could not kill process!")
def killit(self):
"""
@@ -703,8 +788,12 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
self._last_status = None
self._alive = False
+ # XXX use flags, maybe, instead of passing
+ # the parameter around.
self._openvpn_verb = openvpn_verb
+ self._vpn_observer = VPNObserver(qtsigs)
+
# processProtocol methods
def connectionMade(self):
@@ -726,8 +815,9 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
.. seeAlso: `http://twistedmatrix.com/documents/13.0.0/api/twisted.internet.protocol.ProcessProtocol.html` # noqa
"""
# truncate the newline
- # should send this to the logging window
- vpnlog.info(data[:-1])
+ line = data[:-1]
+ vpnlog.info(line)
+ self._vpn_observer.watch(line)
def processExited(self, reason):
"""
diff --git a/src/leap/bitmask/services/soledad/soledadbootstrapper.py b/src/leap/bitmask/services/soledad/soledadbootstrapper.py
index 7968dd6a..4619ba80 100644
--- a/src/leap/bitmask/services/soledad/soledadbootstrapper.py
+++ b/src/leap/bitmask/services/soledad/soledadbootstrapper.py
@@ -34,6 +34,7 @@ from leap.bitmask.services.abstractbootstrapper import AbstractBootstrapper
from leap.bitmask.services.soledad.soledadconfig import SoledadConfig
from leap.bitmask.util import is_file, is_empty_file
from leap.bitmask.util import get_path_prefix
+from leap.bitmask.platform_init import IS_WIN
from leap.common.check import leap_assert, leap_assert_type, leap_check
from leap.common.files import which
from leap.keymanager import KeyManager, openpgp
@@ -264,6 +265,10 @@ class SoledadBootstrapper(AbstractBootstrapper):
logger.error("Error while initializing soledad "
"(unauthorized).")
self.soledad_failed.emit()
+ except u1db_errors.HTTPError as exc:
+ logger.exception("Error whie initializing soledad "
+ "(HTTPError)")
+ self.soledad_failed.emit()
except Exception as exc:
logger.exception("Unhandled error while initializating "
"soledad: %r" % (exc,))
@@ -315,11 +320,12 @@ class SoledadBootstrapper(AbstractBootstrapper):
:returns: the gpg binary path
:rtype: str
"""
- # TODO: Fix for Windows
gpgbin = None
if flags.STANDALONE:
gpgbin = os.path.join(
get_path_prefix(), "..", "apps", "mail", "gpg")
+ if IS_WIN:
+ gpgbin += ".exe"
else:
try:
gpgbin_options = which("gpg")
diff --git a/src/leap/bitmask/util/leap_argparse.py b/src/leap/bitmask/util/leap_argparse.py
index afe5be48..e8a9fda9 100644
--- a/src/leap/bitmask/util/leap_argparse.py
+++ b/src/leap/bitmask/util/leap_argparse.py
@@ -33,8 +33,7 @@ Launches Bitmask""", epilog=epilog)
parser.add_argument('-d', '--debug', action="store_true",
help=("Launches Bitmask in debug mode, writing debug"
"info to stdout"))
- # TODO: when we are ready to disable the --danger flag remove 'True or '
- if True or not IS_RELEASE_VERSION:
+ if not IS_RELEASE_VERSION:
help_text = "Bypasses the certificate check for bootstrap"
parser.add_argument('--danger', action="store_true", help=help_text)
diff --git a/src/leap/bitmask/util/leap_log_handler.py b/src/leap/bitmask/util/leap_log_handler.py
index 98924c12..1ab62331 100644
--- a/src/leap/bitmask/util/leap_log_handler.py
+++ b/src/leap/bitmask/util/leap_log_handler.py
@@ -52,7 +52,8 @@ class LogHandler(logging.Handler):
:param logging_level: the debug level to define the color.
:type logging_level: str.
"""
- log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
+ log_format = ('%(asctime)s - %(name)s:%(funcName)s:L#%(lineno)s '
+ '- %(levelname)s - %(message)s')
formatter = logging.Formatter(log_format)
return formatter