From b79d1e93f5f54a64f8d33fb0a73bdeb71f1ccef0 Mon Sep 17 00:00:00 2001 From: fuzzgun Date: Mon, 1 Apr 2013 20:23:32 +0100 Subject: [PATCH 01/12] Debian packaging --- COPYING | 2 +- LICENSE | 2 +- Makefile | 45 +++++ README.md | 2 +- debian.sh | 21 +++ debian/changelog | 9 + debian/compat | 1 + debian/control | 21 +++ debian/copyright | 30 +++ debian/docs | 1 + debian/files | 1 + debian/pybm | 4 + debian/rules | 68 +++++++ debian/source/format | 1 + debian/source/include-binaries | 15 ++ desktop/can-icon.svg | 173 ++++++++++++++++++ desktop/pybitmessage.desktop | 9 + about.py => src/about.py | 0 about.ui => src/about.ui | 0 addresses.py => src/addresses.py | 0 api client.py => src/api client.py | 0 .../bitmessage_icons.qrc | 0 .../bitmessage_icons_rc.py | 0 bitmessagemain.py => src/bitmessagemain.py | 0 bitmessageui.py => src/bitmessageui.py | 0 bitmessageui.ui => src/bitmessageui.ui | 0 .../defaultKnownNodes.py | 0 help.py => src/help.py | 0 help.ui => src/help.ui | 0 highlevelcrypto.py => src/highlevelcrypto.py | 0 iconglossary.py => src/iconglossary.py | 0 iconglossary.ui => src/iconglossary.ui | 0 {images => src/images}/addressbook.png | Bin {images => src/images}/blacklist.png | Bin {images => src/images}/can-icon-16px.png | Bin {images => src/images}/can-icon-24px.png | Bin {images => src/images}/can-icon.ico | Bin {images => src/images}/greenicon.png | Bin {images => src/images}/identities.png | Bin {images => src/images}/inbox.png | Bin {images => src/images}/networkstatus.png | Bin {images => src/images}/redicon.png | Bin {images => src/images}/send.png | Bin {images => src/images}/sent.png | Bin {images => src/images}/subscriptions.png | Bin {images => src/images}/yellowicon.png | Bin .../messages.dat reader.py | 0 .../newaddressdialog.py | 0 .../newaddressdialog.ui | 0 .../newsubscriptiondialog.py | 0 .../newsubscriptiondialog.ui | 0 {pyelliptic => src/pyelliptic}/LICENSE | 0 {pyelliptic => src/pyelliptic}/README.md | 0 {pyelliptic => src/pyelliptic}/__init__.py | 0 {pyelliptic => src/pyelliptic}/arithmetic.py | 0 {pyelliptic => src/pyelliptic}/cipher.py | 0 {pyelliptic => src/pyelliptic}/ecc.py | 0 {pyelliptic => src/pyelliptic}/hash.py | 0 {pyelliptic => src/pyelliptic}/openssl.py | 0 .../regenerateaddresses.py | 0 .../regenerateaddresses.ui | 0 settings.py => src/settings.py | 0 settings.ui => src/settings.ui | 0 {socks => src/socks}/BUGS | 0 {socks => src/socks}/LICENSE | 0 {socks => src/socks}/README | 0 {socks => src/socks}/__init__.py | 0 .../specialaddressbehavior.py | 0 .../specialaddressbehavior.ui | 0 69 files changed, 402 insertions(+), 3 deletions(-) create mode 100755 Makefile create mode 100755 debian.sh create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/docs create mode 100644 debian/files create mode 100644 debian/pybm create mode 100755 debian/rules create mode 100644 debian/source/format create mode 100644 debian/source/include-binaries create mode 100644 desktop/can-icon.svg create mode 100644 desktop/pybitmessage.desktop rename about.py => src/about.py (100%) rename about.ui => src/about.ui (100%) rename addresses.py => src/addresses.py (100%) rename api client.py => src/api client.py (100%) rename bitmessage_icons.qrc => src/bitmessage_icons.qrc (100%) rename bitmessage_icons_rc.py => src/bitmessage_icons_rc.py (100%) rename bitmessagemain.py => src/bitmessagemain.py (100%) rename bitmessageui.py => src/bitmessageui.py (100%) rename bitmessageui.ui => src/bitmessageui.ui (100%) rename defaultKnownNodes.py => src/defaultKnownNodes.py (100%) rename help.py => src/help.py (100%) rename help.ui => src/help.ui (100%) rename highlevelcrypto.py => src/highlevelcrypto.py (100%) rename iconglossary.py => src/iconglossary.py (100%) rename iconglossary.ui => src/iconglossary.ui (100%) rename {images => src/images}/addressbook.png (100%) rename {images => src/images}/blacklist.png (100%) rename {images => src/images}/can-icon-16px.png (100%) rename {images => src/images}/can-icon-24px.png (100%) rename {images => src/images}/can-icon.ico (100%) rename {images => src/images}/greenicon.png (100%) rename {images => src/images}/identities.png (100%) rename {images => src/images}/inbox.png (100%) rename {images => src/images}/networkstatus.png (100%) rename {images => src/images}/redicon.png (100%) rename {images => src/images}/send.png (100%) rename {images => src/images}/sent.png (100%) rename {images => src/images}/subscriptions.png (100%) rename {images => src/images}/yellowicon.png (100%) rename messages.dat reader.py => src/messages.dat reader.py (100%) rename newaddressdialog.py => src/newaddressdialog.py (100%) rename newaddressdialog.ui => src/newaddressdialog.ui (100%) rename newsubscriptiondialog.py => src/newsubscriptiondialog.py (100%) rename newsubscriptiondialog.ui => src/newsubscriptiondialog.ui (100%) rename {pyelliptic => src/pyelliptic}/LICENSE (100%) rename {pyelliptic => src/pyelliptic}/README.md (100%) rename {pyelliptic => src/pyelliptic}/__init__.py (100%) rename {pyelliptic => src/pyelliptic}/arithmetic.py (100%) rename {pyelliptic => src/pyelliptic}/cipher.py (100%) rename {pyelliptic => src/pyelliptic}/ecc.py (100%) rename {pyelliptic => src/pyelliptic}/hash.py (100%) rename {pyelliptic => src/pyelliptic}/openssl.py (100%) rename regenerateaddresses.py => src/regenerateaddresses.py (100%) rename regenerateaddresses.ui => src/regenerateaddresses.ui (100%) rename settings.py => src/settings.py (100%) rename settings.ui => src/settings.ui (100%) rename {socks => src/socks}/BUGS (100%) rename {socks => src/socks}/LICENSE (100%) rename {socks => src/socks}/README (100%) rename {socks => src/socks}/__init__.py (100%) rename specialaddressbehavior.py => src/specialaddressbehavior.py (100%) rename specialaddressbehavior.ui => src/specialaddressbehavior.ui (100%) diff --git a/COPYING b/COPYING index 078afb1b..e386f371 100644 --- a/COPYING +++ b/COPYING @@ -16,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +THE SOFTWARE. diff --git a/LICENSE b/LICENSE index daaa84e7..de7d6159 100644 --- a/LICENSE +++ b/LICENSE @@ -17,4 +17,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100755 index 00000000..161285e2 --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +APP=pybitmessage +VERSION=0.2.7 + +all: + +debug: + +source: + tar -cvzf ../$(APP)_$(VERSION).orig.tar.gz ../$(APP)-$(VERSION) --exclude=.git + +install: + mkdir -m 755 -p /usr/share/applications + mkdir -m 755 -p /usr/share/applications/$(APP) + mkdir -m 755 -p /usr/share/applications/$(APP)/images + mkdir -m 755 -p /usr/share/applications/$(APP)/pyelliptic + mkdir -m 755 -p /usr/share/applications/$(APP)/socks + mkdir -m 755 -p /usr/share/pixmaps + mkdir -m 755 -p /usr/share/icons + mkdir -m 755 -p /usr/share/icons/hicolor + mkdir -m 755 -p /usr/share/icons/hicolor/scalable + mkdir -m 755 -p /usr/share/icons/hicolor/scalable/apps + mkdir -m 755 -p /usr/share/icons/hicolor/24x24 + mkdir -m 755 -p /usr/share/icons/hicolor/24x24/apps + + install -m 644 src/*.ui /usr/share/applications/$(APP) + install -m 644 src/*.py /usr/share/applications/$(APP) + install -m 644 src/*.qrc /usr/share/applications/$(APP) + + install -m 644 src/images/*.png /usr/share/applications/$(APP)/images + install -m 644 src/images/*.ico /usr/share/applications/$(APP)/images + install -m 644 src/pyelliptic/* /usr/share/applications/$(APP)/pyelliptic + install -m 644 src/socks/* /usr/share/applications/$(APP)/socks + install -m 755 debian/pybm /usr/bin + + install -m 644 desktop/$(APP).desktop /usr/share/applications/$(APP)/$(APP).desktop + install -m 644 src/images/can-icon-24px.png /usr/share/icons/hicolor/24x24/apps/$(APP).png + install -m 644 desktop/can-icon.svg /usr/share/icons/hicolor/scalable/apps/$(APP).svg + install -m 644 desktop/can-icon.svg /usr/share/pixmaps/$(APP).svg + +clean: + rm -rf debian/$(APP) + rm -f ../$(APP)_*.deb ../$(APP)_*.asc ../$(APP)_*.dsc ../$(APP)*.changes + rm -f *.sh~ src/*.pyc src/socks/*.pyc src/pyelliptic/*.pyc + rm -f *.deb \#* \.#* debian/*.log debian/*.substvars + rm -f Makefile~ diff --git a/README.md b/README.md index f124c30d..979872f9 100644 --- a/README.md +++ b/README.md @@ -14,4 +14,4 @@ references ---------- * [project website](https://bitmessage.org) * [protocol specification](https://bitmessage.org/wiki/Protocol_specification) -* [whitepaper](https://bitmessage.org/bitmessage.pdf) \ No newline at end of file +* [whitepaper](https://bitmessage.org/bitmessage.pdf) diff --git a/debian.sh b/debian.sh new file mode 100755 index 00000000..fe4f477c --- /dev/null +++ b/debian.sh @@ -0,0 +1,21 @@ +# To build a debian package first ensure that the code exists +# within a directory called pybitmessage-x.x.x (where the x's +# are the version number), make sure that the VERSION parameter +# within debian/rules and this script are correct, then run +# this script. + +#!/bin/bash + +APP=pybitmessage +VERSION=0.2.7 +ARCH_TYPE=all + +# Create a source archive +make clean +make source + +# Build the package +fakeroot dpkg-buildpackage -A + +gpg -ba ../${APP}_${VERSION}-1_${ARCH_TYPE}.deb +gpg -ba ../${APP}_${VERSION}.orig.tar.gz diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 00000000..b071b96f --- /dev/null +++ b/debian/changelog @@ -0,0 +1,9 @@ +pybitmessage (0.2.7-1) unstable; urgency=low + + * Added debian packaging + * Script to generate debian packages + * SVG icon for Gnome shell, etc + * Source moved int src directory for debian standards compatibility + * Trailing carriage return on COPYING LICENSE and README.md + + -- Bob Mottram (4096 bits) Tue, 1 Apr 2013 17:12:14 +0100 diff --git a/debian/compat b/debian/compat new file mode 100644 index 00000000..45a4fb75 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +8 diff --git a/debian/control b/debian/control new file mode 100644 index 00000000..d9f052fc --- /dev/null +++ b/debian/control @@ -0,0 +1,21 @@ +Source: pybitmessage +Section: contrib/comm +Priority: extra +Maintainer: Jonathan Warren +Build-Depends: debhelper (>= 8.0.0), python, openssl +Standards-Version: 3.9.2 +Homepage: https://bitmessage.org/ +Vcs-Browser: https://github.com/Bitmessage/PyBitmessage +Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git + +Package: pybitmessage +Architecture: all +Depends: ${misc:Depends}, python, openssl +Description: Send encrypted messages to another person or to many subscribers + Bitmessage is a P2P communications protocol used to send encrypted messages + to another person or to many subscribers. It is decentralized and trustless, + meaning that you need-not inherently trust any entities like root certificate + authorities. It uses strong authentication which means that the sender of a + message cannot be spoofed, and it aims to hide "non-content" data, like the + sender and receiver of messages, from passive eavesdroppers like those + running warrantless wiretapping programs. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 00000000..4c5f69f3 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,30 @@ +Format: http://dep.debian.net/deps/dep5 +Upstream-Name: PyBitmessage +Source: https://github.com/Bitmessage/PyBitmessage + +Files: * +Copyright: 2012 Jonathan Warren +License: MIT + +Files: debian/* +Copyright: 2012 Jonathan Warren +License: MIT + +License: MIT + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. \ No newline at end of file diff --git a/debian/docs b/debian/docs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/debian/docs @@ -0,0 +1 @@ + diff --git a/debian/files b/debian/files new file mode 100644 index 00000000..dd2718fa --- /dev/null +++ b/debian/files @@ -0,0 +1 @@ +pybitmessage_0.2.7-1_all.deb contrib/comm extra diff --git a/debian/pybm b/debian/pybm new file mode 100644 index 00000000..1d90ee60 --- /dev/null +++ b/debian/pybm @@ -0,0 +1,4 @@ +#!/bin/bash +cd /usr/share/applications/pybitmessage +python bitmessagemain.py + diff --git a/debian/rules b/debian/rules new file mode 100755 index 00000000..84eb9d38 --- /dev/null +++ b/debian/rules @@ -0,0 +1,68 @@ +#!/usr/bin/make -f +APP=pybitmessage + +DEST_MAIN = $(CURDIR)/debian/$(APP)/usr/bin +DEST_SHARE = $(CURDIR)/debian/$(APP)/usr/share + +build: build-stamp + make +build-stamp: + dh_testdir + touch build-stamp +clean: + dh_testdir + dh_testroot + rm -f build-stamp + dh_clean +install: build clean + dh_testdir + dh_testroot + dh_prep + dh_installdirs + mkdir -m 755 -p $(CURDIR)/debian/$(APP)/usr + mkdir -m 755 -p $(CURDIR)/debian/$(APP)/usr/bin + mkdir -m 755 -p $(DEST_SHARE)/applications + mkdir -m 755 -p $(DEST_SHARE)/applications/$(APP) + mkdir -m 755 -p $(DEST_SHARE)/applications/$(APP)/images + mkdir -m 755 -p $(DEST_SHARE)/applications/$(APP)/pyelliptic + mkdir -m 755 -p $(DEST_SHARE)/applications/$(APP)/socks + mkdir -m 755 -p $(DEST_SHARE)/pixmaps + mkdir -m 755 -p $(DEST_SHARE)/icons + mkdir -m 755 -p $(DEST_SHARE)/icons/hicolor + mkdir -m 755 -p $(DEST_SHARE)/icons/hicolor/scalable + mkdir -m 755 -p $(DEST_SHARE)/icons/hicolor/scalable/apps + mkdir -m 755 -p $(DEST_SHARE)/icons/hicolor/24x24 + mkdir -m 755 -p $(DEST_SHARE)/icons/hicolor/24x24/apps + + install -m 644 $(CURDIR)/src/*.ui $(DEST_SHARE)/applications/$(APP) + install -m 644 $(CURDIR)/src/*.py $(DEST_SHARE)/applications/$(APP) + install -m 644 $(CURDIR)/src/*.qrc $(DEST_SHARE)/applications/$(APP) + + install -m 644 $(CURDIR)/src/images/*.png $(DEST_SHARE)/applications/$(APP)/images + install -m 644 $(CURDIR)/src/images/*.ico $(DEST_SHARE)/applications/$(APP)/images + install -m 644 $(CURDIR)/src/pyelliptic/* $(DEST_SHARE)/applications/$(APP)/pyelliptic + install -m 644 $(CURDIR)/src/socks/* $(DEST_SHARE)/applications/$(APP)/socks + install -m 755 $(CURDIR)/debian/pybm $(DEST_MAIN) + + install -m 644 $(CURDIR)/desktop/$(APP).desktop $(DEST_SHARE)/applications/$(APP)/$(APP).desktop + install -m 644 $(CURDIR)/src/images/can-icon-24px.png $(DEST_SHARE)/icons/hicolor/24x24/apps/$(APP).png + install -m 644 $(CURDIR)/desktop/can-icon.svg $(DEST_SHARE)/icons/hicolor/scalable/apps/$(APP).svg + install -m 644 $(CURDIR)/desktop/can-icon.svg $(DEST_SHARE)/pixmaps/$(APP).svg +binary-indep: build install + dh_shlibdeps + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs +# dh_installexamples +# dh_installman + dh_link + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb +binary-arch: build install +binary: binary-indep +.PHONY: build clean binary-indep binary install diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/source/include-binaries b/debian/source/include-binaries new file mode 100644 index 00000000..8569d576 --- /dev/null +++ b/debian/source/include-binaries @@ -0,0 +1,15 @@ +src/images/sent.png +src/images/can-icon-16px.png +src/images/addressbook.png +src/images/networkstatus.png +src/images/redicon.png +src/images/subscriptions.png +src/images/blacklist.png +src/images/can-icon-24px.png +src/images/identities.png +src/images/yellowicon.png +src/images/inbox.png +src/images/greenicon.png +src/images/can-icon.ico +src/images/send.png +desktop/can-icon.svg diff --git a/desktop/can-icon.svg b/desktop/can-icon.svg new file mode 100644 index 00000000..9b8a9ded --- /dev/null +++ b/desktop/can-icon.svg @@ -0,0 +1,173 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/desktop/pybitmessage.desktop b/desktop/pybitmessage.desktop new file mode 100644 index 00000000..affd63d1 --- /dev/null +++ b/desktop/pybitmessage.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=Application +Name=PyBitmessage +GenericName=PyBitmessage +Comment=Send encrypted messages to another person or to many subscribers +Exec=pybm %U +Icon=pybitmessage +Terminal=false +Categories=Network diff --git a/about.py b/src/about.py similarity index 100% rename from about.py rename to src/about.py diff --git a/about.ui b/src/about.ui similarity index 100% rename from about.ui rename to src/about.ui diff --git a/addresses.py b/src/addresses.py similarity index 100% rename from addresses.py rename to src/addresses.py diff --git a/api client.py b/src/api client.py similarity index 100% rename from api client.py rename to src/api client.py diff --git a/bitmessage_icons.qrc b/src/bitmessage_icons.qrc similarity index 100% rename from bitmessage_icons.qrc rename to src/bitmessage_icons.qrc diff --git a/bitmessage_icons_rc.py b/src/bitmessage_icons_rc.py similarity index 100% rename from bitmessage_icons_rc.py rename to src/bitmessage_icons_rc.py diff --git a/bitmessagemain.py b/src/bitmessagemain.py similarity index 100% rename from bitmessagemain.py rename to src/bitmessagemain.py diff --git a/bitmessageui.py b/src/bitmessageui.py similarity index 100% rename from bitmessageui.py rename to src/bitmessageui.py diff --git a/bitmessageui.ui b/src/bitmessageui.ui similarity index 100% rename from bitmessageui.ui rename to src/bitmessageui.ui diff --git a/defaultKnownNodes.py b/src/defaultKnownNodes.py similarity index 100% rename from defaultKnownNodes.py rename to src/defaultKnownNodes.py diff --git a/help.py b/src/help.py similarity index 100% rename from help.py rename to src/help.py diff --git a/help.ui b/src/help.ui similarity index 100% rename from help.ui rename to src/help.ui diff --git a/highlevelcrypto.py b/src/highlevelcrypto.py similarity index 100% rename from highlevelcrypto.py rename to src/highlevelcrypto.py diff --git a/iconglossary.py b/src/iconglossary.py similarity index 100% rename from iconglossary.py rename to src/iconglossary.py diff --git a/iconglossary.ui b/src/iconglossary.ui similarity index 100% rename from iconglossary.ui rename to src/iconglossary.ui diff --git a/images/addressbook.png b/src/images/addressbook.png similarity index 100% rename from images/addressbook.png rename to src/images/addressbook.png diff --git a/images/blacklist.png b/src/images/blacklist.png similarity index 100% rename from images/blacklist.png rename to src/images/blacklist.png diff --git a/images/can-icon-16px.png b/src/images/can-icon-16px.png similarity index 100% rename from images/can-icon-16px.png rename to src/images/can-icon-16px.png diff --git a/images/can-icon-24px.png b/src/images/can-icon-24px.png similarity index 100% rename from images/can-icon-24px.png rename to src/images/can-icon-24px.png diff --git a/images/can-icon.ico b/src/images/can-icon.ico similarity index 100% rename from images/can-icon.ico rename to src/images/can-icon.ico diff --git a/images/greenicon.png b/src/images/greenicon.png similarity index 100% rename from images/greenicon.png rename to src/images/greenicon.png diff --git a/images/identities.png b/src/images/identities.png similarity index 100% rename from images/identities.png rename to src/images/identities.png diff --git a/images/inbox.png b/src/images/inbox.png similarity index 100% rename from images/inbox.png rename to src/images/inbox.png diff --git a/images/networkstatus.png b/src/images/networkstatus.png similarity index 100% rename from images/networkstatus.png rename to src/images/networkstatus.png diff --git a/images/redicon.png b/src/images/redicon.png similarity index 100% rename from images/redicon.png rename to src/images/redicon.png diff --git a/images/send.png b/src/images/send.png similarity index 100% rename from images/send.png rename to src/images/send.png diff --git a/images/sent.png b/src/images/sent.png similarity index 100% rename from images/sent.png rename to src/images/sent.png diff --git a/images/subscriptions.png b/src/images/subscriptions.png similarity index 100% rename from images/subscriptions.png rename to src/images/subscriptions.png diff --git a/images/yellowicon.png b/src/images/yellowicon.png similarity index 100% rename from images/yellowicon.png rename to src/images/yellowicon.png diff --git a/messages.dat reader.py b/src/messages.dat reader.py similarity index 100% rename from messages.dat reader.py rename to src/messages.dat reader.py diff --git a/newaddressdialog.py b/src/newaddressdialog.py similarity index 100% rename from newaddressdialog.py rename to src/newaddressdialog.py diff --git a/newaddressdialog.ui b/src/newaddressdialog.ui similarity index 100% rename from newaddressdialog.ui rename to src/newaddressdialog.ui diff --git a/newsubscriptiondialog.py b/src/newsubscriptiondialog.py similarity index 100% rename from newsubscriptiondialog.py rename to src/newsubscriptiondialog.py diff --git a/newsubscriptiondialog.ui b/src/newsubscriptiondialog.ui similarity index 100% rename from newsubscriptiondialog.ui rename to src/newsubscriptiondialog.ui diff --git a/pyelliptic/LICENSE b/src/pyelliptic/LICENSE similarity index 100% rename from pyelliptic/LICENSE rename to src/pyelliptic/LICENSE diff --git a/pyelliptic/README.md b/src/pyelliptic/README.md similarity index 100% rename from pyelliptic/README.md rename to src/pyelliptic/README.md diff --git a/pyelliptic/__init__.py b/src/pyelliptic/__init__.py similarity index 100% rename from pyelliptic/__init__.py rename to src/pyelliptic/__init__.py diff --git a/pyelliptic/arithmetic.py b/src/pyelliptic/arithmetic.py similarity index 100% rename from pyelliptic/arithmetic.py rename to src/pyelliptic/arithmetic.py diff --git a/pyelliptic/cipher.py b/src/pyelliptic/cipher.py similarity index 100% rename from pyelliptic/cipher.py rename to src/pyelliptic/cipher.py diff --git a/pyelliptic/ecc.py b/src/pyelliptic/ecc.py similarity index 100% rename from pyelliptic/ecc.py rename to src/pyelliptic/ecc.py diff --git a/pyelliptic/hash.py b/src/pyelliptic/hash.py similarity index 100% rename from pyelliptic/hash.py rename to src/pyelliptic/hash.py diff --git a/pyelliptic/openssl.py b/src/pyelliptic/openssl.py similarity index 100% rename from pyelliptic/openssl.py rename to src/pyelliptic/openssl.py diff --git a/regenerateaddresses.py b/src/regenerateaddresses.py similarity index 100% rename from regenerateaddresses.py rename to src/regenerateaddresses.py diff --git a/regenerateaddresses.ui b/src/regenerateaddresses.ui similarity index 100% rename from regenerateaddresses.ui rename to src/regenerateaddresses.ui diff --git a/settings.py b/src/settings.py similarity index 100% rename from settings.py rename to src/settings.py diff --git a/settings.ui b/src/settings.ui similarity index 100% rename from settings.ui rename to src/settings.ui diff --git a/socks/BUGS b/src/socks/BUGS similarity index 100% rename from socks/BUGS rename to src/socks/BUGS diff --git a/socks/LICENSE b/src/socks/LICENSE similarity index 100% rename from socks/LICENSE rename to src/socks/LICENSE diff --git a/socks/README b/src/socks/README similarity index 100% rename from socks/README rename to src/socks/README diff --git a/socks/__init__.py b/src/socks/__init__.py similarity index 100% rename from socks/__init__.py rename to src/socks/__init__.py diff --git a/specialaddressbehavior.py b/src/specialaddressbehavior.py similarity index 100% rename from specialaddressbehavior.py rename to src/specialaddressbehavior.py diff --git a/specialaddressbehavior.ui b/src/specialaddressbehavior.ui similarity index 100% rename from specialaddressbehavior.ui rename to src/specialaddressbehavior.ui -- 2.45.1 From 781e83566171ca5f976b0cfcc7a609c2e27d7b94 Mon Sep 17 00:00:00 2001 From: fuzzgun Date: Tue, 2 Apr 2013 10:48:54 +0100 Subject: [PATCH 02/12] Qt4 dependencies --- debian/control | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index d9f052fc..3a9bc7a6 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: pybitmessage Section: contrib/comm Priority: extra Maintainer: Jonathan Warren -Build-Depends: debhelper (>= 8.0.0), python, openssl +Build-Depends: debhelper (>= 8.0.0), python, openssl, python-qt4, libqt4-dev, python-qt4-dev Standards-Version: 3.9.2 Homepage: https://bitmessage.org/ Vcs-Browser: https://github.com/Bitmessage/PyBitmessage @@ -10,7 +10,7 @@ Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git Package: pybitmessage Architecture: all -Depends: ${misc:Depends}, python, openssl +Depends: ${misc:Depends}, python, openssl, python-qt4, libqt4-dev, python-qt4-dev Description: Send encrypted messages to another person or to many subscribers Bitmessage is a P2P communications protocol used to send encrypted messages to another person or to many subscribers. It is decentralized and trustless, -- 2.45.1 From a53ade66e3982132aa09c0d0bd82c623d5dd3329 Mon Sep 17 00:00:00 2001 From: fuzzgun Date: Tue, 2 Apr 2013 19:20:20 +0100 Subject: [PATCH 03/12] Fixed lintian duplicate license warnings --- Makefile | 4 ++-- debian/rules | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 161285e2..89888694 100755 --- a/Makefile +++ b/Makefile @@ -28,8 +28,8 @@ install: install -m 644 src/images/*.png /usr/share/applications/$(APP)/images install -m 644 src/images/*.ico /usr/share/applications/$(APP)/images - install -m 644 src/pyelliptic/* /usr/share/applications/$(APP)/pyelliptic - install -m 644 src/socks/* /usr/share/applications/$(APP)/socks + install -m 644 src/pyelliptic/*.py /usr/share/applications/$(APP)/pyelliptic + install -m 644 src/socks/*.py /usr/share/applications/$(APP)/socks install -m 755 debian/pybm /usr/bin install -m 644 desktop/$(APP).desktop /usr/share/applications/$(APP)/$(APP).desktop diff --git a/debian/rules b/debian/rules index 84eb9d38..ca977463 100755 --- a/debian/rules +++ b/debian/rules @@ -40,8 +40,8 @@ install: build clean install -m 644 $(CURDIR)/src/images/*.png $(DEST_SHARE)/applications/$(APP)/images install -m 644 $(CURDIR)/src/images/*.ico $(DEST_SHARE)/applications/$(APP)/images - install -m 644 $(CURDIR)/src/pyelliptic/* $(DEST_SHARE)/applications/$(APP)/pyelliptic - install -m 644 $(CURDIR)/src/socks/* $(DEST_SHARE)/applications/$(APP)/socks + install -m 644 $(CURDIR)/src/pyelliptic/*.py $(DEST_SHARE)/applications/$(APP)/pyelliptic + install -m 644 $(CURDIR)/src/socks/*.py $(DEST_SHARE)/applications/$(APP)/socks install -m 755 $(CURDIR)/debian/pybm $(DEST_MAIN) install -m 644 $(CURDIR)/desktop/$(APP).desktop $(DEST_SHARE)/applications/$(APP)/$(APP).desktop -- 2.45.1 From 57eef7707086d271d66214fb8966e614ffca0de2 Mon Sep 17 00:00:00 2001 From: fuzzgun Date: Wed, 3 Apr 2013 12:45:08 +0100 Subject: [PATCH 04/12] sqlite3 dependency --- debian/control | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index 3a9bc7a6..975082c3 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: pybitmessage Section: contrib/comm Priority: extra Maintainer: Jonathan Warren -Build-Depends: debhelper (>= 8.0.0), python, openssl, python-qt4, libqt4-dev, python-qt4-dev +Build-Depends: debhelper (>= 8.0.0), python, openssl, python-qt4, libqt4-dev, python-qt4-dev, sqlite3, libsqlite3-dev Standards-Version: 3.9.2 Homepage: https://bitmessage.org/ Vcs-Browser: https://github.com/Bitmessage/PyBitmessage @@ -10,7 +10,7 @@ Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git Package: pybitmessage Architecture: all -Depends: ${misc:Depends}, python, openssl, python-qt4, libqt4-dev, python-qt4-dev +Depends: ${misc:Depends}, python, openssl, python-qt4, libqt4-dev, python-qt4-dev, sqlite3, libsqlite3-dev Description: Send encrypted messages to another person or to many subscribers Bitmessage is a P2P communications protocol used to send encrypted messages to another person or to many subscribers. It is decentralized and trustless, -- 2.45.1 From 45d90c0244576fb0e0216b11581efc7d867b3b2c Mon Sep 17 00:00:00 2001 From: fuzzgun Date: Tue, 9 Apr 2013 17:59:33 +0100 Subject: [PATCH 05/12] Bumped version number to 0.2.8 --- Makefile | 2 +- debian.sh | 2 +- debian/changelog | 43 +++++++++++++++++++++++++++++++++++++++++++ debian/files | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 89888694..21b9f793 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ APP=pybitmessage -VERSION=0.2.7 +VERSION=0.2.8 all: diff --git a/debian.sh b/debian.sh index fe4f477c..4ffe1b87 100755 --- a/debian.sh +++ b/debian.sh @@ -7,7 +7,7 @@ #!/bin/bash APP=pybitmessage -VERSION=0.2.7 +VERSION=0.2.8 ARCH_TYPE=all # Create a source archive diff --git a/debian/changelog b/debian/changelog index b071b96f..a7d2a84c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,46 @@ +pybitmessage (0.2.8-1) unstable; urgency=low + + * Fixed Ubuntu & OS X issue: + Bitmessage wouldn't receive any objects from peers after restart. + + * Inventory flush to disk when exiting program now vastly faster. + + * Fixed address generation bug (kept Bitmessage from restarting). + + * Improve deserialization of messages + before processing (a 'best practice'). + + * Change to help Macs find OpenSSL the way Unix systems find it. + + * Do not share or accept IPs which are in the private IP ranges. + + * Added time-fuzzing + to the embedded time in pubkey and getpubkey messages. + + * Added a knownNodes lock + to prevent an exception from sometimes occurring when saving + the data-structure to disk. + + * Show unread messages in bold + and do not display new messages automatically. + + * Support selecting multiple items + in the inbox, sent box, and address book. + + * Use delete key to trash Inbox or Sent messages. + + * Display richtext(HTML) messages + from senders in address book or subscriptions (although not + pseudo-mailing-lists; use new right-click option). + + * Trim spaces + from the beginning and end of addresses when adding to + address book, subscriptions, and blacklist. + + * Improved the display of the time for foreign language users. + + -- Bob Mottram (4096 bits) Tue, 9 Apr 2013 17:44:00 +0100 + pybitmessage (0.2.7-1) unstable; urgency=low * Added debian packaging diff --git a/debian/files b/debian/files index dd2718fa..471f54a3 100644 --- a/debian/files +++ b/debian/files @@ -1 +1 @@ -pybitmessage_0.2.7-1_all.deb contrib/comm extra +pybitmessage_0.2.8-1_all.deb contrib/comm extra -- 2.45.1 From 3976c5a8d2f7473bd0c273a1ca3ec44ece60f3d4 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Sat, 13 Apr 2013 00:52:26 -0400 Subject: [PATCH 06/12] Move knownNodes save to a different position so that exit may run more smoothly --- bitmessagemain.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index 71af5982..12beaa7e 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -439,7 +439,7 @@ class receiveDataThread(QThread): printLock.release() self.broadcastaddr([(int(time.time()), self.streamNumber, 1, self.HOST, remoteNodeIncomingPort)]) #This lets all of our peers know about this new node. self.sendaddr() #This is one large addr message to this one peer. - if connectionsCount[self.streamNumber] > 150: + if not self.initiatedConnection and connectionsCount[self.streamNumber] > 150: printLock.acquire() print 'We are connected to too many people. Closing connection.' printLock.release() @@ -4592,6 +4592,14 @@ class MyForm(QtGui.QMainWindow): else: event.ignore()''' + self.statusBar().showMessage('Bitmessage is stuck waiting for the knownNodesLock.') + knownNodesLock.acquire() + self.statusBar().showMessage('Saving the knownNodes list of peers to disk...') + output = open(appdata + 'knownnodes.dat', 'wb') + pickle.dump(knownNodes, output) + output.close() + knownNodesLock.release() + broadcastToSendDataQueues((0, 'shutdown', 'all')) printLock.acquire() @@ -4607,13 +4615,6 @@ class MyForm(QtGui.QMainWindow): sqlReturnQueue.get() sqlLock.release() - self.statusBar().showMessage('Saving the knownNodes list of peers to disk...') - knownNodesLock.acquire() - output = open(appdata + 'knownnodes.dat', 'wb') - pickle.dump(knownNodes, output) - output.close() - knownNodesLock.release() - self.trayIcon.hide() printLock.acquire() print 'Done.' @@ -4621,7 +4622,8 @@ class MyForm(QtGui.QMainWindow): self.statusBar().showMessage('All done. Closing user interface...') event.accept() print 'done. (passed event.accept())' - raise SystemExit + #raise SystemExit + os._exit(0) def on_action_InboxMessageForceHtml(self): currentInboxRow = self.ui.tableWidgetInbox.currentRow() -- 2.45.1 From 11407f3f4464e30e2e93b6407d1afa76bc569f0b Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Wed, 17 Apr 2013 14:24:16 -0400 Subject: [PATCH 07/12] preparation for switch from 32 bit time to 64 bit time in protocol --- bitmessagemain.py | 401 +++++++++++++++++++++++++++++----------------- 1 file changed, 257 insertions(+), 144 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index 12beaa7e..ca6278b8 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -511,7 +511,16 @@ class receiveDataThread(QThread): if not self.isProofOfWorkSufficient(data): print 'Proof of work in broadcast message insufficient.' return - embeddedTime, = unpack('>I',data[8:12]) + readPosition = 8 #bypass the nonce + embeddedTime, = unpack('>I',data[readPosition:readPosition+4]) + + #This section is used for the transition from 32 bit time to 64 bit time in the protocol. + if embeddedTime == 0: + embeddedTime, = unpack('>Q',data[readPosition:readPosition+8]) + readPosition += 8 + else: + readPosition += 4 + if embeddedTime > (int(time.time())+10800): #prevent funny business print 'The embedded time in this broadcast message is more than three hours in the future. That doesn\'t make sense. Ignoring message.' return @@ -539,7 +548,7 @@ class receiveDataThread(QThread): self.emit(SIGNAL("incrementNumberOfBroadcastsProcessed()")) - self.processbroadcast(data)#When this function returns, we will have either successfully processed this broadcast because we are interested in it, ignored it because we aren't interested in it, or found problem with the broadcast that warranted ignoring it. + self.processbroadcast(readPosition,data)#When this function returns, we will have either successfully processed this broadcast because we are interested in it, ignored it because we aren't interested in it, or found problem with the broadcast that warranted ignoring it. # Let us now set lengthOfTimeWeShouldUseToProcessThisMessage. If we haven't used the specified amount of time, we shall sleep. These values are mostly the same values used for msg messages although broadcast messages are processed faster. if len(data) > 100000000: #Size is greater than 100 megabytes @@ -563,8 +572,7 @@ class receiveDataThread(QThread): printLock.release() #A broadcast message has a valid time and POW and requires processing. The recbroadcast function calls this one. - def processbroadcast(self,data): - readPosition = 12 + def processbroadcast(self,readPosition,data): broadcastVersion, broadcastVersionLength = decodeVarint(data[readPosition:readPosition+9]) if broadcastVersion <> 1: #Cannot decode incoming broadcast versions higher than 1. Assuming the sender isn\' being silly, you should upgrade Bitmessage because this message shall be ignored. @@ -693,13 +701,20 @@ class receiveDataThread(QThread): readPosition = 8 embeddedTime, = unpack('>I',data[readPosition:readPosition+4]) + + #This section is used for the transition from 32 bit time to 64 bit time in the protocol. + if embeddedTime == 0: + embeddedTime, = unpack('>Q',data[readPosition:readPosition+8]) + readPosition += 8 + else: + readPosition += 4 + if embeddedTime > int(time.time())+10800: print 'The time in the msg message is too new. Ignoring it. Time:', embeddedTime return if embeddedTime < int(time.time())-maximumAgeOfAnObjectThatIAmWillingToAccept: print 'The time in the msg message is too old. Ignoring it. Time:', embeddedTime return - readPosition += 4 streamNumberAsClaimedByMsg, streamNumberAsClaimedByMsgLength = decodeVarint(data[readPosition:readPosition+9]) if streamNumberAsClaimedByMsg != self.streamNumber: print 'The stream number encoded in this msg (' + str(streamNumberAsClaimedByMsg) + ') message does not match the stream number on which it was received. Ignoring it.' @@ -1024,6 +1039,14 @@ class receiveDataThread(QThread): readPosition = 8 #for the nonce embeddedTime, = unpack('>I',data[readPosition:readPosition+4]) + + #This section is used for the transition from 32 bit time to 64 bit time in the protocol. + if embeddedTime == 0: + embeddedTime, = unpack('>Q',data[readPosition:readPosition+8]) + readPosition += 8 + else: + readPosition += 4 + if embeddedTime < int(time.time())-lengthOfTimeToHoldOnToAllPubkeys: printLock.acquire() print 'The embedded time in this pubkey message is too old. Ignoring. Embedded time is:', embeddedTime @@ -1034,7 +1057,6 @@ class receiveDataThread(QThread): print 'The embedded time in this pubkey message more than several hours in the future. This is irrational. Ignoring message.' printLock.release() return - readPosition += 4 #for the time addressVersion, varintLength = decodeVarint(data[readPosition:readPosition+10]) readPosition += varintLength streamNumber, varintLength = decodeVarint(data[readPosition:readPosition+10]) @@ -1154,19 +1176,29 @@ class receiveDataThread(QThread): if len(data) < 34: print 'getpubkey message doesn\'t contain enough data. Ignoring.' return - embeddedTime, = unpack('>I',data[8:12]) + readPosition = 8 #bypass the nonce + embeddedTime, = unpack('>I',data[readPosition:readPosition+4]) + + #This section is used for the transition from 32 bit time to 64 bit time in the protocol. + if embeddedTime == 0: + embeddedTime, = unpack('>Q',data[readPosition:readPosition+8]) + readPosition += 8 + else: + readPosition += 4 + if embeddedTime > int(time.time())+10800: print 'The time in this getpubkey message is too new. Ignoring it. Time:', embeddedTime return if embeddedTime < int(time.time())-maximumAgeOfAnObjectThatIAmWillingToAccept: print 'The time in this getpubkey message is too old. Ignoring it. Time:', embeddedTime return - - addressVersionNumber, addressVersionLength = decodeVarint(data[12:22]) - streamNumber, streamNumberLength = decodeVarint(data[12+addressVersionLength:22+addressVersionLength]) + addressVersionNumber, addressVersionLength = decodeVarint(data[readPosition:readPosition+10]) + readPosition += addressVersionLength + streamNumber, streamNumberLength = decodeVarint(data[readPosition:readPosition+10]) if streamNumber <> self.streamNumber: print 'The streamNumber', streamNumber, 'doesn\'t match our stream number:', self.streamNumber return + readPosition += streamNumberLength inventoryHash = calculateInventoryHash(data) inventoryLock.acquire() @@ -1195,7 +1227,7 @@ class receiveDataThread(QThread): print 'The addressVersionNumber of the pubkey request is too high. Can\'t understand. Ignoring it.' return - requestedHash = data[12+addressVersionLength+streamNumberLength:32+addressVersionLength+streamNumberLength] + requestedHash = data[readPosition:readPosition+20] if len(requestedHash) != 20: print 'The length of the requested hash is not 20 bytes. Something is wrong. Ignoring.' return @@ -1349,98 +1381,192 @@ class receiveDataThread(QThread): printLock.acquire() print 'addr message contains', numberOfAddressesIncluded, 'IP addresses.' printLock.release() - #print 'lengthOfNumberOfAddresses', lengthOfNumberOfAddresses - if numberOfAddressesIncluded > 1000 or numberOfAddressesIncluded == 0: - return - if len(data) < lengthOfNumberOfAddresses + (34 * numberOfAddressesIncluded): - print 'addr message does not contain enough data. Ignoring.' - return + if self.remoteProtocolVersion == 1: + print 'self.remoteProtocolVersion == 1' + if numberOfAddressesIncluded > 1000 or numberOfAddressesIncluded == 0: + return + if len(data) != lengthOfNumberOfAddresses + (34 * numberOfAddressesIncluded): + print 'addr message does not contain the correct amount of data. Ignoring.' + return - needToWriteKnownNodesToDisk = False - for i in range(0,numberOfAddressesIncluded): - try: - if data[16+lengthOfNumberOfAddresses+(34*i):28+lengthOfNumberOfAddresses+(34*i)] != '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF': + needToWriteKnownNodesToDisk = False + for i in range(0,numberOfAddressesIncluded): + try: + if data[16+lengthOfNumberOfAddresses+(34*i):28+lengthOfNumberOfAddresses+(34*i)] != '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF': + printLock.acquire() + print 'Skipping IPv6 address.', repr(data[16+lengthOfNumberOfAddresses+(34*i):28+lengthOfNumberOfAddresses+(34*i)]) + printLock.release() + continue + except Exception, err: printLock.acquire() - print 'Skipping IPv6 address.', repr(data[16+lengthOfNumberOfAddresses+(34*i):28+lengthOfNumberOfAddresses+(34*i)]) + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (to test for an IPv6 address). Message: %s\n' % str(err)) printLock.release() + break #giving up on unpacking any more. We should still be connected however. + + try: + recaddrStream, = unpack('>I',data[4+lengthOfNumberOfAddresses+(34*i):8+lengthOfNumberOfAddresses+(34*i)]) + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrStream). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. + if recaddrStream == 0: continue - except Exception, err: - printLock.acquire() - sys.stderr.write('ERROR TRYING TO UNPACK recaddr (to test for an IPv6 address). Message: %s\n' % str(err)) - printLock.release() - break #giving up on unpacking any more. We should still be connected however. + if recaddrStream != self.streamNumber and recaddrStream != (self.streamNumber * 2) and recaddrStream != ((self.streamNumber * 2) + 1): #if the embedded stream number is not in my stream or either of my child streams then ignore it. Someone might be trying funny business. + continue + try: + recaddrServices, = unpack('>Q',data[8+lengthOfNumberOfAddresses+(34*i):16+lengthOfNumberOfAddresses+(34*i)]) + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrServices). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. - try: - recaddrStream, = unpack('>I',data[4+lengthOfNumberOfAddresses+(34*i):8+lengthOfNumberOfAddresses+(34*i)]) - except Exception, err: - printLock.acquire() - sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrStream). Message: %s\n' % str(err)) - printLock.release() - break #giving up on unpacking any more. We should still be connected however. - if recaddrStream == 0: - continue - if recaddrStream != self.streamNumber and recaddrStream != (self.streamNumber * 2) and recaddrStream != ((self.streamNumber * 2) + 1): #if the embedded stream number is not in my stream or either of my child streams then ignore it. Someone might be trying funny business. - continue - try: - recaddrServices, = unpack('>Q',data[8+lengthOfNumberOfAddresses+(34*i):16+lengthOfNumberOfAddresses+(34*i)]) - except Exception, err: - printLock.acquire() - sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrServices). Message: %s\n' % str(err)) - printLock.release() - break #giving up on unpacking any more. We should still be connected however. - - try: - recaddrPort, = unpack('>H',data[32+lengthOfNumberOfAddresses+(34*i):34+lengthOfNumberOfAddresses+(34*i)]) - except Exception, err: - printLock.acquire() - sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrPort). Message: %s\n' % str(err)) - printLock.release() - break #giving up on unpacking any more. We should still be connected however. - #print 'Within recaddr(): IP', recaddrIP, ', Port', recaddrPort, ', i', i - hostFromAddrMessage = socket.inet_ntoa(data[28+lengthOfNumberOfAddresses+(34*i):32+lengthOfNumberOfAddresses+(34*i)]) - #print 'hostFromAddrMessage', hostFromAddrMessage - if data[28+lengthOfNumberOfAddresses+(34*i)] == '\x7F': - print 'Ignoring IP address in loopback range:', hostFromAddrMessage - continue - if data[28+lengthOfNumberOfAddresses+(34*i)] == '\x0A': - print 'Ignoring IP address in private range:', hostFromAddrMessage - continue - if data[28+lengthOfNumberOfAddresses+(34*i):30+lengthOfNumberOfAddresses+(34*i)] == '\xC0A8': - print 'Ignoring IP address in private range:', hostFromAddrMessage - continue - timeSomeoneElseReceivedMessageFromThisNode, = unpack('>I',data[lengthOfNumberOfAddresses+(34*i):4+lengthOfNumberOfAddresses+(34*i)]) #This is the 'time' value in the received addr message. - if recaddrStream not in knownNodes: #knownNodes is a dictionary of dictionaries with one outer dictionary for each stream. If the outer stream dictionary doesn't exist yet then we must make it. + try: + recaddrPort, = unpack('>H',data[32+lengthOfNumberOfAddresses+(34*i):34+lengthOfNumberOfAddresses+(34*i)]) + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrPort). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. + #print 'Within recaddr(): IP', recaddrIP, ', Port', recaddrPort, ', i', i + hostFromAddrMessage = socket.inet_ntoa(data[28+lengthOfNumberOfAddresses+(34*i):32+lengthOfNumberOfAddresses+(34*i)]) + #print 'hostFromAddrMessage', hostFromAddrMessage + if data[28+lengthOfNumberOfAddresses+(34*i)] == '\x7F': + print 'Ignoring IP address in loopback range:', hostFromAddrMessage + continue + if data[28+lengthOfNumberOfAddresses+(34*i)] == '\x0A': + print 'Ignoring IP address in private range:', hostFromAddrMessage + continue + if data[28+lengthOfNumberOfAddresses+(34*i):30+lengthOfNumberOfAddresses+(34*i)] == '\xC0A8': + print 'Ignoring IP address in private range:', hostFromAddrMessage + continue + timeSomeoneElseReceivedMessageFromThisNode, = unpack('>I',data[lengthOfNumberOfAddresses+(34*i):4+lengthOfNumberOfAddresses+(34*i)]) #This is the 'time' value in the received addr message. + if recaddrStream not in knownNodes: #knownNodes is a dictionary of dictionaries with one outer dictionary for each stream. If the outer stream dictionary doesn't exist yet then we must make it. + knownNodesLock.acquire() + knownNodes[recaddrStream] = {} + knownNodesLock.release() + if hostFromAddrMessage not in knownNodes[recaddrStream]: + if len(knownNodes[recaddrStream]) < 20000 and timeSomeoneElseReceivedMessageFromThisNode > (int(time.time())-10800) and timeSomeoneElseReceivedMessageFromThisNode < (int(time.time()) + 10800): #If we have more than 20000 nodes in our list already then just forget about adding more. Also, make sure that the time that someone else received a message from this node is within three hours from now. + knownNodesLock.acquire() + knownNodes[recaddrStream][hostFromAddrMessage] = (recaddrPort, timeSomeoneElseReceivedMessageFromThisNode) + knownNodesLock.release() + print 'added new node', hostFromAddrMessage, 'to knownNodes in stream', recaddrStream + needToWriteKnownNodesToDisk = True + hostDetails = (timeSomeoneElseReceivedMessageFromThisNode, recaddrStream, recaddrServices, hostFromAddrMessage, recaddrPort) + listOfAddressDetailsToBroadcastToPeers.append(hostDetails) + else: + PORT, timeLastReceivedMessageFromThisNode = knownNodes[recaddrStream][hostFromAddrMessage]#PORT in this case is either the port we used to connect to the remote node, or the port that was specified by someone else in a past addr message. + if (timeLastReceivedMessageFromThisNode < timeSomeoneElseReceivedMessageFromThisNode) and (timeSomeoneElseReceivedMessageFromThisNode < int(time.time())): + knownNodesLock.acquire() + knownNodes[recaddrStream][hostFromAddrMessage] = (PORT, timeSomeoneElseReceivedMessageFromThisNode) + knownNodesLock.release() + if PORT != recaddrPort: + print 'Strange occurance: The port specified in an addr message', str(recaddrPort),'does not match the port',str(PORT),'that this program (or some other peer) used to connect to it',str(hostFromAddrMessage),'. Perhaps they changed their port or are using a strange NAT configuration.' + if needToWriteKnownNodesToDisk: #Runs if any nodes were new to us. Also, share those nodes with our peers. + output = open(appdata + 'knownnodes.dat', 'wb') knownNodesLock.acquire() - knownNodes[recaddrStream] = {} + pickle.dump(knownNodes, output) knownNodesLock.release() - if hostFromAddrMessage not in knownNodes[recaddrStream]: - if len(knownNodes[recaddrStream]) < 20000 and timeSomeoneElseReceivedMessageFromThisNode > (int(time.time())-10800) and timeSomeoneElseReceivedMessageFromThisNode < (int(time.time()) + 10800): #If we have more than 20000 nodes in our list already then just forget about adding more. Also, make sure that the time that someone else received a message from this node is within three hours from now. + output.close() + self.broadcastaddr(listOfAddressDetailsToBroadcastToPeers) #no longer broadcast + printLock.acquire() + print 'knownNodes currently has', len(knownNodes[self.streamNumber]), 'nodes for this stream.' + printLock.release() + elif self.remoteProtocolVersion == 2: + print 'self.remoteProtocolVersion == 2' + if numberOfAddressesIncluded > 1000 or numberOfAddressesIncluded == 0: + return + if len(data) != lengthOfNumberOfAddresses + (38 * numberOfAddressesIncluded): + print 'addr message does not contain the correct amount of data. Ignoring.' + return + + needToWriteKnownNodesToDisk = False + for i in range(0,numberOfAddressesIncluded): + try: + if data[20+lengthOfNumberOfAddresses+(38*i):32+lengthOfNumberOfAddresses+(38*i)] != '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF': + printLock.acquire() + print 'Skipping IPv6 address.', repr(data[20+lengthOfNumberOfAddresses+(38*i):32+lengthOfNumberOfAddresses+(38*i)]) + printLock.release() + continue + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (to test for an IPv6 address). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. + + try: + recaddrStream, = unpack('>I',data[8+lengthOfNumberOfAddresses+(38*i):12+lengthOfNumberOfAddresses+(38*i)]) + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrStream). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. + if recaddrStream == 0: + continue + if recaddrStream != self.streamNumber and recaddrStream != (self.streamNumber * 2) and recaddrStream != ((self.streamNumber * 2) + 1): #if the embedded stream number is not in my stream or either of my child streams then ignore it. Someone might be trying funny business. + continue + try: + recaddrServices, = unpack('>Q',data[12+lengthOfNumberOfAddresses+(38*i):20+lengthOfNumberOfAddresses+(38*i)]) + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrServices). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. + + try: + recaddrPort, = unpack('>H',data[36+lengthOfNumberOfAddresses+(38*i):42+lengthOfNumberOfAddresses+(38*i)]) + except Exception, err: + printLock.acquire() + sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrPort). Message: %s\n' % str(err)) + printLock.release() + break #giving up on unpacking any more. We should still be connected however. + #print 'Within recaddr(): IP', recaddrIP, ', Port', recaddrPort, ', i', i + hostFromAddrMessage = socket.inet_ntoa(data[32+lengthOfNumberOfAddresses+(38*i):36+lengthOfNumberOfAddresses+(38*i)]) + #print 'hostFromAddrMessage', hostFromAddrMessage + if data[32+lengthOfNumberOfAddresses+(38*i)] == '\x7F': + print 'Ignoring IP address in loopback range:', hostFromAddrMessage + continue + if data[32+lengthOfNumberOfAddresses+(38*i)] == '\x0A': + print 'Ignoring IP address in private range:', hostFromAddrMessage + continue + if data[32+lengthOfNumberOfAddresses+(38*i):34+lengthOfNumberOfAddresses+(38*i)] == '\xC0A8': + print 'Ignoring IP address in private range:', hostFromAddrMessage + continue + timeSomeoneElseReceivedMessageFromThisNode, = unpack('>Q',data[lengthOfNumberOfAddresses+(38*i):8+lengthOfNumberOfAddresses+(38*i)]) #This is the 'time' value in the received addr message. 64-bit. + if recaddrStream not in knownNodes: #knownNodes is a dictionary of dictionaries with one outer dictionary for each stream. If the outer stream dictionary doesn't exist yet then we must make it. knownNodesLock.acquire() - knownNodes[recaddrStream][hostFromAddrMessage] = (recaddrPort, timeSomeoneElseReceivedMessageFromThisNode) + knownNodes[recaddrStream] = {} knownNodesLock.release() - print 'added new node', hostFromAddrMessage, 'to knownNodes in stream', recaddrStream - needToWriteKnownNodesToDisk = True - hostDetails = (timeSomeoneElseReceivedMessageFromThisNode, recaddrStream, recaddrServices, hostFromAddrMessage, recaddrPort) - listOfAddressDetailsToBroadcastToPeers.append(hostDetails) - else: - PORT, timeLastReceivedMessageFromThisNode = knownNodes[recaddrStream][hostFromAddrMessage]#PORT in this case is either the port we used to connect to the remote node, or the port that was specified by someone else in a past addr message. - if (timeLastReceivedMessageFromThisNode < timeSomeoneElseReceivedMessageFromThisNode) and (timeSomeoneElseReceivedMessageFromThisNode < int(time.time())): - knownNodesLock.acquire() - knownNodes[recaddrStream][hostFromAddrMessage] = (PORT, timeSomeoneElseReceivedMessageFromThisNode) - knownNodesLock.release() - if PORT != recaddrPort: - print 'Strange occurance: The port specified in an addr message', str(recaddrPort),'does not match the port',str(PORT),'that this program (or some other peer) used to connect to it',str(hostFromAddrMessage),'. Perhaps they changed their port or are using a strange NAT configuration.' - if needToWriteKnownNodesToDisk: #Runs if any nodes were new to us. Also, share those nodes with our peers. - output = open(appdata + 'knownnodes.dat', 'wb') - knownNodesLock.acquire() - pickle.dump(knownNodes, output) - knownNodesLock.release() - output.close() - self.broadcastaddr(listOfAddressDetailsToBroadcastToPeers) - printLock.acquire() - print 'knownNodes currently has', len(knownNodes[self.streamNumber]), 'nodes for this stream.' - printLock.release() + if hostFromAddrMessage not in knownNodes[recaddrStream]: + if len(knownNodes[recaddrStream]) < 20000 and timeSomeoneElseReceivedMessageFromThisNode > (int(time.time())-10800) and timeSomeoneElseReceivedMessageFromThisNode < (int(time.time()) + 10800): #If we have more than 20000 nodes in our list already then just forget about adding more. Also, make sure that the time that someone else received a message from this node is within three hours from now. + knownNodesLock.acquire() + knownNodes[recaddrStream][hostFromAddrMessage] = (recaddrPort, timeSomeoneElseReceivedMessageFromThisNode) + knownNodesLock.release() + print 'added new node', hostFromAddrMessage, 'to knownNodes in stream', recaddrStream + needToWriteKnownNodesToDisk = True + hostDetails = (timeSomeoneElseReceivedMessageFromThisNode, recaddrStream, recaddrServices, hostFromAddrMessage, recaddrPort) + listOfAddressDetailsToBroadcastToPeers.append(hostDetails) + else: + PORT, timeLastReceivedMessageFromThisNode = knownNodes[recaddrStream][hostFromAddrMessage]#PORT in this case is either the port we used to connect to the remote node, or the port that was specified by someone else in a past addr message. + if (timeLastReceivedMessageFromThisNode < timeSomeoneElseReceivedMessageFromThisNode) and (timeSomeoneElseReceivedMessageFromThisNode < int(time.time())): + knownNodesLock.acquire() + knownNodes[recaddrStream][hostFromAddrMessage] = (PORT, timeSomeoneElseReceivedMessageFromThisNode) + knownNodesLock.release() + if PORT != recaddrPort: + print 'Strange occurance: The port specified in an addr message', str(recaddrPort),'does not match the port',str(PORT),'that this program (or some other peer) used to connect to it',str(hostFromAddrMessage),'. Perhaps they changed their port or are using a strange NAT configuration.' + if needToWriteKnownNodesToDisk: #Runs if any nodes were new to us. Also, share those nodes with our peers. + output = open(appdata + 'knownnodes.dat', 'wb') + knownNodesLock.acquire() + pickle.dump(knownNodes, output) + knownNodesLock.release() + output.close() + self.broadcastaddr(listOfAddressDetailsToBroadcastToPeers) + printLock.acquire() + print 'knownNodes currently has', len(knownNodes[self.streamNumber]), 'nodes for this stream.' + printLock.release() + #Function runs when we want to broadcast an addr message to all of our peers. Runs when we learn of nodes that we didn't previously know about and want to share them with our peers. def broadcastaddr(self,listOfAddressDetailsToBroadcastToPeers): @@ -1448,7 +1574,7 @@ class receiveDataThread(QThread): payload = '' for hostDetails in listOfAddressDetailsToBroadcastToPeers: timeLastReceivedMessageFromThisNode, streamNumber, services, host, port = hostDetails - payload += pack('>I',timeLastReceivedMessageFromThisNode) + payload += pack('>Q',timeLastReceivedMessageFromThisNode) #now uses 64-bit time payload += pack('>I',streamNumber) payload += pack('>q',services) #service bit flags offered by this node payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(host) @@ -1503,7 +1629,10 @@ class receiveDataThread(QThread): PORT, timeLastReceivedMessageFromThisNode = value if timeLastReceivedMessageFromThisNode > (int(time.time())- maximumAgeOfNodesThatIAdvertiseToOthers): #If it is younger than 3 hours old.. numberOfAddressesInAddrMessage += 1 - payload += pack('>I',timeLastReceivedMessageFromThisNode) + if self.remoteProtocolVersion == 1: + payload += pack('>I',timeLastReceivedMessageFromThisNode) #32-bit time + else: + payload += pack('>Q',timeLastReceivedMessageFromThisNode) #64-bit time payload += pack('>I',self.streamNumber) payload += pack('>q',1) #service bit flags offered by this node payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(HOST) @@ -1512,7 +1641,10 @@ class receiveDataThread(QThread): PORT, timeLastReceivedMessageFromThisNode = value if timeLastReceivedMessageFromThisNode > (int(time.time())- maximumAgeOfNodesThatIAdvertiseToOthers): #If it is younger than 3 hours old.. numberOfAddressesInAddrMessage += 1 - payload += pack('>I',timeLastReceivedMessageFromThisNode) + if self.remoteProtocolVersion == 1: + payload += pack('>I',timeLastReceivedMessageFromThisNode) #32-bit time + else: + payload += pack('>Q',timeLastReceivedMessageFromThisNode) #64-bit time payload += pack('>I',self.streamNumber*2) payload += pack('>q',1) #service bit flags offered by this node payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(HOST) @@ -1521,7 +1653,10 @@ class receiveDataThread(QThread): PORT, timeLastReceivedMessageFromThisNode = value if timeLastReceivedMessageFromThisNode > (int(time.time())- maximumAgeOfNodesThatIAdvertiseToOthers): #If it is younger than 3 hours old.. numberOfAddressesInAddrMessage += 1 - payload += pack('>I',timeLastReceivedMessageFromThisNode) + if self.remoteProtocolVersion == 1: + payload += pack('>I',timeLastReceivedMessageFromThisNode) #32-bit time + else: + payload += pack('>Q',timeLastReceivedMessageFromThisNode) #64-bit time payload += pack('>I',(self.streamNumber*2)+1) payload += pack('>q',1) #service bit flags offered by this node payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(HOST) @@ -1576,6 +1711,7 @@ class receiveDataThread(QThread): print 'Closing connection to myself: ', self.HOST printLock.release() return + broadcastToSendDataQueues((0,'setRemoteProtocolVersion',(self.HOST,self.remoteProtocolVersion))) knownNodesLock.acquire() knownNodes[self.streamNumber][self.HOST] = (self.remoteNodeIncomingPort, int(time.time())) @@ -1728,19 +1864,31 @@ class sendDataThread(QThread): print 'setting the stream number in the sendData thread (ID:',id(self), ') to', specifiedStreamNumber printLock.release() self.streamNumber = specifiedStreamNumber + elif command == 'setRemoteProtocolVersion': + hostInMessage, specifiedRemoteProtocolVersion = data + if hostInMessage == self.HOST: + printLock.acquire() + print 'setting the remote node\'s protocol version in the sendData thread (ID:',id(self), ') to', specifiedRemoteProtocolVersion + printLock.release() + self.remoteProtocolVersion = specifiedRemoteProtocolVersion elif command == 'sendaddr': - try: - #To prevent some network analysis, 'leak' the data out to our peer after waiting a random amount of time unless we have a long list of messages in our queue to send. - random.seed() - time.sleep(random.randrange(0, 10)) - self.sock.sendall(data) - self.lastTimeISentData = int(time.time()) - except: - print 'self.sock.sendall failed' - self.sock.close() - sendDataQueues.remove(self.mailbox) - print 'sendDataThread thread', self, 'ending now' - break + if self.remoteProtocolVersion == 1: + printLock.acquire() + print 'a sendData thread is not sending an addr message to this particular peer ('+self.HOST+') because their protocol version is 1.' + printLock.release() + else: + try: + #To prevent some network analysis, 'leak' the data out to our peer after waiting a random amount of time unless we have a long list of messages in our queue to send. + random.seed() + time.sleep(random.randrange(0, 10)) + self.sock.sendall(data) + self.lastTimeISentData = int(time.time()) + except: + print 'self.sock.sendall failed' + self.sock.close() + sendDataQueues.remove(self.mailbox) + print 'sendDataThread thread', self, 'ending now' + break elif command == 'sendinv': if data not in self.objectsOfWhichThisRemoteNodeIsAlreadyAware: payload = '\x01' + data @@ -3993,18 +4141,7 @@ class MyForm(QtGui.QMainWindow): sqlSubmitQueue.put('commit') sqlLock.release() - - - - """try: - fromLabel = config.get(fromAddress, 'label') - except: - fromLabel = '' - if fromLabel == '': - fromLabel = fromAddress""" - toLabel = '' - t = (toAddress,) sqlLock.acquire() sqlSubmitQueue.put('''select label from addressbook where address=?''') @@ -4018,30 +4155,6 @@ class MyForm(QtGui.QMainWindow): self.displayNewSentMessage(toAddress,toLabel,fromAddress, subject, message, ackdata) workerQueue.put(('sendmessage',toAddress)) - """self.ui.tableWidgetSent.insertRow(0) - if toLabel == '': - newItem = QtGui.QTableWidgetItem(unicode(toAddress,'utf-8')) - else: - newItem = QtGui.QTableWidgetItem(unicode(toLabel,'utf-8')) - newItem.setData(Qt.UserRole,str(toAddress)) - self.ui.tableWidgetSent.setItem(0,0,newItem) - - if fromLabel == '': - newItem = QtGui.QTableWidgetItem(unicode(fromAddress,'utf-8')) - else: - newItem = QtGui.QTableWidgetItem(unicode(fromLabel,'utf-8')) - newItem.setData(Qt.UserRole,str(fromAddress)) - self.ui.tableWidgetSent.setItem(0,1,newItem) - newItem = QtGui.QTableWidgetItem(unicode(subject,'utf-8)')) - newItem.setData(Qt.UserRole,unicode(message,'utf-8)')) - self.ui.tableWidgetSent.setItem(0,2,newItem) - newItem = myTableWidgetItem('Just pressed ''send'' ' + unicode(strftime(config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8')) - newItem.setData(Qt.UserRole,QByteArray(ackdata)) - newItem.setData(33,int(time.time())) - self.ui.tableWidgetSent.setItem(0,3,newItem) - - self.ui.textEditSentMessage.setPlainText(self.ui.tableWidgetSent.item(0,2).data(Qt.UserRole).toPyObject())""" - self.ui.comboBoxSendFrom.setCurrentIndex(0) self.ui.labelFrom.setText('') self.ui.lineEditTo.setText('') -- 2.45.1 From c50ab9ff9c556c4060a8a977970da6127f3bf247 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Wed, 17 Apr 2013 14:32:18 -0400 Subject: [PATCH 08/12] preparation for switch from 32 bit time to 64 bit time in protocol --- bitmessagemain.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index ca6278b8..aae51ae7 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -1474,8 +1474,8 @@ class receiveDataThread(QThread): printLock.acquire() print 'knownNodes currently has', len(knownNodes[self.streamNumber]), 'nodes for this stream.' printLock.release() - elif self.remoteProtocolVersion == 2: - print 'self.remoteProtocolVersion == 2' + elif self.remoteProtocolVersion >= 2: #The difference is that in protocol version 2, network addresses use 64 bit times rather than 32 bit times. + print 'self.remoteProtocolVersion =', self.remoteProtocolVersion if numberOfAddressesIncluded > 1000 or numberOfAddressesIncluded == 0: return if len(data) != lengthOfNumberOfAddresses + (38 * numberOfAddressesIncluded): @@ -1728,7 +1728,7 @@ class receiveDataThread(QThread): def sendversion(self): global softwareVersion payload = '' - payload += pack('>L',1) #protocol version. + payload += pack('>L',2) #protocol version. payload += pack('>q',1) #bitflags of the services I offer. payload += pack('>q',int(time.time())) @@ -1806,7 +1806,7 @@ class sendDataThread(QThread): #Note that there is another copy of this version-sending code in the receiveData class which would need to be changed if you make changes here. global softwareVersion payload = '' - payload += pack('>L',1) #protocol version. + payload += pack('>L',2) #protocol version. payload += pack('>q',1) #bitflags of the services I offer. payload += pack('>q',int(time.time())) @@ -5309,6 +5309,8 @@ if __name__ == "__main__": knownNodes = pickle.load(pickleFile) pickleFile.close() + print knownNodes + if config.getint('bitmessagesettings', 'settingsversion') > 4: print 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.' raise SystemExit -- 2.45.1 From f75f0b20a8389a9ef187dd3e0968ede8d439c947 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Wed, 17 Apr 2013 14:42:03 -0400 Subject: [PATCH 09/12] preparation for switch from 32 bit time to 64 bit time in protocol --- bitmessagemain.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index aae51ae7..f68595dc 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -1481,6 +1481,8 @@ class receiveDataThread(QThread): if len(data) != lengthOfNumberOfAddresses + (38 * numberOfAddressesIncluded): print 'addr message does not contain the correct amount of data. Ignoring.' return + else: + print 'len of addr data is correct:', len(data) needToWriteKnownNodesToDisk = False for i in range(0,numberOfAddressesIncluded): @@ -1516,7 +1518,7 @@ class receiveDataThread(QThread): break #giving up on unpacking any more. We should still be connected however. try: - recaddrPort, = unpack('>H',data[36+lengthOfNumberOfAddresses+(38*i):42+lengthOfNumberOfAddresses+(38*i)]) + recaddrPort, = unpack('>H',data[36+lengthOfNumberOfAddresses+(38*i):38+lengthOfNumberOfAddresses+(38*i)]) except Exception, err: printLock.acquire() sys.stderr.write('ERROR TRYING TO UNPACK recaddr (recaddrPort). Message: %s\n' % str(err)) -- 2.45.1 From b404c1cd3bab15bb04845d8aac294c912e179722 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Wed, 17 Apr 2013 15:00:42 -0400 Subject: [PATCH 10/12] removed extraneous lines used to check correct program operation --- bitmessagemain.py | 97 ++++++++++++++++------------------------------- 1 file changed, 32 insertions(+), 65 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index f68595dc..c572c10d 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -181,7 +181,7 @@ class outgoingSynSender(QThread): knownNodesLock.release() print 'deleting ', HOST, 'from knownNodes because it is more than 48 hours old and we could not connect to it.' except Exception, err: - print 'An exception has occurred in the outgoingSynSender thread that was not caught by other exception types:', err + sys.stderr.write('An exception has occurred in the outgoingSynSender thread that was not caught by other exception types: %s\n' % err) time.sleep(0.1) #Only one singleListener thread will ever exist. It creates the receiveDataThread and sendDataThread for each incoming connection. Note that it cannot set the stream number because it is not known yet- the other node will have to tell us its stream number in a version message. If we don't care about their stream, we will close the connection (within the recversion function of the recieveData thread) @@ -1475,14 +1475,11 @@ class receiveDataThread(QThread): print 'knownNodes currently has', len(knownNodes[self.streamNumber]), 'nodes for this stream.' printLock.release() elif self.remoteProtocolVersion >= 2: #The difference is that in protocol version 2, network addresses use 64 bit times rather than 32 bit times. - print 'self.remoteProtocolVersion =', self.remoteProtocolVersion if numberOfAddressesIncluded > 1000 or numberOfAddressesIncluded == 0: return if len(data) != lengthOfNumberOfAddresses + (38 * numberOfAddressesIncluded): print 'addr message does not contain the correct amount of data. Ignoring.' return - else: - print 'len of addr data is correct:', len(data) needToWriteKnownNodesToDisk = False for i in range(0,numberOfAddressesIncluded): @@ -1728,39 +1725,10 @@ class receiveDataThread(QThread): #Sends a version message def sendversion(self): - global softwareVersion - payload = '' - payload += pack('>L',2) #protocol version. - payload += pack('>q',1) #bitflags of the services I offer. - payload += pack('>q',int(time.time())) - - payload += pack('>q',1) #boolservices offered by the remote node. This data is ignored by the remote host because how could We know what Their services are without them telling us? - payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(self.HOST) - payload += pack('>H',self.PORT)#remote IPv6 and port - - payload += pack('>q',1) #bitflags of the services I offer. - payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + pack('>L',2130706433) # = 127.0.0.1. This will be ignored by the remote host. The actual remote connected IP will be used. - payload += pack('>H',config.getint('bitmessagesettings', 'port'))#my external IPv6 and port - - random.seed() - payload += eightBytesOfRandomDataUsedToDetectConnectionsToSelf - userAgent = '/PyBitmessage:' + softwareVersion + '/' #Length of userAgent must be less than 253. - payload += pack('>B',len(userAgent)) #user agent string length. If the user agent is more than 252 bytes long, this code isn't going to work. - payload += userAgent - payload += encodeVarint(1) #The number of streams about which I care. PyBitmessage currently only supports 1. - payload += encodeVarint(self.streamNumber) - - datatosend = '\xe9\xbe\xb4\xd9' #magic bits, slighly different from Bitcoin's magic bits. - datatosend = datatosend + 'version\x00\x00\x00\x00\x00' #version command - datatosend = datatosend + pack('>L',len(payload)) #payload length - datatosend = datatosend + hashlib.sha512(payload).digest()[0:4] - datatosend = datatosend + payload - printLock.acquire() print 'Sending version message' printLock.release() - self.sock.sendall(datatosend) - #self.versionSent = 1 + self.sock.sendall(assembleVersionMessage(self.HOST,self.PORT,self.streamNumber)) #Sends a verack message def sendverack(self): @@ -1804,35 +1772,7 @@ class sendDataThread(QThread): printLock.release() def sendVersionMessage(self): - - #Note that there is another copy of this version-sending code in the receiveData class which would need to be changed if you make changes here. - global softwareVersion - payload = '' - payload += pack('>L',2) #protocol version. - payload += pack('>q',1) #bitflags of the services I offer. - payload += pack('>q',int(time.time())) - - payload += pack('>q',1) #boolservices of remote connection. How can I even know this for sure? This is probably ignored by the remote host. - payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(self.HOST) - payload += pack('>H',self.PORT)#remote IPv6 and port - - payload += pack('>q',1) #bitflags of the services I offer. - payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + pack('>L',2130706433) # = 127.0.0.1. This will be ignored by the remote host. The actual remote connected IP will be used. - payload += pack('>H',config.getint('bitmessagesettings', 'port'))#my external IPv6 and port - - random.seed() - payload += eightBytesOfRandomDataUsedToDetectConnectionsToSelf - userAgent = '/PyBitmessage:' + softwareVersion + '/' #Length of userAgent must be less than 253. - payload += pack('>B',len(userAgent)) #user agent string length. If the user agent is more than 252 bytes long, this code isn't going to work. - payload += userAgent - payload += encodeVarint(1) #The number of streams about which I care. PyBitmessage currently only supports 1 per connection. - payload += encodeVarint(self.streamNumber) - - datatosend = '\xe9\xbe\xb4\xd9' #magic bits, slighly different from Bitcoin's magic bits. - datatosend = datatosend + 'version\x00\x00\x00\x00\x00' #version command - datatosend = datatosend + pack('>L',len(payload)) #payload length - datatosend = datatosend + hashlib.sha512(payload).digest()[0:4] - datatosend = datatosend + payload + datatosend = assembleVersionMessage(self.HOST,self.PORT,self.streamNumber)#the IP and port of the remote host, and my streamNumber. printLock.acquire() print 'Sending version packet: ', repr(datatosend) @@ -2086,6 +2026,35 @@ def isAddressInMyAddressBook(address): sqlLock.release() return queryreturn != [] +def assembleVersionMessage(remoteHost,remotePort,myStreamNumber): + global softwareVersion + payload = '' + payload += pack('>L',2) #protocol version. + payload += pack('>q',1) #bitflags of the services I offer. + payload += pack('>q',int(time.time())) + + payload += pack('>q',1) #boolservices of remote connection. How can I even know this for sure? This is probably ignored by the remote host. + payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + socket.inet_aton(remoteHost) + payload += pack('>H',remotePort)#remote IPv6 and port + + payload += pack('>q',1) #bitflags of the services I offer. + payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + pack('>L',2130706433) # = 127.0.0.1. This will be ignored by the remote host. The actual remote connected IP will be used. + payload += pack('>H',config.getint('bitmessagesettings', 'port'))#my external IPv6 and port + + random.seed() + payload += eightBytesOfRandomDataUsedToDetectConnectionsToSelf + userAgent = '/PyBitmessage:' + softwareVersion + '/' #Length of userAgent must be less than 253. + payload += pack('>B',len(userAgent)) #user agent string length. If the user agent is more than 252 bytes long, this code isn't going to work. + payload += userAgent + payload += encodeVarint(1) #The number of streams about which I care. PyBitmessage currently only supports 1 per connection. + payload += encodeVarint(myStreamNumber) + + datatosend = '\xe9\xbe\xb4\xd9' #magic bits, slighly different from Bitcoin's magic bits. + datatosend = datatosend + 'version\x00\x00\x00\x00\x00' #version command + datatosend = datatosend + pack('>L',len(payload)) #payload length + datatosend = datatosend + hashlib.sha512(payload).digest()[0:4] + return datatosend + payload + #This thread exists because SQLITE3 is so un-threadsafe that we must submit queries to it and it puts results back in a different queue. They won't let us just use locks. class sqlThread(QThread): def __init__(self, parent = None): @@ -5311,8 +5280,6 @@ if __name__ == "__main__": knownNodes = pickle.load(pickleFile) pickleFile.close() - print knownNodes - if config.getint('bitmessagesettings', 'settingsversion') > 4: print 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.' raise SystemExit -- 2.45.1 From 3bbf701130c85686db19fad4251807469afbfed9 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Wed, 17 Apr 2013 15:16:22 -0400 Subject: [PATCH 11/12] removed extraneous lines used to check correct program operation --- bitmessagemain.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index c572c10d..409b1ad2 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -1383,7 +1383,6 @@ class receiveDataThread(QThread): printLock.release() if self.remoteProtocolVersion == 1: - print 'self.remoteProtocolVersion == 1' if numberOfAddressesIncluded > 1000 or numberOfAddressesIncluded == 0: return if len(data) != lengthOfNumberOfAddresses + (34 * numberOfAddressesIncluded): @@ -1452,7 +1451,6 @@ class receiveDataThread(QThread): knownNodesLock.acquire() knownNodes[recaddrStream][hostFromAddrMessage] = (recaddrPort, timeSomeoneElseReceivedMessageFromThisNode) knownNodesLock.release() - print 'added new node', hostFromAddrMessage, 'to knownNodes in stream', recaddrStream needToWriteKnownNodesToDisk = True hostDetails = (timeSomeoneElseReceivedMessageFromThisNode, recaddrStream, recaddrServices, hostFromAddrMessage, recaddrPort) listOfAddressDetailsToBroadcastToPeers.append(hostDetails) -- 2.45.1 From 5f28f56c814420e4b337894664aafa32e2e8196b Mon Sep 17 00:00:00 2001 From: Lasse Karstensen Date: Sat, 20 Apr 2013 14:26:41 +0200 Subject: [PATCH 12/12] Add gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..34cba6df --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**pyc -- 2.45.1