Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • bug/8049_reconnect
  • bug/8498_bad_provider_url
  • bug/8818_last_vpn
  • bug/8829_cli_create
  • bug/8870_profile
  • bug/8881_self_signed
  • bug/8887_json_status
  • bug/8892_encoding
  • bug/8931_unread
  • bug/8956_stop_vpn
  • bug/8957_b64
  • bug/9003_signature_mime
  • bug/9048_vpn_restart
  • bug/9056_get_configs
  • bug/9059_renew_vpn_cert
  • bug/9073_api_uri
  • bug/9137_dns_artful
  • bug/9171_stuck_bootstrap
  • bug/9201_message_id
  • bug/fix_gpg1
  • bug/helpers_firewall
  • bug/mail_status
  • bug/manholecfg
  • bug/missing_inbox
  • bug/msg_satus
  • bug/polkit_updater
  • bug/soledad_master_CI
  • bug/stop_openvpn
  • bug/tokens
  • bug/update
  • bug/vpn_shutdown
  • ci
  • docs/8775_mail_status
  • docs/keymanager-overview
  • feat/5_keymanager_uids
  • feat/6914_api_encr
  • feat/8112_check_validity_of_key_signature
  • feat/8217_renew_keys
  • feat/8435_tokens_file
  • feat/8486_fetch_smtp_cert
  • feat/8487_password_change
  • feat/8488_list_users
  • feat/8755_account_based_keymanagement
  • feat/8769_active_user
  • feat/8770_simple_status
  • feat/8777_pgpy
  • feat/8779_vpn_js
  • feat/8802_version_api
  • feat/8806_default_vpn
  • feat/8835_vpn_start
  • feat/8901_gpg1
  • feat/8972_mixing_api
  • feat/8973_add_msg
  • feat/9010_vpn_gateway
  • feat/9012_common_vpn_problems
  • feat/9023_api_fetch_key
  • feat/9074_pin
  • feat/9188_dont_persist_ip
  • feat/9289_fw_reload
  • feat/autostart
  • feat/discover_gpg
  • feat/gitlab_ci
  • feat/keymanager_status
  • feat/openvpn_tcp_management
  • feat/osx_ci
  • feat/rename_user_signup
  • feat/snap_path
  • feat/update_polkit
  • feat/vpn
  • feature/4_improve_status_report
  • fixes
  • master
  • pkg/python-deps
  • refactor/8942_vpn
  • refactor/key_extraction
  • refactor/outgoing_smtp
  • test/vext_issues
  • tests/8813_random_test
  • tests/9159_e2e
  • tst_probl
  • win
  • wip
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.10.3
  • 0.10.3rc1
  • 0.10.4
  • 0.10.5
  • 0.10.5rc1
  • 0.10.6
  • 0.10.7
  • 0.10a1
  • 0.10a2
  • 0.10a3
  • 0.10rc1
  • 0.10rc2
  • 0.10rc3
  • 0.9.3
  • 0.9.4
100 results

Target

Select target project
  • meskio/bitmask-dev
  • elijah/bitmask-dev
  • shyba/bitmask-dev
  • azul/bitmask-dev
  • kwadronaut/bitmask-dev
  • simonft/bitmask-dev
  • micah/bitmask-dev
  • moomin/bitmask-dev
  • jubobot/bitmask-dev
  • azadi/bitmask-dev
  • vishwas78/bitmask-dev
  • theo.giovanna/bitmask-dev
  • octamois/bitmask-dev
  • icydoge/bitmask-dev
  • kardan/bitmask-dev
  • mbowcutt/bitmask-dev
  • bit4bit/bitmask-dev
  • adb/bitmask-dev
  • cyberdrudge/bitmask-dev
  • finn0/bitmask-dev
  • jrabbit/bitmask-dev
21 results
Select Git revision
  • bug/8049_reconnect
  • bug/8498_bad_provider_url
  • bug/8818_last_vpn
  • bug/8829_cli_create
  • bug/8870_profile
  • bug/8881_self_signed
  • bug/8887_json_status
  • bug/8892_encoding
  • bug/8931_unread
  • bug/8956_stop_vpn
  • bug/8957_b64
  • bug/9003_signature_mime
  • bug/9048_vpn_restart
  • bug/9056_get_configs
  • bug/9059_renew_vpn_cert
  • bug/9073_api_uri
  • bug/9137_dns_artful
  • bug/9171_stuck_bootstrap
  • bug/9201_message_id
  • bug/fix_gpg1
  • bug/helpers_firewall
  • bug/mail_status
  • bug/manholecfg
  • bug/missing_inbox
  • bug/msg_satus
  • bug/polkit_updater
  • bug/soledad_master_CI
  • bug/stop_openvpn
  • bug/tokens
  • bug/update
  • bug/vpn_shutdown
  • ci
  • docs/8775_mail_status
  • docs/keymanager-overview
  • feat/5_keymanager_uids
  • feat/6914_api_encr
  • feat/8112_check_validity_of_key_signature
  • feat/8217_renew_keys
  • feat/8435_tokens_file
  • feat/8486_fetch_smtp_cert
  • feat/8487_password_change
  • feat/8488_list_users
  • feat/8755_account_based_keymanagement
  • feat/8769_active_user
  • feat/8770_simple_status
  • feat/8777_pgpy
  • feat/8779_vpn_js
  • feat/8802_version_api
  • feat/8806_default_vpn
  • feat/8835_vpn_start
  • feat/8901_gpg1
  • feat/8972_mixing_api
  • feat/8973_add_msg
  • feat/9010_vpn_gateway
  • feat/9012_common_vpn_problems
  • feat/9023_api_fetch_key
  • feat/9074_pin
  • feat/9188_dont_persist_ip
  • feat/9289_fw_reload
  • feat/autostart
  • feat/discover_gpg
  • feat/gitlab_ci
  • feat/keymanager_status
  • feat/openvpn_tcp_management
  • feat/osx_ci
  • feat/rename_user_signup
  • feat/snap_path
  • feat/update_polkit
  • feat/vpn
  • feature/4_improve_status_report
  • fixes
  • master
  • pkg/python-deps
  • refactor/8942_vpn
  • refactor/key_extraction
  • refactor/outgoing_smtp
  • test/vext_issues
  • tests/8813_random_test
  • tests/9159_e2e
  • tst_probl
  • win
  • wip
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.10.3
  • 0.10.3rc1
  • 0.10.4
  • 0.10.5
  • 0.10.5rc1
  • 0.10.6
  • 0.10.7
  • 0.10a1
  • 0.10a2
  • 0.10a3
  • 0.10rc1
  • 0.10rc2
  • 0.10rc3
  • 0.9.3
  • 0.9.4
100 results
Show changes

Commits on Source 1016

916 additional commits have been omitted to prevent performance issues.
Showing with 1417 additions and 88 deletions
...@@ -25,9 +25,11 @@ docs/cov_html/ ...@@ -25,9 +25,11 @@ docs/cov_html/
.cache .cache
coverage.xml coverage.xml
*,cover *,cover
_trial_temp
# Sphinx documentation # Sphinx documentation
docs/_build/ docs/_build/
docs/_static
# virtualenv # virtualenv
.venv/ .venv/
...@@ -35,10 +37,22 @@ venv/ ...@@ -35,10 +37,22 @@ venv/
ENV/ ENV/
# Javascript, web-ui # Javascript, web-ui
www/node_modules ui/node_modules
www/public ui/npm-debug.log
www/npm-debug.log ui/pydist/leap/bitmask_js
www/leap/bitmask_www/public/
# vim # vim
*.swp *.swp
# PyInstaller
pkg/pyinst/dist/
pkg/pyinst/build/
pkg/launcher/bitmask
NOTES
# logs and screenshots from failed functional tests
/failures/
# temporary home folders for functional tests
/tmp/
---
stages:
- test
- publish
variables:
DOCKER_DRIVER: overlay
# Cache gems in between stages for this pipeline only
cache:
paths:
- .tox/py27-dev
linux_test:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: test
script:
# In this first job, recreate the tox venv from scratch
# on start of every pipeline
- dpkg -l tox > /dev/null || apt-get -y --no-install-recommends install tox
- tox --recreate -e py27-dev
tags:
- linux
osx_test:
stage: test
allow_failure: true
script:
- ls -la /usr/bin/gpg
- /usr/local/bin/tox --recreate -e py27-dev
tags:
- yosemite
- osx
bitmask_latest_bundle:
image: 0xacab.org:4567/leap/docker/bitmask-bundler:latest
stage: publish
script:
- pkg/build_bundle_with_venv.sh
- mv "dist/bitmask-`cat pkg/next-version`" .
artifacts:
paths:
- "bitmask-`cat pkg/next-version`"
name: "Bitmask_linux64_latest_${CI_BUILD_REF}"
expire_in: 1 month
tags:
- linux
e2e_test_mail:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: test
script:
- dpkg -l tox gnupg1 haveged > /dev/null || apt-get -y --no-install-recommends install tox gnupg1 haveged
- tox -e py27-dev --notest
- source .tox/py27-dev/bin/activate
- make dev-latest-backend
- mkdir -p /root/.config/leap/
- make install_helpers
- make test_e2e_mail
tags:
- linux
e2e_test_vpn:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: test
script:
- dpkg -l tox gnupg1 haveged > /dev/null || apt-get -y --no-install-recommends install tox gnupg1 haveged
- tox -e py27-dev --notest
- source .tox/py27-dev/bin/activate
- make dev-latest-backend
- mkdir -p /root/.config/leap/
- make install_helpers
- make test_e2e_vpn
tags:
- linux
e2e_test_conditional_downloads:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: test
allow_failure: true
script:
- dpkg -l tox gnupg1 haveged > /dev/null || apt-get -y --no-install-recommends install tox gnupg1 haveged
- tox -e py27-dev --notest
- source .tox/py27-dev/bin/activate
- make dev-latest-backend
- mkdir -p /root/.config/leap/
- make install_helpers
- make test_e2e_conditional_downloads
tags:
- linux
functional_tests:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: test
before_script:
- dpkg -l tox > /dev/null || apt-get -y --no-install-recommends install tox
- tox -e py27-dev --notest
- source .tox/py27-dev/bin/activate
- make dev-latest-all
- make test_functional_setup
script:
- make test_functional
artifacts:
when: on_failure
paths:
- failures
name: "Bitmask_linux64_${CI_BUILD_REF}_e2e_screenshots"
expire_in: 1 month
tags:
- linux
# This is Work In Progress
#functional_test_bundle:
# image: 0xacab.org:4567/leap/bitmask-dev:latest
# stage: test_bundle
# allow_failure: true
# script:
# - TEST_MODE='bundle_ci' make test_functional
# artifacts:
# when: on_failure
# paths:
# - failures
# name: "Bitmask_linux64_${CI_BUILD_REF}_e2e_screenshots"
# expire_in: 1 month
# tags:
# - linux
build_ui:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: test
script:
- cd ui && make dev-build
tags:
- linux
cache:
paths:
- ui/node_modules/
build_docker_image:
image: 0xacab.org:4567/leap/bitmask-dev:latest
stage: publish
services:
- docker:dind
tags:
- docker-in-docker
only:
- branches@leap/bitmask-dev
before_script:
- >
export LAST_COMMIT=$(curl -s --header "PRIVATE-TOKEN: ${LEAP_CODE_O_MATIC_PRIVATE_TOKEN}" https://0xacab.org/api/v4/projects/574/pipelines |
python -c "import sys, json; print json.load(sys.stdin)[1]['sha']")
script:
- >
if git diff $LAST_COMMIT HEAD --name-only | egrep '(tests/docker|.gitlab)' || [ "$CI_JOB_MANUAL" == "true" ] ; then
if [ "$CI_COMMIT_REF_SLUG" == "master" ]
then
TAG='latest'
else
TAG="$CI_COMMIT_REF_SLUG"
fi
docker --version
docker info
docker login -u gitlab-ci-token -e sysdev@leap.se -p $CI_JOB_TOKEN $CI_REGISTRY
docker build -t ${CI_REGISTRY_IMAGE}:${TAG} tests/docker
docker push ${CI_REGISTRY_IMAGE}:${TAG}
fi
build_docker_bundle_image:
image: 0xacab.org:4567/leap/docker/bitmask-bundler:latest
stage: publish
services:
- docker:dind
tags:
- docker-in-docker
only:
- branches@leap/bitmask-dev
before_script:
- >
export LAST_COMMIT=$(curl -s --header "PRIVATE-TOKEN: ${LEAP_CODE_O_MATIC_PRIVATE_TOKEN}" https://0xacab.org/api/v4/projects/574/pipelines |
python -c "import sys, json; print json.load(sys.stdin)[1]['sha']")
script:
- >
if git diff $LAST_COMMIT HEAD --name-only | egrep '(pkg/docker_bundle|.gitlab)' || [ "$CI_JOB_MANUAL" == "true" ] ; then
if [ "$CI_COMMIT_REF_SLUG" == "master" ]
then
TAG='latest'
else
TAG="$CI_COMMIT_REF_SLUG"
fi
docker --version
docker info
docker login -u gitlab-ci-token -e sysdev@leap.se -p $CI_JOB_TOKEN $CI_REGISTRY
docker build -t ${CI_REGISTRY_IMAGE}:${TAG} pkg/docker_bundle
docker push ${CI_REGISTRY_IMAGE}:${TAG}
fi
.job_template: &job_definition
stage: publish
# Only build packages for https://0xacab.org/leap/bitmask-dev, not
# for forks
only:
- master@leap/bitmask-dev
- tags@leap/bitmask-dev
image: "0xacab.org:4567/leap/gitlab-buildpackage:build_${DIST}_${ARCH}"
script:
- "pwd; git describe"
- build-build-package
# Test the package with lintian
- build-test-lintian
- upload-package
# sleep 1h to allow debugging of running container
#- sleep 3600
artifacts:
expire_in: 1w
paths:
- '*_*.xz'
- '*_*.dsc'
- '*_amd64.changes'
- '*.deb'
- 'results/*'
package:amd64_stretch:
variables:
ARCH: "amd64"
DIST: "stretch"
REPONAMES: "client"
# Default is to fail on warnings, we disable it here
# unless all lintian warnings are fixed (#9033)
LINTIAN_OPTS: "-X filename-length, --suppress-tags newer-standards-version"
<<: *job_definition
package:amd64_buster:
variables:
ARCH: "amd64"
DIST: "buster"
REPONAMES: "client"
# Default is to fail on warnings, we disable it here
# unless all lintian warnings are fixed (#9033)
LINTIAN_OPTS: "-X filename-length"
<<: *job_definition
package:amd64_sid:
variables:
ARCH: "amd64"
DIST: "sid"
REPONAMES: "client"
# Default is to fail on warnings, we disable it here
# unless all lintian warnings are fixed (#9033)
LINTIAN_OPTS: "-X filename-length, --suppress-tags newer-standards-version"
<<: *job_definition
package:amd64_artful:
variables:
ARCH: "amd64"
DIST: "artful"
REPONAMES: "client"
# Default is to fail on warnings, we disable it here
# unless all lintian warnings are fixed (#9033)
LINTIAN_OPTS: "-X filename-length, --suppress-tags newer-standards-version"
<<: *job_definition
---
os: osx
# Xcode 6.4, OS X 10.10
osx_image: xcode6.4
# language: python is not supported on OSX
# see https://github.com/travis-ci/travis-ci/issues/2312
language: generic
before_install:
- brew update
- brew install python
# Only if we need a newer version of openssl (1.0.2l instead of 1.0.2a-1)
# - brew upgrade OpenSSL
- pip2 install virtualenv
# https://stackoverflow.com/questions/36555679/fatal-error-in-building-sqlcipher-openssl-rand-h-file-not-found
- brew link openssl --force --overwrite
- virtualenv env -p python2.7
- source env/bin/activate
- pip2 install tox
script: tox --recreate -e py27-dev
Tomás Touceda <chiiph@leap.se>
Ivan Alejandro <ivanalejandro0@gmail.com>
Kali Kaneko <kali@leap.se>
drebs <drebs@leap.se>
antialias <antialias@leap.se>
elijah <elijah@riseup.net>
Ruben Pollan <meskio@sindominio.net>
k clair <kclair@riseup.net>
Jaromil <jaromil@dyne.org>
kwadronaut <kwadronaut@leap.se>
Duda Dornelles <ddornell@thoughtworks.com>
Bruno Wagner Goncalves <bwagner@thoughtworks.com>
Parménides GV <parmegv@sdf.org>
Neissi Lima <neissi.lima@gmail.com>
Micah Anderson <micah@riseup.net>
irregulator <irregulator@riseup.net>
...@@ -672,39 +672,3 @@ may consider it more useful to permit linking proprietary applications with ...@@ -672,39 +672,3 @@ may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>. <http://www.gnu.org/philosophy/why-not-lgpl.html>.
--------------------------------------------------------------------------------
We are "embedding" PastebinAPI class since currently the installation through
pip does not work.
file: src/leap/bitmask/util/pastebin.py
License: GPL
Author: Ian Havelock
website: https://github.com/Morrolan/PastebinAPI
--------------------------------------------------------------------------------
Bitmask also uses third party icons:
---
data/images/Arrow-Up-32.png
data/images/Arrow-Down-32.png
Author: Liam McKay
License: GNU General Public License - http://en.wikipedia.org/wiki/GNU_General_Public_License
WebSite: http://wefunction.com/
IconPackage: WooFunction icon pack - http://www.iconspedia.com/pack/woofunction-icons-4136/
---
data/images/oxygen-icons/
The following icons were created based on 'mail-unread.png' from oxygen:
data/images/mail-locked.png
data/images/mail-unlocked.png
License: LGPL - http://www.gnu.org/licenses/lgpl.html
Website: http://www.oxygen-icons.org/
--
data/images/pastebin.png
author: Marco Martin
License: LGPL
website: https://www.iconfinder.com/icons/7897/binary_icon
include versioneer.py include versioneer.py
include src/leap/bitmask/_version.py include src/leap/bitmask/_version.py
include src/leap/bitmask/core/bitmaskd.tac
include *.bin
clean: DIST=dist/bitmask
find . -type f -name "*.py[co]" -delete NEXT_VERSION = $(shell cat pkg/next-version)
find . -type d -name "__pycache__" -delete DIST_VERSION = $(DIST)-$(NEXT_VERSION)/
HEADLESS_DIST=dist/bitmask-nox
HEADLESS_DIST_VERSION = $(HEADLESS_DIST)-$(NEXT_VERSION)/
ANONVPN_DIST=dist/anonvpn
ANONVPN_DIST_VERSION = $(ANONVPN_DIST)-$(NEXT_VERSION)/
BITMASK_ROOT = src/leap/bitmask/vpn/helpers/linux/bitmask-root
POLKIT_POLICY = src/leap/bitmask/vpn/helpers/linux/se.leap.bitmask.policy
SUDO = /usr/bin/sudo
include pkg/bundles/build.mk
include pkg/thirdparty/openvpn/build.mk
dev-bootstrap:
pkg/tools/bitmask-bootstrap.sh
dev-mail: dev-mail:
pip install -e '.[mail]' pip install -U -e '.[mail]'
pip install -e www
dev-gui: install_pixelated
pip install -U -e '.[gui]'
dev-backend:
pip install -U -e '.[backend]'
dev-all: dev-all: install_pixelated
pip install -e '.[all]' pip install -I --install-option="--bundled" pysqlcipher
pip install -U -e '.[all]'
dev-latest-leap:
pip install -U -e 'git+https://0xacab.org/leap/leap_pycommon@master#egg=leap.common'
pip install -U -e 'git+https://0xacab.org/leap/soledad@master#egg=leap.soledad'
dev-latest-backend: dev-backend dev-latest-leap
dev-latest-all: dev-all dev-latest-leap
upgrade-all:
python pkg/tools/upgrade_all.py
uninstall: uninstall:
pip uninstall leap.bitmask pip uninstall leap.bitmask
test:
tox
test_e2e_mail: install_helpers
tests/e2e/e2e-test-mail.sh
test_e2e_vpn: install_helpers
tests/e2e/e2e-test-vpn.sh
test_e2e_conditional_downloads: install_helpers
tests/e2e/conditional_downloads.py
test_functional_setup:
pip install -U behave selenium
test_functional: install_helpers
test -f /usr/bin/lxpolkit && lxpolkit &
xvfb-run --server-args="-screen 0 1280x1024x24" behave --tags ~@wip --tags @smoke tests/functional/features -k --no-capture -D host=localhost
test_functional_graphical:
behave --tags ~@wip --tags @smoke tests/functional/features -k --no-capture -D host=localhost
test_functional_graphical_wip:
behave --tags @wip tests/functional/features -k --no-capture -D host=localhost
install_helpers:
# if there's no sudo, assumming this is running as root by the CI
test -f $(SUDO) && sudo cp $(BITMASK_ROOT) /usr/local/sbin/ || cp $(BITMASK_ROOT) /usr/local/sbin/
test -f $(SUDO) && sudo cp $(POLKIT_POLICY) /usr/share/polkit-1/actions/se.bitmask.bundle.policy || cp $(POLKIT_POLICY) /usr/share/polkit-1/actions/se.bitmask.bundle.policy
install_pixelated:
pip install leap.pixelated leap.pixelated-www
qt-resources:
pyrcc5 pkg/branding/icons.qrc -o src/leap/bitmask/gui/app_rc.py
doc:
cd docs && make html
bundle_in_virtualenv:
pkg/build_bundle_with_venv.sh
bundle_in_virtualenv_osx:
pkg/build_osx_bundle_with_venv.sh
package_in_docker:
# needs docker_ce and gitlab-runner from upstream
gitlab-runner exec docker package:amd64_stretch
bundler_image:
cd pkg/docker_bundler && make bundler
bundle_in_docker:
# needs a docker container called 'bitmask-bundler-apt', created with 'make bundler_image'
# XXX why was it needed to specify -u `id -u` again? if it's something with gilab CI we might need
# to chown it first.
cat pkg/bundle_from_docker | docker run -i -v /srv/bitmask-builds:/dist -w /dist -e REPO="$(REPO)" -e BRANCH="$(BRANCH)" bitmask-bundler-apt bash
bundle_riseupvpn:
# needs a docker container called 'bitmask-bundler-apt', created with 'make bundler_image'
# XXX why was it needed to specify -u `id -u` again? if it's something with gilab CI we might need
# to chown it first.
cat pkg/bundle_riseupvpn_from_docker | docker run -i -v /srv/bitmask-builds:/dist -w /dist -e REPO="$(REPO)" -e BRANCH="$(BRANCH)" bitmask-bundler-apt bash
bundle_in_docker_virtualenv:
# this runs bundles inside a virtualenv. it is kind of slow because it compiles all python extensions in dependencies each time.
cat pkg/bundle_from_docker_venv | docker run -i -v ~/leap/bitmask-dev:/dist -w /dist -u `id -u` -e REPO="$(REPO)" -e BRANCH="$(BRANCH)" bitmask-bundler-venv bash
mkdir -p dist/
cp -r bitmaskbuild/$(DIST_VERSION) dist/
rm -rf bitmaskbuild
upload:
python setup.py sdist bdist_wheel --universal upload --sign -i kali@leap.se -r pypi
clean:
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
Ticket numbers in this file can be looked up by visiting
http://0xacab.org/leap/bitmask-dev/issues/<number>
Bitmask 0.10.0
==============
Features
--------
Bugfixes
--------
Documentation
-------------
Other
-----
Bitmask Bitmask
=========== ===========================================================
*Your internet encryption toolkit* *Your internet encryption toolkit*
.. image:: https://badge.fury.io/py/leap.bitmask.svg .. image:: https://badge.fury.io/py/leap.bitmask.svg
:target: http://badge.fury.io/py/leap.bitmask :target: http://badge.fury.io/py/leap.bitmask
.. image:: https://0xacab.org/leap/bitmask-dev/badges/master/build.svg
:target: https://0xacab.org/leap/bitmask-dev/pipelines
.. image:: https://readthedocs.org/projects/bitmask/badge/?version=latest
:target: http://bitmask.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status
.. image:: https://img.shields.io/badge/IRC-leap-blue.svg .. image:: https://img.shields.io/badge/IRC-leap-blue.svg
:target: http://webchat.freenode.net/?channels=%23leap&uio=d4 :target: http://webchat.freenode.net/?channels=%23leap&uio=d4
:alt: IRC :alt: IRC
...@@ -19,67 +24,124 @@ also used as a set of libraries to communicate with the different services from ...@@ -19,67 +24,124 @@ also used as a set of libraries to communicate with the different services from
third party applications. third party applications.
It is written in python using `Twisted`_ and licensed under the `GPL3`_. The It is written in python using `Twisted`_ and licensed under the `GPL3`_. The
Graphical User Interface is written in html+js and uses `PyQt5`_ for serving the Graphical User Interface is written in html+js and uses `PyQt5`_ for serving
application. the application.
.. _`the LEAP Platform`: https://github.com/leapcode/leap_platform .. _`the LEAP Platform`: https://github.com/leapcode/leap_platform
.. _`Twisted`: https://twistedmatrix.com .. _`Twisted`: https://twistedmatrix.com
.. _`PyQt5`: https://pypi.python.org/pypi/PyQt5 .. _`PyQt5`: https://pypi.python.org/pypi/PyQt5
.. _`GPL3`: http://www.gnu.org/licenses/gpl.txt .. _`GPL3`: http://www.gnu.org/licenses/gpl.txt
Package under development!
-----------------------------------------------------------
The previous client using PySide has been deprecated (Bitmask version 0.9.2,
still available at the http://github.com/leapcode/bitmask_client repo).
Read the Docs! Read the Docs!
------------------ -----------------------------------------------------------
The latest documentation is available at `LEAP`_. There is documentation about Bitmask `for users`_ and `for developers`_. For
developers, be sure to read the sections on `hacking`_ and `contributing_`.
Testers should read the section on `testing and QA`_.
.. _`LEAP`: https://leap.se/en/docs/client .. _`for users`: https://leap.se/en/docs/client
.. _`for developers`: https://bitmask.readthedocs.io
.. _`hacking`: https://bitmask.readthedocs.io/en/latest/hacking/index.html
.. _`contributing`: https://bitmask.readthedocs.io/en/latest/hacking/contributing.html#contributing
.. _`testing and QA`: https://bitmask.readthedocs.io/en/latest/testing/index.html
Bugs Bugs
==== ===========================================================
Please report any bugs `in our bug tracker`_. Please report any bugs `in our bug tracker`_.
.. _`in our bug tracker`: https://leap.se/code/projects/report-issues .. _`in our bug tracker`: https://0xacab.org/leap/bitmask-dev/issues/
Logs
----
If you want to watch the logs, from the command line::
bitmaskctl logs watch
The paste command can be handy to do bug reports (needs ``pastebinit`` installed
in the system)::
bitmaskctl logs send
but do not upload anything that you do not want to make public ;)
Development Development
============== ===========================================================
Tests Running Tests
----- -----------------------------------------------------------
You need tox to run the tests. If you don't have it in your system yet:: You need tox to run the tests. If you don't have it in your system yet::
pip install tox pip install tox
And then run all the tests:: And then run all the python tests::
tox tox
If you are developing against a non-published branch of ``leap.common`` or There are some minimal end-to-end tests::
``leap.soledad``, run instead::
make test_e2e
tox -e py27-dev For testing the UI (aka ``bitmask-js``) you need to have ``mocha``
installed. You can run ui tests like this::
cd ui && make test
More info abou testing can be found in the ``docs/hacking/testing`` document.
This expects ``leap_common`` and ``soledad`` repos to be checked out in the
parent folder.
Hacking Hacking
------- -----------------------------------------------------------
In order to run bitmask in a development environment, you must activate a
`virtualenv`_ and install the various leap-related python packages using ``pip
install -e``. This installs them as links to the source code, so
that your code changes are immediately reflected in the packages imported from
within the virtualenv.
The various ``make dev-*`` commands will run the appropriate ``pip install``
commands for you.
If you want to setup your whole development environment in a single step, and
you are running a debian-based system, you can use::
make dev-bootstrap
That should install all the system dependencies, create a virtualenv for you,
and drop you in a shell inside that virtualenv. In the future, you can enter this
`virtualenv`_ again by using `pew`_::
pew workon bitmask
To upgrade regularly the python dependencies installed inside your virtualenv,
you can run::
If you want to develop for the encrypted mail service, execute inside your virtualenv:: make upgrade-all
make dev-mail inside your virtualenv, and it will install any new version of your
dependencies that is found in `pypi`_.
If you want to develop for the gui client too, you have to have installed the Check out the ``docs/hacking`` page for more extense instructions `to get
python2 bindings for Qt5 in your system (in debian: ``apt install python-pyqt5 you started`_.
python-pyqt5.qtwebkit``). After ensuring this, you can do::
make dev-all .. _`to get you started`: https://bitmask.readthedocs.io/en/latest/hacking/
.. _`pew`: https://pypi.python.org/pypi/pew
.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
.. _`pypi`: https://pypi.python.org
License License
======= ===========================================================
.. image:: https://raw.github.com/leapcode/bitmask_client/develop/docs/user/gpl.png .. image:: https://raw.github.com/leapcode/bitmask_client/develop/docs/user/gpl.png
......
# This makefile is currently intended to make it easy to generate the
# benchmarking graphs.
RESULTS_FILE = tests/results.json
GRAPH_PREFIX = benchmark
GRAPH_FILE = $(GRAPH_PREFIX)-test_gpg_init.svg
all: $(GRAPH_FILE)
#
# rules for generating one graph with the results of all speed tests
#
$(RESULTS_FILE):
tox -v test_gpg_speed.py -- -v --pdb -s \
--benchmark-max-time=2.0 \
--benchmark-json=$(subst tests/,,$@)
$(GRAPH_FILE): $(RESULTS_FILE)
py.test-benchmark compare $< --histogram $(GRAPH_PREFIX)
#
# rule for generating one graph for each graph
#
test:
tox -v test_gpg_speed.py -- -v --pdb -s \
--benchmark-histogram=gpg_speed \
--benchmark-storage=./graphs/ \
--benchmark-save=keymanager_gpg_speed \
clean:
rm -f $(RESULTS_FILE) $(GRAPH_PREFIX)*.svg
.PHONY: all test graph
- tune test params (max time, number of iterations, etc)
ADDRESS = 'leap@leap.se'
ADDRESS_2 = 'anotheruser@leap.se'
KEY_FINGERPRINT = "E36E738D69173C13D709E44F2F455E2824D18DDF"
CIPHERTEXT = """
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1
hQIMAyj9aG/xtZOwAQ/+OtgYlCULNaCqSnzDIAIO5Swsg7fLFIErSWF/4ngkNxPk
GqL3/2/HvlLY6blsmn5RU2AK4vo5Dc5s2lQU3PwqsaVKNoqkn1G9bMqsoIQhP4vW
M6c+KdxtA8cQggENpx0kF8FXdvV+GclChfK38TDJUrJLnksfo+UP9rI2BsIpHpiS
sfikVLuUc83+2hTozuTOVARNG7x58hhnR7wPtbgm/6AwVNvU0SQDEDJXi43MFRbP
9VboUHIRZLbeIwlxFHj3umh4f8rca4jSwiWxDna2YRAFBZrFiyiGAnISZQc9Nh4d
jLqa7rMeLSfTigkOXVYdVjEgx/wsbsDjgJ2f6TUrfP6RWen3/4223ctfeL2x4r2V
6ej2cbbR61qQx2FR4HV4XRaSg3tV+Ytz0dklrvcL0PQVdSsJhDmRV4pNgLSt0/bA
E6F2hk/S3sjnXZRMvXNb3SRQk2R0Svn4j/8ft/8VC+h5jkHO2G5K3DbAHkS2MPJm
bLwx4LMPohZstS75OFKZv63nzdOYIz5gPSy9A4IC1VHqM4d3T99cqY8XOJOqRkr5
TCYOxOHF4z6N2nRkzVXoDoTfC6+qx9bWuvGhoj5WjFG1I19e+L1IVVvpYKo6LAOa
7Dn+IXe3XnCGGHn3AusJgyeqt/3Z5HgzsSPMKIh2WfUKERZZ+vrxTXIf4Ko+2tbS
aQEpuiQUr9zE4z8eT+brGJNl5mx9c1qYCSPjGIGUCt8fTOKruMEkWBQHMln05qpF
nFMYk7JXtYaArGrC1QPRVHOvgUTB6Vx7KVHikzsEXGLF6ywBnZYzeh8ah/FtxHG9
o+vTTcScQkxVcw==
=qYFS
-----END PGP MESSAGE-----
"""
SIGNEDTEXT = """
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1
owHtwYszEwAcAOBtbMxrxOWRhp2aIq/Ligubt2Ynbh45c6Sb6mZbmeFY18qi7lY4
VHMlXENey2M9PCKvW5FHpesKXSycavNcxOr/6H7fV2Ssg0Ah3YKTnBwnxLPIJqLd
GSyXlXKe7crL5sU1I6j2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAf+AGylYXgUQh
MGhUXDOCijDAmroFJzk5TohnsZm4v7GUm3nKlmm81iD29kxTiej+o721Di7tHisO
RQNzteoFD7aa5r8tfnUnptG7YHjV10I7mKLYnuDFCJJxrPxmUo7v0haOsKS4GqYe
snts8+eyUaU/rjVh/Z5ygNnEovajBQGWeYnTpLcc6fsF7a7TmNzQndW3FjKnUitb
P0lGTGQ1kfV0RdakLsOYpNAU8qNWZTYSVcimX9kHhlliY8WQXUMEVn9/GMEkXPV5
5GLQiuVAYXqQ9YPXmJ64UYOds8Nzxpe62vu2enMwSLQ3Odo8p1CJiBqjOAtSnegs
2sM1T1odsnqFk3zUiO2bwRfqdS40qNjX5vkbZBceiXM9mRedWaXRHE6L9PMpDnhK
iTY5Hag99XXq25v1Y0gmt2aPWnXrOyNUKuo9UrrzrlhhvxyJo3Xhmi70SbKJ83KZ
F+rkogA/nM/8GKWT4VkQLw/16KKmM8q8pjpGB3UtDsV3L1df6UnlL5LN+lOFL0QO
AZQDXE3aL8fy8B9aeri4CJmLrxvElwhH3Ad2Kp6XykVZnc8wT1q39OTFS8tfXsb8
lKyZcmy47m2x5TKf+LpAqxKNraHf+CS+xiS7Et0gvbtrNSNN26ffprRdtWZFdByX
H0SiTbvNExzL8zhEXo/QldiyWT+e6GwpOadPGL9xIpe8Uc0k/A6uonvy8f8A
=wZ2N
-----END PGP MESSAGE-----
"""
PUBLIC_KEY = """
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
mQINBFC9+dkBEADNRfwV23TWEoGc/x0wWH1P7PlXt8MnC2Z1kKaKKmfnglVrpOiz
iLWoiU58sfZ0L5vHkzXHXCBf6Eiy/EtUIvdiWAn+yASJ1mk5jZTBKO/WMAHD8wTO
zpMsFmWyg3xc4DkmFa9KQ5EVU0o/nqPeyQxNMQN7px5pPwrJtJFmPxnxm+aDkPYx
irDmz/4DeDNqXliazGJKw7efqBdlwTHkl9Akw2gwy178pmsKwHHEMOBOFFvX61AT
huKqHYmlCGSliwbrJppTG7jc1/ls3itrK+CWTg4txREkSpEVmfcASvw/ZqLbjgfs
d/INMwXnR9U81O8+7LT6yw/ca4ppcFoJD7/XJbkRiML6+bJ4Dakiy6i727BzV17g
wI1zqNvm5rAhtALKfACha6YO43aJzairO4II1wxVHvRDHZn2IuKDDephQ3Ii7/vb
hUOf6XCSmchkAcpKXUOvbxm1yfB1LRa64mMc2RcZxf4mW7KQkulBsdV5QG2276lv
U2UUy2IutXcGP5nXC+f6sJJGJeEToKJ57yiO/VWJFjKN8SvP+7AYsQSqINUuEf6H
T5gCPCraGMkTUTPXrREvu7NOohU78q6zZNaL3GW8ai7eSeANSuQ8Vzffx7Wd8Y7i
Pw9sYj0SMFs1UgjbuL6pO5ueHh+qyumbtAq2K0Bci0kqOcU4E9fNtdiovQARAQAB
tBxMZWFwIFRlc3QgS2V5IDxsZWFwQGxlYXAuc2U+iQI3BBMBCAAhBQJQvfnZAhsD
BQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEC9FXigk0Y3fT7EQAKH3IuRniOpb
T/DDIgwwjz3oxB/W0DDMyPXowlhSOuM0rgGfntBpBb3boezEXwL86NPQxNGGruF5
hkmecSiuPSvOmQlqlS95NGQp6hNG0YaKColh+Q5NTspFXCAkFch9oqUje0LdxfSP
QfV9UpeEvGyPmk1I9EJV/YDmZ4+Djge1d7qhVZInz4Rx1NrSyF/Tc2EC0VpjQFsU
Y9Kb2YBBR7ivG6DBc8ty0jJXi7B4WjkFcUEJviQpMF2dCLdonCehYs1PqsN1N7j+
eFjQd+hqVMJgYuSGKjvuAEfClM6MQw7+FmFwMyLgK/Ew/DttHEDCri77SPSkOGSI
txCzhTg6798f6mJr7WcXmHX1w1Vcib5FfZ8vTDFVhz/XgAgArdhPo9V6/1dgSSiB
KPQ/spsco6u5imdOhckERE0lnAYvVT6KE81TKuhF/b23u7x+Wdew6kK0EQhYA7wy
7LmlaNXc7rMBQJ9Z60CJ4JDtatBWZ0kNrt2VfdDHVdqBTOpl0CraNUjWE5YMDasr
K2dF5IX8D3uuYtpZnxqg0KzyLg0tzL0tvOL1C2iudgZUISZNPKbS0z0v+afuAAnx
2pTC3uezbh2Jt8SWTLhll4i0P4Ps5kZ6HQUO56O+/Z1cWovX+mQekYFmERySDR9n
3k1uAwLilJmRmepGmvYbB8HloV8HqwgguQINBFC9+dkBEAC0I/xn1uborMgDvBtf
H0sEhwnXBC849/32zic6udB6/3Efk9nzbSpL3FSOuXITZsZgCHPkKarnoQ2ztMcS
sh1ke1C5gQGms75UVmM/nS+2YI4vY8OX/GC/on2vUyncqdH+bR6xH5hx4NbWpfTs
iQHmz5C6zzS/kuabGdZyKRaZHt23WQ7JX/4zpjqbC99DjHcP9BSk7tJ8wI4bkMYD
uFVQdT9O6HwyKGYwUU4sAQRAj7XCTGvVbT0dpgJwH4RmrEtJoHAx4Whg8mJ710E0
GCmzf2jqkNuOw76ivgk27Kge+Hw00jmJjQhHY0yVbiaoJwcRrPKzaSjEVNgrpgP3
lXPRGQArgESsIOTeVVHQ8fhK2YtTeCY9rIiO+L0OX2xo9HK7hfHZZWL6rqymXdyS
fhzh/f6IPyHFWnvj7Brl7DR8heMikygcJqv+ed2yx7iLyCUJ10g12I48+aEj1aLe
dP7lna32iY8/Z0SHQLNH6PXO9SlPcq2aFUgKqE75A/0FMk7CunzU1OWr2ZtTLNO1
WT/13LfOhhuEq9jTyTosn0WxBjJKq18lnhzCXlaw6EAtbA7CUwsD3CTPR56aAXFK
3I7KXOVAqggrvMe5Tpdg5drfYpI8hZovL5aAgb+7Y5ta10TcJdUhS5K3kFAWe/td
U0cmWUMDP1UMSQ5Jg6JIQVWhSwARAQABiQIfBBgBCAAJBQJQvfnZAhsMAAoJEC9F
Xigk0Y3fRwsP/i0ElYCyxeLpWJTwo1iCLkMKz2yX1lFVa9nT1BVTPOQwr/IAc5OX
NdtbJ14fUsKL5pWgW8OmrXtwZm1y4euI1RPWWubG01ouzwnGzv26UcuHeqC5orZj
cOnKtL40y8VGMm8LoicVkRJH8blPORCnaLjdOtmA3rx/v2EXrJpSa3AhOy0ZSRXk
ZSrK68AVNwamHRoBSYyo0AtaXnkPX4+tmO8X8BPfj125IljubvwZPIW9VWR9UqCE
VPfDR1XKegVb6VStIywF7kmrknM1C5qUY28rdZYWgKorw01hBGV4jTW0cqde3N51
XT1jnIAa+NoXUM9uQoGYMiwrL7vNsLlyyiW5ayDyV92H/rIuiqhFgbJsHTlsm7I8
oGheR784BagAA1NIKD1qEO9T6Kz9lzlDaeWS5AUKeXrb7ZJLI1TTCIZx5/DxjLqM
Tt/RFBpVo9geZQrvLUqLAMwdaUvDXC2c6DaCPXTh65oCZj/hqzlJHH+RoTWWzKI+
BjXxgUWF9EmZUBrg68DSmI+9wuDFsjZ51BcqvJwxyfxtTaWhdoYqH/UQS+D1FP3/
diZHHlzwVwPICzM9ooNTgbrcDzyxRkIVqsVwBq7EtzcvgYUyX53yG25Giy6YQaQ2
ZtQ/VymwFL3XdUWV6B/hU4PVAFvO3qlOtdJ6TpE+nEWgcWjCv5g7RjXX
=MuOY
-----END PGP PUBLIC KEY BLOCK-----
"""
PRIVATE_KEY = """
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
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
=JTFu
-----END PGP PRIVATE KEY BLOCK-----
"""
# different private key to the same address
# A4337956D27DC89C Leap Test Key <leap@leap.se>
# no expiry date
DIFFERENT_KEY_FPR = "EFA5842560D6462AD9CCE7A2A4337956D27DC89C"
DIFFERENT_PRIVATE_KEY = """
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1
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
=3mjv
-----END PGP PRIVATE KEY BLOCK-----
"""
# the corresponding public key
# this is signed by the other key 2F455E2824D18DDF above
DIFFERENT_PUBLIC_KEY = """
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
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
=X/jT
-----END PGP PUBLIC KEY BLOCK-----
"""
# key 7FEE575A: public key "anotheruser <anotheruser@leap.se>"
KEY_FINGERPRINT_2 = "F6E2B572ADB84EA58BD2E9A57F9DFA687FEE575A"
PUBLIC_KEY_2 = """
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
mI0EUYwJXgEEAMbTKHuPJ5/Gk34l9Z06f+0WCXTDXdte1UBoDtZ1erAbudgC4MOR
gquKqoj3Hhw0/ILqJ88GcOJmKK/bEoIAuKaqlzDF7UAYpOsPZZYmtRfPC2pTCnXq
Z1vdeqLwTbUspqXflkCkFtfhGKMq5rH8GV5a3tXZkRWZhdNwhVXZagC3ABEBAAG0
IWFub3RoZXJ1c2VyIDxhbm90aGVydXNlckBsZWFwLnNlPoi4BBMBAgAiBQJRjAle
AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRB/nfpof+5XWotuA/4tLN4E
gUr7IfLy2HkHAxzw7A4rqfMN92DIM9mZrDGaWRrOn3aVF7VU1UG7MDkHfPvp/cFw
ezoCw4s4IoHVc/pVlOkcHSyt4/Rfh248tYEJmFCJXGHpkK83VIKYJAithNccJ6Q4
JE/o06Mtf4uh/cA1HUL4a4ceqUhtpLJULLeKo7iNBFGMCV4BBADsyQI7GR0wSAxz
VayLjuPzgT+bjbFeymIhjuxKIEwnIKwYkovztW+4bbOcQs785k3Lp6RzvigTpQQt
Z/hwcLOqZbZw8t/24+D+Pq9mMP2uUvCFFqLlVvA6D3vKSQ/XNN+YB919WQ04jh63
yuRe94WenT1RJd6xU1aaUff4rKizuQARAQABiJ8EGAECAAkFAlGMCV4CGwwACgkQ
f536aH/uV1rPZQQAqCzRysOlu8ez7PuiBD4SebgRqWlxa1TF1ujzfLmuPivROZ2X
Kw5aQstxgGSjoB7tac49s0huh4X8XK+BtJBfU84JS8Jc2satlfwoyZ35LH6sDZck
I+RS/3we6zpMfHs3vvp9xgca6ZupQxivGtxlJs294TpJorx+mFFqbV17AzQ=
=Thdu
-----END PGP PUBLIC KEY BLOCK-----
"""
PRIVATE_KEY_2 = """
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
lQHYBFGMCV4BBADG0yh7jyefxpN+JfWdOn/tFgl0w13bXtVAaA7WdXqwG7nYAuDD
kYKriqqI9x4cNPyC6ifPBnDiZiiv2xKCALimqpcwxe1AGKTrD2WWJrUXzwtqUwp1
6mdb3Xqi8E21LKal35ZApBbX4RijKuax/BleWt7V2ZEVmYXTcIVV2WoAtwARAQAB
AAP7BLuSAx7tOohnimEs74ks8l/L6dOcsFQZj2bqs4AoY3jFe7bV0tHr4llypb/8
H3/DYvpf6DWnCjyUS1tTnXSW8JXtx01BUKaAufSmMNg9blKV6GGHlT/Whe9uVyks
7XHk/+9mebVMNJ/kNlqq2k+uWqJohzC8WWLRK+d1tBeqDsECANZmzltPaqUsGV5X
C3zszE3tUBgptV/mKnBtopKi+VH+t7K6fudGcG+bAcZDUoH/QVde52mIIjjIdLje
uajJuHUCAO1mqh+vPoGv4eBLV7iBo3XrunyGXiys4a39eomhxTy3YktQanjjx+ty
GltAGCs5PbWGO6/IRjjvd46wh53kzvsCAO0J97gsWhzLuFnkxFAJSPk7RRlyl7lI
1XS/x0Og6j9XHCyY1OYkfBm0to3UlCfkgirzCYlTYObCofzdKFIPDmSqHbQhYW5v
dGhlcnVzZXIgPGFub3RoZXJ1c2VyQGxlYXAuc2U+iLgEEwECACIFAlGMCV4CGwMG
CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEH+d+mh/7ldai24D/i0s3gSBSvsh
8vLYeQcDHPDsDiup8w33YMgz2ZmsMZpZGs6fdpUXtVTVQbswOQd8++n9wXB7OgLD
izgigdVz+lWU6RwdLK3j9F+Hbjy1gQmYUIlcYemQrzdUgpgkCK2E1xwnpDgkT+jT
oy1/i6H9wDUdQvhrhx6pSG2kslQst4qjnQHYBFGMCV4BBADsyQI7GR0wSAxzVayL
juPzgT+bjbFeymIhjuxKIEwnIKwYkovztW+4bbOcQs785k3Lp6RzvigTpQQtZ/hw
cLOqZbZw8t/24+D+Pq9mMP2uUvCFFqLlVvA6D3vKSQ/XNN+YB919WQ04jh63yuRe
94WenT1RJd6xU1aaUff4rKizuQARAQABAAP9EyElqJ3dq3EErXwwT4mMnbd1SrVC
rUJrNWQZL59mm5oigS00uIyR0SvusOr+UzTtd8ysRuwHy5d/LAZsbjQStaOMBILx
77TJveOel0a1QK0YSMF2ywZMCKvquvjli4hAtWYz/EwfuzQN3t23jc5ny+GqmqD2
3FUxLJosFUfLNmECAO9KhVmJi+L9dswIs+2Dkjd1eiRQzNOEVffvYkGYZyKxNiXF
UA5kvyZcB4iAN9sWCybE4WHZ9jd4myGB0MPDGxkCAP1RsXJbbuD6zS7BXe5gwunO
2q4q7ptdSl/sJYQuTe1KNP5d/uGsvlcFfsYjpsopasPjFBIncc/2QThMKlhoEaEB
/0mVAxpT6SrEvUbJ18z7kna24SgMPr3OnPMxPGfvNLJY/Xv/A17YfoqjmByCvsKE
JCDjopXtmbcrZyoEZbEht9mko4ifBBgBAgAJBQJRjAleAhsMAAoJEH+d+mh/7lda
z2UEAKgs0crDpbvHs+z7ogQ+Enm4EalpcWtUxdbo83y5rj4r0TmdlysOWkLLcYBk
o6Ae7WnOPbNIboeF/FyvgbSQX1POCUvCXNrGrZX8KMmd+Sx+rA2XJCPkUv98Hus6
THx7N776fcYHGumbqUMYrxrcZSbNveE6SaK8fphRam1dewM0
=a5gs
-----END PGP PRIVATE KEY BLOCK-----
"""
# key with expiry date, change if key below is changed
ADDRESS_EXPIRING = 'leap.expiring@leap.se'
KEY_EXPIRING_CREATION_DATE = '2016-11-06'
PRIVATE_EXPIRING_KEY = """
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1
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
=2Zjl
-----END PGP PRIVATE KEY BLOCK-----
"""
# -*- coding: utf-8 -*-
# conftest.py
# Copyright (C) 2016 LEAP Encryption Acess Project
#
# 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/>.
"""
Fixtures for the benchmarks for leap.bitmask.keymanager
"""
import pytest
from leap.bitmask.keymanager.keys import build_key_from_dict
from leap.bitmask.keymanager.wrapper import TempGPGWrapper
from common import ADDRESS
from common import KEY_FINGERPRINT
from common import PUBLIC_KEY
from common import PRIVATE_KEY
from common import ADDRESS_2
from common import KEY_FINGERPRINT_2
from common import PUBLIC_KEY_2
from common import PRIVATE_KEY_2
@pytest.fixture
def wrapper(keys=None):
return TempGPGWrapper(keys=keys)
def _get_key(address, key_fingerprint, key_data, private):
kdict = {
'uids': [address],
'fingerprint': key_fingerprint,
'key_data': key_data,
'private': private,
'length': 4096,
'expiry_date': 0,
'refreshed_at': 1311239602,
}
key = build_key_from_dict(kdict)
return key
@pytest.fixture
def public_key():
return _get_key(ADDRESS, KEY_FINGERPRINT, PUBLIC_KEY, False)
@pytest.fixture
def public_key_2():
return _get_key(ADDRESS_2, KEY_FINGERPRINT_2, PUBLIC_KEY_2, False)
@pytest.fixture
def openpgp_keys():
return [
_get_key(ADDRESS, KEY_FINGERPRINT, PUBLIC_KEY, False),
_get_key(ADDRESS_2, KEY_FINGERPRINT_2, PUBLIC_KEY_2, False),
_get_key(ADDRESS, KEY_FINGERPRINT, PRIVATE_KEY, True),
_get_key(ADDRESS_2, KEY_FINGERPRINT_2, PRIVATE_KEY_2, True),
]
# -*- coding: utf-8 -*-
# test_opengpg_speed.py
# Copyright (C) 2016 LEAP Encryption Acess Project
#
# 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/>.
"""
Benchmarking for the leap.bitmask.keymanager.openpgp module
"""
import commands
import pytest
from functools import partial
from gnupg import GPG
from leap.bitmask.keymanager.wrapper import TempGPGWrapper
from common import CIPHERTEXT
from common import SIGNEDTEXT
GROUP_INIT = 'initialization only'
GROUP_CRYPTO = 'crypto only'
GROUP_INIT_AND_CRYPTO = 'initialization and crypto'
# the gnupg module gets the binary version each time the GPG object is
# initialized. In some platforms this takes hundreds of milliseconds, and
# sometimes more than a second. This is currently a known bug. For making it
# evident, we provide a way to bypass the version check by monkeypatching the
# actual function that does the job.
def get_gpg_version():
output = commands.getoutput(
'gpg --list-config --with-colons | grep version')
version = output.split(':').pop()
return version
GPG_VERSION = get_gpg_version()
def mock_gpg_get_version(monkeypatch):
def _setver(self):
self.binary_version = GPG_VERSION
monkeypatch.setattr(
GPG, '_check_sane_and_get_gpg_version', _setver)
#
# generic speed test creator
#
def create_test(fun, num_keys=0, mock_get_version=True, init=None, group=None):
@pytest.mark.benchmark(group=group)
def test(tmpdir, benchmark, openpgp_keys, monkeypatch):
if mock_get_version:
mock_gpg_get_version(monkeypatch)
if init:
res = init(tmpdir, benchmark, openpgp_keys, monkeypatch, num_keys)
benchmark(fun, res)
else:
benchmark(
fun, tmpdir, benchmark, openpgp_keys, monkeypatch, num_keys)
return test
#
# gpg initializarion: 0, 1 and 2 keys
#
def gpg_init_only(tmpdir, benchmark, openpgp_keys, monkeypatch, num_keys):
keys = openpgp_keys[0:num_keys]
gpg = GPG(homedir=tmpdir.dirname)
for key in keys:
gpg.import_keys(key.key_data)
test_gpg_init_nokey_slow = create_test(
gpg_init_only, num_keys=0,
mock_get_version=False,
group=GROUP_INIT)
test_gpg_init_1key_slow = create_test(
gpg_init_only, num_keys=1,
mock_get_version=False,
group=GROUP_INIT)
test_gpg_init_2keys_slow = create_test(
gpg_init_only, num_keys=2,
mock_get_version=False,
group=GROUP_INIT)
test_gpg_init_nokey = create_test(
gpg_init_only, num_keys=0,
group=GROUP_INIT)
test_gpg_init_1key = create_test(
gpg_init_only, num_keys=1,
group=GROUP_INIT)
test_gpg_init_2keys = create_test(
gpg_init_only, num_keys=2,
group=GROUP_INIT)
#
# wrapper initialization: 0, 1 and 2 keys
#
def wrapper_init_only(tmpdir, benchmark, openpgp_keys, monkeypatch, num_keys):
keys = openpgp_keys[0:num_keys]
wrapper = TempGPGWrapper(keys=keys)
with wrapper as gpg:
assert GPG == type(gpg)
test_wrapper_init_nokey_slow = create_test(
wrapper_init_only, num_keys=0,
mock_get_version=False,
group=GROUP_INIT)
test_wrapper_init_1key_slow = create_test(
wrapper_init_only, num_keys=1,
mock_get_version=False,
group=GROUP_INIT)
test_wrapper_init_2keys_slow = create_test(
wrapper_init_only, num_keys=2,
mock_get_version=False,
group=GROUP_INIT)
test_wrapper_init_nokey = create_test(
wrapper_init_only, num_keys=0,
group=GROUP_INIT)
test_wrapper_init_1key = create_test(
wrapper_init_only, num_keys=1,
group=GROUP_INIT)
test_wrapper_init_2keys = create_test(
wrapper_init_only, num_keys=2,
group=GROUP_INIT)
#
# initialization + encryption
#
PLAINTEXT = ' ' * 10000 # 10 KB
def gpg_init_exec(fun, tmpdir, benchmark, openpgp_keys, monkeypatch, _):
pubkey = openpgp_keys[0]
privkey = openpgp_keys[2] # this is PRIVATE_KEY
gpg = GPG(homedir=tmpdir.dirname)
gpg.import_keys(pubkey.key_data)
gpg.import_keys(privkey.key_data)
fun((gpg, pubkey, privkey))
def wrapper_init_exec(fun, tmpdir, benchmark, openpgp_keys, monkeypatch, _):
pubkey = openpgp_keys[0]
privkey = openpgp_keys[2]
wrapper = TempGPGWrapper(keys=[pubkey, privkey])
wrapper._build_keyring()
fun((wrapper._gpg, pubkey, privkey))
def gpg_enc(res):
gpg, pubkey, _ = res
ciphertext = gpg.encrypt(PLAINTEXT, pubkey.fingerprint)
assert ciphertext.ok
assert len(ciphertext.data)
test_gpg_init_enc = create_test(
partial(gpg_init_exec, gpg_enc),
group=GROUP_INIT_AND_CRYPTO)
test_wrapper_init_enc = create_test(
partial(wrapper_init_exec, gpg_enc),
group=GROUP_INIT_AND_CRYPTO)
#
# initialization + decryption
#
def gpg_dec(res):
gpg, _, _ = res
plaintext = gpg.decrypt(CIPHERTEXT)
assert plaintext.ok
assert len(plaintext.data)
test_gpg_init_dec = create_test(
partial(gpg_init_exec, gpg_dec),
group=GROUP_INIT_AND_CRYPTO)
test_wrapper_init_dec = create_test(
partial(wrapper_init_exec, gpg_dec),
group=GROUP_INIT_AND_CRYPTO)
#
# initialization + sign
#
def gpg_sign(res):
gpg, _, privkey = res
gpg.import_keys(privkey.key_data)
signed = gpg.sign(PLAINTEXT, default_key=privkey.fingerprint)
assert signed.status == 'begin signing'
assert len(signed.data) > len(PLAINTEXT)
assert '-----BEGIN PGP SIGNATURE-----' in signed.data
assert '-----END PGP SIGNATURE-----' in signed.data
test_gpg_init_sign = create_test(
partial(gpg_init_exec, gpg_sign),
group=GROUP_INIT_AND_CRYPTO)
test_wrapper_init_sign = create_test(
partial(wrapper_init_exec, gpg_sign),
group=GROUP_INIT_AND_CRYPTO)
#
# initialization + verify
#
def gpg_verify(res):
gpg, _, privkey = res
signed = gpg.verify(SIGNEDTEXT)
assert signed.valid
test_gpg_init_verify = create_test(
partial(gpg_init_exec, gpg_verify),
group=GROUP_INIT_AND_CRYPTO)
test_wrapper_init_verify = create_test(
partial(wrapper_init_exec, gpg_verify),
group=GROUP_INIT_AND_CRYPTO)
#
# encryption only
#
def gpg_init(tmpdir, benchmark, openpgp_keys, monkeypatch, _):
pubkey = openpgp_keys[0]
privkey = openpgp_keys[2] # this is PRIVATE_KEY
gpg = GPG(homedir=tmpdir.dirname)
gpg.import_keys(pubkey.key_data)
gpg.import_keys(privkey.key_data)
return gpg, pubkey, privkey
def wrapper_init(tmpdir, benchmark, openpgp_keys, monkeypatch, _):
pubkey = openpgp_keys[0]
privkey = openpgp_keys[2]
wrapper = TempGPGWrapper(keys=[pubkey, privkey])
wrapper._build_keyring()
return wrapper._gpg, pubkey, privkey
test_gpg_enc = create_test(
gpg_enc, init=gpg_init, group=GROUP_CRYPTO)
test_wrapper_enc = create_test(
gpg_enc, init=wrapper_init, group=GROUP_CRYPTO)
#
# decryption only
#
test_gpg_dec = create_test(
gpg_dec,
init=gpg_init, group=GROUP_CRYPTO)
test_wrapper_dec = create_test(
gpg_dec,
init=wrapper_init, group=GROUP_CRYPTO)
#
# sign only
#
test_gpg_sign = create_test(
gpg_sign, init=gpg_init, group=GROUP_CRYPTO)
test_wrapper_sign = create_test(
gpg_sign, init=wrapper_init, group=GROUP_CRYPTO)
#
# verify only
#
test_gpg_verify = create_test(
gpg_verify, init=gpg_init, group=GROUP_CRYPTO)
test_wrapper_verify = create_test(
gpg_verify, init=wrapper_init, group=GROUP_CRYPTO)
/usr/bin/bitmask_chromium
/usr/lib/python2.7/dist-packages/leap/bitmask/chrome/
/usr/bin/bitmaskd
/usr/bin/bitmaskctl
/usr/lib/python2.7/dist-packages/leap/bitmask/core/
/usr/lib/python2.7/dist-packages/leap/bitmask/cli/
/usr/lib/python2.7/dist-packages/leap/bitmask/bonafide/
/usr/lib/python2.7/dist-packages/leap/bitmask/__init__.py
/usr/lib/python2.7/dist-packages/leap/bitmask/_version.py
/usr/lib/python2.7/dist-packages/leap/bitmask/util.py
/usr/lib/python2.7/dist-packages/leap/bitmask/hooks.py
/usr/lib/python2.7/dist-packages/leap/bitmask/config.py
/usr/lib/python2.7/dist-packages/leap.bitmask-*.egg-info
ui/pydist/leap/bitmask_js/ /usr/lib/python2.7/dist-packages/leap
/usr/lib/python2.7/dist-packages/leap/bitmask/mail/
/usr/lib/python2.7/dist-packages/leap/bitmask/keymanager/
src/leap/bitmask/mua /usr/lib/python2.7/dist-packages/leap/bitmask/mua
[Desktop Entry]
Version=1.0
Type=Application
Name=Bitmask
Comment=Secure Communication
Comment[es]=Secure Communication
Comment[de]=Secure Communication
Exec=bitmask %U
Terminal=false
Icon=bitmask
Categories=Network;Application;
StartupNotify=true
X-AppInstall-Package=bitmask
Keywords=email;messaging;encryption;vpn;leap