diff options
51 files changed, 544 insertions, 253 deletions
| @@ -1,7 +1,7 @@  [main]  host = https://www.transifex.com -[leap-client.leap-client] +[bitmask.bitmask]  file_filter = data/translations/<lang>.ts  source_file = data/ts/en_US.ts @@ -17,7 +17,7 @@ COMPILED_DIR = src/leap/gui  TRANSLAT_DIR = data/translations  #Project file, used for translations -PROJFILE = data/leap_client.pro +PROJFILE = data/bitmask.pro  #UI files to compile  UI_FILES = loggerwindow.ui mainwindow.ui wizard.ui login.ui statuspanel.ui @@ -58,7 +58,7 @@ $(COMPILED_DIR)/%_rc.py : $(RESOURCE_DIR)/%.qrc  	$(PYRCC) $< -o $@  manpages: -	rst2man docs/man/leap.1.rst docs/man/leap.1 +	rst2man docs/man/bitmask.1.rst docs/man/bitmask.1  apidocs:  	@sphinx-apidoc -o docs/api src/leap @@ -3,13 +3,13 @@ The LEAP Encryption Access Project Client  *your internet encryption toolkit* -.. image:: https://pypip.in/v/leap-client/badge.png -        :target: https://crate.io/packages/leap.client +.. image:: https://pypip.in/v/bitmask/badge.png +        :target: https://crate.io/packages/bitmask  Dependencies  ------------------ -LEAP Client depends on these libraries: +Bitmask depends on these libraries:  * ``python 2.6`` or ``2.7``  * ``qt4 libraries`` @@ -21,14 +21,14 @@ Python packages are listed in ``pkg/requirements.pip`` and ``pkg/test-requiremen  Debian  ^^^^^^ -With a Debian based system, to be able to run leap-client you need to run the following command:: +With a Debian based system, to be able to run Bitmask you need to run the following command::    $ sudo apt-get install openvpn python-pyside pyside-tools python-setuptools python-all-dev python-pip python-dev python-openssl  Installing  ----------- -After getting the source and installing all the dependencies, proceed to install ``leap-client`` package:: +After getting the source and installing all the dependencies, proceed to install ``bitmask`` package::    $ make    $ sudo LEAP_VENV_SKIP_PYSIDE=1 python setup.py install @@ -36,13 +36,13 @@ After getting the source and installing all the dependencies, proceed to install  Running  ------- -After a successful installation, there should be a launcher called ``leap-client`` somewhere in your path:: +After a successful installation, there should be a launcher called ``bitmask`` somewhere in your path:: -  $ leap-client +  $ bitmask -If you are testing a new provider and do not have a CA certificate chain tied to your SSL certificate, you should execute leap-client in the following way:: +If you are testing a new provider and do not have a CA certificate chain tied to your SSL certificate, you should execute Bitmask in the following way:: -  $ leap-client --danger +  $ bitmask --danger  But **DO NOT use it on a regular bases**. @@ -53,9 +53,9 @@ But **DO NOT use it on a regular bases**.  Hacking  ======= -The LEAP client git repository is available at:: +The Bitmask git repository is available at:: -  git://leap.se/leap_client +  git://leap.se/bitmask  Some steps need to be run when setting a development environment for the first time. @@ -66,19 +66,19 @@ Enable a **virtualenv** to isolate your libraries. (Current *.gitignore* knows a  Make sure you are in the development branch:: -  (leap_client)$ git checkout develop +  (bitmask)$ git checkout develop  Symlink your global pyside libraries:: -  (leap_client)$ pkg/postmkvenv.sh +  (bitmask)$ pkg/postmkvenv.sh  And make your working tree available to your pythonpath:: -  (leap_client)$ python setup.py develop +  (bitmask)$ python setup.py develop -Run the client:: +Run Bitmask:: -  (leap_client)$ python src/leap/app.py -d +  (bitmask)$ python src/leap/app.py -d  If you are testing a new provider that doesn't have the proper certificates yet, you can use --danger flag, but **DO NOT use it on a regular bases**. @@ -101,8 +101,8 @@ which the first time should automagically install all the needed dependencies in  License  ======= -.. image:: https://raw.github.com/leapcode/leap_client/develop/docs/user/gpl.png +.. image:: https://raw.github.com/leapcode/bitmask/develop/docs/user/gpl.png -The LEAP Client is released under the terms of the `GNU GPL version 3`_ or later. +Bitmask is released under the terms of the `GNU GPL version 3`_ or later.  .. _`GNU GPL version 3`: http://www.gnu.org/licenses/gpl.txt diff --git a/changes/bug-3401_login-fail-left-ui-inconsistent b/changes/bug-3401_login-fail-left-ui-inconsistent new file mode 100644 index 00000000..2403fe0e --- /dev/null +++ b/changes/bug-3401_login-fail-left-ui-inconsistent @@ -0,0 +1 @@ +  o Properly handle login failures. Closes bug #3401. diff --git a/changes/feature-3313_rebrand-the-client b/changes/feature-3313_rebrand-the-client new file mode 100644 index 00000000..4e10345e --- /dev/null +++ b/changes/feature-3313_rebrand-the-client @@ -0,0 +1 @@ +  o Rebrand the client to be named Bitmask. Feature #3313. diff --git a/changes/feature-3403_support-multiple-schemas b/changes/feature-3403_support-multiple-schemas new file mode 100644 index 00000000..9ed7ac89 --- /dev/null +++ b/changes/feature-3403_support-multiple-schemas @@ -0,0 +1 @@ +  o Add multiple schema support for SMTP. Closes #3403. diff --git a/changes/feature-3404_support-multiple-schemas b/changes/feature-3404_support-multiple-schemas new file mode 100644 index 00000000..354dc71e --- /dev/null +++ b/changes/feature-3404_support-multiple-schemas @@ -0,0 +1 @@ +  o Add multiple schema support for Soledad. Closes #3404. diff --git a/changes/feature-3418_update-transifex-project-name b/changes/feature-3418_update-transifex-project-name new file mode 100644 index 00000000..2ac7485a --- /dev/null +++ b/changes/feature-3418_update-transifex-project-name @@ -0,0 +1 @@ +  o Update Transifex project name and translators' documentation. Closes #3418. diff --git a/changes/feature_3305_openvpn_verbosity b/changes/feature_3305_openvpn_verbosity new file mode 100644 index 00000000..d838861f --- /dev/null +++ b/changes/feature_3305_openvpn_verbosity @@ -0,0 +1 @@ +  o Accept flag for changing openvpn verbosity in logs. Closes: #3305 diff --git a/changes/feature_add-imap-service b/changes/feature_add-imap-service new file mode 100644 index 00000000..6721e2cd --- /dev/null +++ b/changes/feature_add-imap-service @@ -0,0 +1 @@ +  o Add imap service to the client. Closes: #2579 diff --git a/changes/feature_add-uic-support-in-virtualenv b/changes/feature_add-uic-support-in-virtualenv new file mode 100644 index 00000000..2c067f80 --- /dev/null +++ b/changes/feature_add-uic-support-in-virtualenv @@ -0,0 +1 @@ +  o Add pyside-uic support inside the virtualenv. This way it won't fail to 'make' if the virtualenv is activated. Closes #3411. diff --git a/changes/feature_support_bundled_gpg b/changes/feature_support_bundled_gpg new file mode 100644 index 00000000..8ef3d522 --- /dev/null +++ b/changes/feature_support_bundled_gpg @@ -0,0 +1,2 @@ +  o Support bundled gpg. Related to #3397. +  o Set the default port for SMTP to be 2013.
\ No newline at end of file diff --git a/data/leap_client.pro b/data/bitmask.pro index ff26ad1a..ff26ad1a 100644 --- a/data/leap_client.pro +++ b/data/bitmask.pro diff --git a/data/images/mask-icon.png b/data/images/mask-icon.pngBinary files differ new file mode 100644 index 00000000..3504bae9 --- /dev/null +++ b/data/images/mask-icon.png diff --git a/data/images/mask-launcher.png b/data/images/mask-launcher.pngBinary files differ new file mode 100644 index 00000000..cb27f8d3 --- /dev/null +++ b/data/images/mask-launcher.png diff --git a/data/resources/mainwindow.qrc b/data/resources/mainwindow.qrc index 655f2812..d1268186 100644 --- a/data/resources/mainwindow.qrc +++ b/data/resources/mainwindow.qrc @@ -1,5 +1,7 @@  <RCC>    <qresource prefix="/"> +    <file>../images/mask-launcher.png</file> +    <file>../images/mask-icon.png</file>      <file>../images/watermark.png</file>      <file>../images/leap-gray-big.png</file>      <file>../images/Blue-Arrow-Right-32.png</file> diff --git a/docs/config/files.rst b/docs/config/files.rst index 0f4abead..70d3bff8 100644 --- a/docs/config/files.rst +++ b/docs/config/files.rst @@ -3,7 +3,7 @@  Configuration Files  =================== -This document covers the different configuration files used by the LEAP Client. +This document covers the different configuration files used by Bitmask.  leap.conf  --------- diff --git a/docs/dev/environment.rst b/docs/dev/environment.rst index 010ccc83..7ce536f9 100644 --- a/docs/dev/environment.rst +++ b/docs/dev/environment.rst @@ -3,7 +3,7 @@  Setting up a development environment  ==================================== -This document covers how to get an enviroment ready to contribute code to the LEAP Client. +This document covers how to get an enviroment ready to contribute code to Bitmask.  Cloning the repo  ---------------- @@ -13,12 +13,12 @@ Cloning the repo  :: -    git clone git://leap.se/leap_client  +    git clone git://leap.se/bitmask      git checkout develop  Base Dependencies  ------------------ -Leap client depends on these libraries: +Bitmask depends on these libraries:  * `python 2.6 or 2.7`  * `qt4` libraries (see also :ref:`Troubleshooting PySide install <pysidevirtualenv>` about how to install inside your virtualenv) @@ -100,10 +100,10 @@ You can install python dependencies with ``pip``. If you do it inside your worki  Copy script files  ----------------- -The openvpn invocation expects some files to be in place. If you have not installed `leap-client` from a debian package, you must copy these files manually by now:: +The openvpn invocation expects some files to be in place. If you have not installed `bitmask` from a debian package, you must copy these files manually by now::      $ sudo mkdir -p /etc/leap -    $ sudo cp pkg/linux/resolv-update /etc/leap  +    $ sudo cp pkg/linux/resolv-update /etc/leap  .. _policykit: @@ -111,9 +111,9 @@ Running openvpn without root privileges  ---------------------------------------  In linux, we are using ``policykit`` to be able to run openvpn without root privileges, and a policy file is needed to be installed for that to be possible. -The setup script tries to install the policy file when installing the client system-wide, so if you have installed the client in your global site-packages at least once it should have copied this file for you.  +The setup script tries to install the policy file when installing bitmask system-wide, so if you have installed bitmask in your global site-packages at least once it should have copied this file for you. -If you *only* are running the client from inside a virtualenv, you will need to copy this file by hand:: +If you *only* are running bitmask from inside a virtualenv, you will need to copy this file by hand::      $ sudo cp pkg/linux/polkit/net.openvpn.gui.leap.policy /usr/share/polkit-1/actions/ diff --git a/docs/dev/internals.rst b/docs/dev/internals.rst index 8bb19211..e43868f3 100644 --- a/docs/dev/internals.rst +++ b/docs/dev/internals.rst @@ -3,7 +3,7 @@  Internals  ========= -This section covers briefly the internal organization of the LEAP Client source tree. +This section covers briefly the internal organization of Bitmask source tree.  .. note:: diff --git a/docs/dev/internationalization.rst b/docs/dev/internationalization.rst index 8c584fdd..f9f522b9 100644 --- a/docs/dev/internationalization.rst +++ b/docs/dev/internationalization.rst @@ -3,15 +3,15 @@  Internationalization  ==================== -This part of the documentation covers the localization and translation of LEAP Client. +This part of the documentation covers the localization and translation of Bitmask.  Because we want to *bring fire to the people*, in as many countries and languages as possible. -Translating the LEAP Client PySide Application --------------------------------------------- +Translating Bitmask PySide Application +--------------------------------------  .. raw:: html -   <div><a target="_blank" style="text-decoration:none; color:black; font-size:66%" href="https://www.transifex.com/projects/p/leap-client/resource/leap-client/" title="See more information on Transifex.com">Top translations: leap-client » leap-client</a><br/><img border="0" src="https://www.transifex.com/projects/p/leap-client/resource/leap-client/chart/image_png"/><br/><a target="_blank" href="https://www.transifex.com/"><img border="0" src="https://ds0k0en9abmn1.cloudfront.net/static/charts/images/tx-logo-micro.646b0065fce6.png"/></a></div> +   <div><a target="_blank" style="text-decoration:none; color:black; font-size:66%" href="https://www.transifex.com/projects/p/bitmask/resource/bitmask/" title="See more information on Transifex.com">Top translations: bitmask » bitmask</a><br/><img border="0" src="https://www.transifex.com/projects/p/bitmask/resource/bitmask/chart/image_png"/><br/><a target="_blank" href="https://www.transifex.com/"><img border="0" src="https://ds0k0en9abmn1.cloudfront.net/static/charts/images/tx-logo-micro.646b0065fce6.png"/></a></div>  For translators @@ -21,7 +21,7 @@ For translators     as internal notes. -We are using `transifex <http://transifex.com/projects/p/leap-client>`_ to coordinate translation efforts. If you want to contribute, just sign up there and ... +We are using `transifex <http://transifex.com/projects/p/bitmask>`_ to coordinate translation efforts. If you want to contribute, just sign up there and ...  .. note::     ... and what?? @@ -61,11 +61,11 @@ You need ``pyside-lupdate`` and ``lrelease`` for these steps. To get it, in debi  If you do not already have it, install the ``transifex-client`` from the cheese shop:: -   pip install  transifex-client +   pip install transifex-client  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/leap_client.pro``. *We should automate this with some templating, it's tedious.* +**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``.:: @@ -80,7 +80,7 @@ You can learn more about the transifex-client `here <http://help.transifex.com/f  **5.** *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 leap-client.leap-client (source: data/ts/en_US.ts) +   Pulling new translations for resource bitmask.bitmask (source: data/ts/en_US.ts)     -> es: data/translations/es.ts     Done. @@ -89,7 +89,7 @@ Note that there is a configuration option in ``.tx/config`` for setting the mini  **6.** Generate .qm files from the updated .ts files:: -   $ make translations  +   $ make translations  and yes, it's the same command than in step 2. One less thing to remember :) @@ -101,7 +101,7 @@ and yes, it's the same command than in step 2. One less thing to remember :)  If you want to try it, just set your LANG environment variable:: -    $ LANG=es_ES leap-client +    $ LANG=es_ES bitmask  Translating the Documentation diff --git a/docs/dev/tests.rst b/docs/dev/tests.rst index 7f5fbaaf..d55c206a 100644 --- a/docs/dev/tests.rst +++ b/docs/dev/tests.rst @@ -39,8 +39,8 @@ Hint: colorized output  Install ``rednose`` locally, export the ``NOSE_REDNOSE`` variable, and give your eyes a rest :):: -  (leap_client)% pip install rednose -  (leap_client)% export NOSE_REDNOSE=1 +  (bitmask)% pip install rednose +  (bitmask)% export NOSE_REDNOSE=1  Testing all the supported python versions  ----------------------------------------- diff --git a/docs/man/leap-client.1.rst b/docs/man/bitmask.1.rst index 1ef5b3cc..12c87a5d 100644 --- a/docs/man/leap-client.1.rst +++ b/docs/man/bitmask.1.rst @@ -1,6 +1,6 @@ -=========== -leap-client  -=========== +======= +bitmask +=======  ------------------------------------------------------------------------  graphical client to control LEAP, the encrypted internet access toolkit. @@ -16,12 +16,12 @@ graphical client to control LEAP, the encrypted internet access toolkit.  SYNOPSIS  ======== -leap-client [-h] [-d] [-l [LOG FILE]] [--openvpn-verbosity [OPENVPN_VERB]] +bitmask [-h] [-d] [-l [LOG FILE]] [--openvpn-verbosity [OPENVPN_VERB]]  DESCRIPTION  =========== -*leap-client* is a graphical client to control LEAP, the encrypted internet access toolkit. +*bitmask* is a graphical client to control LEAP, the encrypted internet access toolkit.  When launched, it places an icon in the system tray from where the LEAP services can be controlled. @@ -49,14 +49,14 @@ WARNING  This software is still in early alfa testing. So don't trust your life to it!  -At the current time, the LEAP Client is not compatible with ``openresolv``, but it works with ``resolvconf``. +At the current time, Bitmask is not compatible with ``openresolv``, but it works with ``resolvconf``.  FILES  =====  /etc/leap/resolv-update  ----------------------- -Post up/down script passed to openvpn. It writes /etc/resolv.conf to avoid dns leaks, and restores the original resolv.conf on exit.             +Post up/down script passed to openvpn. It writes /etc/resolv.conf to avoid dns leaks, and restores the original resolv.conf on exit.  /etc/leap/resolv-head  --------------------- diff --git a/docs/testers/howto.rst b/docs/testers/howto.rst index a3f8da09..dde893d1 100644 --- a/docs/testers/howto.rst +++ b/docs/testers/howto.rst @@ -34,19 +34,19 @@ Bootstrap script     This will fetch the *develop* branch. If you want to test another branch, just change it in the line starting with *pip install...*. Alternatively, bug kali so she add an option branch to a decent script.  .. note:: -   This script could make use of the after_install hook. Read http://pypi.python.org/pypi/virtualenv/  +   This script could make use of the after_install hook. Read http://pypi.python.org/pypi/virtualenv/  Download and source the following script in the parent folder where you want your testing build to be downloaded. For instance, to `/tmp/`:  .. code-block:: bash     cd /tmp -   wget https://raw.github.com/leapcode/leap_client/develop/pkg/scripts/leap_client_bootstrap.sh +   wget https://raw.github.com/leapcode/bitmask/develop/pkg/scripts/leap_client_bootstrap.sh     source leap_client_bootstrap.sh -Tada! If everything went well, you should be able to run the client by typing:: +Tada! If everything went well, you should be able to run bitmask by typing:: -    bin/leap-client +    bin/bitmask  Noticed that your prompt changed? That was *virtualenv*. Keep reading... @@ -54,7 +54,7 @@ Activating the virtualenv  ^^^^^^^^^^^^^^^^^^^^^^^^^  The above bootstrap script has fetched latest code inside a virtualenv, which is an isolated, *virtual* python local environment that avoids messing with your global paths. You will notice you are *inside* a virtualenv because you will see a modified prompt reminding it to you (*leap-client-testbuild* in this case). -Thus, if you forget to *activate your virtualenv*, the client will not run from the local path, and it will be looking for something else in your global path. So, **you have to remember to activate your virtualenv** each time that you open a new shell and want to execute the code you are testing. You can do this by typing:: +Thus, if you forget to *activate your virtualenv*, bitmask will not run from the local path, and it will be looking for something else in your global path. So, **you have to remember to activate your virtualenv** each time that you open a new shell and want to execute the code you are testing. You can do this by typing::      $ source bin/activate @@ -65,11 +65,11 @@ Refer to :ref:`Working with virtualenv <virtualenv>` to learn more about virtual  Copying config files  ^^^^^^^^^^^^^^^^^^^^ -If you have never installed the ``leap-client`` globally, **you need to copy some files to its proper path before running it for the first time** (you only need to do this once). This, unless the virtualenv-based operations, will need root permissions. See :ref:`copy script files <copyscriptfiles>` and :ref:`running openvpn without root privileges <policykit>` sections for more info on this. In short:: +If you have never installed ``bitmask`` globally, **you need to copy some files to its proper path before running it for the first time** (you only need to do this once). This, unless the virtualenv-based operations, will need root permissions. See :ref:`copy script files <copyscriptfiles>` and :ref:`running openvpn without root privileges <policykit>` sections for more info on this. In short::      $ sudo cp pkg/linux/polkit/net.openvpn.gui.leap.policy /usr/share/polkit-1/actions/      $ sudo mkdir -p /etc/leap -    $ sudo cp pkg/linux/resolv-update /etc/leap  +    $ sudo cp pkg/linux/resolv-update /etc/leap  Local config files  ^^^^^^^^^^^^^^^^^^^ @@ -83,8 +83,8 @@ Pulling latest changes  You should be able to cd into the downloaded repo and pull latest changes:: -    (leap-client-testbuild)$ cd src/leap-client -    (leap-client-testbuild)$ git pull origin develop +    (bitmask-testbuild)$ cd src/bitmask +    (bitmask-testbuild)$ git pull origin develop  However, as a tester you are encouraged to run the whole bootstrap process from time to time to help us catching install and versioniing bugs too. @@ -95,13 +95,13 @@ When we have a release candidate for the supported platforms (Debian stable, Ubu  Testing the status of translations  ---------------------------------- -We need translators! You can go to `transifex <https://www.transifex.com/projects/p/leap-client/>`_, get an account and start contributing. +We need translators! You can go to `transifex <https://www.transifex.com/projects/p/bitmask/>`_, get an account and start contributing. -If you want to check the current status of the client localization in a language other than the one set in your machine, you can do it with a simple trick (under linux). For instance, do:: +If you want to check the current status of bitmask localization in a language other than the one set in your machine, you can do it with a simple trick (under linux). For instance, do:: -    $ lang=es_ES leap-client +    $ lang=es_ES bitmask -for running  LEAP Client with the spanish locales. +for running Bitmask with the spanish locales.  Reporting bugs  -------------- @@ -110,6 +110,6 @@ Reporting bugs     There is a great text on the art of bug reporting, that can be found `online <http://www.chiark.greenend.org.uk/~sgtatham/bugs.html>`_. -.. TODO add a line with ref. to running the client in debug mode... +.. TODO add a line with ref. to running Bitmask in debug mode... -We use the `LEAP Client Bug Tracker <https://leap.se/code/projects/eip-client>`_, although you can also use `Github issues <https://github.com/leapcode/leap_client/issues>`_. +We use the `Bitmask Bug Tracker <https://leap.se/code/projects/eip-client>`_, although you can also use `Github issues <https://github.com/leapcode/bitmask/issues>`_. diff --git a/docs/user/install.rst b/docs/user/install.rst index 0467ba8b..da1d914c 100644 --- a/docs/user/install.rst +++ b/docs/user/install.rst @@ -3,7 +3,7 @@  Installation  ============ -This part of the documentation covers the installation of the LEAP Client. +This part of the documentation covers the installation of Bitmask.  We assume that you want to get it properly installed before being able to use it.  .. note:: @@ -16,9 +16,9 @@ Distribute & Pip  .. warning:: The package in the cheese shop is from the stable, `0.2.0` release, which is now outdated. You are encouraged to install the development version instead. -Installing LEAP Client is as simple as using `pip <http://www.pip-installer.org/>`_ for the already released versions :: +Installing Bitmask is as simple as using `pip <http://www.pip-installer.org/>`_ for the already released versions :: -    $ pip install leap-client +    $ pip install bitmask  Debian package  -------------- @@ -40,20 +40,20 @@ Add the archive to your sources.list::     # apt-get update     # apt-get install leap-keyring -And  then you can happily install leap-client:: +And  then you can happily install bitmask:: -   apt-get install leap-client +   apt-get install bitmask  Show me the code!  -----------------  You can get the code from LEAP public git repository :: -   $ git clone git://leap.se/leap_client +   $ git clone git://leap.se/bitmask  Or from the github mirror :: -   $ git clone git://github.com/leapcode/leap_client.git +   $ git clone git://github.com/leapcode/bitmask.git  Once you have grabbed a copy of the sources, you can install it into your site-packages easily :: diff --git a/docs/user/intro.rst b/docs/user/intro.rst index 9461d5f2..22ad9356 100644 --- a/docs/user/intro.rst +++ b/docs/user/intro.rst @@ -3,15 +3,15 @@  Introduction  ============ -The LEAP Client ---------------- +Bitmask +-------  .. if yoy change this, change it also in the index.rst -The **LEAP Client** is a :ref:`GPL3 Licensed <gpl3>` multiplatform client, written in python using PySide, that supports the features offered by :ref:`the LEAP Platform <leapplatform>`. Currently is being tested on Linux, support for OSX and Windows will come soon. +**Bitmask** is a :ref:`GPL3 Licensed <gpl3>` multiplatform client, written in python using PySide, that supports the features offered by :ref:`the LEAP Platform <leapplatform>`. Currently is being tested on Linux, support for OSX and Windows will come soon.  Features  ^^^^^^^^ -The LEAP Client allows to easily secure communications. +Bitmask allows to easily secure communications.  - Provider selection  - User registration @@ -78,22 +78,22 @@ GPLv3 License  .. image:: gpl.* -The LEAP Client is released under the terms of the `GNU GPL version 3`_ or later. +Bitmask is released under the terms of the `GNU GPL version 3`_ or later.  :: -    The LEAP Client is free software: you can redistribute it and/or modify +    Bitmask 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. -    The LEAP Client is distributed in the hope that it will be useful, +    Bitmask 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 the LEAP Client.  If not, see http://www.gnu.org/licenses/. +    along with Bitmask.  If not, see http://www.gnu.org/licenses/.  .. _`GNU GPL version 3`: http://www.gnu.org/licenses/gpl.txt diff --git a/docs/user/running.rst b/docs/user/running.rst index 43f3e87c..da83e9ef 100644 --- a/docs/user/running.rst +++ b/docs/user/running.rst @@ -3,13 +3,13 @@  Running  ================== -This document covers how to launch the LEAP Client. +This document covers how to launch Bitmask. -Launching the client --------------------- -After a successful installation, there should be a launcher called `leap-client` somewhere in your path:: +Launching Bitmask +----------------- +After a successful installation, there should be a launcher called `bitmask` somewhere in your path:: -  % leap-client +  % bitmask  The first time you launch it, it should launch the first run wizard that will guide you through the setup of the LEAP Services. @@ -21,13 +21,13 @@ The first time you launch it, it should launch the first run wizard that will gu  Debug mode  ---------- -If you are happy having lots of output in your terminal, you will like to know that you can run the client in debug mode:: +If you are happy having lots of output in your terminal, you will like to know that you can run bitmask in debug mode:: -  $ leap-client --debug +  $ bitmask --debug  If you ask for it, you can also have all that debug info in a beautiful file ready to be attached to your bug reports:: -  $ leap-client --debug --logfile /tmp/leap.log +  $ bitmask --debug --logfile /tmp/leap.log  .. warning   .. the following is broken since it will clutter your stdout with all the commands sent to the management interface. @@ -35,10 +35,10 @@ If you ask for it, you can also have all that debug info in a beautiful file rea  .. not working...  .. If you want to increment the level of verbosity passed to openvpn, you can do:: -.. $ leap-client --openvpn-verbosity 4 +.. $ bitmask --openvpn-verbosity 4  Options  ------------  To see all the available command line options:: -  $ leap-client --help +  $ bitmask --help diff --git a/pkg/osx/install/install-leapc.sh b/pkg/osx/install/install-leapc.sh index ec3c2834..e47abb7c 100755 --- a/pkg/osx/install/install-leapc.sh +++ b/pkg/osx/install/install-leapc.sh @@ -1,6 +1,6 @@  #!/bin/bash -# LEAP CLient Installer Script. +# Bitmask Installer Script.  #  # Copyright (C) 2013 LEAP Encryption Access Project  # @@ -20,7 +20,7 @@ leapdir=/Applications/LEAP\ Client.app  leaplibs=${leapdir}/Contents/MacOS  tunstartup=/Library/StartupItems/tun/tun -echo "Installing LEAP Client in /Applications..." +echo "Installing Bitmask in /Applications..."  cp -r "LEAP Client.app" /Applications  echo "Copying openvpn binary..." diff --git a/pkg/postmkvenv.sh b/pkg/postmkvenv.sh index 2f0cba45..04f8d372 100755 --- a/pkg/postmkvenv.sh +++ b/pkg/postmkvenv.sh @@ -16,7 +16,7 @@ elif [[ "$unamestr" == 'Darwin' ]]; then     platform='darwin'  fi -LIBS=( PySide ) +LIBS=( PySide pysideuic )  PYTHON_VERSION=python$(python -c "import sys; print (str(sys.version_info[0])+'.'+str(sys.version_info[1]))")  VAR=( $(which -a $PYTHON_VERSION) ) diff --git a/relnotes.txt b/relnotes.txt new file mode 100644 index 00000000..5f711005 --- /dev/null +++ b/relnotes.txt @@ -0,0 +1,81 @@ +ANNOUNCING Bitmask, the internet encryption toolkit, v0.3.0 + +The LEAP team is pleased to announce the immediate availability of +version 0.3.0 of Bitmask + +https://downloads.leap.se/client/ + +LEAP (LEAP Encryption Access Project) develops a plan to secure +everyday communication, breaking down into discrete services. + +The client for the current phase gives support to the EIP Service and +the first beta release of Encrypted Mail. +EIP (the Encrypted Internet Proxy) provides circumvention, +location anonymization, and traffic encryption in a hassle-free, +automatically self-configuring fashion. +Encrypted Mail + +You can read the user manual and the developer notes online at: + +http://bitmask.readthedocs.org/ + +WARNING: This is still a beta release of our services, a lot of +testing and audits are still needed so DO NOT use this for strong +security. + + +WHAT CAN THIS VERSION OF THE CLIENT DO FOR ME? + +You can connect to the EIP service offered by a provider of your +choice, and enjoy a encrypted internet connection. + +The first run wizard allows to register an user with the selected +provider, downloading all the config files needed to connect to the +eip service. There are also some minimal network checks in place. + + +LICENCE + +You may use this package under the GNU General Public License, +version 3 or, at your option, any later version. See the file +"COPYING.GPL" for the terms of the GNU General Public +License, version 3. + +In addition, as a special exception, the copyright holders give +permission to link the code of portions of this program with the +OpenSSL library under certain conditions as described in each +individual source file, and distribute linked combinations +including the two. + + +INSTALLATION + +The current version of the LEAP Client has been tested on GNU/Linux +and OSX, but it is likely that you are able to run it under other +systems, specially if you are skillful and patient is one of your +virtues. + +Have a look at "docs/user/install.rst". + +Packages are provided for debian and ubuntu. OSX and win installers +will be following soon. + + +BUGS + +You can send the bugs our way by pointing your telnet session to port 443 on +https://leap.se/code. We will do our best to make them follow our +intensive bug-reeducation program. + + +HACKING + +You can find us in the #leap-dev channel on the freenode network. +If you are lucky enough, you can spot us sleepless in night trains, +rooftops, rainforests, and beyond any border. + + +The LEAP team. + +Aug 9, 2013 +Somewhere in the middle of the intertubes. @@ -19,7 +19,7 @@ import versioneer  versioneer.versionfile_source = 'src/leap/_version.py'  versioneer.versionfile_build = 'leap/_version.py'  versioneer.tag_prefix = ''  # tags are like 1.2.0 -versioneer.parentdir_prefix = 'leap_client-' +versioneer.parentdir_prefix = 'bitmask-'  from setuptools import Command @@ -52,7 +52,7 @@ trove_classifiers = [  parsed_reqs = utils.parse_requirements()  cmdclass = versioneer.get_cmdclass() -leap_launcher = 'leap-client=leap.app:main' +leap_launcher = 'bitmask=leap.app:main'  from setuptools.command.develop import develop as _develop @@ -70,6 +70,7 @@ def copy_reqs(path, withsrc=False):      with open(reqsfile, "w") as f:          f.write('\n'.join(parsed_reqs)) +  class cmd_develop(_develop):      def run(self):          # versioneer: @@ -109,7 +110,7 @@ cmdclass["sdist"] = cmd_sdist  setup( -    name="leap-client", +    name="bitmask",      package_dir={"": "src"},      version=versioneer.get_version(),      cmdclass=cmdclass, @@ -131,7 +132,8 @@ setup(      test_suite='nose.collector',      tests_require=utils.parse_requirements(          reqfiles=['pkg/requirements-testing.pip']), -    keywords='LEAP, client, qt, encryption, proxy, openvpn, imap, smtp', +    keywords=('Bitmask, LEAP, client, qt, encryption, ' +              'proxy, openvpn, imap, smtp'),      author='The LEAP Encryption Access Project',      author_email='info@leap.se',      url='https://leap.se', @@ -145,10 +147,10 @@ setup(      # not being used? -- setuptools does not like it.      # looks like debhelper is honoring it...      data_files=[ -    #    ("share/man/man1", -    #        ["docs/man/leap-client.1"]), +        # ("share/man/man1", +        #     ["docs/man/bitmask.1"]),          ("share/polkit-1/actions", -            ["pkg/linux/polkit/net.openvpn.gui.leap.policy"]), +         ["pkg/linux/polkit/net.openvpn.gui.leap.policy"]),      ],      zip_safe=False,      platforms="all", diff --git a/src/leap/_version.py b/src/leap/_version.py index 6f7e3d05..05542975 100644 --- a/src/leap/_version.py +++ b/src/leap/_version.py @@ -16,6 +16,8 @@ git_full = "$Format:%H$"  import subprocess  import sys +import re +import os.path  def run_command(args, cwd=None, verbose=False): @@ -38,11 +40,6 @@ def run_command(args, cwd=None, verbose=False):      return stdout -import sys -import re -import os.path - -  def get_expanded_variables(versionfile_source):      # the code embedded in _version.py can just fetch the value of these      # variables. When used from setup.py, we don't want to import @@ -187,7 +184,7 @@ def versions_from_parentdir(parentdir_prefix, versionfile_source,      return {"version": dirname[len(parentdir_prefix):], "full": ""}  tag_prefix = "" -parentdir_prefix = "leap_client-" +parentdir_prefix = "bitmask-"  versionfile_source = "src/leap/_version.py" diff --git a/src/leap/app.py b/src/leap/app.py index 6ba27813..22340d4d 100644 --- a/src/leap/app.py +++ b/src/leap/app.py @@ -142,21 +142,22 @@ def main():      bypass_checks = getattr(opts, 'danger', False)      debug = opts.debug      logfile = opts.log_file +    openvpn_verb = opts.openvpn_verb      logger = add_logger_handlers(debug, logfile)      replace_stdout_stderr_with_logging(logger)      if not we_are_the_one_and_only(): -        # leap-client is already running +        # Bitmask is already running          logger.warning("Tried to launch more than one instance " -                       "of leap-client. Raising the existing " +                       "of Bitmask. Raising the existing "                         "one instead.")          sys.exit(1)      check_requirements()      logger.info('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~') -    logger.info('LEAP client version %s', VERSION) +    logger.info('Bitmask version %s', VERSION)      logger.info('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')      logger.info('Starting app') @@ -202,6 +203,7 @@ def main():      window = MainWindow(          lambda: twisted_main.quit(app),          standalone=standalone, +        openvpn_verb=openvpn_verb,          bypass_checks=bypass_checks)      sigint_window = partial(sigint_handler, window, logger=logger) @@ -210,8 +212,10 @@ def main():      if IS_MAC:          window.raise_() -    tx_app = leap_services() -    assert(tx_app) +    # This was a good idea, but for this to work as intended we +    # should centralize the start of all services in there. +    #tx_app = leap_services() +    #assert(tx_app)      # Run main loop      twisted_main.start(app) diff --git a/src/leap/config/providerconfig.py b/src/leap/config/providerconfig.py index eb097034..f899b17c 100644 --- a/src/leap/config/providerconfig.py +++ b/src/leap/config/providerconfig.py @@ -42,12 +42,25 @@ class ProviderConfig(BaseConfig):      def __init__(self):          BaseConfig.__init__(self) -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration +        Returns the schema corresponding to the version given. + +        :rtype: dict or None if the version is not supported.          """          return leap_provider_spec +    def _get_spec(self): +        """ +        Returns the spec object for the specific configuration. + +        Override the BaseConfig one because we do not support multiple schemas +        for the provider yet. + +        :rtype: dict or None if the version is not supported. +        """ +        return self._get_schema() +      def get_api_uri(self):          return self._safe_get_value("api_uri") diff --git a/src/leap/gui/login.py b/src/leap/gui/login.py index 3c994597..de0b2d50 100644 --- a/src/leap/gui/login.py +++ b/src/leap/gui/login.py @@ -197,18 +197,18 @@ class LoginWidget(QtGui.QWidget):          """          self.ui.lnUser.setEnabled(enabled)          self.ui.lnPassword.setEnabled(enabled) -        self.ui.btnLogin.setEnabled(enabled)          self.ui.chkRemember.setEnabled(enabled)          self.ui.cmbProviders.setEnabled(enabled) -    def set_cancel(self, enabled=False): +        self._set_cancel(not enabled) + +    def _set_cancel(self, enabled=False):          """          Enables or disables the cancel action in the "log in" process.          :param enabled: wether it should be enabled or not          :type enabled: bool          """ -        self.ui.btnLogin.setEnabled(enabled)          text = self.tr("Cancel")          login_or_cancel = self.cancel_login diff --git a/src/leap/gui/mainwindow.py b/src/leap/gui/mainwindow.py index a1ba4df4..5ace1043 100644 --- a/src/leap/gui/mainwindow.py +++ b/src/leap/gui/mainwindow.py @@ -45,6 +45,7 @@ from leap.services.eip.providerbootstrapper import ProviderBootstrapper  # XXX: Soledad might not work out of the box in Windows, issue #2932  from leap.services.soledad.soledadbootstrapper import SoledadBootstrapper  from leap.services.mail.smtpbootstrapper import SMTPBootstrapper +from leap.services.mail import imap  from leap.platform_init import IS_WIN, IS_MAC  from leap.platform_init.initializers import init_platform @@ -82,7 +83,7 @@ class MainWindow(QtGui.QMainWindow):      EIP_STATUS_INDEX = 1      # Keyring -    KEYRING_KEY = "leap_client" +    KEYRING_KEY = "bitmask"      # SMTP      PORT_KEY = "port" @@ -94,12 +95,15 @@ class MainWindow(QtGui.QMainWindow):      # Signals      new_updates = QtCore.Signal(object)      raise_window = QtCore.Signal([]) +    soledad_ready = QtCore.Signal([])      # We use this flag to detect abnormal terminations      user_stopped_eip = False      def __init__(self, quit_callback, -                 standalone=False, bypass_checks=False): +                 standalone=False, +                 openvpn_verb=1, +                 bypass_checks=False):          """          Constructor for the client main window @@ -140,6 +144,9 @@ class MainWindow(QtGui.QMainWindow):              self.ui.stackedWidget.widget(self.LOGIN_INDEX))          self.ui.loginLayout.addWidget(self._login_widget) +        # Signals +        # TODO separate logic from ui signals. +          self._login_widget.login.connect(self._login)          self._login_widget.cancel_login.connect(self._cancel_login)          self._login_widget.show_wizard.connect( @@ -210,7 +217,7 @@ class MainWindow(QtGui.QMainWindow):          self._smtp_bootstrapper.download_config.connect(              self._smtp_bootstrapped_stage) -        self._vpn = VPN() +        self._vpn = VPN(openvpn_verb=openvpn_verb)          self._vpn.qtsigs.state_changed.connect(              self._status_panel.update_vpn_state)          self._vpn.qtsigs.status_changed.connect( @@ -260,7 +267,9 @@ class MainWindow(QtGui.QMainWindow):          self.ui.lblNewUpdates.setVisible(False)          self.ui.btnMore.setVisible(False)          self.ui.btnMore.clicked.connect(self._updates_details) +          self.new_updates.connect(self._react_to_new_updates) +        self.soledad_ready.connect(self._start_imap_service)          init_platform() @@ -273,6 +282,7 @@ class MainWindow(QtGui.QMainWindow):          self._soledad = None          self._keymanager = None +        self._imap_service = None          self._login_defer = None          self._download_provider_defer = None @@ -413,11 +423,11 @@ class MainWindow(QtGui.QMainWindow):          Parses and displays the updates details          """ -        msg = self.tr("The LEAPClient app is ready to update, please" +        msg = self.tr("The Bitmask app is ready to update, please"                        " restart the application.")          # We assume that if there is nothing in the contents, then -        # the LEAPClient bundle is what needs updating. +        # the Bitmask bundle is what needs updating.          if len(self._updates_content) > 0:              files = self._updates_content.split(", ")              files_str = "" @@ -645,17 +655,23 @@ class MainWindow(QtGui.QMainWindow):          SLOT          TRIGGERS: self.ui.action_about_leap.triggered -        Display the About LEAP dialog +        Display the About Bitmask dialog          """          QtGui.QMessageBox.about( -            self, self.tr("About LEAP - %s") % (VERSION,), -            self.tr("version: <b>%s</b><br>" +            self, self.tr("About Bitmask - %s") % (VERSION,), +            self.tr("Version: <b>%s</b><br>" +                    "<br>" +                    "Bitmask is the Desktop client application for " +                    "the LEAP platform, supporting encrypted internet " +                    "proxy, secure email, and secure chat (coming soon).<br>" +                    "<br>"                      "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. " -                    "<a href=\"https://leap.se\">More about LEAP" +                    "and widely available. <br>" +                    "<br>" +                    "<a href='https://leap.se'>More about LEAP"                      "</a>") % (VERSION,))      def changeEvent(self, e): @@ -804,7 +820,6 @@ class MainWindow(QtGui.QMainWindow):          self._login_widget.set_status(self.tr("Logging in..."), error=False)          self._login_widget.set_enabled(False) -        self._login_widget.set_cancel(True)          if self._login_widget.get_remember() and has_keyring():              # in the keyring and in the settings @@ -832,7 +847,6 @@ class MainWindow(QtGui.QMainWindow):          Stops the login sequence.          """          logger.debug("Cancelling log in.") -        self._login_widget.set_cancel(False)          if self._download_provider_defer:              logger.debug("Cancelling download provider defer.") @@ -913,7 +927,8 @@ class MainWindow(QtGui.QMainWindow):              self._provider_config,              self._login_widget.get_user(),              self._login_widget.get_password(), -            download_if_needed=True) +            download_if_needed=True, +            standalone=self._standalone)          self._download_eip_config() @@ -951,29 +966,41 @@ class MainWindow(QtGui.QMainWindow):          passed = data[self._soledad_bootstrapper.PASSED_KEY]          if not passed:              logger.error(data[self._soledad_bootstrapper.ERROR_KEY]) -        else: -            logger.debug("Done bootstrapping Soledad") +            return -            self._soledad = self._soledad_bootstrapper.soledad -            self._keymanager = self._soledad_bootstrapper.keymanager +        logger.debug("Done bootstrapping Soledad") -            if self._provider_config.provides_mx() and \ -                    self._enabled_services.count(self.MX_SERVICE) > 0: -                self._smtp_bootstrapper.run_smtp_setup_checks( -                    self._provider_config, -                    self._smtp_config, -                    True) +        self._soledad = self._soledad_bootstrapper.soledad +        self._keymanager = self._soledad_bootstrapper.keymanager + +        # Ok, now soledad is ready, so we can allow other things that +        # depend on soledad to start. + +        # this will trigger start_imap_service +        self.soledad_ready.emit() + +        # TODO connect all these activations to the soledad_ready +        # signal so the logic is clearer to follow. + +        if self._provider_config.provides_mx() and \ +                self._enabled_services.count(self.MX_SERVICE) > 0: +            self._smtp_bootstrapper.run_smtp_setup_checks( +                self._provider_config, +                self._smtp_config, +                True) +        else: +            if self._enabled_services.count(self.MX_SERVICE) > 0: +                pass  # TODO: show MX status +                #self._status_panel.set_eip_status( +                #    self.tr("%s does not support MX") % +                #    (self._provider_config.get_domain(),), +                #                     error=True)              else: -                if self._enabled_services.count(self.MX_SERVICE) > 0: -                    pass  # TODO: show MX status -                    #self._status_panel.set_eip_status( -                    #    self.tr("%s does not support MX") % -                    #    (self._provider_config.get_domain(),), -                    #                     error=True) -                else: -                    pass  # TODO: show MX status -                    #self._status_panel.set_eip_status( -                    #    self.tr("MX is disabled")) +                pass  # TODO: show MX status +                #self._status_panel.set_eip_status( +                #    self.tr("MX is disabled")) + +    # Service control methods: smtp      def _smtp_bootstrapped_stage(self, data):          """ @@ -991,29 +1018,41 @@ class MainWindow(QtGui.QMainWindow):          passed = data[self._smtp_bootstrapper.PASSED_KEY]          if not passed:              logger.error(data[self._smtp_bootstrapper.ERROR_KEY]) -        else: -            logger.debug("Done bootstrapping SMTP") - -            hosts = self._smtp_config.get_hosts() -            # TODO: handle more than one host and define how to choose -            if len(hosts) > 0: -                hostname = hosts.keys()[0] -                logger.debug("Using hostname %s for SMTP" % (hostname,)) -                host = hosts[hostname][self.IP_KEY].encode("utf-8") -                port = hosts[hostname][self.PORT_KEY] -                # TODO: pick local smtp port in a better way -                # TODO: Make the encrypted_only configurable - -                from leap.mail.smtp import setup_smtp_relay -                client_cert = self._eip_config.get_client_cert_path( -                    self._provider_config) -                setup_smtp_relay(port=1234, -                                 keymanager=self._keymanager, -                                 smtp_host=host, -                                 smtp_port=port, -                                 smtp_cert=client_cert, -                                 smtp_key=client_cert, -                                 encrypted_only=False) +            return +        logger.debug("Done bootstrapping SMTP") + +        hosts = self._smtp_config.get_hosts() +        # TODO: handle more than one host and define how to choose +        if len(hosts) > 0: +            hostname = hosts.keys()[0] +            logger.debug("Using hostname %s for SMTP" % (hostname,)) +            host = hosts[hostname][self.IP_KEY].encode("utf-8") +            port = hosts[hostname][self.PORT_KEY] +            # TODO: pick local smtp port in a better way +            # TODO: Make the encrypted_only configurable + +            from leap.mail.smtp import setup_smtp_relay +            client_cert = self._eip_config.get_client_cert_path( +                self._provider_config) +            setup_smtp_relay(port=2013, +                             keymanager=self._keymanager, +                             smtp_host=host, +                             smtp_port=port, +                             smtp_cert=client_cert, +                             smtp_key=client_cert, +                             encrypted_only=False) + +    def _start_imap_service(self): +        """ +        SLOT +        TRIGGERS: +            soledad_ready +        """ +        logger.debug('Starting imap service') + +        self._imap_service = imap.start_imap_service( +            self._soledad, +            self._keymanager)      def _get_socket_host(self):          """ @@ -1068,6 +1107,7 @@ class MainWindow(QtGui.QMainWindow):              self._status_panel.eip_started() +            # XXX refactor into status_panel method?              self._action_eip_startstop.setText(self.tr("Turn OFF"))              self._action_eip_startstop.disconnect(self)              self._action_eip_startstop.triggered.connect( @@ -1112,7 +1152,7 @@ class MainWindow(QtGui.QMainWindow):              self._status_panel.set_global_status(                  self.tr("Another openvpn instance is already running, and "                          "could not be stopped because it was not launched by " -                        "LEAP. Please stop it and try again."), +                        "Bitmask. Please stop it and try again."),                  error=True)              self._set_eipstatus_off()          except VPNLauncherException as e: @@ -1301,7 +1341,6 @@ class MainWindow(QtGui.QMainWindow):          """          passed = data[self._provider_bootstrapper.PASSED_KEY]          if not passed: -            self._login_widget.set_cancel(False)              self._login_widget.set_enabled(True)              self._login_widget.set_status(                  self.tr("Unable to connect: Problem with provider")) @@ -1409,6 +1448,9 @@ class MainWindow(QtGui.QMainWindow):          """          logger.debug('About to quit, doing cleanup...') +        if self._imap_service is not None: +            self._imap_service.stop() +          if self._srp_auth is not None:              if self._srp_auth.get_session_id() is not None or \                 self._srp_auth.get_token() is not None: @@ -1421,16 +1463,28 @@ class MainWindow(QtGui.QMainWindow):          else:              logger.error("No instance of soledad was found.") -        logger.debug('Cleaning pidfiles') -        self._cleanup_pidfiles() -          logger.debug('Terminating vpn')          self._vpn.terminate(shutdown=True) +        if self._login_defer: +            logger.debug("Cancelling login defer.") +            self._login_defer.cancel() + +        if self._download_provider_defer: +            logger.debug("Cancelling download provider defer.") +            self._download_provider_defer.cancel() + +        # TODO missing any more cancels? + +        logger.debug('Cleaning pidfiles') +        self._cleanup_pidfiles() +      def quit(self):          """          Cleanup and tidely close the main window before quitting.          """ +        # TODO: separate the shutting down of services from the +        # UI stuff.          self._cleanup_and_quit()          self._really_quit = True @@ -1441,14 +1495,6 @@ class MainWindow(QtGui.QMainWindow):          if self._logger_window:              self._logger_window.close() -        if self._login_defer: -            logger.debug("Cancelling login defer.") -            self._login_defer.cancel() - -        if self._download_provider_defer: -            logger.debug("Cancelling download provider defer.") -            self._download_provider_defer.cancel() -          self.close()          if self._quit_callback: diff --git a/src/leap/gui/ui/loggerwindow.ui b/src/leap/gui/ui/loggerwindow.ui index 28325cdf..b08428a9 100644 --- a/src/leap/gui/ui/loggerwindow.ui +++ b/src/leap/gui/ui/loggerwindow.ui @@ -15,7 +15,7 @@    </property>    <property name="windowIcon">     <iconset resource="../../../../data/resources/mainwindow.qrc"> -    <normaloff>:/images/leap-color-big.png</normaloff>:/images/leap-color-big.png</iconset> +    <normaloff>:/images/mask-icon.png</normaloff>:/images/mask-icon.png</iconset>    </property>    <layout class="QGridLayout" name="gridLayout">     <item row="2" column="0" colspan="2"> diff --git a/src/leap/gui/ui/mainwindow.ui b/src/leap/gui/ui/mainwindow.ui index 67d78736..ecd3cbe9 100644 --- a/src/leap/gui/ui/mainwindow.ui +++ b/src/leap/gui/ui/mainwindow.ui @@ -11,11 +11,11 @@     </rect>    </property>    <property name="windowTitle"> -   <string>LEAP</string> +   <string>Bitmask</string>    </property>    <property name="windowIcon">     <iconset resource="../../../../data/resources/mainwindow.qrc"> -    <normaloff>:/images/leap-color-big.png</normaloff>:/images/leap-color-big.png</iconset> +    <normaloff>:/images/mask-icon.png</normaloff>:/images/mask-icon.png</iconset>    </property>    <property name="inputMethodHints">     <set>Qt::ImhHiddenText</set> @@ -166,7 +166,7 @@         <string/>        </property>        <property name="pixmap"> -       <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/leap-color-big.png</pixmap> +       <pixmap resource="../../../../data/resources/mainwindow.qrc">:/images/mask-launcher.png</pixmap>        </property>        <property name="alignment">         <set>Qt::AlignCenter</set> @@ -288,7 +288,7 @@    </action>    <action name="action_about_leap">     <property name="text"> -    <string>About &LEAP</string> +    <string>About &Bitmask</string>     </property>    </action>    <action name="action_help"> diff --git a/src/leap/gui/ui/wizard.ui b/src/leap/gui/ui/wizard.ui index d8acd69a..a8f66bbc 100644 --- a/src/leap/gui/ui/wizard.ui +++ b/src/leap/gui/ui/wizard.ui @@ -11,11 +11,11 @@     </rect>    </property>    <property name="windowTitle"> -   <string>LEAP First run</string> +   <string>Bitmask first run</string>    </property>    <property name="windowIcon">     <iconset resource="../../../../data/resources/mainwindow.qrc"> -    <normaloff>:/images/leap-color-big.png</normaloff>:/images/leap-color-big.png</iconset> +    <normaloff>:/images/mask-icon.png</normaloff>:/images/mask-icon.png</iconset>    </property>    <property name="modal">     <bool>true</bool> @@ -31,7 +31,7 @@      <string>Welcome</string>     </property>     <property name="subTitle"> -    <string>This is the LEAP Client first run wizard</string> +    <string>This is the Bitmask first run wizard</string>     </property>     <attribute name="pageId">      <string notr="true">0</string> @@ -733,7 +733,7 @@      <string>Congratulations!</string>     </property>     <property name="subTitle"> -    <string>You have successfully configured the LEAP Client.</string> +    <string>You have successfully configured Bitmask.</string>     </property>     <attribute name="pageId">      <string notr="true">6</string> diff --git a/src/leap/platform_init/initializers.py b/src/leap/platform_init/initializers.py index cc5f6e87..46488250 100644 --- a/src/leap/platform_init/initializers.py +++ b/src/leap/platform_init/initializers.py @@ -84,7 +84,7 @@ def get_missing_updown_dialog():      :rtype: QtGui.QMessageBox instance      """      WE_NEED_POWERS = ("To better protect your privacy, " -                      "LEAP needs administrative privileges " +                      "Bitmask needs administrative privileges "                        "to install helper files. "                        "Do you want to proceed?")      msg = QtGui.QMessageBox() @@ -180,7 +180,7 @@ def WindowsInitializer():      if not _windows_has_tap_device():          msg = QtGui.QMessageBox()          msg.setWindowTitle(msg.tr("TAP Driver")) -        msg.setText(msg.tr("LEAPClient needs to install the necessary drivers " +        msg.setText(msg.tr("Bitmask needs to install the necessary drivers "                             "for Encrypted Internet to work. Would you like to "                             "proceed?"))          msg.setInformativeText(msg.tr("Encrypted Internet uses VPN, which " @@ -306,7 +306,7 @@ def DarwinInitializer():      if not _darwin_has_tun_kext():          msg = QtGui.QMessageBox()          msg.setWindowTitle(msg.tr("TUN Driver")) -        msg.setText(msg.tr("LEAPClient needs to install the necessary drivers " +        msg.setText(msg.tr("Bitmask needs to install the necessary drivers "                             "for Encrypted Internet to work. Would you like to "                             "proceed?"))          msg.setInformativeText(msg.tr("Encrypted Internet uses VPN, which " diff --git a/src/leap/services/eip/eipconfig.py b/src/leap/services/eip/eipconfig.py index 2f2f6e7c..d69e1fd8 100644 --- a/src/leap/services/eip/eipconfig.py +++ b/src/leap/services/eip/eipconfig.py @@ -138,25 +138,13 @@ class EIPConfig(BaseConfig):          BaseConfig.__init__(self)          self._api_version = None -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration -        """ -        leap_assert(self._api_version is not None, -                    "You should set the API version.") - -        return get_schema(self._api_version) +        Returns the schema corresponding to the version given. -    def set_api_version(self, version): +        :rtype: dict or None if the version is not supported.          """ -        Sets the supported api version. - -        :param api_version: the version of the api supported by the provider. -        :type api_version: str -        """ -        self._api_version = version -        leap_assert(get_schema(self._api_version) is not None, -                    "Version %s is not supported." % (version, )) +        return get_schema(self._api_version)      def get_clusters(self):          # TODO: create an abstraction for clusters diff --git a/src/leap/services/eip/vpnlaunchers.py b/src/leap/services/eip/vpnlaunchers.py index 526f1ba4..17950a25 100644 --- a/src/leap/services/eip/vpnlaunchers.py +++ b/src/leap/services/eip/vpnlaunchers.py @@ -352,7 +352,7 @@ class LinuxVPNLauncher(VPNLauncher):          return None      def get_vpn_command(self, eipconfig=None, providerconfig=None, -                        socket_host=None, socket_port="unix"): +                        socket_host=None, socket_port="unix", openvpn_verb=1):          """          Returns the platform dependant vpn launching command. It will          look for openvpn in the regular paths and algo in @@ -375,6 +375,9 @@ class LinuxVPNLauncher(VPNLauncher):                              socket, or port otherwise          :type socket_port: str +        :param openvpn_verb: openvpn verbosity wanted +        :type openvpn_verb: int +          :return: A VPN command ready to be launched          :rtype: list          """ @@ -404,7 +407,8 @@ class LinuxVPNLauncher(VPNLauncher):              args.append(openvpn)              openvpn = first(pkexec) -        # TODO: handle verbosity +        if openvpn_verb is not None: +            args += ['--verb', '%d' % (openvpn_verb,)]          gateway_selector = VPNGatewaySelector(eipconfig)          gateways = gateway_selector.get_gateways() @@ -516,9 +520,9 @@ class DarwinVPNLauncher(VPNLauncher):      COCOASUDO = "cocoasudo"      # XXX need the good old magic translate for these strings      # (look for magic in 0.2.0 release) -    SUDO_MSG = ("LEAP needs administrative privileges to run " +    SUDO_MSG = ("Bitmask needs administrative privileges to run "                  "Encrypted Internet.") -    INSTALL_MSG = ("\"LEAP needs administrative privileges to install " +    INSTALL_MSG = ("\"Bitmask needs administrative privileges to install "                     "missing scripts and fix permissions.\"")      INSTALL_PATH = os.path.realpath(os.getcwd() + "/../../") @@ -604,7 +608,7 @@ class DarwinVPNLauncher(VPNLauncher):          return self.COCOASUDO, args      def get_vpn_command(self, eipconfig=None, providerconfig=None, -                        socket_host=None, socket_port="unix"): +                        socket_host=None, socket_port="unix", openvpn_verb=1):          """          Returns the platform dependant vpn launching command @@ -623,6 +627,9 @@ class DarwinVPNLauncher(VPNLauncher):                              socket, or port otherwise          :type socket_port: str +        :param openvpn_verb: openvpn verbosity wanted +        :type openvpn_verb: int +          :return: A VPN command ready to be launched          :rtype: list          """ @@ -651,7 +658,8 @@ class DarwinVPNLauncher(VPNLauncher):          openvpn = first(openvpn_possibilities)          args = [openvpn] -        # TODO: handle verbosity +        if openvpn_verb is not None: +            args += ['--verb', '%d' % (openvpn_verb,)]          gateway_selector = VPNGatewaySelector(eipconfig)          gateways = gateway_selector.get_gateways() @@ -768,9 +776,10 @@ class WindowsVPNLauncher(VPNLauncher):      OPENVPN_BIN = 'openvpn_leap.exe'      # XXX UPDOWN_FILES ... we do not have updown files defined yet! +    # (and maybe we won't)      def get_vpn_command(self, eipconfig=None, providerconfig=None, -                        socket_host=None, socket_port="9876"): +                        socket_host=None, socket_port="9876", openvpn_verb=1):          """          Returns the platform dependant vpn launching command. It will          look for openvpn in the regular paths and algo in @@ -780,14 +789,20 @@ class WindowsVPNLauncher(VPNLauncher):          :param eipconfig: eip configuration object          :type eipconfig: EIPConfig +          :param providerconfig: provider specific configuration          :type providerconfig: ProviderConfig +          :param socket_host: either socket path (unix) or socket IP          :type socket_host: str +          :param socket_port: either string "unix" if it's a unix          socket, or port otherwise          :type socket_port: str +        :param openvpn_verb: the openvpn verbosity wanted +        :type openvpn_verb: int +          :return: A VPN command ready to be launched          :rtype: list          """ @@ -810,8 +825,8 @@ class WindowsVPNLauncher(VPNLauncher):          openvpn = first(openvpn_possibilities)          args = [] - -        # TODO: handle verbosity +        if openvpn_verb is not None: +            args += ['--verb', '%d' % (openvpn_verb,)]          gateway_selector = VPNGatewaySelector(eipconfig)          gateways = gateway_selector.get_gateways() diff --git a/src/leap/services/eip/vpnprocess.py b/src/leap/services/eip/vpnprocess.py index c4bdb30c..5b07a3cf 100644 --- a/src/leap/services/eip/vpnprocess.py +++ b/src/leap/services/eip/vpnprocess.py @@ -80,7 +80,9 @@ class VPN(object):      TERMINATE_MAXTRIES = 10      TERMINATE_WAIT = 1  # secs -    def __init__(self): +    OPENVPN_VERB = "openvpn_verb" + +    def __init__(self, **kwargs):          """          Instantiate empty attributes and get a copy          of a QObject containing the QSignals that we will pass along @@ -92,6 +94,8 @@ class VPN(object):          self._reactor = reactor          self._qtsigs = VPNSignals() +        self._openvpn_verb = kwargs.get(self.OPENVPN_VERB, None) +      @property      def qtsigs(self):          return self._qtsigs @@ -108,9 +112,12 @@ class VPN(object):          """          self._stop_pollers()          kwargs['qtsigs'] = self.qtsigs +        kwargs['openvpn_verb'] = self._openvpn_verb          # start the main vpn subprocess          vpnproc = VPNProcess(*args, **kwargs) +                             #qtsigs=self.qtsigs, +                             #openvpn_verb=self._openvpn_verb)          if vpnproc.get_openvpn_process():              logger.info("Another vpn process is running. Will try to stop it.") @@ -566,7 +573,12 @@ class VPNManager(object):                  # we should check that cmdline BEGINS                  # with openvpn or with our wrapper                  # (pkexec / osascript / whatever) -                if "openvpn" in ' '.join(p.cmdline): + +                # This needs more work, see #3268, but for the moment +                # we need to be able to filter out arguments in the form +                # --openvpn-foo, since otherwise we are shooting ourselves +                # in the feet. +                if any(map(lambda s: s.startswith("openvpn"), p.cmdline)):                      openvpn_process = p                      break              except psutil.error.AccessDenied: @@ -645,7 +657,7 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):      """      def __init__(self, eipconfig, providerconfig, socket_host, socket_port, -                 qtsigs): +                 qtsigs, openvpn_verb):          """          :param eipconfig: eip configuration object          :type eipconfig: EIPConfig @@ -663,6 +675,10 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):          :param qtsigs: a QObject containing the Qt signals used to notify the                         UI.          :type qtsigs: QObject + +        :param openvpn_verb: the desired level of verbosity in the +                             openvpn invocation +        :type openvpn_verb: int          """          VPNManager.__init__(self, qtsigs=qtsigs)          leap_assert_type(eipconfig, EIPConfig) @@ -682,6 +698,8 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):          self._last_status = None          self._alive = False +        self._openvpn_verb = openvpn_verb +      # processProtocol methods      def connectionMade(self): @@ -757,7 +775,8 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):              eipconfig=self._eipconfig,              providerconfig=self._providerconfig,              socket_host=self._socket_host, -            socket_port=self._socket_port) +            socket_port=self._socket_port, +            openvpn_verb=self._openvpn_verb)          return map(str, cmd)      # shutdown diff --git a/src/leap/services/mail/imap.py b/src/leap/services/mail/imap.py new file mode 100644 index 00000000..4dceb2ad --- /dev/null +++ b/src/leap/services/mail/imap.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# imap.py +# 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/>. +""" +Initialization of imap service +""" +import logging +import sys + +from leap.mail.imap.service import imap +from twisted.python import log + +logger = logging.getLogger(__name__) + + +def start_imap_service(*args, **kwargs): +    """ +    Initializes and run imap service. + +    :returns: twisted.internet.task.LoopingCall instance +    """ +    logger.debug('Launching imap service') + +    # Uncomment the next two lines to get a separate debugging log +    # TODO handle this by a separate flag. +    #log.startLogging(open('/tmp/leap-imap.log', 'w')) +    #log.startLogging(sys.stdout) + +    return imap.run_service(*args, **kwargs) diff --git a/src/leap/services/mail/smtpbootstrapper.py b/src/leap/services/mail/smtpbootstrapper.py index e8af5349..48040035 100644 --- a/src/leap/services/mail/smtpbootstrapper.py +++ b/src/leap/services/mail/smtpbootstrapper.py @@ -72,10 +72,12 @@ class SMTPBootstrapper(AbstractBootstrapper):          if self._download_if_needed and mtime:              headers['if-modified-since'] = mtime +        api_version = self._provider_config.get_api_version() +          # there is some confusion with this uri,          config_uri = "%s/%s/config/smtp-service.json" % ( -            self._provider_config.get_api_uri(), -            self._provider_config.get_api_version()) +            self._provider_config.get_api_uri(), api_version) +          logger.debug('Downloading SMTP config from: %s' % config_uri)          srp_auth = SRPAuth(self._provider_config) @@ -91,6 +93,8 @@ class SMTPBootstrapper(AbstractBootstrapper):                                  cookies=cookies)          res.raise_for_status() +        self._smtp_config.set_api_version(api_version) +          # Not modified          if res.status_code == 304:              logger.debug("SMTP definition has not been modified") diff --git a/src/leap/services/mail/smtpconfig.py b/src/leap/services/mail/smtpconfig.py index 30371005..ea0f9c37 100644 --- a/src/leap/services/mail/smtpconfig.py +++ b/src/leap/services/mail/smtpconfig.py @@ -21,7 +21,7 @@ SMTP configuration  import logging  from leap.common.config.baseconfig import BaseConfig -from leap.services.mail.smtpspec import smtp_config_spec +from leap.services.mail.smtpspec import get_schema  logger = logging.getLogger(__name__) @@ -34,11 +34,13 @@ class SMTPConfig(BaseConfig):      def __init__(self):          BaseConfig.__init__(self) -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration +        Returns the schema corresponding to the version given. + +        :rtype: dict or None if the version is not supported.          """ -        return smtp_config_spec +        return get_schema(self._api_version)      def get_hosts(self):          return self._safe_get_value("hosts") diff --git a/src/leap/services/mail/smtpspec.py b/src/leap/services/mail/smtpspec.py index 270dfb76..ff9d1bf8 100644 --- a/src/leap/services/mail/smtpspec.py +++ b/src/leap/services/mail/smtpspec.py @@ -15,7 +15,14 @@  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -smtp_config_spec = { +# Schemas dict +# To add a schema for a version you should follow the form: +# { '1': schema_v1, '2': schema_v2, ... etc } +# so for instance, to add the '2' version, you should do: +# smtp_config_spec['2'] = schema_v2 +smtp_config_spec = {} + +smtp_config_spec['1'] = {      'description': 'sample smtp service config',      'type': 'object',      'properties': { @@ -49,3 +56,15 @@ smtp_config_spec = {          }      }  } + + +def get_schema(version): +    """ +    Returns the schema corresponding to the version given. + +    :param version: the version of the schema to get. +    :type version: str +    :rtype: dict or None if the version is not supported. +    """ +    schema = smtp_config_spec.get(version, None) +    return schema diff --git a/src/leap/services/soledad/soledadbootstrapper.py b/src/leap/services/soledad/soledadbootstrapper.py index ac3243c1..c67bc004 100644 --- a/src/leap/services/soledad/soledadbootstrapper.py +++ b/src/leap/services/soledad/soledadbootstrapper.py @@ -23,6 +23,7 @@ import logging  import os  from PySide import QtCore +from u1db import errors as u1db_errors  from leap.common.check import leap_assert, leap_assert_type  from leap.common.files import get_mtime @@ -103,15 +104,18 @@ class SoledadBootstrapper(AbstractBootstrapper):              # TODO: If selected server fails, retry with another host              # (issue #3309) -            self._soledad = Soledad(uuid, -                                    self._password.encode("utf-8"), -                                    secrets_path=secrets_path, -                                    local_db_path=local_db_path, -                                    server_url=server_url, -                                    cert_file=cert_file, -                                    auth_token=srp_auth.get_token()) - -            self._soledad.sync() +            try: +                self._soledad = Soledad( +                    uuid, +                    self._password.encode("utf-8"), +                    secrets_path=secrets_path, +                    local_db_path=local_db_path, +                    server_url=server_url, +                    cert_file=cert_file, +                    auth_token=srp_auth.get_token()) +                self._soledad.sync() +            except u1db_errors.Unauthorized: +                logger.error("Error while initializing soledad.")          else:              raise Exception("No soledad server found") @@ -139,10 +143,12 @@ class SoledadBootstrapper(AbstractBootstrapper):          if self._download_if_needed and mtime:              headers['if-modified-since'] = mtime +        api_version = self._provider_config.get_api_version() +          # there is some confusion with this uri,          config_uri = "%s/%s/config/soledad-service.json" % (              self._provider_config.get_api_uri(), -            self._provider_config.get_api_version()) +            api_version)          logger.debug('Downloading soledad config from: %s' % config_uri)          srp_auth = SRPAuth(self._provider_config) @@ -158,6 +164,8 @@ class SoledadBootstrapper(AbstractBootstrapper):                                  cookies=cookies)          res.raise_for_status() +        self._soledad_config.set_api_version(api_version) +          # Not modified          if res.status_code == 304:              logger.debug("Soledad definition has not been modified") @@ -190,6 +198,14 @@ class SoledadBootstrapper(AbstractBootstrapper):          logger.debug("Retrieving key for %s" % (address,))          srp_auth = SRPAuth(self._provider_config) + +        # TODO: Fix for Windows +        gpgbin = "/usr/bin/gpg" + +        if self._standalone: +            gpgbin = os.path.join(self._provider_config.get_path_prefix(), +                                  "..", "apps", "mail", "gpg") +          self._keymanager = KeyManager(              address,              "https://nicknym.%s:6425" % (self._provider_config.get_domain(),), @@ -199,7 +215,8 @@ class SoledadBootstrapper(AbstractBootstrapper):              ca_cert_path=self._provider_config.get_ca_cert_path(),              api_uri=self._provider_config.get_api_uri(),              api_version=self._provider_config.get_api_version(), -            uid=srp_auth.get_uid()) +            uid=srp_auth.get_uid(), +            gpgbinary=gpgbin)          try:              self._keymanager.get_key(address, openpgp.OpenPGPKey,                                       private=True, fetch_remote=False) @@ -213,7 +230,8 @@ class SoledadBootstrapper(AbstractBootstrapper):                                   provider_config,                                   user,                                   password, -                                 download_if_needed=False): +                                 download_if_needed=False, +                                 standalone=False):          """          Starts the checks needed for a new soledad setup @@ -223,6 +241,13 @@ class SoledadBootstrapper(AbstractBootstrapper):          :type user: str          :param password: User's password          :type password: str +        :param download_if_needed: If True, it will only download +                                   files if the have changed since the +                                   time it was previously downloaded. +        :type download_if_needed: bool +        :param standalone: If True, it'll look for paths inside the +                           bundle (like for gpg) +        :type standalone: bool          """          leap_assert_type(provider_config, ProviderConfig) @@ -230,6 +255,7 @@ class SoledadBootstrapper(AbstractBootstrapper):          self._download_if_needed = download_if_needed          self._user = user          self._password = password +        self._standalone = standalone          cb_chain = [              (self._download_config, self.download_config), diff --git a/src/leap/services/soledad/soledadconfig.py b/src/leap/services/soledad/soledadconfig.py index 80a82d11..a2367692 100644 --- a/src/leap/services/soledad/soledadconfig.py +++ b/src/leap/services/soledad/soledadconfig.py @@ -21,7 +21,7 @@ Soledad configuration  import logging  from leap.common.config.baseconfig import BaseConfig -from leap.services.soledad.soledadspec import soledad_config_spec +from leap.services.soledad.soledadspec import get_schema  logger = logging.getLogger(__name__) @@ -34,11 +34,13 @@ class SoledadConfig(BaseConfig):      def __init__(self):          BaseConfig.__init__(self) -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration +        Returns the schema corresponding to the version given. + +        :rtype: dict or None if the version is not supported.          """ -        return soledad_config_spec +        return get_schema(self._api_version)      def get_hosts(self):          return self._safe_get_value("hosts") diff --git a/src/leap/services/soledad/soledadspec.py b/src/leap/services/soledad/soledadspec.py index 8233d6a0..111175dd 100644 --- a/src/leap/services/soledad/soledadspec.py +++ b/src/leap/services/soledad/soledadspec.py @@ -15,7 +15,14 @@  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -soledad_config_spec = { +# Schemas dict +# To add a schema for a version you should follow the form: +# { '1': schema_v1, '2': schema_v2, ... etc } +# so for instance, to add the '2' version, you should do: +# soledad_config_spec['2'] = schema_v2 +soledad_config_spec = {} + +soledad_config_spec['1'] = {      'description': 'sample soledad service config',      'type': 'object',      'properties': { @@ -55,3 +62,15 @@ soledad_config_spec = {          }      }  } + + +def get_schema(version): +    """ +    Returns the schema corresponding to the version given. + +    :param version: the version of the schema to get. +    :type version: str +    :rtype: dict or None if the version is not supported. +    """ +    schema = soledad_config_spec.get(version, None) +    return schema diff --git a/src/leap/services/tx.py b/src/leap/services/tx.py index ef08fcc6..7da1cb01 100644 --- a/src/leap/services/tx.py +++ b/src/leap/services/tx.py @@ -40,7 +40,7 @@ def leap_services():      register them.      """      logger.debug('starting leap services') -    application = Application("LEAP Client Local Services") +    application = Application("Bitmask Local Services")      #lc = LoopingCall(task)      #lc.start(5)      return application diff --git a/src/leap/util/leap_argparse.py b/src/leap/util/leap_argparse.py index bdf80401..f60c4e10 100644 --- a/src/leap/util/leap_argparse.py +++ b/src/leap/util/leap_argparse.py @@ -27,9 +27,9 @@ def build_parser():      """      epilog = "Copyright 2012 The LEAP Encryption Access Project"      parser = argparse.ArgumentParser(description=""" -Launches the LEAP Client""", epilog=epilog) +Launches Bitmask""", epilog=epilog)      parser.add_argument('-d', '--debug', action="store_true", -                        help=("Launches client in debug mode, writing debug" +                        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: @@ -45,7 +45,7 @@ Launches the LEAP Client""", epilog=epilog)                          action="store", dest="openvpn_verb",                          help='verbosity level for openvpn logs [1-6]')      parser.add_argument('-s', '--standalone', action="store_true", -                        help='Makes the client use standalone' +                        help='Makes Bitmask use standalone'                          'directories for configuration and binary'                          'searching') | 
