Compare commits


125 Commits

Author SHA1 Message Date
cis-kuldeep 1c6d4702c0 Added flatpak build manifests with split dependencies 2021-04-27 20:37:46 +05:30
Muzahid f5fba7d1a8
update changes and rename file name 2021-04-06 13:04:44 +05:30
Muzahid f075d27fae
add dot in importing 2021-04-05 19:08:10 +05:30
Muzahid 1b8dc18ef6
remove functions imports 2021-04-05 18:28:26 +05:30
Muzahid 06cab993d9
Fix configparser import error 2021-04-01 21:06:22 +05:30
Dmitri Bogomolov 6f9b66ddff
Qt test for UDP setting 2021-03-01 19:55:48 +02:00
Dmitri Bogomolov 79efacffb1
Replaced lost UDPSocket.maxTimeOffset by constants.MAX_TIME_OFFSET
Closes: #1696
2021-03-01 19:55:47 +02:00
Dmitri Bogomolov 6ee6989df2
A minimal test for UDP. Restore expected default settings in tearDown(). 2021-03-01 19:55:30 +02:00
Dmitri Bogomolov 5f9d507717
announceInterval is for AnnounceThread, not UDPSocket 2021-02-22 19:56:24 +02:00
Dmitri Bogomolov 6168d63699
Replace formatting socket.error by exc_info in network.udp 2021-02-22 19:56:24 +02:00
Dmitri Bogomolov 8ff8e0e2cb
Make it possible to disable UDP announcing in settings 2021-02-22 19:56:23 +02:00
Dmitri Bogomolov ef849d2dd3
Handle old psutil in TestProcess 2021-02-18 17:15:56 +02:00
Dmitri Bogomolov d8cf148d4a
Replaced print operator by print function in network.asyncore_pollchoose
and unmaintained modules.
2021-02-18 17:15:56 +02:00
Dmitri Bogomolov 2fe2f17688
Don't run tests when build deb 2021-02-18 17:15:56 +02:00
Dmitri Bogomolov 671df69303
Work around deprecation of platform.dist() in recent python 2021-02-18 17:15:56 +02:00
Dmitri Bogomolov 81645eadef
Remove import from debug from openclpow, remove shebang, format 2021-02-18 17:15:56 +02:00
Dmitri Bogomolov e77238fa07
Support tox and request more warnings:
- make separate tests runner -; python test still works
  - tox.ini with coverage config
  - -b: issue warnings about comparing bytearray with unicode
  - export PYTHONWARNINGS=all on stage install
2021-02-18 17:12:43 +02:00
Dmitri Bogomolov 0f8528cc48
Fix python3 issues in test_blindsig:
- simplify imports
 - signatures are of type bytes
 - chain kwarg of pyelliptic.ECCBlindChain is bytes
2021-02-18 17:12:42 +02:00
Dmitri Bogomolov faed885c34
Fix python3 issues in test_crypto:
- use bytes for python3
 - encode the result of arithmetic.privtopub
 - add test for arithmetic.base10_multiply
2021-02-18 17:12:42 +02:00
Dmitri Bogomolov 5bd3bd4711
Make addresses module available for testing with python3:
- remove import from debug
 - use divmod and bytes
2021-02-18 17:12:42 +02:00
Dmitri Bogomolov 5976a449e2
test_randomtrackingdict: revert bytes to string for python3 2021-02-18 17:12:42 +02:00
Dmitri Bogomolov da8bd36614
Fix python3 issues in pyelliptic:
- use dotted imports, remove unneeded shebangs
 - openssl._OpenSSL._version is of type bytes
 - use b'\x00' literal instead of chr(0) in eccblind and test_openssl
 - use // and divmod in arithmetic to fit PEP238:
2021-02-18 17:11:36 +02:00
Dmitri Bogomolov d05255625b
Universal pathmagic returns app dir; activated in setup for python3 2021-02-17 17:11:25 +02:00
Dmitri Bogomolov f8844f4d74
Use common.skip_python3() to skip tests modules not supporting python3 2021-02-17 17:11:25 +02:00
Dmitri Bogomolov b3c341951d
Add normal exit in depends if detected python3 2021-02-17 17:11:25 +02:00
Dmitri Bogomolov 6029ec85b6
Add python 3.7. Use general shebangs in scripts to test with python3;
Use 2.7_with_system_site_packages for python2 to run qt tests
as suggested in Travis doc instead of bypassing virtualenv by shebang.
2021-02-17 17:11:24 +02:00
Peter Šurda 574b60ed0e
Add Dockerfile for running test
- run ./ to run travis tests locally
2021-02-16 10:15:15 +01:00
Dmitri Bogomolov d35c284e13
Move desktop plugin initialization to updateStartOnLogon(); Fixes: #1735 2021-02-15 14:00:52 +02:00
Dmitri Bogomolov c51108e867
Entry point 'desktop' for plugins managing desktop environment;
desktop_xdg will do it with pyxdg. Fixes: #857
2021-02-12 21:16:19 +02:00
Dmitri Bogomolov 74e039de5d
Added Network category in desktop file 2021-02-12 21:15:49 +02:00
Dmitri Bogomolov 2f5d6214ff
Move addressbook test to bitmessageqt.tests because it uses Qt 2021-02-11 17:07:48 +02:00
Dmitri Bogomolov 26057be6ff
A test for listening port 8444 2021-02-11 16:34:43 +02:00
Dmitri Bogomolov 5052602c21
Add test for BITMESSAGE_HOME 2021-02-11 16:34:38 +02:00
Dmitri Bogomolov 265fb932a8
Instruct git to use LF as line ending for knownnodes.dat test pattern 2021-02-10 16:01:30 +02:00
Dmitri Bogomolov 5b71bd1931
Format and simplify bitmessagemain.spec, exclude unused libs and files 2021-02-09 22:56:44 +02:00
surbhicis d36e7615a9
remove kivy specification file along with component changes of version from upstream 2021-02-09 19:59:40 +05:30
navjot f381721bec
remove TestProcessProto import from test_openclpow module 2021-02-04 14:37:26 +05:30
Dmitri Bogomolov 448e9e2f36
Prevent adding bootstrap servers to knownnodes when received in addr 2021-01-22 18:52:34 +02:00
Dmitri Bogomolov 3108115570
Shorten Bootstrapper methods:
handle_close() and set_connection_fully_established()
2021-01-22 18:52:34 +02:00
Dmitri Bogomolov d6cab9935d
Try to find bootstrap server in knownnodes after bootstrapping 2021-01-22 18:52:34 +02:00
Dmitri Bogomolov 2ac4b1fece
A separate test for dontconnect setting 2021-01-22 18:52:33 +02:00
Dmitri Bogomolov 2b5f605857
Set close_reason for exceptions in network.tls 2021-01-22 18:52:33 +02:00
Dmitri Bogomolov 9540d5fabe
Fixing tor related tests:
- knownnodes.cleanupKnownNodes() should set knownNodesActual = False
   if there are no nodes in stream 1 (repeated bootstrapping)
 - set socksproxytype before _initiate_bootstrap()
 - wait 5 sec in _initiate_bootstrap() to be sure all connections are closed
 - plugins do not work on travis - use socksproxytype = SOCKS5,
   check tor presence by trying to bind on port 9050
 - successfull connection to 3 onion nodes in 6 minutes is not guaranteed -
   check that bitmessage doesn't try non-onion nodes
2021-01-22 18:52:33 +02:00
Dmitri Bogomolov e9073d736a
Another possible approach for connection check 2021-01-22 18:52:33 +02:00
Dmitri Bogomolov d9d1cdb5d8
A separate test for connection to bootstrap servers 2021-01-22 18:52:33 +02:00
navjot 7b8bf082ff
add Gpu skip condition and setupclass in test_openclpow module 2021-01-20 16:42:14 +05:30
navjot 1612f9c778
test case for openclpow module 2021-01-20 16:41:33 +05:30
navjot 9c5d329c90
replace print with logger and remove unused file 2021-01-18 23:31:45 +05:30
surbhicis 6ffb912f2a
detach kivy version from upstream 2021-01-16 23:11:19 +05:30
navjot edc4660c6d
imported helper_addressGenerator module 2021-01-15 15:34:38 +05:30
navjot bfdb78151c
updated addressbook table in class_sqlThread module 2021-01-14 15:43:30 +05:30
navjot f146500b58
written test case for addressbook 2021-01-14 15:43:30 +05:30
navjot 42037502ab
fixed Own address should not save in address book issue
- removed redundant code

- written test case for address book own address saving

- fixed CQ issues

- added helper_addressbook module

- Fixed CQ issue of src.helper_addressbook module

- fixed travis-ci checks failing issue
2021-01-14 15:43:30 +05:30
navjot 09439b4a0d
added general exception handler 2021-01-13 20:29:20 +05:30
navjot 5fb8692eb6
ignoring ValueError from proofofwork module 2021-01-13 20:29:20 +05:30
navjot ac23a397a1
added timer of less then 10 seconds 2021-01-13 14:14:26 +05:30
navjot 14a4f42fc0
remove qt dependency 2021-01-12 20:09:36 +05:30
navjot 16e9319d5f
add helper_addressGenerator module 2021-01-08 17:41:33 +05:30
813492291816 a0e1c0041f
Add missing TTL to API sendMessage 2021-01-07 19:51:12 -05:00
Peter Šurda e084d7f53c
`objectProcessor` waits for `sqlThread` ready
- fixes #1702
2021-01-03 11:14:27 +01:00
Peter Šurda 184664d758
SQL operations asserts and code quality
- complain if trying to execute SQL statements without a running
  `.threads.sqlThread`. This is to give better test feedback if used
- refactor `.helper_sql.sql_ready` as a `threading.Event`
- code quality
2021-01-01 17:54:05 +01:00
navjot 7a010441c3
Fixed flake8 CQ issues 2020-12-30 20:01:33 +05:30
navjot 46e2f04488
move out side the network dircetory 2020-12-29 13:12:22 +05:30
navjot a2ab0a02dc
written test case randomtrackingdict dict module 2020-12-28 16:01:23 +05:30
navjot 9fe4ad0489
test case for testing old knownnodes pickle
-test case for testing old knownnodes pickle

-fixed CQ for tests.core module

-implemented shutil.copyfile feature and use small size knownnodes.dat file in test_pattern dir

-remove unnecessary code

-Fixed CQ of tests.core module
2020-12-21 22:50:38 +05:30
navjot d2a340d012
implemented dependency checks in checkdeps module 2020-11-25 19:52:27 +05:30
navjot 9265235053
fixed network issue when it is set offline 2020-11-23 17:52:20 +05:30
navjot 124e6d9b32
fix for #1656 issue 2020-11-23 17:52:20 +05:30
navjot 1c304125e8
fixed CQ issues 2020-11-21 13:53:10 +05:30
navjot 4681d37377
validate address in insert method and improve test cases 2020-11-21 13:53:10 +05:30
navjot 360539b320
Fixed CQ of class_objectProcessor, bitmessagecurses and bitmessageqt module 2020-11-21 13:53:10 +05:30
navjot 61f7f32dfc
removed unused code and return ackdata from inset method insted of msgid 2020-11-21 13:53:10 +05:30
navjot beaece254c
omitted unused code and optimized it 2020-11-21 13:53:10 +05:30
navjot 89254064f6
fixed default variables in insert method 2020-11-21 13:53:10 +05:30
navjot 5eff9d6a04
Fixed CQ for tests.core module 2020-11-21 13:53:10 +05:30
navjot a9e9f25b5d
change helper_sent.insert methods 2020-11-21 13:53:10 +05:30
navjot 0ec15d1d4d
Test case for insert method default values 2020-11-21 13:53:10 +05:30
navjot 1bc3fe7b42
added checks in helper_sent module 2020-11-21 13:53:10 +05:30
navjot b7d920d529
Fixed CQ for test/ module 2020-11-21 13:53:10 +05:30
navjot 0023fc4b3d
Written test case for helper_sent.insert method 2020-11-21 13:53:10 +05:30
navjot e60d12ddbf
Refactord the uuid creation code and placed it in helper_sent.insert method
refactored on the bases of comments

Fixed CQ of src.helper_sent module

fixed CQ for helper_sent module
2020-11-21 13:53:10 +05:30
navjot 881351033f
replaced insert into sent query with helper_sent.insert method and also replaced empty msgid with uuid 2020-11-21 13:53:10 +05:30
813492291816 601158f6fb
add pendingDownload to return of API clientStatus 2020-11-21 01:00:11 +00:00
Dmitri Bogomolov cb0710e454
Fix updateStatusBar wrong args order 2020-11-04 16:24:58 +02:00
Dmitri Bogomolov caf3a3fbbc
A test for updateStatusBar command 2020-11-04 16:24:58 +02:00
Dmitri Bogomolov 695140d57d
Save exceptions in the main thread in excQueue 2020-11-04 16:24:52 +02:00
citizenaspirant 93bf7ad62c
Add apparmor config to data_files for Debian and Ubuntu 2020-11-04 15:47:46 +02:00
Dmitri Bogomolov 84b5f2982c
Allow running pybitmessage -t without tests package 2020-11-04 14:25:21 +02:00
Dmitri Bogomolov 8be89e9a25
Remove deb building overdocumentation 2020-11-04 14:25:21 +02:00
Dmitri Bogomolov d3fbf17acf
Remove unmaintained debian package 2020-11-04 14:25:20 +02:00
Dmitri Bogomolov d410cad4b6
stdeb config for building deb 2020-11-04 14:25:15 +02:00
Dmitri Bogomolov db11d6331f
Optimize setUpClass() and tearDownClass() in test_process 2020-11-03 17:14:00 +02:00
Peter Šurda 96a784b58b
Merged PeterSurda/teardown-test1:
- reset BMConfigParser before reading config file
  - enable threads name check on posix systems
  - check singleton.lock in TestProcessProto.setUpClass()
2020-11-03 17:14:00 +02:00
Dmitri Bogomolov b65f2d154a
Common basic cleanup procedure 2020-11-03 17:14:00 +02:00
Dmitri Bogomolov 1bcffd2853
Make TestLogger a subclass of TestProcessProto 2020-11-02 18:01:51 +02:00
Dmitri Bogomolov cf4e812334
Allow TestProcess subclasses set home dir, use mkdtemp for test_config 2020-11-02 18:01:51 +02:00
Dmitri Bogomolov affdb2fdc0
Solve problem with on windows:
- uncomment console_scripts (only for windows) to get exe
 - replace call() with Popen() to avoid blocking
2020-11-02 18:01:50 +02:00
Dmitri Bogomolov 80831754b3
Fail in TestProcessProto.setUp if bitmessage process dies 2020-11-02 11:08:28 +02:00
navjot 6c5bb62123
replaced double quotes with Single quotes in class_singleWorker module 2020-10-31 13:07:51 +05:30
navjot a7c1018f47
fixed CQ for src.class_singleWorker module 2020-10-31 13:07:51 +05:30
navjot 30044f7516
implemented filter query in sent table on the bases of folder= 'sent' 2020-10-31 13:07:51 +05:30
Dmitri Bogomolov b650e97edc
Fix statuses for sendBroadcast 2020-10-28 15:25:46 +02:00
navjot c18b544732
fixed socket error on sendato #1583 2020-10-23 17:54:59 +05:30
navjot ec922adb36
fixed flake8 code quality issue 2020-10-12 16:44:49 +05:30
navjot 1ec0bd4c42
removed unnecessary import 2020-10-12 16:44:49 +05:30
navjot 263711a4d3
fixed unread trash message listing issue 2020-10-09 16:56:56 +05:30
Dmitri Bogomolov 6b65113bb4
Added missing msgid in HandleGetInboxMessageById() query 2020-10-04 17:24:45 +03:00
Dmitri Bogomolov 380530c839
Experimental APIError codes table 2020-09-14 13:11:43 +03:00
Dmitri Bogomolov 85f306e5f6
Covered more API commands by tests, listed uncovered in TODO 2020-09-14 13:11:43 +03:00
Dmitri Bogomolov ef5593b3d5
Formatted lines for PEP8, handled pylint warnings, added docstrings 2020-09-14 13:11:43 +03:00
Dmitri Bogomolov 3a8e842e60
Use encodingType arg in sendMessage and sendBroadcast API commands 2020-09-14 13:11:43 +03:00
Dmitri Bogomolov 5b07d2de30
httplib status codes constants in response 2020-09-14 13:11:43 +03:00
Dmitri Bogomolov 6c85bdd498
Also check sent broadcast status and it's presence in sent messages 2020-09-14 13:11:43 +03:00
Dmitri Bogomolov efff8f95ba
Prefix based command filter 2020-09-14 13:11:42 +03:00
Dmitri Bogomolov fabbccbeac
Rewrote test_user_password() for xmlrpclib.ProtocolError:
it would be very difficult to return string from BMXMLRPCRequestHandler
2020-09-14 13:11:42 +03:00
Dmitri Bogomolov 06033ed96e
Fixed response for bad username or password and content-type header
(closes #244)
2020-09-14 13:11:42 +03:00
Dmitri Bogomolov 726986c1eb
Implemented JSON-RPC apivariant 2020-09-14 13:11:42 +03:00
Dmitri Bogomolov 6a089e0f88
Decoupled SimpleXMLRPCRequestHandler subclass
and added simple introspection
2020-09-14 13:11:42 +03:00
Dmitri Bogomolov f4bf3bac2a
Used defusedxml to protect against XML vulnerabilities 2020-09-14 13:11:42 +03:00
Dmitri Bogomolov 2142888cbe
Inherited APIError from xmlrpclib.Fault.
From now on any errors are raised.
2020-09-14 13:11:42 +03:00
Dmitri Bogomolov 25abf66f1d
Reused _verifyAddress() in HandleDecodeAddress() 2020-09-14 13:11:41 +03:00
Dmitri Bogomolov 5925781b9a
Proper message for APIError 0 2020-09-14 13:11:41 +03:00
Dmitri Bogomolov 7cafe402be
Methods to form a dictionary for inbox and sent messages 2020-09-14 13:11:41 +03:00
Dmitri Bogomolov 45b0659e4c
Refactoring the API with metaclass and decorator 2020-09-14 13:11:35 +03:00
coolguy-cell 1571176082
fixed CQ for bitmessageqt.statusbar module 2020-09-09 12:12:52 +05:30
168 changed files with 2694 additions and 12214 deletions

.gitattributes vendored Normal file
View File

@ -0,0 +1,3 @@
# Pickle files (for testing) should always have UNIX line endings.
# Windows issue like here
knownnodes.dat text eol=lf

.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "packages/flatpak/shared-modules"]
path = packages/flatpak/shared-modules
url =

View File

@ -1,6 +1,9 @@
language: python
cache: pip
dist: bionic
- "2.7"
- "2.7_with_system_site_packages"
- "3.7"
@ -11,9 +14,9 @@ addons:
- xvfb
- pip install -r requirements.txt
- ln -s src pybitmessage # tests environment
- python install
- python
- xvfb-run src/ -t
- python test
- python -bm tests

View File

@ -6,43 +6,37 @@ RUN apt-get update
# Install dependencies
RUN apt-get install -yq --no-install-suggests --no-install-recommends \
python-msgpack dh-python python-all-dev build-essential libssl-dev \
python-stdeb fakeroot python-pip libcap-dev
build-essential libcap-dev libssl-dev \
python-all-dev python-msgpack python-pip python-setuptools
RUN pip install --upgrade pip
RUN pip2 install --upgrade pip
EXPOSE 8444 8442
ENV HOME /home/bitmessage
# Install tests dependencies
RUN pip install -r requirements.txt
# Build and install deb
RUN python2 sdist \
&& py2dsc-deb dist/pybitmessage-${VER}.tar.gz \
&& dpkg -i deb_dist/python-pybitmessage_${VER}-1_amd64.deb
RUN pip2 install -r requirements.txt
# Install
RUN python2 install
# Create a user
RUN useradd bitmessage && chown -R bitmessage ${HOME}
USER bitmessage
# Generate default config
RUN src/ -t && mv keys.dat /tmp
# Clean HOME
RUN rm -rf ${HOME}/*
# Generate default config
RUN pybitmessage -t
# Setup environment
RUN mv /tmp/keys.dat . \
&& APIPASS=$(tr -dc a-zA-Z0-9 < /dev/urandom | head -c32 && echo) \
RUN APIPASS=$(tr -dc a-zA-Z0-9 < /dev/urandom | head -c32 && echo) \
&& echo "\napiusername: api\napipassword: $APIPASS" \
&& echo "apienabled = true\napiinterface =\napiusername = api\napipassword = $APIPASS" >> keys.dat

Dockerfile.travis Normal file
View File

@ -0,0 +1,64 @@
FROM ubuntu:bionic AS pybm-travis-bionic
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -yq --no-install-suggests --no-install-recommends \
RUN dpkg --add-architecture i386
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get -y install sudo
RUN apt-get install -yq --no-install-suggests --no-install-recommends \
# travis xenial bionic
python-setuptools libssl-dev libpq-dev python-prctl python-dev \
python-dev python-virtualenv python-pip virtualenv \
# dpkg
python-minimal python-setuptools python-all python openssl libssl-dev \
dh-apparmor debhelper dh-python python-msgpack python-qt4 python-stdeb \
python-all-dev python-crypto python-psutil \
fakeroot python-pytest \
# Code quality
pylint python-pycodestyle python3-pycodestyle pycodestyle python-flake8 \
python3-flake8 flake8 python-pyflakes python3-pyflakes pyflakes pyflakes3 \
curl \
# Wine
python python-pip wget wine-stable winetricks mingw-w64 wine32 wine64 xvfb \
# Buildbot
python3-dev libffi-dev python3-setuptools \
python3-pip \
# python 3.7
python3.7 python3.7-dev \
# .travis.yml
build-essential libcap-dev tor \
# cleanup
RUN rm -rf /var/lib/apt/lists/*
RUN useradd -m -U builder
RUN echo 'builder ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# travis2bash
RUN wget -O /usr/local/bin/
RUN chmod +x /usr/local/bin/
# copy sources
COPY . /home/builder/src
RUN chown -R builder.builder /home/builder/src
USER builder
WORKDIR /home/builder/src
ENTRYPOINT /usr/local/bin/

View File

@ -1,43 +0,0 @@
This sample aims to be as close to a real world example of a mobile. It has a more refined design and also provides a practical example of how a mobile app would interact and communicate with its addresses.
Steps for trying out this sample:
Compile and install the mobile app onto your mobile device or emulator.
Getting Started
This sample uses the kivy as Kivy is an open source, cross-platform Python framework for the development of applications that make use of innovative, multi-touch user interfaces. The aim is to allow for quick and easy interaction design and rapid prototyping whilst making your code reusable and deployable.
Kivy is written in Python and Cython, supports various input devices and has an extensive widget library. With the same codebase, you can target Windows, OS X, Linux, Android and iOS. All Kivy widgets are built with multitouch support.
Kivy in support take Buildozer which is a tool that automates the entire build process. It downloads and sets up all the prerequisite for python-for-android, including the android SDK and NDK, then builds an apk that can be automatically pushed to the device.
Buildozer currently works only in Linux, and is an alpha release, but it already works well and can significantly simplify the apk build.
To build this project, use the "Buildozer android release deploy run" command or use.
Buildozer ue=sed for creating application packages easily.The goal is to have one "buildozer.spec" file in your app directory, describing your application requirements and settings such as title, icon, included modules etc. Buildozer will use that spec to create a package for Android, iOS, Windows, OSX and/or Linux.
Installing Requirements
You can create a package for android using the python-for-android project as with using the Buildozer tool to automate the entire process. You can also see Packaging your application for the Kivy Launcher to run kivy programs without compiling them.
You can get buildozer at or you can directly install using pip install buildozer
This will install buildozer in your system. Afterwards, navigate to your project directory and run:
buildozer init
This creates a buildozer.spec file controlling your build configuration. You should edit it appropriately with your app name etc. You can set variables to control most or all of the parameters passed to python-for-android.
Install buildozers dependencies.
Finally, plug in your android device and run:
buildozer android debug deploy run >> To build, push and automatically run the apk on your device. Here we used debug as tested in debug mode for now.
Packaging your application for the Kivy Launcher

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
Check dependencies and give recommendations about how to satisfy them
@ -144,20 +144,23 @@ for lhs, rhs in EXTRAS_REQUIRE.items():
for x in rhs
rhs_cmd = ''.join([
' ',
' '.join([
''. join([
for x in rhs
"Optional dependency `pip install .[{}]` would require `{}`"
" to be run as root".format(lhs, rhs_cmd))
except Exception as e:
rhs_cmd = ''.join([
' ',
' '.join([
''. join([
for x in rhs
"Optional dependency `pip install .[{}]` would require `{}`"
" to be run as root".format(lhs, rhs_cmd))
if (not compiler or prereqs) and OPSYS in PACKAGE_MANAGER:
print("You can install the missing dependencies by running, as root:")

View File

@ -6,4 +6,4 @@ Comment=Send encrypted messages
Exec=pybitmessage %F

View File

@ -2,3 +2,17 @@
li.wy-breadcrumbs-aside > a.fa {
display: none;
/* Override table width restrictions */
/* @media screen and (min-width: 700px) { */
.wy-table-responsive table td {
/* !important prevents the common CSS stylesheets from overriding
this as on RTD they are loaded after this stylesheet */
white-space: normal !important;
.wy-table-responsive {
overflow: visible !important;
/* } */

View File

@ -0,0 +1,19 @@
# Last Modified: Wed Apr 29 21:04:08 2020
#include <tunables/global>
/usr/bin/pybitmessage {
#include <abstractions/base>
#include <abstractions/fonts>
#include <abstractions/lightdm>
#include <abstractions/python>
#include <abstractions/user-tmp>
owner /home/*/.ICEauthority r,
owner /home/*/.Xauthority r,
owner /home/*/.config/PyBitmessage/ rw,
owner /home/*/.config/PyBitmessage/* rwk,
owner /home/*/.config/Trolltech.conf rwk,
owner /home/*/.config/Trolltech.conf.* rw,
owner /proc/*/mounts r,

View File

@ -0,0 +1,57 @@
"id": "org.bitmessage.BaseApp",
"branch": "19.08",
"runtime": "org.freedesktop.Platform",
"sdk": "org.freedesktop.Sdk",
"runtime-version": "19.08",
"separate-locales": false,
"modules": [
"name": "python-sip",
"sources": [
"type": "archive",
"url": "",
"sha256": "b39d93e937647807bac23579edbff25fe46d16213f708370072574ab1f1b4211"
"buildsystem": "simple",
"build-commands": [
"python --sip-module PyQt4.sip --no-dist-info",
"make install"
"name": "python-qt4",
"sources": [
"type": "archive",
"url": "",
"sha256": "a00f5abef240a7b5852b7924fa5fdf5174569525dc076cd368a566619e56d472"
"buildsystem": "simple",
"build-commands": [
"python -w --confirm-license",
"make install"
"name" : "PyBitmessage-dependencies",
"buildsystem" : "simple",
"build-options": {
"build-args": [
"build-commands": [
"pip --version",
"pip install setuptools msgpack"

View File

@ -0,0 +1,48 @@
"app-id": "org.bitmessage.PyBitmessage",
"runtime": "org.freedesktop.Platform",
"runtime-version": "19.08",
"branch": "stable",
"sdk": "org.freedesktop.Sdk",
"base": "org.bitmessage.BaseApp",
"command": "pybitmessage",
"finish-args" : [
"modules": [
"name" : "PyBitmessage",
"buildsystem" : "simple",
"build-options": {
"build-args": [
"build-commands": [
"python --version",
"python install --prefix=/app --exec-prefix=/app",
"sed -i 's~/usr/bin/~/app/bin/~' /app/bin/pybitmessage",
"cat /app/bin/pybitmessage",
"mv /app/share/applications/pybitmessage.desktop /app/share/applications/org.bitmessage.PyBitmessage.desktop",
"sed -i 's~Icon=pybitmessage~Icon=org.bitmessage.PyBitmessage~' /app/share/applications/org.bitmessage.PyBitmessage.desktop",
"mv /app/share/icons/hicolor/scalable/apps/pybitmessage.svg /app/share/icons/hicolor/scalable/apps/org.bitmessage.PyBitmessage.svg",
"mv /app/share/icons/hicolor/24x24/apps/pybitmessage.png /app/share/icons/hicolor/24x24/apps/org.bitmessage.PyBitmessage.png",
"which pybitmessage"
"sources" : [
"type" : "dir",
"path" : "../../"

@ -0,0 +1 @@
Subproject commit fd4d38328ccb078b88ad4a891807e593ae8de806

View File

@ -1,52 +1,54 @@
# -*- mode: python -*-
import ctypes
import os
import time
import sys
import time
if ctypes.sizeof(ctypes.c_voidp) == 4:
sslName = 'OpenSSL-Win%s' % ("32" if arch == 32 else "64")
site_root = os.path.abspath(HOMEPATH)
spec_root = os.path.abspath(SPECPATH)
arch = 32 if ctypes.sizeof(ctypes.c_voidp) == 4 else 64
cdrivePath = site_root[0:3]
srcPath = os.path.join(spec_root[:-20], "src")
qtBase = "PyQt4"
sslName = 'OpenSSL-Win%i' % arch
openSSLPath = os.path.join(cdrivePath, sslName)
msvcrDllPath = os.path.join(cdrivePath, "windows", "system32")
pythonDllPath = os.path.join(cdrivePath, "Python27")
outPath = os.path.join(spec_root, "bitmessagemain")
qtBase = "PyQt4"
importPath = srcPath
from version import softwareVersion
sys.path.insert(0, srcPath)
today = time.strftime("%Y%m%d")
snapshot = False
os.rename(os.path.join(srcPath, ''), os.path.join(srcPath, ''))
os.path.join(srcPath, ''),
os.path.join(srcPath, ''))
# -*- mode: python -*-
a = Analysis(
[os.path.join(srcPath, '')],
hiddenimports=['bitmessageqt.languagebox', 'pyopencl','numpy', 'win32com' , 'setuptools.msvc' ,'_cffi_backend'],
[os.path.join(srcPath, '')],
'bitmessageqt.languagebox', 'pyopencl', 'numpy', 'win32com',
'setuptools.msvc', '_cffi_backend'
excludes=['bsddb', 'bz2', 'tcl', 'tk', 'Tkinter']
os.path.join(srcPath, ''),
os.path.join(srcPath, ''))
os.rename(os.path.join(srcPath, ''), os.path.join(srcPath, ''))
def addTranslations():
import os
extraDatas = []
for file_ in os.listdir(os.path.join(srcPath, 'translations')):
if file_[-3:] != ".qm":
extraDatas.append((os.path.join('translations', file_),
os.path.join('translations', file_),
os.path.join(srcPath, 'translations', file_), 'DATA'))
for libdir in sys.path:
qtdir = os.path.join(libdir, qtBase, 'translations')
@ -57,57 +59,74 @@ def addTranslations():
for file_ in os.listdir(qtdir):
if file_[0:3] != "qt_" or file_[5:8] != ".qm":
extraDatas.append((os.path.join('translations', file_),
os.path.join('translations', file_),
os.path.join(qtdir, file_), 'DATA'))
return extraDatas
def addUIs():
import os
extraDatas = []
for file_ in os.listdir(os.path.join(srcPath, 'bitmessageqt')):
if file_[-3:] != ".ui":
extraDatas.append((os.path.join('ui', file_), os.path.join(srcPath,
'bitmessageqt', file_), 'DATA'))
return extraDatas
dir_append = os.path.join(srcPath, 'bitmessageqt')
a.datas += [
(os.path.join('ui', file_), os.path.join(dir_append, file_), 'DATA')
for file_ in os.listdir(dir_append) if file_.endswith('.ui')
# append the translations directory
a.datas += addTranslations()
a.datas += addUIs()
a.binaries += [('libeay32.dll', os.path.join(openSSLPath, 'libeay32.dll'), 'BINARY'),
('python27.dll', os.path.join(pythonDllPath, 'python27.dll'), 'BINARY'),
(os.path.join('bitmsghash', 'bitmsghash%i.dll' % (arch)), os.path.join(srcPath, 'bitmsghash', 'bitmsghash%i.dll' % (arch)), 'BINARY'),
(os.path.join('bitmsghash', ''), os.path.join(srcPath, 'bitmsghash', ''), 'BINARY'),
(os.path.join('sslkeys', 'cert.pem'), os.path.join(srcPath, 'sslkeys', 'cert.pem'), 'BINARY'),
(os.path.join('sslkeys', 'key.pem'), os.path.join(srcPath, 'sslkeys', 'key.pem'), 'BINARY')
excluded_binaries = [
a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries])
a.binaries += [
# No effect: libeay32.dll will be taken from PyQt if installed
('libeay32.dll', os.path.join(openSSLPath, 'libeay32.dll'), 'BINARY'),
(os.path.join('bitmsghash', 'bitmsghash%i.dll' % arch),
os.path.join(srcPath, 'bitmsghash', 'bitmsghash%i.dll' % arch),
(os.path.join('bitmsghash', ''),
os.path.join(srcPath, 'bitmsghash', ''), 'BINARY'),
(os.path.join('sslkeys', 'cert.pem'),
os.path.join(srcPath, 'sslkeys', 'cert.pem'), 'BINARY'),
(os.path.join('sslkeys', 'key.pem'),
os.path.join(srcPath, 'sslkeys', 'key.pem'), 'BINARY')
from version import softwareVersion
today = time.strftime("%Y%m%d")
fname = '%s_%%s_%s.exe' % (
('Bitmessagedev', today) if snapshot else ('Bitmessage', softwareVersion)
) % ("x86" if arch == 32 else "x64")
fname = 'Bitmessage_%s_%s.exe' % ("x86" if arch == 32 else "x64", softwareVersion)
if snapshot:
fname = 'Bitmessagedev_%s_%s.exe' % ("x86" if arch == 32 else "x64", today)
pyz = PYZ(a.pure)
exe = EXE(pyz,
console=False, icon= os.path.join(srcPath, 'images', 'can-icon.ico'))
coll = COLLECT(exe,
exe = EXE(
console=False, icon=os.path.join(srcPath, 'images', 'can-icon.ico')
coll = COLLECT(

View File

@ -1,48 +0,0 @@
SHORTDIR=`basename ${CURDIR}`
if [ $ARCH_TYPE == "x86_64" ]; then
if [ $ARCH_TYPE == "i686" ]; then
# Update version numbers automatically - so you don't have to
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/ puppypackage/
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
make clean
# Change the parent directory name to Debian format
mv ../${SHORTDIR} ../${DIR}
# Create a source archive
make sourcedeb
# Build the package
dpkg-buildpackage -F -us -uc
# Sign files
gpg -ba ../${APP}_${VERSION}-1_${ARCH_TYPE}.deb
gpg -ba ../${APP}_${VERSION}.orig.tar.gz
# Restore the parent directory name
mv ../${DIR} ../${SHORTDIR}

View File

@ -1,483 +0,0 @@
pybitmessage (0.6.0-1) trusty; urgency=low
* Bugfixes
* UI improvements
* performance and security improvements
* integration with email gateway (
-- Peter Surda <> Mon, 2 May 2016 16:25:00 +0200
pybitmessage (0.4.4-1) utopic; urgency=low
* Added ability to limit network transfer rate
* Updated to Protocol Version 3
* Removed use of memoryview so that we can support python 2.7.3
* Make use of l10n for localizations
-- Bob Mottram (4096 bits) <> Sun, 2 November 2014 12:55:00 +0100
pybitmessage (0.4.3-1) saucy; urgency=low
* Support pyelliptic's updated HMAC algorithm. We'll remove support for the old method after an upgrade period.
* Improved version check
* Refactored decodeBase58 function
* Ignore duplicate messages
* Added bytes received/sent counts and rate on the network information tab
* Fix unicode handling in 'View HTML code as formatted text'
* Refactor handling of packet headers
* Use pointMult function instead of arithmetic.privtopub since it is faster
* Fixed issue where client wasn't waiting for a verack before continuing on with the conversation
* Fixed CPU hogging by implementing tab-based refresh improvements
* Added curses interface
* Added support for IPv6
* Added a 'trustedpeer' option to keys.dat
* Limit maximum object size to 20 MB
* Support email-like > quote characters and reply-below-quote
* Added Japanese and Dutch language files; updated Norwegian and Russian languages files
-- Bob Mottram (4096 bits) <> Thu, 6 March 2014 20:23:00 +0100
pybitmessage (0.4.2-1) saucy; urgency=low
* Exclude debian directory from orig.tar.gz
* Added Norwegian, Chinese, and Arabic translations
* sock.sendall function isn't atomic.
Let sendDataThread be the only thread which sends data.
* Moved API code to
* Populate comboBoxSendFrom when replying
* Added option to show recent broadcasts when subscribing
* Fixed issue: If Windows username contained an international character,
Bitmessage wouldn't start
* Added some code for FreeBSD compatibility
* Moved responsibility for processing network objects
to the new ObjectProcessorThread
* Refactored main QT module
Moved popup menus initialization to separate methods
Simplified inbox loading
Moved magic strings to the model scope constants so they won't
be created every time.
* Updated list of defaultKnownNodes
* Fixed issue: [Linux] When too many messages arrive too quickly,
exception occurs: "Exceeded maximum number of notifications"
* Fixed issue: creating then deleting an Address in short time crashes
* Refactored code which displays messages to improve code readability
* load "Sent To" label from subscriptions if available
* Removed code to add chans to our address book as it is no longer necessary
* Added identicons
* Modified addresses.decodeAddress so that API command decodeAddress
works properly
* Added API commands createChan, joinChan, leaveChan, deleteAddress
* In pyelliptic, check the return value of RAND_bytes to make sure enough
random data was generated
* Don't store messages in UI table (and thus in memory), pull from SQL
inventory as needed
* Fix typos in API commands addSubscription and getInboxMessagesByAddress
* Add feature in settings menu to give up resending a message after a
specified period of time
-- Bob Mottram (4096 bits) <> Thu, 6 March 2014 20:23:00 +0100
pybitmessage (0.4.1-1) raring; urgency=low
* Fixed whitelist bug
* Fixed chan bug
Added addressversion field to pubkeys table
Sending messages to a chan no longer uses anything in the pubkeys table
Sending messages to yourself is now fully supported
* Change _verifyAddress function to support v4 addresses
-- Bob Mottram (4096 bits) <> Sun, 29 September 2013 09:54:00 +0100
pybitmessage (0.4.0-1) raring; urgency=low
* Raised default demanded difficulty from 1 to 2 for new addresses
* Added v4 addresses:
pubkeys are now encrypted and tagged in the inventory
* Use locks when accessing dictionary inventory
* Refactored the way inv and addr messages are shared
* Give user feedback when disk is full
* Added chan true/false to listAddresses results
* When replying using chan address, send to whole chan not just sender
* Refactored of the way PyBitmessage looks for interesting new objects
in large inv messages from peers
* Show inventory lookup rate on Network Status tab
* Added SqlBulkExecute class
so we can update inventory with only one commit
* Updated Russian translations
* Move duplicated SQL code into helper
* Allow specification of alternate settings dir
via BITMESSAGE_HOME environment variable
* Removed use of gevent. Removed
* Added Sip and PyQt to includes in
* Show number of each message type processed
in the API command clientStatus
* Use fast PoW
unless we're explicitly a frozen (binary) version of the code
* Enable user-set localization in settings
* Fix Archlinux package creation
* Fallback to language only localization when region doesn't match
* Fixed brew install instructions
* Added German translation
* Made inbox and sent messages table panels read-only
* Allow inbox and sent preview panels to resize
* Count RE: as a reply header, just like Re: so we don't chain Re: RE:
* Fix for traceback on OSX
* Added backend ability to understand shorter addresses
* Convert 'API Error' to raise APIError()
* Added option in settings to allow sending to a mobile device
(app not yet done)
* Added ability to start daemon mode when using Bitmessage as a module
* Improved the way client detects locale
* Added API commands:
getInboxMessageIds, getSentMessageIds, listAddressBookEntries,
trashSentMessageByAckData, addAddressBookEntry,
deleteAddressBookEntry, listAddresses2, listSubscriptions
* Set a maximum frequency for playing sounds
* Show Invalid Method error in same format as other API errors
* Update status of separate broadcasts separately
even if the sent data is identical
* Added Namecoin integration
* Internally distinguish peers by IP and port
* Inbox message retrieval API
functions now also returns read status
-- Bob Mottram (4096 bits) <> Sat, 28 September 2013 09:54:00 +0100
pybitmessage (0.3.5-1) raring; urgency=low
* Inbox message retrieval API functions now also returns read status
* Added right-click option to mark a message as unread
* Prompt user to connect at first startup
* Install into /usr/local by default
* Add a missing rm -f to the uninstall task.
* Use system text color for enabled addresses instead of black
* Added support for Chans
* Start storing msgid in sent table
* Optionally play sounds on connection/disconnection or when messages arrive
* Adding configuration option to listen for connections when using SOCKS
* Added packaging for multiple distros (Arch, Puppy, Slack, etc.)
* Added Russian translation
* Added search support in the UI
* Added 'make uninstall'
* To improve OSX support, use PKCS5_PBKDF2_HMAC_SHA1
if PKCS5_PBKDF2_HMAC is unavailable
* Added better warnings for OSX users who are using old versions of Python
* Repaired debian packaging
* Altered Makefile to avoid needing to chase changes
* Added logger module
* Added bgWorker class for background tasks
* Added use of gevent module
* On not-Windows: Fix insecure keyfile permissions
* Fix 100% CPU usage issue
-- Bob Mottram (4096 bits) <> Mon, 29 July 2013 22:11:00 +0100
pybitmessage (0.3.4-1) raring; urgency=low
* Switched addr, msg, broadcast, and getpubkey message types
to 8 byte time. Last remaining type is pubkey.
* Added tooltips to show the full subject of messages
* Added Maximum Acceptable Difficulty fields in the settings
* Send out pubkey immediately after generating deterministic
addresses rather than waiting for a request
-- Bob Mottram (4096 bits) <> Sun, 30 June 2013 11:23:00 +0100
pybitmessage (0.3.3-1) raring; urgency=low
* Remove inbox item from GUI when using API command trashMessage
* Add missing trailing semicolons to pybitmessage.desktop
* Ensure $(DESTDIR)/usr/bin exists
* Update Makefile to correct sandbox violations when built
via Portage (Gentoo)
* Fix message authentication bug
-- Bob Mottram (4096 bits) <> Sat, 29 June 2013 11:23:00 +0100
pybitmessage (0.3.211-1) raring; urgency=low
* Removed multi-core proof of work
as the multiprocessing module does not work well with
pyinstaller's --onefile option.
-- Bob Mottram (4096 bits) <> Fri, 28 June 2013 11:23:00 +0100
pybitmessage (0.3.2-1) raring; urgency=low
* Bugfix: Remove remaining references to the old myapp.trayIcon
* Refactored message status-related code. API function getStatus
now returns one of these strings: notfound, msgqueued,
broadcastqueued, broadcastsent, doingpubkeypow, awaitingpubkey,
doingmsgpow, msgsent, or ackreceived
* Moved proof of work to low-priority multi-threaded child
* Added menu option to delete all trashed messages
* Added inv flooding attack mitigation
* On Linux, when selecting Show Bitmessage, do not maximize
* Store tray icons in
-- Bob Mottram (4096 bits) <> Mon, 03 June 2013 20:17:00 +0100
pybitmessage (0.3.1-1) raring; urgency=low
* Added new API commands: getDeterministicAddress,
addSubscription, deleteSubscription
* TCP Connection timeout for non-fully-established connections
now 20 seconds
* Don't update the time we last communicated with a node unless
the connection is fully established. This will allow us to
forget about active but non-Bitmessage nodes which have made
it into our knownNodes file.
* Prevent incoming connection flooding from crashing
singleListener thread. Client will now only accept one
connection per remote node IP
* Bugfix: Worker thread crashed when doing a POW to send out
a v2 pubkey (bug introduced in 0.3.0)
* Wrap all sock.shutdown functions in error handlers
* Put all 'commit' commands within SQLLocks
* Bugfix: If address book label is blank, Bitmessage wouldn't
show message (bug introduced in 0.3.0)
* Messaging menu item selects the oldest unread message
* Standardize on 'Quit' rather than 'Exit'
* [OSX] Try to seek homebrew installation of OpenSSL
* Prevent multiple instances of the application from running
* Show 'Connected' or 'Connection Lost' indicators
* Use only 9 half-open connections on Windows but 32 for
everyone else
* Added appIndicator (a more functional tray icon) and Ubuntu
Messaging Menu integration
* Changed Debian install directory and run script name based
on Github issue #135
-- Jonathan Warren (4096 bits) <> Sat, 25 May 2013 12:06:00 +0100
pybitmessage (0.3.0-1) raring; urgency=low
* Added new API function: getStatus
* Added error-handling around all sock.sendall() functions
in the receiveData thread so that if there is a problem
sending data, the threads will close gracefully
* Abandoned and removed the connectionsCount data structure;
use the connectedHostsList instead because it has proved to be
more accurate than trying to maintain the connectionsCount
* Added daemon mode. All UI code moved into a module and many
shared objects moved into
* Truncate display of very long messages to avoid freezing the UI
* Added encrypted broadcasts for v3 addresses or v2 addresses
after 2013-05-28 10:00 UTC