Compare commits

...

66 Commits

Author SHA1 Message Date
Muzahid 59311f3f31
update core changes reuse sql_helper in testcase
2 years ago
Muzahid a3e52099bc
update test and thread
2 years ago
Muzahid e41d200e81
add sql file for the query
2 years ago
Muzahid ff84454a95
change as per creae_function
2 years ago
Muzahid 27e07954a0
refactor methods and add create_function and its test
2 years ago
Muzahid 56dea46d98
refactor the versioning code and apply sql files behalf of query
2 years ago
Muzahid a38bcb2f04
rever changes
2 years ago
Muzahid 7a076e92fe
fix py3 import error
2 years ago
Muzahid ce0f99a8c2
refactor the sqlthread test cases and fix py3 issue
2 years ago
Muzahid 17d40ef43c
test case for versioning 10,9,8,1
2 years ago
Muzahid aed71c11ab
test case for sqlthread version 1
2 years ago
Muzahid b6155b1af3
fix db migration issue
2 years ago
Dmitri Bogomolov f2b4c97d1d
Handle old psutil in TestProcess
2 years ago
Dmitri Bogomolov bb433ac58b
Replaced print operator by print function in network.asyncore_pollchoose
2 years ago
Dmitri Bogomolov d46bda07e3
Don't run tests when build deb
2 years ago
Dmitri Bogomolov b4247409c6
Work around deprecation of platform.dist() in recent python
2 years ago
Dmitri Bogomolov c1b533f8db
Remove import from debug from openclpow, remove shebang, format
2 years ago
Dmitri Bogomolov 52146b8394
Support tox and request more warnings:
2 years ago
Dmitri Bogomolov 52a1ac21a8
Fix python3 issues in test_blindsig:
2 years ago
Dmitri Bogomolov 8e8697d9b2
Fix python3 issues in test_crypto:
2 years ago
Dmitri Bogomolov 28a602536f
Make addresses module available for testing with python3:
2 years ago
Dmitri Bogomolov ea6f23e596
test_randomtrackingdict: revert bytes to string for python3
2 years ago
Dmitri Bogomolov eede298a22
Fix python3 issues in pyelliptic:
2 years ago
Dmitri Bogomolov 0e9674bce1
Universal pathmagic returns app dir; activated in setup for python3
2 years ago
Dmitri Bogomolov eaab6d3f5f
Use common.skip_python3() to skip tests modules not supporting python3
2 years ago
Dmitri Bogomolov dba54841bf
Add normal exit in depends if detected python3
2 years ago
Dmitri Bogomolov 9dabd31470
Add python 3.7. Use general shebangs in scripts to test with python3;
2 years ago
Peter Šurda 1adb593cfa
Add Dockerfile for running test
2 years ago
Dmitri Bogomolov 0c4f3e0dc0
Move desktop plugin initialization to updateStartOnLogon(); Fixes: #1735
2 years ago
Dmitri Bogomolov da1dcfd62f
Entry point 'desktop' for plugins managing desktop environment;
2 years ago
Dmitri Bogomolov 4c214b945b
Added Network category in desktop file
2 years ago
Dmitri Bogomolov 552733778b
Move addressbook test to bitmessageqt.tests because it uses Qt
2 years ago
Dmitri Bogomolov b0cc81d643
A test for listening port 8444
2 years ago
Dmitri Bogomolov f5fa7d47ad
Add test for BITMESSAGE_HOME
2 years ago
Dmitri Bogomolov 30a78901f9
Instruct git to use LF as line ending for knownnodes.dat test pattern
2 years ago
Dmitri Bogomolov 7497cc5704
Format and simplify bitmessagemain.spec, exclude unused libs and files
2 years ago
Muzahid 42007d02ad
fix DB thread issue
2 years ago
surbhicis 3fa531c223
remove kivy specification file along with component changes of version from upstream
2 years ago
Muzahid 0dfc4dac7b
test commit
2 years ago
Muzahid bb38c158fe
Refactoring of database upgrade mechanism
2 years ago
Muzahid 583e5910fe
proper inherit remove return from __init__
2 years ago
Muzahid 31c5e4ff38
remove no in case
2 years ago
Muzahid cdc2977331
Migrate Db with respect to their versions
2 years ago
navjot 86001ce749
remove TestProcessProto import from test_openclpow module
2 years ago
Dmitri Bogomolov f23487a155
Prevent adding bootstrap servers to knownnodes when received in addr
2 years ago
Dmitri Bogomolov 3feea1ee3f
Shorten Bootstrapper methods:
2 years ago
Dmitri Bogomolov 1b198e9a4a
Try to find bootstrap server in knownnodes after bootstrapping
2 years ago
Dmitri Bogomolov 1a3a7089cc
A separate test for dontconnect setting
2 years ago
Dmitri Bogomolov f75268bc56
Set close_reason for exceptions in network.tls
2 years ago
Dmitri Bogomolov 2a8e91e6a7
Fixing tor related tests:
2 years ago
Dmitri Bogomolov 9b27e6734a
Another possible approach for connection check
2 years ago
Dmitri Bogomolov 93c86bc8d5
A separate test for connection to bootstrap servers
2 years ago
navjot 0283339138
add Gpu skip condition and setupclass in test_openclpow module
2 years ago
navjot 27383ff635
test case for openclpow module
2 years ago
navjot a5786f72e6
replace print with logger and remove unused file
2 years ago
surbhicis 8dd766fcb8
detach kivy version from upstream
2 years ago
navjot 07a1ce9914
imported helper_addressGenerator module
2 years ago
navjot 7825229444
updated addressbook table in class_sqlThread module
2 years ago
navjot c61436a5ca
written test case for addressbook
2 years ago
navjot 4e1990b63e
fixed Own address should not save in address book issue
2 years ago
navjot 8763c80bad
added general exception handler
2 years ago
navjot c96f51b193
ignoring ValueError from proofofwork module
2 years ago
navjot 16ded2c558
added timer of less then 10 seconds
2 years ago
navjot d24bf4b8af
remove qt dependency
2 years ago
navjot 6e236680cd
add helper_addressGenerator module
2 years ago
813492291816 6e69755c8a
Add missing TTL to API sendMessage
2 years ago

3
.gitattributes vendored

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

@ -1,6 +1,9 @@
language: python
cache: pip
dist: bionic
python:
- "2.7"
- "2.7_with_system_site_packages"
- "3.7"
addons:
apt:
packages:
@ -11,9 +14,9 @@ addons:
- xvfb
install:
- pip install -r requirements.txt
- ln -s src pybitmessage # tests environment
- python setup.py install
- export PYTHONWARNINGS=all
script:
- python checkdeps.py
- xvfb-run src/bitmessagemain.py -t
- python setup.py test
- python -bm tests

@ -0,0 +1,64 @@
FROM ubuntu:bionic AS pybm-travis-bionic
ENV DEBIAN_FRONTEND noninteractive
ENV TRAVIS_SKIP_APT_UPDATE 1
RUN apt-get update
RUN apt-get install -yq --no-install-suggests --no-install-recommends \
software-properties-common
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 \
language-pack-en
# 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/travis2bash.sh https://git.bitmessage.org/Bitmessage/buildbot-scripts/raw/branch/master/travis2bash.sh
RUN chmod +x /usr/local/bin/travis2bash.sh
# copy sources
COPY . /home/builder/src
RUN chown -R builder.builder /home/builder/src
USER builder
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
WORKDIR /home/builder/src
ENTRYPOINT /usr/local/bin/travis2bash.sh

@ -1,43 +0,0 @@
PyBitmessage(Android)
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 https://github.com/kivy/buildozer 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

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
"""
Check dependencies and give recommendations about how to satisfy them

@ -6,4 +6,4 @@ Comment=Send encrypted messages
Exec=pybitmessage %F
Icon=pybitmessage
Terminal=false
Categories=Office;Email;
Categories=Office;Email;Network;

@ -1,52 +1,54 @@
# -*- mode: python -*-
import ctypes
import os
import time
import sys
import time
if ctypes.sizeof(ctypes.c_voidp) == 4:
arch=32
else:
arch=64
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
sys.path.insert(0,importPath)
os.chdir(sys.path[0])
from version import softwareVersion
sys.path.insert(0, srcPath)
os.chdir(srcPath)
today = time.strftime("%Y%m%d")
snapshot = False
os.rename(os.path.join(srcPath, '__init__.py'), os.path.join(srcPath, '__init__.py.backup'))
os.rename(
os.path.join(srcPath, '__init__.py'),
os.path.join(srcPath, '__init__.py.backup'))
# -*- mode: python -*-
a = Analysis(
[os.path.join(srcPath, 'bitmessagemain.py')],
pathex=[outPath],
hiddenimports=['bitmessageqt.languagebox', 'pyopencl','numpy', 'win32com' , 'setuptools.msvc' ,'_cffi_backend'],
hookspath=None,
runtime_hooks=None
)
[os.path.join(srcPath, 'bitmessagemain.py')],
pathex=[outPath],
hiddenimports=[
'bitmessageqt.languagebox', 'pyopencl', 'numpy', 'win32com',
'setuptools.msvc', '_cffi_backend'
],
hookspath=None,
runtime_hooks=None,
excludes=['bsddb', 'bz2', 'tcl', 'tk', 'Tkinter']
)
os.rename(
os.path.join(srcPath, '__init__.py.backup'),
os.path.join(srcPath, '__init__.py'))
os.rename(os.path.join(srcPath, '__init__.py.backup'), os.path.join(srcPath, '__init__.py'))
def addTranslations():
import os
extraDatas = []
for file_ in os.listdir(os.path.join(srcPath, 'translations')):
if file_[-3:] != ".qm":
continue
extraDatas.append((os.path.join('translations', file_),
extraDatas.append((
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":
continue
extraDatas.append((os.path.join('translations', file_),
extraDatas.append((
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":
continue
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', 'bitmsghash.cl'), os.path.join(srcPath, 'bitmsghash', 'bitmsghash.cl'), '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')
]
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)
excluded_binaries = [
'QtOpenGL4.dll',
'QtSvg4.dll',
'QtXml4.dll',
]
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),
'BINARY'),
(os.path.join('bitmsghash', 'bitmsghash.cl'),
os.path.join(srcPath, 'bitmsghash', 'bitmsghash.cl'), '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")
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
a.binaries,
[],
name=fname,
debug=False,
strip=None,
upx=False,
console=False, icon= os.path.join(srcPath, 'images', 'can-icon.ico'))
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=False,
name='main')
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=fname,
debug=False,
strip=None,
upx=False,
console=False, icon=os.path.join(srcPath, 'images', 'can-icon.ico')
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=False,
name='main'
)

@ -1,3 +1,4 @@
coverage
python_prctl
psutil
pycrypto

@ -0,0 +1,4 @@
#!/bin/bash
docker build -t pybm-travis-bionic -f Dockerfile.travis .
docker run pybm-travis-bionic

@ -12,6 +12,7 @@ from src.version import softwareVersion
EXTRAS_REQUIRE = {
'docs': ['sphinx', 'sphinxcontrib-apidoc', 'm2r'],
'gir': ['pygobject'],
'json': ['jsonrpclib'],
'notify2': ['notify2'],
@ -20,8 +21,8 @@ EXTRAS_REQUIRE = {
'qrcode': ['qrcode'],
'sound;platform_system=="Windows"': ['winsound'],
'tor': ['stem'],
'xml': ['defusedxml'],
'docs': ['sphinx', 'sphinxcontrib-apidoc', 'm2r']
'xdg': ['pyxdg'],
'xml': ['defusedxml']
}
@ -94,11 +95,14 @@ if __name__ == "__main__":
['desktop/icons/24x24/pybitmessage.png'])
]
if platform.dist()[0] in ('Debian', 'Ubuntu'):
data_files += [
("etc/apparmor.d/",
['packages/apparmor/pybitmessage'])
]
try:
if platform.dist()[0] in ('Debian', 'Ubuntu'):
data_files += [
("etc/apparmor.d/",
['packages/apparmor/pybitmessage'])
]
except AttributeError:
pass # FIXME: use distro for more recent python
dist = setup(
name='pybitmessage',
@ -115,6 +119,7 @@ if __name__ == "__main__":
#keywords='',
install_requires=installRequires,
tests_require=requirements,
test_suite='tests.unittest_discover',
extras_require=EXTRAS_REQUIRE,
classifiers=[
"License :: OSI Approved :: MIT License"
@ -153,6 +158,9 @@ if __name__ == "__main__":
'libmessaging ='
'pybitmessage.plugins.indicator_libmessaging [gir]'
],
'bitmessage.desktop': [
'freedesktop = pybitmessage.plugins.desktop_xdg [xdg]'
],
'bitmessage.proxyconfig': [
'stem = pybitmessage.plugins.proxyconfig_stem [tor]'
],

@ -3,10 +3,12 @@ Operations with addresses
"""
# pylint: disable=redefined-outer-name,inconsistent-return-statements
import hashlib
import logging
from binascii import hexlify, unhexlify
from struct import pack, unpack
from debug import logger
logger = logging.getLogger('default')
ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
@ -23,8 +25,7 @@ def encodeBase58(num, alphabet=ALPHABET):
arr = []
base = len(alphabet)
while num:
rem = num % base
num = num // base
num, rem = divmod(num, base)
arr.append(alphabet[rem])
arr.reverse()
return ''.join(arr)
@ -148,16 +149,16 @@ def encodeAddress(version, stream, ripe):
'Programming error in encodeAddress: The length of'
' a given ripe hash was not 20.'
)
if ripe[:2] == '\x00\x00':
if ripe[:2] == b'\x00\x00':
ripe = ripe[2:]
elif ripe[:1] == '\x00':
elif ripe[:1] == b'\x00':
ripe = ripe[1:]
elif version == 4:
if len(ripe) != 20:
raise Exception(
'Programming error in encodeAddress: The length of'
' a given ripe hash was not 20.')
ripe = ripe.lstrip('\x00')
ripe = ripe.lstrip(b'\x00')
storedBinaryData = encodeVarint(version) + encodeVarint(stream) + ripe
@ -191,8 +192,8 @@ def decodeAddress(address):
status = 'invalidcharacters'
return status, 0, 0, ''
# after converting to hex, the string will be prepended
# with a 0x and appended with a L
hexdata = hex(integer)[2:-1]
# with a 0x and appended with a L in python2
hexdata = hex(integer)[2:].rstrip('L')
if len(hexdata) % 2 != 0:
hexdata = '0' + hexdata
@ -242,13 +243,13 @@ def decodeAddress(address):
data[bytesUsedByVersionNumber + bytesUsedByStreamNumber:-4]
if len(embeddedRipeData) == 19:
return status, addressVersionNumber, streamNumber, \
'\x00' + embeddedRipeData
b'\x00' + embeddedRipeData
elif len(embeddedRipeData) == 20:
return status, addressVersionNumber, streamNumber, \
embeddedRipeData
elif len(embeddedRipeData) == 18:
return status, addressVersionNumber, streamNumber, \
'\x00\x00' + embeddedRipeData
b'\x00\x00' + embeddedRipeData
elif len(embeddedRipeData) < 18:
return 'ripetooshort', 0, 0, ''
elif len(embeddedRipeData) > 20:
@ -257,7 +258,7 @@ def decodeAddress(address):
elif addressVersionNumber == 4:
embeddedRipeData = \
data[bytesUsedByVersionNumber + bytesUsedByStreamNumber:-4]
if embeddedRipeData[0:1] == '\x00':
if embeddedRipeData[0:1] == b'\x00':
# In order to enforce address non-malleability, encoded
# RIPE data must have NULL bytes removed from the front
return 'encodingproblem', 0, 0, ''
@ -265,7 +266,7 @@ def decodeAddress(address):
return 'ripetoolong', 0, 0, ''
elif len(embeddedRipeData) < 4:
return 'ripetooshort', 0, 0, ''
x00string = '\x00' * (20 - len(embeddedRipeData))
x00string = b'\x00' * (20 - len(embeddedRipeData))
return status, addressVersionNumber, streamNumber, \
x00string + embeddedRipeData

@ -1112,7 +1112,7 @@ class BMRPCDispatcher(object):
ackdata = helper_sent.insert(
toAddress=toAddress, fromAddress=fromAddress,
subject=subject, message=message, encoding=encodingType)
subject=subject, message=message, encoding=encodingType, ttl=TTL)
toLabel = ''
queryreturn = sqlQuery(

@ -983,7 +983,7 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body="", reply=F
def loadInbox():
"""Load the list of messages"""
sys.stdout = sys.__stdout__
print "Loading inbox messages..."
print("Loading inbox messages...")
sys.stdout = printlog
where = "toaddress || fromaddress || subject || message"
@ -1035,7 +1035,7 @@ def loadInbox():
def loadSent():
"""Load the messages that sent"""
sys.stdout = sys.__stdout__
print "Loading sent messages..."
print("Loading sent messages...")
sys.stdout = printlog
where = "toaddress || fromaddress || subject || message"
@ -1121,7 +1121,7 @@ def loadSent():
def loadAddrBook():
"""Load address book"""
sys.stdout = sys.__stdout__
print "Loading address book..."
print("Loading address book...")
sys.stdout = printlog
ret = sqlQuery("SELECT label, address FROM addressbook")
@ -1228,7 +1228,7 @@ def run(stdscr):
def doShutdown():
"""Shutting the app down"""
sys.stdout = sys.__stdout__
print "Shutting down..."
print("Shutting down...")
sys.stdout = printlog
shutdown.doCleanShutdown()
sys.stdout = sys.__stdout__

@ -1,45 +0,0 @@
from helper_sql import *
def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, what=None, unreadOnly=False):
if what is not None and what != "":
what = "%" + what + "%"
else:
what = None
if folder == "sent":
sqlStatementBase = '''
SELECT toaddress, fromaddress, subject, status, ackdata, lastactiontime
FROM sent '''
else:
sqlStatementBase = '''SELECT folder, msgid, toaddress, fromaddress, subject, received, read
FROM inbox '''
sqlStatementParts = []
sqlArguments = []
if account is not None:
if xAddress == 'both':
sqlStatementParts.append("(fromaddress = ? OR toaddress = ?)")
sqlArguments.append(account)
sqlArguments.append(account)
else:
sqlStatementParts.append(xAddress + " = ? ")
sqlArguments.append(account)
if folder is not None:
if folder == "new":
folder = "inbox"
unreadOnly = True
sqlStatementParts.append("folder = ? ")
sqlArguments.append(folder)
else:
sqlStatementParts.append("folder != ?")
sqlArguments.append("trash")
if what is not None:
sqlStatementParts.append("%s LIKE ?" % (where))
sqlArguments.append(what)
if unreadOnly:
sqlStatementParts.append("read = 0")
if len(sqlStatementParts) > 0:
sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts)
if folder == "sent":
sqlStatementBase += " ORDER BY lastactiontime"
return sqlQuery(sqlStatementBase, sqlArguments)

@ -1,354 +0,0 @@
#:import la kivy.adapters.listadapter
#:import factory kivy.factory
#:import mpybit bitmessagekivy.mpybit
#:import C kivy.utils.get_color_from_hex
<Navigator>:
id: nav_drawer
NavigationDrawerIconButton:
Spinner:
pos_hint:{"x":0,"y":.3}
id: btn
background_color: app.theme_cls.primary_dark
text: app.showmeaddresses(name='text')
values: app.showmeaddresses(name='values')
on_text:app.getCurrentAccountData(self.text)
NavigationDrawerIconButton:
icon: 'email-open'
text: "inbox"
on_release: app.root.ids.scr_mngr.current = 'inbox'
NavigationDrawerIconButton:
icon: 'mail-send'
text: "sent"
on_release: app.root.ids.scr_mngr.current = 'sent'
NavigationDrawerIconButton:
icon: 'dropbox'
text: "trash"
on_release: app.root.ids.scr_mngr.current = 'trash'
NavigationDrawerIconButton:
icon: 'email'
text: "drafts"
on_release: app.root.ids.scr_mngr.current = 'dialog'
NavigationDrawerIconButton:
icon: 'markunread-mailbox'
text: "test"
on_release: app.root.ids.scr_mngr.current = 'test'
NavigationDrawerIconButton:
text: "new identity"
icon:'accounts-add'
on_release: app.root.ids.scr_mngr.current = 'newidentity'
BoxLayout:
orientation: 'vertical'
Toolbar:
id: toolbar
title: app.getCurrentAccount()
background_color: app.theme_cls.primary_dark
left_action_items: [['menu', lambda x: app.nav_drawer.toggle()]]
Button:
text:"EXIT"
color: 0,0,0,1
background_color: (0,0,0,0)
size_hint_y: 0.4
size_hint_x: 0.1
pos_hint: {'x': 0.8, 'y':0.4}
on_press: app.say_exit()
ScreenManager:
id: scr_mngr
Inbox:
id:sc1
Sent:
id:sc2
Trash:
id:sc3
Dialog:
id:sc4
Test:
id:sc5
Create:
id:sc6
NewIdentity:
id:sc7
Page:
id:sc8
AddressSuccessful:
id:sc9
Button:
id:create
height:100
size_hint_y: 0.13
size_hint_x: 0.1
pos_hint: {'x': 0.85, 'y': 0.5}
background_color: (0,0,0,0)
on_press: scr_mngr.current = 'create'
Image:
source: 'images/plus.png'
y: self.parent.y - 7.5
x: self.parent.x + self.parent.width - 50
size: 70, 70
<SwipeButton@Carousel>:
text: ''
size_hint_y: None
height: 48
ignore_perpendicular_swipes: True
data_index: 0
min_move: 20 / self.width
on__offset: app.update_index(root.data_index, self.index)
canvas.before:
Color:
rgba: C('FFFFFF33')
Rectangle:
pos: self.pos
size: self.size
Line:
rectangle: self.pos + self.size
Button:
text: 'delete ({}:{})'.format(root.text, root.data_index)
on_press: app.delete(root.data_index)
Button:
text: root.text
on_press: app.getInboxMessageDetail(self.text)
Button:
text: 'archive'
on_press: app.archive(root.data_index)
<Inbox>:
name: 'inbox'
RecycleView:
data: root.data
viewclass: 'SwipeButton'
do_scroll_x: False
scroll_timeout: 100
RecycleBoxLayout:
id:rc
orientation: 'vertical'
size_hint_y: None
height: self.minimum_height
default_size_hint: 1, None
canvas.before:
Color:
rgba: 0,0,0, 1
Rectangle:
pos: self.pos
size: self.size
<Sent>:
name: 'sent'
RecycleView:
data: root.data
viewclass: 'SwipeButton'
do_scroll_x: False
scroll_timeout: 100
RecycleBoxLayout:
id:rc
orientation: 'vertical'
size_hint_y: None
height: self.minimum_height
default_size_hint: 1, None
canvas.before:
Color:
rgba: 0,0,0, 1
Rectangle:
pos: self.pos
size: self.size
<Trash>:
name: 'trash'
RecycleView:
data: root.data
viewclass: 'SwipeButton'
do_scroll_x: False
scroll_timeout: 100
RecycleBoxLayout:
id:rc
orientation: 'vertical'
size_hint_y: None
height: self.minimum_height
default_size_hint: 1, None
canvas.before:
Color:
rgba: 0,0,0, 1
Rectangle:
pos: self.pos
size: self.size
<Dialog>:
name: 'dialog'
Label:
text:"I have a good dialox box"
color: 0,0,0,1
<Test>:
name: 'test'
Label:
text:"I am in test"
color: 0,0,0,1
<Create>:
name: 'create'
GridLayout:
rows: 5
cols: 1
padding: 60,60,60,60
spacing: 50
BoxLayout:
size_hint_y: None
height: '32dp'
Label:
text: 'FROM'
color: 0,0,0,1
Spinner:
size_hint: 1,1
pos_hint: {"x":0,"top":1.}
pos: 10,10
id: spinner_id
text: app.showmeaddresses(name='text')
values: app.showmeaddresses(name='values')
BoxLayout:
size_hint_y: None
height: '32dp'
Label:
text: 'TO'
color: 0,0,0,1
TextInput:
id: recipent
hint_text: 'To'
BoxLayout:
size_hint_y: None
height: '32dp'
Label:
text: 'SUBJECT'
color: 0,0,0,1
TextInput:
id: subject
hint_text: 'SUBJECT'
BoxLayout:
size_hint_y: None
height: '32dp'
Label:
text: 'BODY'
color: 0,0,0,1
TextInput:
id: message
multiline:True
size_hint: 1,2
Button:
text: 'send'
size_hint_y: 0.1
size_hint_x: 0.2
height: '32dp'
pos_hint: {'x': .5, 'y': 0.1}
on_press: root.send()
Button:
text: 'cancel'
size_hint_y: 0.1
size_hint_x: 0.2
height: '32dp'
pos_hint: {'x': .72, 'y': 0.1}
on_press: root.cancel()
<NewIdentity>:
name: 'newidentity'
GridLayout:
padding: '120dp'
cols: 1
Label:
text:"""Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged."""
line_height:1.5
text_size:(700,None)
color: 0,0,0,1
BoxLayout:
CheckBox:
canvas.before:
Color:
rgb: 1,0,0
Ellipse:
pos:self.center_x-8, self.center_y-8
size:[16,16]
group: "money"
id:chk
text:"use a random number generator to make an address"
on_active:
root.checked = self.text
active:root.is_active
Label:
text: "use a random number generator to make an address"
color: 0,0,0,1
BoxLayout:
CheckBox:
canvas.before:
Color:
rgb: 1,0,0
Ellipse:
pos:self.center_x-8, self.center_y-8
size:[16,16]
group: "money"
id:chk
text:"use a pseudo number generator to make an address"
on_active:
root.checked = self.text
active:not root.is_active
Label:
text: "use a pseudo number generator to make an address"
color: 0,0,0,1
Label:
color: 0,0,0,1
size_hint_x: .35
markup: True
text: "[b]{}[/b]".format("Randomly generated addresses")
BoxLayout:
size_hint_y: None
height: '32dp'
Label:
text: "Label (not shown to anyone except you)"
color: 0,0,0,1
BoxLayout:
size_hint_y: None
height: '32dp'
TextInput:
id: label
Button:
text: 'Cancel'
size_hint_y: 0.1
size_hint_x: 0.3
height: '32dp'
pos_hint: {'x': .1, 'y': 0.1}
Button:
text: 'Ok'
size_hint_y: 0.1
size_hint_x: 0.3
height: '32dp'
pos_hint: {'x': .5, 'y': 0.1}
on_press: root.generateaddress()
<Page>:
name: 'page'
Label:
text: 'I am on description of my email yooooo'
color: 0,0,0,1
<AddressSuccessful>:
name: 'add_sucess'
Label:
text: 'Successfully created a new bit address'
color: 0,0,0,1

@ -1,393 +0,0 @@
import kivy_helper_search
import os
import queues
import shutdown
import state
import time
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import BooleanProperty
from kivy.clock import Clock
from navigationdrawer import NavigationDrawer
from kivy.properties import ObjectProperty, StringProperty, ListProperty
from kivy.uix.screenmanager import Screen
from kivy.uix.textinput import TextInput
from kivymd.theming import ThemeManager
from kivymd.toolbar import Toolbar
from bmconfigparser import BMConfigParser
from helper_ackPayload import genAckPayload
from addresses import decodeAddress, addBMIfNotPresent
from helper_sql import sqlExecute
statusIconColor = 'red'
class NavigateApp(App, TextInput):
"""Application uses kivy in which base Class of Navigate App inherits from the App class."""
theme_cls = ThemeManager()
nav_drawer = ObjectProperty()
def build(self):
"""Return a main_widget as a root widget.
An application can be built if you return a widget on build(), or if you set
self.root.
"""
main_widget = Builder.load_file(
os.path.join(os.path.dirname(__file__), 'main.kv'))
self.nav_drawer = Navigator()
return main_widget
def getCurrentAccountData(self, text):
"""Get Current Address Account Data."""
state.association = text
self.root.ids.sc1.clear_widgets()
self.root.ids.sc2.clear_widgets()
self.root.ids.sc3.clear_widgets()
self.root.ids.sc1.add_widget(Inbox())
self.root.ids.sc2.add_widget(Sent())
self.root.ids.sc3.add_widget(Trash())
self.root.ids.toolbar.title = BMConfigParser().get(
state.association, 'label') + '({})'.format(state.association)
Inbox()
Sent()
Trash()
def say_exit(self):
"""Exit the application as uses shutdown PyBitmessage."""
print("**************************EXITING FROM APPLICATION*****************************")
App.get_running_app().stop()
shutdown.doCleanShutdown()
@staticmethod
def showmeaddresses(name="text"):
"""Show the addresses in spinner to make as dropdown."""
if name == "text":
return BMConfigParser().addresses()[0]
elif name == "values":
return BMConfigParser().addresses()
def update_index(self, data_index, index):
"""Update index after archieve message to trash."""
if self.root.ids.scr_mngr.current == 'inbox':
self.root.ids.sc1.data[data_index]['index'] = index
elif self.root.ids.scr_mngr.current == 'sent':
self.root.ids.sc2.data[data_index]['index'] = index
elif self.root.ids.scr_mngr.current == 'trash':
self.root.ids.sc3.data[data_index]['index'] = index
def delete(self, data_index):
"""It will make delete using remove function."""
print("delete {}".format(data_index))
self._remove(data_index)
def archive(self, data_index):
"""It will make archieve using remove function."""
print("archive {}".format(data_index))
self._remove(data_index)
def _remove(self, data_index):
"""It will remove message by resetting the values in recycleview data."""
if self.root.ids.scr_mngr.current == 'inbox':
self.root.ids.sc1.data.pop(data_index)
self.root.ids.sc1.data = [{
'data_index': i,
'index': d['index'],
'height': d['height'],
'text': d['text']}
for i, d in enumerate(self.root.ids.sc1.data)
]
elif self.root.ids.scr_mngr.current == 'sent':
self.root.ids.sc2.data.pop(data_index)
self.root.ids.sc2.data = [{
'data_index': i,
'index': d['index'],
'height': d['height'],
'text': d['text']}
for i, d in enumerate(self.root.ids.sc2.data)
]
elif self.root.ids.scr_mngr.current == 'trash':
self.root.ids.sc3.data.pop(data_index)
self.root.ids.sc3.data = [{
'data_index': i,
'index': d['index'],
'height': d['height'],
'text': d['text']}
for i, d in enumerate(self.root.ids.sc3.data)
]
def getInboxMessageDetail(self, instance):
"""It will get message detail after make selected message description."""
try:
self.root.ids.scr_mngr.current = 'page'
except AttributeError:
self.parent.manager.current = 'page'
print('Message Clicked {}'.format(instance))
@staticmethod
def getCurrentAccount():
"""It uses to get current account label."""
return BMConfigParser().get(state.association, 'label') + '({})'.format(state.association)
class Navigator(NavigationDrawer):
"""Navigator class uses NavigationDrawer.
It is an UI panel that shows our app's main navigation menu
It is hidden when not in use, but appears when the user swipes
a finger from the left edge of the screen or, when at the top
level of the app, the user touches the drawer icon in the app bar
"""
image_source = StringProperty('images/qidenticon_two.png')
title = StringProperty('Navigation')
class Inbox(Screen):
"""Inbox Screen uses screen to show widgets of screens."""
data = ListProperty()
def __init__(self, *args, **kwargs):
super(Inbox, self).__init__(*args, **kwargs)
if state.association == '':
state.association = Navigator().ids.btn.text
Clock.schedule_once(self.init_ui, 0)
def init_ui(self, dt=0):
"""Clock Schdule for method inbox accounts."""
self.inboxaccounts()
print(dt)
def inboxaccounts(self):
"""Load inbox accounts."""
account = state.association
self.loadMessagelist(account, 'All', '')
def loadMessagelist(self, account, where="", what=""):
"""Load Inbox list for inbox messages."""
xAddress = "toaddress"
queryreturn = kivy_helper_search.search_sql(
xAddress, account, 'inbox', where, what, False)
if queryreturn:
self.data = [{
'data_index': i,
'index': 1,
'height': 48,
'text': row[4]}
for i, row in enumerate(queryreturn)
]
else:
self.data = [{
'data_index': 1,
'index': 1,
'height': 48,
'text': "yet no message for this account!!!!!!!!!!!!!"}
]
class Page(Screen):
pass
class AddressSuccessful(Screen):
pass
class Sent(Screen):
"""Sent Screen uses screen to show widgets of screens."""
data = ListProperty()
def __init__(self, *args, **kwargs):
super(Sent, self).__init__(*args, **kwargs)
if state.association == '':
state.association = Navigator().ids.btn.text
Clock.schedule_once(self.init_ui, 0)