Merge branch 'master' of https://github.com/Bitmessage/PyBitmessage into namecoin-id
Conflicts: src/bitmessageqt/__init__.py src/bitmessageqt/bitmessageui.py src/bitmessageqt/settings.py
This commit is contained in:
commit
a2fe6a1b44
76
Makefile
Executable file → Normal file
76
Makefile
Executable file → Normal file
|
@ -1,51 +1,45 @@
|
||||||
APP=pybitmessage
|
APP=pybitmessage
|
||||||
VERSION=0.3.4
|
VERSION=0.3.4
|
||||||
DEST_SHARE=${DESTDIR}/usr/share
|
RELEASE=1
|
||||||
DEST_APP=${DEST_SHARE}/${APP}
|
ARCH_TYPE=`uname -m`
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
|
||||||
debug:
|
debug:
|
||||||
|
|
||||||
source:
|
source:
|
||||||
tar -cvzf ../${APP}_${VERSION}.orig.tar.gz ../${APP}-${VERSION} --exclude-vcs
|
tar -cvzf ../${APP}_${VERSION}.orig.tar.gz ../${APP}-${VERSION} --exclude-vcs
|
||||||
|
|
||||||
install:
|
install:
|
||||||
mkdir -m 755 -p ${DESTDIR}/usr/bin
|
mkdir -p ${DESTDIR}/usr
|
||||||
mkdir -m 755 -p ${DEST_APP}
|
mkdir -p ${DESTDIR}/usr/bin
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/applications
|
mkdir -m 755 -p ${DESTDIR}/usr/share
|
||||||
mkdir -m 755 -p ${DEST_APP}/images
|
mkdir -m 755 -p ${DESTDIR}/usr/share/man
|
||||||
mkdir -m 755 -p ${DEST_APP}/pyelliptic
|
mkdir -m 755 -p ${DESTDIR}/usr/share/man/man1
|
||||||
mkdir -m 755 -p ${DEST_APP}/socks
|
install -m 644 man/${APP}.1.gz ${DESTDIR}/usr/share/man/man1
|
||||||
mkdir -m 755 -p ${DEST_APP}/bitmessageqt
|
mkdir -m 755 -p ${DESTDIR}/usr/share/${APP}
|
||||||
mkdir -m 755 -p ${DEST_APP}/translations
|
mkdir -m 755 -p ${DESTDIR}/usr/share/applications
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/pixmaps
|
mkdir -m 755 -p ${DESTDIR}/usr/share/pixmaps
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/icons
|
mkdir -m 755 -p ${DESTDIR}/usr/share/icons
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/icons/hicolor
|
mkdir -m 755 -p ${DESTDIR}/usr/share/icons/hicolor
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/icons/hicolor/scalable
|
mkdir -m 755 -p ${DESTDIR}/usr/share/icons/hicolor/scalable
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/icons/hicolor/scalable/apps
|
mkdir -m 755 -p ${DESTDIR}/usr/share/icons/hicolor/scalable/apps
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/icons/hicolor/24x24
|
mkdir -m 755 -p ${DESTDIR}/usr/share/icons/hicolor/24x24
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/icons/hicolor/24x24/apps
|
mkdir -m 755 -p ${DESTDIR}/usr/share/icons/hicolor/24x24/apps
|
||||||
|
install -m 644 desktop/${APP}.desktop ${DESTDIR}/usr/share/applications/${APP}.desktop
|
||||||
cp -r src/* ${DEST_APP}
|
install -m 644 desktop/icon24.png ${DESTDIR}/usr/share/icons/hicolor/24x24/apps/${APP}.png
|
||||||
install -m 755 debian/pybm ${DESTDIR}/usr/bin/${APP}
|
cp -rf src/* ${DESTDIR}/usr/share/${APP}
|
||||||
|
echo '#!/bin/sh' > ${DESTDIR}/usr/bin/${APP}
|
||||||
install -m 644 desktop/${APP}.desktop ${DEST_SHARE}/applications/${APP}.desktop
|
echo 'cd /usr/share/pybitmessage' >> ${DESTDIR}/usr/bin/${APP}
|
||||||
install -m 644 src/images/can-icon-24px.png ${DEST_SHARE}/icons/hicolor/24x24/apps/${APP}.png
|
echo 'LD_LIBRARY_PATH="/opt/openssl-compat-bitcoin/lib/" exec python2 bitmessagemain.py' >> ${DESTDIR}/usr/bin/${APP}
|
||||||
install -m 644 desktop/can-icon.svg ${DEST_SHARE}/icons/hicolor/scalable/apps/${APP}.svg
|
chmod +x ${DESTDIR}/usr/bin/${APP}
|
||||||
install -m 644 desktop/can-icon.svg ${DEST_SHARE}/pixmaps/${APP}.svg
|
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
rm -Rf "${DEST_APP}"
|
rm -f /usr/share/man/man1/${APP}.1.gz
|
||||||
rm -f "${DESTDIR}/usr/bin/${APP}"
|
rm -rf /usr/share/${APP}
|
||||||
rm -f "${DEST_SHARE}/applications/${APP}.desktop"
|
rm -f /usr/bin/${APP}
|
||||||
rm -f "${DEST_SHARE}/icons/hicolor/24x24/apps/${APP}.png"
|
rm -f /usr/share/applications/${APP}.desktop
|
||||||
rm -f "${DEST_SHARE}/icons/hicolor/scalable/apps/${APP}.svg"
|
rm -f /usr/share/icons/hicolor/scalable/apps/${APP}.svg
|
||||||
rm -f "${DEST_SHARE}/pixmaps/${APP}.svg"
|
/usr/share/pixmaps/${APP}.svg
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf debian/${APP}
|
rm -f ${APP} \#* \.#* gnuplot* *.png debian/*.substvars debian/*.log
|
||||||
rm -f ../${APP}_*.deb ../${APP}_*.asc ../${APP}_*.dsc ../${APP}*.changes
|
rm -fr deb.* debian/${APP} rpmpackage/${ARCH_TYPE}
|
||||||
rm -f *.sh~ src/*.pyc src/socks/*.pyc src/pyelliptic/*.pyc
|
rm -f ../${APP}*.deb ../${APP}*.changes ../${APP}*.asc ../${APP}*.dsc
|
||||||
rm -f *.deb \#* \.#* debian/*.log debian/*.substvars
|
rm -f rpmpackage/*.src.rpm archpackage/*.gz archpackage/*.xz
|
||||||
rm -f Makefile~
|
rm -f puppypackage/*.gz puppypackage/*.pet slackpackage/*.txz
|
||||||
|
|
48
arch.sh
Executable file
48
arch.sh
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP=pybitmessage
|
||||||
|
PREV_VERSION=0.3.4
|
||||||
|
VERSION=0.3.4
|
||||||
|
RELEASE=1
|
||||||
|
ARCH_TYPE=`uname -m`
|
||||||
|
CURRDIR=`pwd`
|
||||||
|
SOURCE=archpackage/${APP}-${VERSION}.tar.gz
|
||||||
|
|
||||||
|
# Update version numbers automatically - so you don't have to
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile debian.sh rpm.sh puppy.sh ebuild.sh slack.sh
|
||||||
|
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
|
||||||
|
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/pinstall.sh puppypackage/puninstall.sh
|
||||||
|
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
|
||||||
|
|
||||||
|
|
||||||
|
# Create the source code
|
||||||
|
make clean
|
||||||
|
rm -f archpackage/*.gz
|
||||||
|
|
||||||
|
# having the root directory called name-version seems essential
|
||||||
|
mv ../${APP} ../${APP}-${VERSION}
|
||||||
|
tar -cvzf ${SOURCE} ../${APP}-${VERSION} --exclude-vcs
|
||||||
|
|
||||||
|
# rename the root directory without the version number
|
||||||
|
mv ../${APP}-${VERSION} ../${APP}
|
||||||
|
|
||||||
|
# calculate the MD5 checksum
|
||||||
|
CHECKSM=$(md5sum ${SOURCE})
|
||||||
|
sed -i "s/md5sums[^)]*)/md5sums=(${CHECKSM%% *})/g" archpackage/PKGBUILD
|
||||||
|
|
||||||
|
cd archpackage
|
||||||
|
|
||||||
|
# Create the package
|
||||||
|
tar -c -f ${APP}-${VERSION}.pkg.tar .
|
||||||
|
sync
|
||||||
|
xz ${APP}-${VERSION}.pkg.tar
|
||||||
|
sync
|
||||||
|
|
||||||
|
# Move back to the original directory
|
||||||
|
cd ${CURRDIR}
|
||||||
|
|
31
archpackage/PKGBUILD
Normal file
31
archpackage/PKGBUILD
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Maintainer: Bob Mottram (4096 bits) <bob@robotics.uk.to>
|
||||||
|
pkgname=pybitmessage
|
||||||
|
pkgver=0.3.4
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="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."
|
||||||
|
arch=('i686' 'x86_64')
|
||||||
|
url="https://github.com/Bitmessage/PyBitmessage"
|
||||||
|
license=('MIT')
|
||||||
|
groups=()
|
||||||
|
depends=('python2' 'qt4' 'python2-pyqt4' 'sqlite' 'openssl')
|
||||||
|
makedepends=()
|
||||||
|
optdepends=('python2-gevent')
|
||||||
|
provides=()
|
||||||
|
conflicts=()
|
||||||
|
replaces=()
|
||||||
|
backup=()
|
||||||
|
options=()
|
||||||
|
install=
|
||||||
|
changelog=
|
||||||
|
source=($pkgname-$pkgver.tar.gz)
|
||||||
|
noextract=()
|
||||||
|
md5sums=()
|
||||||
|
build() {
|
||||||
|
cd "$srcdir/$pkgname-$pkgver"
|
||||||
|
./configure --prefix=/usr
|
||||||
|
make
|
||||||
|
}
|
||||||
|
package() {
|
||||||
|
cd "$srcdir/$pkgname-$pkgver"
|
||||||
|
make DESTDIR="$pkgdir/" install
|
||||||
|
}
|
52
debian.sh
Executable file → Normal file
52
debian.sh
Executable file → Normal file
|
@ -1,32 +1,46 @@
|
||||||
# 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
|
#!/bin/bash
|
||||||
|
|
||||||
APP=pybitmessage
|
APP=pybitmessage
|
||||||
PREV_VERSION=0.3.3
|
PREV_VERSION=0.3.4
|
||||||
VERSION=0.3.4
|
VERSION=0.3.4
|
||||||
RELEASE=1
|
RELEASE=1
|
||||||
ARCH_TYPE=all
|
ARCH_TYPE=`uname -m`
|
||||||
|
DIR=${APP}-${VERSION}
|
||||||
|
|
||||||
#update version numbers automatically - so you don't have to
|
if [ $ARCH_TYPE == "x86_64" ]; then
|
||||||
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile
|
ARCH_TYPE="amd64"
|
||||||
sed -i 's/'''${PREV_VERSION}'''/'''${VERSION}'''/g' src/shared.py
|
fi
|
||||||
|
if [ $ARCH_TYPE == "i686" ]; then
|
||||||
|
ARCH_TYPE="i386"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Update version numbers automatically - so you don't have to
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile rpm.sh arch.sh puppy.sh ebuild.sh slack.sh
|
||||||
|
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
|
||||||
|
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/pinstall.sh puppypackage/puninstall.sh
|
||||||
|
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
|
||||||
|
|
||||||
|
make clean
|
||||||
|
make
|
||||||
|
|
||||||
|
# change the parent directory name to debian format
|
||||||
|
mv ../${APP} ../${DIR}
|
||||||
|
|
||||||
# Create a source archive
|
# Create a source archive
|
||||||
make clean
|
|
||||||
# change the directory name to pybitmessage-version
|
|
||||||
mv ../PyBitmessage ../${APP}-${VERSION}
|
|
||||||
make source
|
make source
|
||||||
|
|
||||||
# Build the package
|
# Build the package
|
||||||
dpkg-buildpackage -A || exit 1
|
dpkg-buildpackage -F
|
||||||
|
|
||||||
# change the directory name back
|
# sign files
|
||||||
mv ../${APP}-${VERSION} ../PyBitmessage
|
gpg -ba ../${APP}_${VERSION}-1_${ARCH_TYPE}.deb
|
||||||
|
|
||||||
gpg -ba ../${APP}_${VERSION}-${RELEASE}_${ARCH_TYPE}.deb
|
|
||||||
gpg -ba ../${APP}_${VERSION}.orig.tar.gz
|
gpg -ba ../${APP}_${VERSION}.orig.tar.gz
|
||||||
|
|
||||||
|
# restore the parent directory name
|
||||||
|
mv ../${DIR} ../${APP}
|
||||||
|
|
4
debian/changelog
vendored
4
debian/changelog
vendored
|
@ -18,7 +18,7 @@ pybitmessage (0.3.3-1) raring; urgency=low
|
||||||
via Portage (Gentoo)
|
via Portage (Gentoo)
|
||||||
* Fix message authentication bug
|
* Fix message authentication bug
|
||||||
|
|
||||||
-- Bob Mottram (4096 bits) <bob@robotics.uk.to> Sun, 30 June 2013 11:23:00 +0100
|
-- Bob Mottram (4096 bits) <bob@robotics.uk.to> Sat, 29 June 2013 11:23:00 +0100
|
||||||
|
|
||||||
pybitmessage (0.3.211-1) raring; urgency=low
|
pybitmessage (0.3.211-1) raring; urgency=low
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ pybitmessage (0.3.211-1) raring; urgency=low
|
||||||
as the multiprocessing module does not work well with
|
as the multiprocessing module does not work well with
|
||||||
pyinstaller's --onefile option.
|
pyinstaller's --onefile option.
|
||||||
|
|
||||||
-- Bob Mottram (4096 bits) <bob@robotics.uk.to> Sun, 30 June 2013 11:23:00 +0100
|
-- Bob Mottram (4096 bits) <bob@robotics.uk.to> Fri, 28 June 2013 11:23:00 +0100
|
||||||
|
|
||||||
pybitmessage (0.3.2-1) raring; urgency=low
|
pybitmessage (0.3.2-1) raring; urgency=low
|
||||||
|
|
||||||
|
|
2
debian/compat
vendored
2
debian/compat
vendored
|
@ -1 +1 @@
|
||||||
8
|
9
|
||||||
|
|
34
debian/control
vendored
34
debian/control
vendored
|
@ -1,21 +1,21 @@
|
||||||
Source: pybitmessage
|
Source: pybitmessage
|
||||||
Section: contrib/comm
|
|
||||||
Priority: extra
|
Priority: extra
|
||||||
Maintainer: Jonathan Warren <jonathan@bitmessage.org>
|
Maintainer: Bob Mottram (4096 bits) <bob@robotics.uk.to>
|
||||||
Build-Depends: debhelper (>= 8.0.0), python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev, libmessaging-menu-dev
|
Build-Depends: debhelper (>= 9.0.0)
|
||||||
Standards-Version: 3.9.2
|
Standards-Version: 3.9.4
|
||||||
Homepage: https://bitmessage.org/
|
Homepage: https://github.com/Bitmessage/PyBitmessage
|
||||||
Vcs-Browser: https://github.com/Bitmessage/PyBitmessage
|
Vcs-Git: https://github.com/fuzzgun/fin.git
|
||||||
Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git
|
|
||||||
|
|
||||||
Package: pybitmessage
|
Package: pybitmessage
|
||||||
Architecture: all
|
Section: mail
|
||||||
Depends: ${misc:Depends}, python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev, libmessaging-menu-dev
|
Architecture: any
|
||||||
Description: Send encrypted messages to another person or to many subscribers
|
Depends: ${shlibs:Depends}, ${misc:Depends}, python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev
|
||||||
Bitmessage is a P2P communications protocol used to send encrypted messages
|
Suggests: libmessaging-menu-dev
|
||||||
to another person or to many subscribers. It is decentralized and trustless,
|
Description: Send encrypted messages
|
||||||
meaning that you need-not inherently trust any entities like root certificate
|
Bitmessage is a P2P communications protocol used to send encrypted
|
||||||
authorities. It uses strong authentication which means that the sender of a
|
messages to another person or to many subscribers. It is decentralized and
|
||||||
message cannot be spoofed, and it aims to hide "non-content" data, like the
|
trustless, meaning that you need-not inherently trust any entities like
|
||||||
sender and receiver of messages, from passive eavesdroppers like those
|
root certificate authorities. It uses strong authentication which means
|
||||||
running warrantless wiretapping programs.
|
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.
|
||||||
|
|
40
debian/copyright
vendored
40
debian/copyright
vendored
|
@ -1,30 +1,30 @@
|
||||||
Format: http://dep.debian.net/deps/dep5
|
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
Upstream-Name: PyBitmessage
|
Upstream-Name:
|
||||||
Source: https://github.com/Bitmessage/PyBitmessage
|
Source:
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2012 Jonathan Warren
|
Copyright: Copyright 2013 Bob Mottram (4096 bits) <bob@robotics.uk.to>
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
||||||
Files: debian/*
|
Files: debian/*
|
||||||
Copyright: 2012 Jonathan Warren
|
Copyright: Copyright 2013 Bob Mottram (4096 bits) <bob@robotics.uk.to>
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
||||||
License: MIT
|
License: MIT
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
copy of this software and associated documentation files (the "Software"),
|
||||||
in the Software without restriction, including without limitation the rights
|
to deal in the Software without restriction, including without limitation
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
furnished to do so, subject to the following conditions:
|
Software is furnished to do so, subject to the following conditions:
|
||||||
.
|
.
|
||||||
The above copyright notice and this permission notice shall be included in
|
The above copyright notice and this permission notice shall be included
|
||||||
all copies or substantial portions of the Software.
|
in all copies or substantial portions of the Software.
|
||||||
.
|
.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
THE SOFTWARE.
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
1
debian/manpages
vendored
Normal file
1
debian/manpages
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
man/pybitmessage.1.gz
|
84
debian/rules
vendored
Executable file → Normal file
84
debian/rules
vendored
Executable file → Normal file
|
@ -1,66 +1,42 @@
|
||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
APP=pybitmessage
|
|
||||||
DESTDIR=${CURDIR}/debian/${APP}
|
|
||||||
DEST_SHARE=${DESTDIR}/usr/share
|
|
||||||
DEST_APP=${DEST_SHARE}/${APP}
|
|
||||||
|
|
||||||
|
APP=pybitmessage
|
||||||
build: build-stamp
|
build: build-stamp
|
||||||
make
|
make
|
||||||
build-arch: build-stamp
|
build-arch: build-stamp
|
||||||
build-indep: build-stamp
|
build-indep: build-stamp
|
||||||
build-stamp:
|
build-stamp:
|
||||||
dh_testdir
|
dh_testdir
|
||||||
touch build-stamp
|
touch build-stamp
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
dh_testdir
|
dh_testdir
|
||||||
dh_testroot
|
dh_testroot
|
||||||
rm -f build-stamp
|
rm -f build-stamp
|
||||||
dh_clean
|
dh_clean
|
||||||
install:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_prep
|
|
||||||
dh_clean -k
|
|
||||||
dh_installdirs
|
|
||||||
|
|
||||||
mkdir -m 755 -p ${DESTDIR}/usr/bin
|
|
||||||
mkdir -m 755 -p ${DEST_APP}
|
|
||||||
mkdir -m 755 -p ${DEST_SHARE}/applications
|
|
||||||
mkdir -m 755 -p ${DEST_APP}/images
|
|
||||||
mkdir -m 755 -p ${DEST_APP}/pyelliptic
|
|
||||||
mkdir -m 755 -p ${DEST_APP}/socks
|
|
||||||
mkdir -m 755 -p ${DEST_APP}/bitmessageqt
|
|
||||||
mkdir -m 755 -p ${DEST_APP}/translations
|
|
||||||
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
|
|
||||||
|
|
||||||
cp -r src/* ${DEST_APP}
|
|
||||||
install -m 755 debian/pybm ${DESTDIR}/usr/bin/${APP}
|
|
||||||
|
|
||||||
install -m 644 desktop/${APP}.desktop ${DEST_SHARE}/applications/${APP}.desktop
|
|
||||||
install -m 644 src/images/can-icon-24px.png ${DEST_SHARE}/icons/hicolor/24x24/apps/${APP}.png
|
|
||||||
install -m 644 desktop/can-icon.svg ${DEST_SHARE}/icons/hicolor/scalable/apps/${APP}.svg
|
|
||||||
install -m 644 desktop/can-icon.svg ${DEST_SHARE}/pixmaps/${APP}.svg
|
|
||||||
|
|
||||||
|
install: build clean
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
dh_prep
|
||||||
|
dh_installdirs
|
||||||
|
${MAKE} install -B DESTDIR=${CURDIR}/debian/${APP}
|
||||||
binary-indep: build install
|
binary-indep: build install
|
||||||
dh_shlibdeps
|
dh_testdir
|
||||||
dh_testdir
|
dh_testroot
|
||||||
dh_testroot
|
dh_installchangelogs
|
||||||
dh_installchangelogs
|
dh_installdocs
|
||||||
dh_installdocs
|
dh_installexamples
|
||||||
# dh_installman
|
dh_installman
|
||||||
dh_link
|
dh_link
|
||||||
dh_compress
|
dh_compress
|
||||||
dh_fixperms
|
dh_fixperms
|
||||||
dh_installdeb
|
dh_installdeb
|
||||||
dh_gencontrol
|
dh_gencontrol
|
||||||
dh_md5sums
|
dh_md5sums
|
||||||
dh_builddeb
|
dh_builddeb
|
||||||
|
|
||||||
binary-arch: build install
|
binary-arch: build install
|
||||||
|
|
||||||
binary: binary-indep binary-arch
|
binary: binary-indep binary-arch
|
||||||
.PHONY: build clean binary-indep binary install
|
.PHONY: build clean binary-indep binary-arch binary install
|
||||||
|
|
111
desktop/icon14.xpm
Normal file
111
desktop/icon14.xpm
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * icon14_xpm[] = {
|
||||||
|
"14 14 94 2",
|
||||||
|
" c None",
|
||||||
|
". c #B9BABC",
|
||||||
|
"+ c #D2D3D4",
|
||||||
|
"@ c #BEBFC1",
|
||||||
|
"# c #CBCCCF",
|
||||||
|
"$ c #E0E3E1",
|
||||||
|
"% c #F6F8F8",
|
||||||
|
"& c #F3F3F3",
|
||||||
|
"* c #B9BABD",
|
||||||
|
"= c #C8C9CB",
|
||||||
|
"- c #DADCDB",
|
||||||
|
"; c #E6E8E7",
|
||||||
|
"> c #F7F7F7",
|
||||||
|
", c #FCFCFC",
|
||||||
|
"' c #F5F5F5",
|
||||||
|
") c #BCBDBF",
|
||||||
|
"! c #D3D5D5",
|
||||||
|
"~ c #E3E5E4",
|
||||||
|
"{ c #F1F2F2",
|
||||||
|
"] c #FDFDFD",
|
||||||
|
"^ c #F8F8F8",
|
||||||
|
"/ c #CBCCCC",
|
||||||
|
"( c #B2B3B6",
|
||||||
|
"_ c #B0B1B3",
|
||||||
|
": c #D3D4D6",
|
||||||
|
"< c #DFE0E0",
|
||||||
|
"[ c #EAEDEB",
|
||||||
|
"} c #FAF9F9",
|
||||||
|
"| c #DFE0DF",
|
||||||
|
"1 c #B9BBBD",
|
||||||
|
"2 c #C2C3C5",
|
||||||
|
"3 c #B7B8BC",
|
||||||
|
"4 c #CDCED0",
|
||||||
|
"5 c #DCDDDE",
|
||||||
|
"6 c #E7E9E7",
|
||||||
|
"7 c #F6F6F6",
|
||||||
|
"8 c #C0C1C2",
|
||||||
|
"9 c #DDDFDF",
|
||||||
|
"0 c #BCBCBF",
|
||||||
|
"a c #D7D9DA",
|
||||||
|
"b c #E2E4E3",
|
||||||
|
"c c #F0F2F1",
|
||||||
|
"d c #FAFAFA",
|
||||||
|
"e c #F9F9F9",
|
||||||
|
"f c #CCCDCD",
|
||||||
|
"g c #B6B7B9",
|
||||||
|
"h c #C7C8CA",
|
||||||
|
"i c #A6A7A9",
|
||||||
|
"j c #D3D4D5",
|
||||||
|
"k c #F2F5F3",
|
||||||
|
"l c #F1F2F1",
|
||||||
|
"m c #F6F8F7",
|
||||||
|
"n c #FCFBFC",
|
||||||
|
"o c #E8EAE9",
|
||||||
|
"p c #B6B7B8",
|
||||||
|
"q c #BFC0C2",
|
||||||
|
"r c #323138",
|
||||||
|
"s c #1D1D22",
|
||||||
|
"t c #111117",
|
||||||
|
"u c #4C4C51",
|
||||||
|
"v c #ECECED",
|
||||||
|
"w c #FFFFFF",
|
||||||
|
"x c #BBBDBD",
|
||||||
|
"y c #C9CACB",
|
||||||
|
"z c #333238",
|
||||||
|
"A c #313036",
|
||||||
|
"B c #27272C",
|
||||||
|
"C c #1E1F24",
|
||||||
|
"D c #16171D",
|
||||||
|
"E c #919193",
|
||||||
|
"F c #F2F3F3",
|
||||||
|
"G c #B4B5B7",
|
||||||
|
"H c #CDCFCF",
|
||||||
|
"I c #67666B",
|
||||||
|
"J c #37363C",
|
||||||
|
"K c #2C2B31",
|
||||||
|
"L c #2A292F",
|
||||||
|
"M c #16171C",
|
||||||
|
"N c #68696B",
|
||||||
|
"O c #C7C8C9",
|
||||||
|
"P c #CBCDCC",
|
||||||
|
"Q c #49474E",
|
||||||
|
"R c #39383E",
|
||||||
|
"S c #36353B",
|
||||||
|
"T c #333138",
|
||||||
|
"U c #28272D",
|
||||||
|
"V c #CED0D0",
|
||||||
|
"W c #67676C",
|
||||||
|
"X c #414046",
|
||||||
|
"Y c #424147",
|
||||||
|
"Z c #39383F",
|
||||||
|
"` c #8C8D8F",
|
||||||
|
" . c #6B6C70",
|
||||||
|
".. c #75757A",
|
||||||
|
" . + ",
|
||||||
|
" @ # $ % & ",
|
||||||
|
" * = - ; > , ' ",
|
||||||
|
" ) ! ~ { ] ^ / ( ",
|
||||||
|
" _ : < [ } , | 1 2 ",
|
||||||
|
" 3 4 5 6 7 , { 8 . 9 ",
|
||||||
|
" 2 0 a b c d e f g h ",
|
||||||
|
" i j k l m n o p q h ",
|
||||||
|
" r s t u v w ' x g y ",
|
||||||
|
" z A B C D E F G H ",
|
||||||
|
" I J A K L M N O P ",
|
||||||
|
" Q R R S T U V ",
|
||||||
|
" W X Y X Z ` ",
|
||||||
|
" ... "};
|
BIN
desktop/icon24.png
Normal file
BIN
desktop/icon24.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
|
@ -2,29 +2,8 @@
|
||||||
Type=Application
|
Type=Application
|
||||||
Name=PyBitmessage
|
Name=PyBitmessage
|
||||||
GenericName=PyBitmessage
|
GenericName=PyBitmessage
|
||||||
X-GNOME-FullName=PyBitmessage Secure Messaging
|
Comment=Send encrypted messages
|
||||||
Comment=Send encrypted messages to another person or to many subscribers
|
Exec=pybitmessage %F
|
||||||
Exec=pybitmessage %U
|
|
||||||
Icon=pybitmessage
|
Icon=pybitmessage
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Categories=Network;Email;Application;
|
Categories=Office;Email;
|
||||||
Keywords=Email;E-mail;Newsgroup;Messaging;
|
|
||||||
X-MessagingMenu-UsesChatSection=true
|
|
||||||
X-Ubuntu-Gettext-Domain=pybitmessage
|
|
||||||
|
|
||||||
Actions=Send;Subscribe;AddressBook;
|
|
||||||
|
|
||||||
[Desktop Action Send]
|
|
||||||
Name=Send
|
|
||||||
Exec=pybitmessage -s
|
|
||||||
OnlyShowIn=Unity;
|
|
||||||
|
|
||||||
[Desktop Action Subscribe]
|
|
||||||
Name=Subscribe
|
|
||||||
Exec=pybitmessage -b
|
|
||||||
OnlyShowIn=Unity;
|
|
||||||
|
|
||||||
[Desktop Action AddressBook]
|
|
||||||
Name=Address Book
|
|
||||||
Exec=pybitmessage -a
|
|
||||||
OnlyShowIn=Unity;
|
|
||||||
|
|
33
ebuild.sh
Executable file
33
ebuild.sh
Executable file
|
@ -0,0 +1,33 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP=pybitmessage
|
||||||
|
PREV_VERSION=0.3.4
|
||||||
|
VERSION=0.3.4
|
||||||
|
RELEASE=1
|
||||||
|
SOURCEDIR=.
|
||||||
|
ARCH_TYPE=`uname -m`
|
||||||
|
CURRDIR=`pwd`
|
||||||
|
SOURCE=~/ebuild/${APP}-${VERSION}.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
# Update version numbers automatically - so you don't have to
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile debian.sh rpm.sh arch.sh puppy.sh slack.sh
|
||||||
|
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
|
||||||
|
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/pinstall.sh puppypackage/puninstall.sh
|
||||||
|
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
|
||||||
|
|
||||||
|
# create the source code in the SOURCES directory
|
||||||
|
make clean
|
||||||
|
mkdir -p ~/ebuild
|
||||||
|
rm -f ${SOURCE}
|
||||||
|
mv ../${APP} ../${APP}-${VERSION}
|
||||||
|
tar -cvzf ${SOURCE} ../${APP}-${VERSION} --exclude-vcs
|
||||||
|
|
||||||
|
# rename the root directory without the version number
|
||||||
|
mv ../${APP}-${VERSION} ../${APP}
|
||||||
|
|
22
ebuildpackage/pybitmessage-0.3.4-1.ebuild
Executable file
22
ebuildpackage/pybitmessage-0.3.4-1.ebuild
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
# $Header: $
|
||||||
|
|
||||||
|
EAPI=4
|
||||||
|
|
||||||
|
DESCRIPTION="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."
|
||||||
|
HOMEPAGE="https://github.com/Bitmessage/PyBitmessage"
|
||||||
|
SRC_URI="${PN}/${P}.tar.gz"
|
||||||
|
LICENSE="MIT"
|
||||||
|
SLOT="0"
|
||||||
|
KEYWORDS="x86"
|
||||||
|
RDEPEND="dev-libs/popt"
|
||||||
|
DEPEND="${RDEPEND}"
|
||||||
|
|
||||||
|
src_configure() {
|
||||||
|
econf --with-popt
|
||||||
|
}
|
||||||
|
|
||||||
|
src_install() {
|
||||||
|
emake DESTDIR="${D}" install
|
||||||
|
# Install README and (Debian) changelog
|
||||||
|
dodoc README.md debian/changelog
|
||||||
|
}
|
7
generate.sh
Executable file
7
generate.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Generates packaging
|
||||||
|
|
||||||
|
rm -f Makefile rpmpackage/*.spec
|
||||||
|
|
||||||
|
packagemonkey -n "PyBitmessage" --version "0.3.4" --dir "." -l "mit" -e "Bob Mottram (4096 bits) <bob@robotics.uk.to>" --brief "Send encrypted messages" --desc "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." --homepage "https://github.com/Bitmessage/PyBitmessage" --section "mail" --categories "Office/Email" --dependsdeb "python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev" --dependsrpm "python, PyQt4, openssl-compat-bitcoin-libs" --mainscript "bitmessagemain.py" --librarypath "/opt/openssl-compat-bitcoin/lib/" --suggestsdeb "libmessaging-menu-dev" --dependspuppy "openssl, python-qt4, sqlite3, sqlite3-dev, python-openssl, python-sip" --dependsarch "python2, qt4, python2-pyqt4, sqlite, openssl" --suggestsarch "python2-gevent" --pythonversion 2
|
BIN
man/pybitmessage.1.gz
Normal file
BIN
man/pybitmessage.1.gz
Normal file
Binary file not shown.
66
puppy.sh
Executable file
66
puppy.sh
Executable file
|
@ -0,0 +1,66 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP=pybitmessage
|
||||||
|
PREV_VERSION=0.3.4
|
||||||
|
VERSION=0.3.4
|
||||||
|
RELEASE=1
|
||||||
|
BUILDDIR=~/petbuild
|
||||||
|
CURRDIR=`pwd`
|
||||||
|
PROJECTDIR=${BUILDDIR}/${APP}-${VERSION}-${RELEASE}
|
||||||
|
|
||||||
|
# Update version numbers automatically - so you don't have to
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile debian.sh rpm.sh arch.sh ebuild.sh slack.sh
|
||||||
|
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
|
||||||
|
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/pinstall.sh puppypackage/puninstall.sh
|
||||||
|
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
|
||||||
|
|
||||||
|
|
||||||
|
# Make directories within which the project will be built
|
||||||
|
mkdir -p ${BUILDDIR}
|
||||||
|
mkdir -p ${PROJECTDIR}
|
||||||
|
|
||||||
|
# Build the project
|
||||||
|
make clean
|
||||||
|
make
|
||||||
|
make install -B DESTDIR=${PROJECTDIR}
|
||||||
|
|
||||||
|
# Alter the desktop file categories
|
||||||
|
sed -i "s/Categories=Office;Email;/Categories=Internet;mailnews;/g" ${PROJECTDIR}/usr/share/applications/${APP}.desktop
|
||||||
|
|
||||||
|
# Create directories specific to puppy
|
||||||
|
mkdir ${PROJECTDIR}/usr
|
||||||
|
mkdir ${PROJECTDIR}/usr/local
|
||||||
|
mkdir ${PROJECTDIR}/usr/local/bin
|
||||||
|
|
||||||
|
# Copy anything in /usr/bin into /usr/local/bin
|
||||||
|
cp ${PROJECTDIR}/usr/bin/* ${PROJECTDIR}/usr/local/bin/
|
||||||
|
|
||||||
|
# Copy the spec file into the build directory
|
||||||
|
cp ${CURRDIR}/puppypackage/${APP}-${VERSION}.pet.specs ${PROJECTDIR}
|
||||||
|
|
||||||
|
# Copy the XPM mini icon into the build directory
|
||||||
|
cp ${CURRDIR}/desktop/icon14.xpm ${PROJECTDIR}/${APP}.xpm
|
||||||
|
|
||||||
|
# Compress the build directory
|
||||||
|
cd ${BUILDDIR}
|
||||||
|
tar -c -f ${APP}-${VERSION}-${RELEASE}.tar .
|
||||||
|
sync
|
||||||
|
gzip ${APP}-${VERSION}-${RELEASE}.tar
|
||||||
|
mv ${APP}-${VERSION}-${RELEASE}.tar.gz ${CURRDIR}/puppypackage
|
||||||
|
cd ${CURRDIR}/puppypackage
|
||||||
|
|
||||||
|
# Create the PET package
|
||||||
|
MD5SUM="`md5sum ${APP}-${VERSION}-${RELEASE}.tar.gz | cut -f 1 -d ' '`"
|
||||||
|
echo -n "$MD5SUM" >> ${APP}-${VERSION}-${RELEASE}.tar.gz
|
||||||
|
sync
|
||||||
|
mv -f ${APP}-${VERSION}-${RELEASE}.tar.gz ${APP}-${VERSION}-${RELEASE}.pet
|
||||||
|
sync
|
||||||
|
cd ${CURRDIR}
|
||||||
|
|
||||||
|
# Remove the temporary build directory
|
||||||
|
rm -fr ${BUILDDIR}
|
111
puppypackage/icon14.xpm
Normal file
111
puppypackage/icon14.xpm
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * icon14_xpm[] = {
|
||||||
|
"14 14 94 2",
|
||||||
|
" c None",
|
||||||
|
". c #B9BABC",
|
||||||
|
"+ c #D2D3D4",
|
||||||
|
"@ c #BEBFC1",
|
||||||
|
"# c #CBCCCF",
|
||||||
|
"$ c #E0E3E1",
|
||||||
|
"% c #F6F8F8",
|
||||||
|
"& c #F3F3F3",
|
||||||
|
"* c #B9BABD",
|
||||||
|
"= c #C8C9CB",
|
||||||
|
"- c #DADCDB",
|
||||||
|
"; c #E6E8E7",
|
||||||
|
"> c #F7F7F7",
|
||||||
|
", c #FCFCFC",
|
||||||
|
"' c #F5F5F5",
|
||||||
|
") c #BCBDBF",
|
||||||
|
"! c #D3D5D5",
|
||||||
|
"~ c #E3E5E4",
|
||||||
|
"{ c #F1F2F2",
|
||||||
|
"] c #FDFDFD",
|
||||||
|
"^ c #F8F8F8",
|
||||||
|
"/ c #CBCCCC",
|
||||||
|
"( c #B2B3B6",
|
||||||
|
"_ c #B0B1B3",
|
||||||
|
": c #D3D4D6",
|
||||||
|
"< c #DFE0E0",
|
||||||
|
"[ c #EAEDEB",
|
||||||
|
"} c #FAF9F9",
|
||||||
|
"| c #DFE0DF",
|
||||||
|
"1 c #B9BBBD",
|
||||||
|
"2 c #C2C3C5",
|
||||||
|
"3 c #B7B8BC",
|
||||||
|
"4 c #CDCED0",
|
||||||
|
"5 c #DCDDDE",
|
||||||
|
"6 c #E7E9E7",
|
||||||
|
"7 c #F6F6F6",
|
||||||
|
"8 c #C0C1C2",
|
||||||
|
"9 c #DDDFDF",
|
||||||
|
"0 c #BCBCBF",
|
||||||
|
"a c #D7D9DA",
|
||||||
|
"b c #E2E4E3",
|
||||||
|
"c c #F0F2F1",
|
||||||
|
"d c #FAFAFA",
|
||||||
|
"e c #F9F9F9",
|
||||||
|
"f c #CCCDCD",
|
||||||
|
"g c #B6B7B9",
|
||||||
|
"h c #C7C8CA",
|
||||||
|
"i c #A6A7A9",
|
||||||
|
"j c #D3D4D5",
|
||||||
|
"k c #F2F5F3",
|
||||||
|
"l c #F1F2F1",
|
||||||
|
"m c #F6F8F7",
|
||||||
|
"n c #FCFBFC",
|
||||||
|
"o c #E8EAE9",
|
||||||
|
"p c #B6B7B8",
|
||||||
|
"q c #BFC0C2",
|
||||||
|
"r c #323138",
|
||||||
|
"s c #1D1D22",
|
||||||
|
"t c #111117",
|
||||||
|
"u c #4C4C51",
|
||||||
|
"v c #ECECED",
|
||||||
|
"w c #FFFFFF",
|
||||||
|
"x c #BBBDBD",
|
||||||
|
"y c #C9CACB",
|
||||||
|
"z c #333238",
|
||||||
|
"A c #313036",
|
||||||
|
"B c #27272C",
|
||||||
|
"C c #1E1F24",
|
||||||
|
"D c #16171D",
|
||||||
|
"E c #919193",
|
||||||
|
"F c #F2F3F3",
|
||||||
|
"G c #B4B5B7",
|
||||||
|
"H c #CDCFCF",
|
||||||
|
"I c #67666B",
|
||||||
|
"J c #37363C",
|
||||||
|
"K c #2C2B31",
|
||||||
|
"L c #2A292F",
|
||||||
|
"M c #16171C",
|
||||||
|
"N c #68696B",
|
||||||
|
"O c #C7C8C9",
|
||||||
|
"P c #CBCDCC",
|
||||||
|
"Q c #49474E",
|
||||||
|
"R c #39383E",
|
||||||
|
"S c #36353B",
|
||||||
|
"T c #333138",
|
||||||
|
"U c #28272D",
|
||||||
|
"V c #CED0D0",
|
||||||
|
"W c #67676C",
|
||||||
|
"X c #414046",
|
||||||
|
"Y c #424147",
|
||||||
|
"Z c #39383F",
|
||||||
|
"` c #8C8D8F",
|
||||||
|
" . c #6B6C70",
|
||||||
|
".. c #75757A",
|
||||||
|
" . + ",
|
||||||
|
" @ # $ % & ",
|
||||||
|
" * = - ; > , ' ",
|
||||||
|
" ) ! ~ { ] ^ / ( ",
|
||||||
|
" _ : < [ } , | 1 2 ",
|
||||||
|
" 3 4 5 6 7 , { 8 . 9 ",
|
||||||
|
" 2 0 a b c d e f g h ",
|
||||||
|
" i j k l m n o p q h ",
|
||||||
|
" r s t u v w ' x g y ",
|
||||||
|
" z A B C D E F G H ",
|
||||||
|
" I J A K L M N O P ",
|
||||||
|
" Q R R S T U V ",
|
||||||
|
" W X Y X Z ` ",
|
||||||
|
" ... "};
|
1
puppypackage/pybitmessage-0.3.4.pet.specs
Normal file
1
puppypackage/pybitmessage-0.3.4.pet.specs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pybitmessage-0.3.4-1|PyBitmessage|0.3.4|1|Internet;mailnews;|5.1M||pybitmessage-0.3.4-1.pet|+openssl,+python-qt4,+sqlite3,+sqlite3-dev,+python-openssl,+python-sip|Send encrypted messages|ubuntu|precise|5|
|
53
rpm.sh
Executable file
53
rpm.sh
Executable file
|
@ -0,0 +1,53 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP=pybitmessage
|
||||||
|
PREV_VERSION=0.3.4
|
||||||
|
VERSION=0.3.4
|
||||||
|
RELEASE=1
|
||||||
|
SOURCEDIR=.
|
||||||
|
ARCH_TYPE=`uname -m`
|
||||||
|
CURRDIR=`pwd`
|
||||||
|
SOURCE=~/rpmbuild/SOURCES/${APP}_${VERSION}.orig.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
# Update version numbers automatically - so you don't have to
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile debian.sh arch.sh puppy.sh ebuild.sh slack.sh
|
||||||
|
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
|
||||||
|
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/pinstall.sh puppypackage/puninstall.sh
|
||||||
|
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
|
||||||
|
|
||||||
|
sudo yum groupinstall "Development Tools"
|
||||||
|
sudo yum install rpmdevtools
|
||||||
|
|
||||||
|
# setup the rpmbuild directory tree
|
||||||
|
rpmdev-setuptree
|
||||||
|
|
||||||
|
# create the source code in the SOURCES directory
|
||||||
|
make clean
|
||||||
|
mkdir -p ~/rpmbuild/SOURCES
|
||||||
|
rm -f ${SOURCE}
|
||||||
|
|
||||||
|
# having the root directory called name-version seems essential
|
||||||
|
mv ../${APP} ../${APP}-${VERSION}
|
||||||
|
tar -cvzf ${SOURCE} ../${APP}-${VERSION} --exclude-vcs
|
||||||
|
|
||||||
|
# rename the root directory without the version number
|
||||||
|
mv ../${APP}-${VERSION} ../${APP}
|
||||||
|
|
||||||
|
# copy the spec file into the SPECS directory
|
||||||
|
cp -f rpmpackage/${APP}.spec ~/rpmbuild/SPECS
|
||||||
|
|
||||||
|
# build
|
||||||
|
cd ~/rpmbuild/SPECS
|
||||||
|
rpmbuild -ba ${APP}.spec
|
||||||
|
cd ${CURRDIR}
|
||||||
|
|
||||||
|
# Copy the results into the rpmpackage directory
|
||||||
|
mkdir -p rpmpackage/${ARCH_TYPE}
|
||||||
|
cp -r ~/rpmbuild/RPMS/${ARCH_TYPE}/${APP}* rpmpackage/${ARCH_TYPE}
|
||||||
|
cp -r ~/rpmbuild/SRPMS/${APP}* rpmpackage
|
207
rpmpackage/pybitmessage.spec
Normal file
207
rpmpackage/pybitmessage.spec
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
Name: pybitmessage
|
||||||
|
Version: 0.3.4
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: Send encrypted messages
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/Bitmessage/PyBitmessage
|
||||||
|
Packager: Bob Mottram (4096 bits) <bob@robotics.uk.to>
|
||||||
|
Source0: http://yourdomainname.com/src/%{name}_%{version}.orig.tar.gz
|
||||||
|
Group: Office/Email
|
||||||
|
|
||||||
|
Requires: python, PyQt4, openssl-compat-bitcoin-libs
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
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.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q
|
||||||
|
|
||||||
|
%build
|
||||||
|
%configure
|
||||||
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
|
%install
|
||||||
|
rm -rf %{buildroot}
|
||||||
|
mkdir -p %{buildroot}
|
||||||
|
mkdir -p %{buildroot}/etc
|
||||||
|
mkdir -p %{buildroot}/etc/%{name}
|
||||||
|
mkdir -p %{buildroot}/usr
|
||||||
|
mkdir -p %{buildroot}/usr/bin
|
||||||
|
mkdir -p %{buildroot}/usr/share
|
||||||
|
mkdir -p %{buildroot}/usr/share/man
|
||||||
|
mkdir -p %{buildroot}/usr/share/man/man1
|
||||||
|
mkdir -p %{buildroot}/usr/share/%{name}
|
||||||
|
mkdir -p %{buildroot}/usr/share/applications
|
||||||
|
mkdir -p %{buildroot}/usr/share/icons
|
||||||
|
mkdir -p %{buildroot}/usr/share/icons/hicolor
|
||||||
|
mkdir -p %{buildroot}/usr/share/icons/hicolor/24x24
|
||||||
|
mkdir -p %{buildroot}/usr/share/icons/hicolor/24x24/apps
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}/usr/share/pixmaps
|
||||||
|
mkdir -p %{buildroot}/usr/share/icons/hicolor/scalable
|
||||||
|
mkdir -p %{buildroot}/usr/share/icons/hicolor/scalable/apps
|
||||||
|
# Make install but to the RPM BUILDROOT directory
|
||||||
|
make install -B DESTDIR=%{buildroot}
|
||||||
|
|
||||||
|
%files
|
||||||
|
%doc README.md LICENSE
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%dir /usr/share/%{name}
|
||||||
|
%dir /usr/share/applications
|
||||||
|
%dir /usr/share/icons/hicolor
|
||||||
|
%dir /usr/share/icons/hicolor/24x24
|
||||||
|
%dir /usr/share/icons/hicolor/24x24/apps
|
||||||
|
%dir /usr/share/pixmaps
|
||||||
|
%dir /usr/share/icons/hicolor/scalable
|
||||||
|
%dir /usr/share/icons/hicolor/scalable/apps
|
||||||
|
/usr/share/%{name}/*
|
||||||
|
%{_bindir}/*
|
||||||
|
%{_mandir}/man1/*
|
||||||
|
%attr(644,root,root) /usr/share/applications/%{name}.desktop
|
||||||
|
%attr(644,root,root) /usr/share/icons/hicolor/24x24/apps/%{name}.png
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Sun Jun 30 2013 Bob Mottram (4096 bits) <bob@robotics.uk.to> - 0.3.4-1
|
||||||
|
- Switched addr, msg, broadcast, and getpubkey message types
|
||||||
|
to 8 byte time. Last remaining type is pubkey.
|
||||||
|
- Added tooltips to show the full subject of messages
|
||||||
|
- Added Maximum Acceptable Difficulty fields in the settings
|
||||||
|
- Send out pubkey immediately after generating deterministic
|
||||||
|
addresses rather than waiting for a request
|
||||||
|
|
||||||
|
* Sat Jun 29 2013 Bob Mottram (4096 bits) <bob@robotics.uk.to> - 0.3.3-1
|
||||||
|
- Remove inbox item from GUI when using API command trashMessage
|
||||||
|
- Add missing trailing semicolons to pybitmessage.desktop
|
||||||
|
- Ensure $(DESTDIR)/usr/bin exists
|
||||||
|
- Update Makefile to correct sandbox violations when built
|
||||||
|
via Portage (Gentoo)
|
||||||
|
- Fix message authentication bug
|
||||||
|
|
||||||
|
* Fri Jun 28 2013 Bob Mottram (4096 bits) <bob@robotics.uk.to> - 0.3.211-1
|
||||||
|
- Removed multi-core proof of work
|
||||||
|
as the multiprocessing module does not work well with
|
||||||
|
pyinstaller's --onefile option.
|
||||||
|
|
||||||
|
* Mon Jun 03 2013 Bob Mottram (4096 bits) <bob@robotics.uk.to> - 0.3.2-1
|
||||||
|
- Bugfix: Remove remaining references to the old myapp.trayIcon
|
||||||
|
- Refactored message status-related code. API function getStatus
|
||||||
|
now returns one of these strings: notfound, msgqueued,
|
||||||
|
broadcastqueued, broadcastsent, doingpubkeypow, awaitingpubkey,
|
||||||
|
doingmsgpow, msgsent, or ackreceived
|
||||||
|
- Moved proof of work to low-priority multi-threaded child
|
||||||
|
processes
|
||||||
|
- Added menu option to delete all trashed messages
|
||||||
|
- Added inv flooding attack mitigation
|
||||||
|
- On Linux, when selecting Show Bitmessage, do not maximize
|
||||||
|
automatically
|
||||||
|
- Store tray icons in bitmessage_icons_rc.py
|
||||||
|
|
||||||
|
* Sat May 25 2013 Jonathan Warren (4096 bits) <jonathan@bitmessage.org> - 0.3.1-1
|
||||||
|
- Added new API commands: getDeterministicAddress,
|
||||||
|
addSubscription, deleteSubscription
|
||||||
|
- TCP Connection timeout for non-fully-established connections
|
||||||
|
now 20 seconds
|
||||||
|
- Don't update the time we last communicated with a node unless
|
||||||
|
the connection is fully established. This will allow us to
|
||||||
|
forget about active but non-Bitmessage nodes which have made
|
||||||
|
it into our knownNodes file.
|
||||||
|
- Prevent incoming connection flooding from crashing
|
||||||
|
singleListener thread. Client will now only accept one
|
||||||
|
connection per remote node IP
|
||||||
|
- Bugfix: Worker thread crashed when doing a POW to send out
|
||||||
|
a v2 pubkey (bug introduced in 0.3.0)
|
||||||
|
- Wrap all sock.shutdown functions in error handlers
|
||||||
|
- Put all 'commit' commands within SQLLocks
|
||||||
|
- Bugfix: If address book label is blank, Bitmessage wouldn't
|
||||||
|
show message (bug introduced in 0.3.0)
|
||||||
|
- Messaging menu item selects the oldest unread message
|
||||||
|
- Standardize on 'Quit' rather than 'Exit'
|
||||||
|
- [OSX] Try to seek homebrew installation of OpenSSL
|
||||||
|
- Prevent multiple instances of the application from running
|
||||||
|
- Show 'Connected' or 'Connection Lost' indicators
|
||||||
|
- Use only 9 half-open connections on Windows but 32 for
|
||||||
|
everyone else
|
||||||
|
- Added appIndicator (a more functional tray icon) and Ubuntu
|
||||||
|
Messaging Menu integration
|
||||||
|
- Changed Debian install directory and run script name based
|
||||||
|
on Github issue #135
|
||||||
|
|
||||||
|
* Tue May 6 2013 Bob Mottram (4096 bits) <bob@sluggish.dyndns.org> - 0.3.0-1
|
||||||
|
- Added new API function: getStatus
|
||||||
|
- Added error-handling around all sock.sendall() functions
|
||||||
|
in the receiveData thread so that if there is a problem
|
||||||
|
sending data, the threads will close gracefully
|
||||||
|
- Abandoned and removed the connectionsCount data structure;
|
||||||
|
use the connectedHostsList instead because it has proved to be
|
||||||
|
more accurate than trying to maintain the connectionsCount
|
||||||
|
- Added daemon mode. All UI code moved into a module and many
|
||||||
|
shared objects moved into shared.py
|
||||||
|
- Truncate display of very long messages to avoid freezing the UI
|
||||||
|
- Added encrypted broadcasts for v3 addresses or v2 addresses
|
||||||
|
after 2013-05-28 10:00 UTC
|
||||||
|
- No longer self.sock.close() from within receiveDataThreads,
|
||||||
|
let the sendDataThreads do it
|
||||||
|
- Swapped out the v2 announcements subscription address for a v3
|
||||||
|
announcements subscription address
|
||||||
|
- Vacuum the messages.dat file once a month: will greatly reduce the file size
|
||||||
|
- Added a settings table in message.dat
|
||||||
|
- Implemented v3 addresses:
|
||||||
|
pubkey messages must now include two var_ints: nonce_trials_per_byte
|
||||||
|
and extra_bytes, and also be signed. When sending a message to a v3
|
||||||
|
address, the sender must use these values in calculating its POW or
|
||||||
|
else the message will not be accepted by the receiver.
|
||||||
|
- Display a privacy warning when selecting 'Send Broadcast from this address'
|
||||||
|
- Added gitignore file
|
||||||
|
- Added code in preparation for a switch from 32-bit time to 64-bit time.
|
||||||
|
Nodes will now advertise themselves as using protocol version 2.
|
||||||
|
- Don't necessarily delete entries from the inventory after 2.5 days;
|
||||||
|
leave pubkeys there for 28 days so that we don't process the same ones
|
||||||
|
many times throughout a month. This was causing the 'pubkeys processed'
|
||||||
|
indicator on the 'Network Status' tab to not accurately reflect the
|
||||||
|
number of truly new addresses on the network.
|
||||||
|
- Use 32 threads for outgoing connections in order to connect quickly
|
||||||
|
- Fix typo when calling os.environ in the sys.platform=='darwin' case
|
||||||
|
- Allow the cancelling of a message which is in the process of being
|
||||||
|
sent by trashing it then restarting Bitmessage
|
||||||
|
- Bug fix: can't delete address from address book
|
||||||
|
|
||||||
|
* Tue Apr 9 2013 Bob Mottram (4096 bits) <bob@sluggish.dyndns.org> - 0.2.8-1
|
||||||
|
- 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.
|
||||||
|
|
||||||
|
* Tue Apr 1 2013 Bob Mottram (4096 bits) <bob@sluggish.dyndns.org> - 0.2.7-1
|
||||||
|
- 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
|
48
slack.sh
Executable file
48
slack.sh
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP=pybitmessage
|
||||||
|
PREV_VERSION=0.3.4
|
||||||
|
VERSION=0.3.4
|
||||||
|
RELEASE=1
|
||||||
|
ARCH_TYPE=`uname -m`
|
||||||
|
BUILDDIR=~/slackbuild
|
||||||
|
CURRDIR=`pwd`
|
||||||
|
PROJECTDIR=${BUILDDIR}/${APP}-${VERSION}-${RELEASE}
|
||||||
|
|
||||||
|
# Update version numbers automatically - so you don't have to
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' Makefile debian.sh rpm.sh arch.sh puppy.sh ebuild.sh
|
||||||
|
sed -i 's/Version: '${PREV_VERSION}'/Version: '${VERSION}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/Release: '${RELEASE}'/Release: '${RELEASE}'/g' rpmpackage/${APP}.spec
|
||||||
|
sed -i 's/pkgrel='${RELEASE}'/pkgrel='${RELEASE}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i 's/pkgver='${PREV_VERSION}'/pkgver='${VERSION}'/g' archpackage/PKGBUILD
|
||||||
|
sed -i "s/-${PREV_VERSION}-/-${VERSION}-/g" puppypackage/*.specs
|
||||||
|
sed -i "s/|${PREV_VERSION}|/|${VERSION}|/g" puppypackage/*.specs
|
||||||
|
sed -i 's/VERSION='${PREV_VERSION}'/VERSION='${VERSION}'/g' puppypackage/pinstall.sh puppypackage/puninstall.sh
|
||||||
|
sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
|
||||||
|
|
||||||
|
|
||||||
|
# Make directories within which the project will be built
|
||||||
|
mkdir -p ${BUILDDIR}
|
||||||
|
mkdir -p ${PROJECTDIR}
|
||||||
|
|
||||||
|
# Build the project
|
||||||
|
make clean
|
||||||
|
make
|
||||||
|
make install -B DESTDIR=${PROJECTDIR}
|
||||||
|
|
||||||
|
# Copy the slack-desc and doinst.sh files into the build install directory
|
||||||
|
mkdir ${PROJECTDIR}/install
|
||||||
|
cp ${CURRDIR}/slackpackage/slack-desc ${PROJECTDIR}/install
|
||||||
|
cp ${CURRDIR}/slackpackage/doinst.sh ${PROJECTDIR}/install
|
||||||
|
|
||||||
|
# Compress the build directory
|
||||||
|
cd ${BUILDDIR}
|
||||||
|
tar -c -f ${APP}-${VERSION}-${RELEASE}.tar .
|
||||||
|
sync
|
||||||
|
xz ${APP}-${VERSION}-${RELEASE}.tar
|
||||||
|
sync
|
||||||
|
mv ${APP}-${VERSION}-${RELEASE}.tar.xz ${CURRDIR}/slackpackage/${APP}-${VERSION}-${ARCH_TYPE}-${RELEASE}.txz
|
||||||
|
cd ${CURRDIR}
|
||||||
|
|
||||||
|
# Remove the temporary build directory
|
||||||
|
rm -fr ${BUILDDIR}
|
4
slackpackage/doinst.sh
Executable file
4
slackpackage/doinst.sh
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
# This script is run after installation.
|
||||||
|
# Any additional configuration goes here.
|
19
slackpackage/slack-desc
Normal file
19
slackpackage/slack-desc
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# HOW TO EDIT THIS FILE:
|
||||||
|
# The "handy ruler" below makes it easier to edit a package description. Line
|
||||||
|
# up the first '|' above the ':' following the base package name, and the '|' on
|
||||||
|
# the right side marks the last column you can put a character in. You must make
|
||||||
|
# exactly 11 lines for the formatting to be correct. It's also customary to
|
||||||
|
# leave one space after the ':'.
|
||||||
|
|
||||||
|
|-----handy-ruler--------------------------------------------------|
|
||||||
|
pybitmessage: pybitmessage (Send encrypted messages)
|
||||||
|
pybitmessage:
|
||||||
|
pybitmessage: Bitmessage is a P2P communications protocol used to send
|
||||||
|
pybitmessage: encrypted messages to another person or to many subscribers. It
|
||||||
|
pybitmessage: is decentralized and trustless, meaning that you need-not
|
||||||
|
pybitmessage: inherently trust any entities like root certificate authorities.
|
||||||
|
pybitmessage: It uses strong authentication which means that the sender of a
|
||||||
|
pybitmessage: message cannot be spoofed, and it aims to hide "non-content"
|
||||||
|
pybitmessage: data, like the sender and receiver of messages, from passive
|
||||||
|
pybitmessage: eavesdroppers like those running warrantless wiretapping
|
||||||
|
pybitmessage: programs.
|
|
@ -14,7 +14,7 @@ try:
|
||||||
from gevent import monkey
|
from gevent import monkey
|
||||||
monkey.patch_all()
|
monkey.patch_all()
|
||||||
except ImportError as ex:
|
except ImportError as ex:
|
||||||
print "cannot find gevent"
|
print "Not using the gevent module as it was not found. No need to worry."
|
||||||
|
|
||||||
import signal # Used to capture a Ctrl-C keypress so that Bitmessage can shutdown gracefully.
|
import signal # Used to capture a Ctrl-C keypress so that Bitmessage can shutdown gracefully.
|
||||||
# The next 3 are used for the API
|
# The next 3 are used for the API
|
||||||
|
@ -32,7 +32,6 @@ from class_singleListener import *
|
||||||
from class_addressGenerator import *
|
from class_addressGenerator import *
|
||||||
|
|
||||||
# Helper Functions
|
# Helper Functions
|
||||||
import helper_startup
|
|
||||||
import helper_bootstrap
|
import helper_bootstrap
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
@ -719,11 +718,8 @@ if __name__ == "__main__":
|
||||||
signal.signal(signal.SIGINT, helper_generic.signal_handler)
|
signal.signal(signal.SIGINT, helper_generic.signal_handler)
|
||||||
# signal.signal(signal.SIGINT, signal.SIG_DFL)
|
# signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||||
|
|
||||||
helper_startup.loadConfig()
|
|
||||||
|
|
||||||
helper_bootstrap.knownNodes()
|
helper_bootstrap.knownNodes()
|
||||||
helper_bootstrap.dns()
|
helper_bootstrap.dns()
|
||||||
|
|
||||||
# Start the address generation thread
|
# Start the address generation thread
|
||||||
addressGeneratorThread = addressGenerator()
|
addressGeneratorThread = addressGenerator()
|
||||||
addressGeneratorThread.daemon = True # close the main program even if there are threads left
|
addressGeneratorThread.daemon = True # close the main program even if there are threads left
|
||||||
|
|
|
@ -30,6 +30,8 @@ import os
|
||||||
from pyelliptic.openssl import OpenSSL
|
from pyelliptic.openssl import OpenSSL
|
||||||
import pickle
|
import pickle
|
||||||
import platform
|
import platform
|
||||||
|
import debug
|
||||||
|
from debug import logger
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
@ -311,205 +313,10 @@ class MyForm(QtGui.QMainWindow):
|
||||||
addressInKeysFile)
|
addressInKeysFile)
|
||||||
|
|
||||||
# Load inbox from messages database file
|
# Load inbox from messages database file
|
||||||
font = QFont()
|
self.loadInbox()
|
||||||
font.setBold(True)
|
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put(
|
|
||||||
'''SELECT msgid, toaddress, fromaddress, subject, received, message, read FROM inbox where folder='inbox' ORDER BY received''')
|
|
||||||
shared.sqlSubmitQueue.put('')
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
for row in queryreturn:
|
|
||||||
msgid, toAddress, fromAddress, subject, received, message, read = row
|
|
||||||
subject = shared.fixPotentiallyInvalidUTF8Data(subject)
|
|
||||||
message = shared.fixPotentiallyInvalidUTF8Data(message)
|
|
||||||
try:
|
|
||||||
if toAddress == self.str_broadcast_subscribers:
|
|
||||||
toLabel = self.str_broadcast_subscribers
|
|
||||||
else:
|
|
||||||
toLabel = shared.config.get(toAddress, 'label')
|
|
||||||
except:
|
|
||||||
toLabel = ''
|
|
||||||
if toLabel == '':
|
|
||||||
toLabel = toAddress
|
|
||||||
|
|
||||||
fromLabel = ''
|
|
||||||
t = (fromAddress,)
|
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put(
|
|
||||||
'''select label from addressbook where address=?''')
|
|
||||||
shared.sqlSubmitQueue.put(t)
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
|
|
||||||
if queryreturn != []:
|
|
||||||
for row in queryreturn:
|
|
||||||
fromLabel, = row
|
|
||||||
|
|
||||||
if fromLabel == '': # If this address wasn't in our address book...
|
|
||||||
t = (fromAddress,)
|
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put(
|
|
||||||
'''select label from subscriptions where address=?''')
|
|
||||||
shared.sqlSubmitQueue.put(t)
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
|
|
||||||
if queryreturn != []:
|
|
||||||
for row in queryreturn:
|
|
||||||
fromLabel, = row
|
|
||||||
|
|
||||||
self.ui.tableWidgetInbox.insertRow(0)
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(toLabel, 'utf-8'))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
if not read:
|
|
||||||
newItem.setFont(font)
|
|
||||||
newItem.setData(Qt.UserRole, str(toAddress))
|
|
||||||
if shared.safeConfigGetBoolean(toAddress, 'mailinglist'):
|
|
||||||
newItem.setTextColor(QtGui.QColor(137, 04, 177))
|
|
||||||
self.ui.tableWidgetInbox.setItem(0, 0, newItem)
|
|
||||||
if fromLabel == '':
|
|
||||||
newItem = QtGui.QTableWidgetItem(
|
|
||||||
unicode(fromAddress, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(fromAddress, 'utf-8'))
|
|
||||||
else:
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(fromLabel, 'utf-8'))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
if not read:
|
|
||||||
newItem.setFont(font)
|
|
||||||
newItem.setData(Qt.UserRole, str(fromAddress))
|
|
||||||
|
|
||||||
self.ui.tableWidgetInbox.setItem(0, 1, newItem)
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(subject, 'utf-8'))
|
|
||||||
newItem.setData(Qt.UserRole, unicode(message, 'utf-8)'))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
if not read:
|
|
||||||
newItem.setFont(font)
|
|
||||||
self.ui.tableWidgetInbox.setItem(0, 2, newItem)
|
|
||||||
newItem = myTableWidgetItem(unicode(strftime(shared.config.get(
|
|
||||||
'bitmessagesettings', 'timeformat'), localtime(int(received))), 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(strftime(shared.config.get(
|
|
||||||
'bitmessagesettings', 'timeformat'), localtime(int(received))), 'utf-8'))
|
|
||||||
newItem.setData(Qt.UserRole, QByteArray(msgid))
|
|
||||||
newItem.setData(33, int(received))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
if not read:
|
|
||||||
newItem.setFont(font)
|
|
||||||
self.ui.tableWidgetInbox.setItem(0, 3, newItem)
|
|
||||||
self.ui.tableWidgetInbox.sortItems(3, Qt.DescendingOrder)
|
|
||||||
self.ui.tableWidgetInbox.keyPressEvent = self.tableWidgetInboxKeyPressEvent
|
|
||||||
|
|
||||||
# Load Sent items from database
|
# Load Sent items from database
|
||||||
shared.sqlLock.acquire()
|
self.loadSent()
|
||||||
shared.sqlSubmitQueue.put(
|
|
||||||
'''SELECT toaddress, fromaddress, subject, message, status, ackdata, lastactiontime FROM sent where folder = 'sent' ORDER BY lastactiontime''')
|
|
||||||
shared.sqlSubmitQueue.put('')
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
for row in queryreturn:
|
|
||||||
toAddress, fromAddress, subject, message, status, ackdata, lastactiontime = row
|
|
||||||
subject = shared.fixPotentiallyInvalidUTF8Data(subject)
|
|
||||||
message = shared.fixPotentiallyInvalidUTF8Data(message)
|
|
||||||
try:
|
|
||||||
fromLabel = shared.config.get(fromAddress, 'label')
|
|
||||||
except:
|
|
||||||
fromLabel = ''
|
|
||||||
if fromLabel == '':
|
|
||||||
fromLabel = fromAddress
|
|
||||||
|
|
||||||
toLabel = ''
|
|
||||||
t = (toAddress,)
|
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put(
|
|
||||||
'''select label from addressbook where address=?''')
|
|
||||||
shared.sqlSubmitQueue.put(t)
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
|
|
||||||
if queryreturn != []:
|
|
||||||
for row in queryreturn:
|
|
||||||
toLabel, = row
|
|
||||||
|
|
||||||
self.ui.tableWidgetSent.insertRow(0)
|
|
||||||
if toLabel == '':
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(toAddress, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(toAddress, 'utf-8'))
|
|
||||||
else:
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(toLabel, 'utf-8'))
|
|
||||||
newItem.setData(Qt.UserRole, str(toAddress))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
self.ui.tableWidgetSent.setItem(0, 0, newItem)
|
|
||||||
if fromLabel == '':
|
|
||||||
newItem = QtGui.QTableWidgetItem(
|
|
||||||
unicode(fromAddress, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(fromAddress, 'utf-8'))
|
|
||||||
else:
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(fromLabel, 'utf-8'))
|
|
||||||
newItem.setData(Qt.UserRole, str(fromAddress))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
self.ui.tableWidgetSent.setItem(0, 1, newItem)
|
|
||||||
newItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8'))
|
|
||||||
newItem.setToolTip(unicode(subject, 'utf-8'))
|
|
||||||
newItem.setData(Qt.UserRole, unicode(message, 'utf-8)'))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
self.ui.tableWidgetSent.setItem(0, 2, newItem)
|
|
||||||
if status == 'awaitingpubkey':
|
|
||||||
statusText = _translate(
|
|
||||||
"MainWindow", "Waiting on their encryption key. Will request it again soon.")
|
|
||||||
elif status == 'doingpowforpubkey':
|
|
||||||
statusText = _translate(
|
|
||||||
"MainWindow", "Encryption key request queued.")
|
|
||||||
elif status == 'msgqueued':
|
|
||||||
statusText = _translate(
|
|
||||||
"MainWindow", "Queued.")
|
|
||||||
elif status == 'msgsent':
|
|
||||||
statusText = _translate("MainWindow", "Message sent. Waiting on acknowledgement. Sent at %1").arg(
|
|
||||||
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
|
||||||
elif status == 'doingmsgpow':
|
|
||||||
statusText = _translate(
|
|
||||||
"MainWindow", "Need to do work to send message. Work is queued.")
|
|
||||||
elif status == 'ackreceived':
|
|
||||||
statusText = _translate("MainWindow", "Acknowledgement of the message received %1").arg(
|
|
||||||
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
|
||||||
elif status == 'broadcastqueued':
|
|
||||||
statusText = _translate(
|
|
||||||
"MainWindow", "Broadcast queued.")
|
|
||||||
elif status == 'broadcastsent':
|
|
||||||
statusText = _translate("MainWindow", "Broadcast on %1").arg(unicode(strftime(
|
|
||||||
shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
|
||||||
elif status == 'toodifficult':
|
|
||||||
statusText = _translate("MainWindow", "Problem: The work demanded by the recipient is more difficult than you are willing to do. %1").arg(
|
|
||||||
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
|
||||||
elif status == 'badkey':
|
|
||||||
statusText = _translate("MainWindow", "Problem: The recipient\'s encryption key is no good. Could not encrypt message. %1").arg(
|
|
||||||
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
|
||||||
elif status == 'forcepow':
|
|
||||||
statusText = _translate(
|
|
||||||
"MainWindow", "Forced difficulty override. Send should start soon.")
|
|
||||||
else:
|
|
||||||
statusText = _translate("MainWindow", "Unknown status: %1 %2").arg(status).arg(unicode(
|
|
||||||
strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
|
||||||
newItem = myTableWidgetItem(statusText)
|
|
||||||
newItem.setToolTip(statusText)
|
|
||||||
newItem.setData(Qt.UserRole, QByteArray(ackdata))
|
|
||||||
newItem.setData(33, int(lastactiontime))
|
|
||||||
newItem.setFlags(
|
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
|
||||||
self.ui.tableWidgetSent.setItem(0, 3, newItem)
|
|
||||||
self.ui.tableWidgetSent.sortItems(3, Qt.DescendingOrder)
|
|
||||||
self.ui.tableWidgetSent.keyPressEvent = self.tableWidgetSentKeyPressEvent
|
|
||||||
|
|
||||||
# Initialize the address book
|
# Initialize the address book
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
|
@ -530,6 +337,14 @@ class MyForm(QtGui.QMainWindow):
|
||||||
# Initialize the Subscriptions
|
# Initialize the Subscriptions
|
||||||
self.rerenderSubscriptions()
|
self.rerenderSubscriptions()
|
||||||
|
|
||||||
|
# Initialize the inbox search
|
||||||
|
QtCore.QObject.connect(self.ui.inboxSearchLineEdit, QtCore.SIGNAL(
|
||||||
|
"returnPressed()"), self.inboxSearchLineEditPressed)
|
||||||
|
|
||||||
|
# Initialize the sent search
|
||||||
|
QtCore.QObject.connect(self.ui.sentSearchLineEdit, QtCore.SIGNAL(
|
||||||
|
"returnPressed()"), self.sentSearchLineEditPressed)
|
||||||
|
|
||||||
# Initialize the Blacklist or Whitelist
|
# Initialize the Blacklist or Whitelist
|
||||||
if shared.config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
if shared.config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
||||||
self.loadBlackWhiteList()
|
self.loadBlackWhiteList()
|
||||||
|
@ -689,6 +504,251 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.appIndicatorShow()
|
self.appIndicatorShow()
|
||||||
self.ui.tabWidget.setCurrentIndex(5)
|
self.ui.tabWidget.setCurrentIndex(5)
|
||||||
|
|
||||||
|
# Load Sent items from database
|
||||||
|
def loadSent(self, where="", what=""):
|
||||||
|
what = "%" + what + "%"
|
||||||
|
if where == "To":
|
||||||
|
where = "toaddress"
|
||||||
|
elif where == "From":
|
||||||
|
where = "fromaddress"
|
||||||
|
elif where == "Subject":
|
||||||
|
where = "subject"
|
||||||
|
elif where == "Message":
|
||||||
|
where = "message"
|
||||||
|
else:
|
||||||
|
where = "toaddress || fromaddress || subject || message"
|
||||||
|
|
||||||
|
sqlQuery = '''
|
||||||
|
SELECT toaddress, fromaddress, subject, message, status, ackdata, lastactiontime
|
||||||
|
FROM sent WHERE folder="sent" AND %s LIKE ?
|
||||||
|
ORDER BY lastactiontime
|
||||||
|
''' % (where,)
|
||||||
|
|
||||||
|
while self.ui.tableWidgetSent.rowCount() > 0:
|
||||||
|
self.ui.tableWidgetSent.removeRow(0)
|
||||||
|
|
||||||
|
t = (what,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put(sqlQuery)
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
for row in queryreturn:
|
||||||
|
toAddress, fromAddress, subject, message, status, ackdata, lastactiontime = row
|
||||||
|
subject = shared.fixPotentiallyInvalidUTF8Data(subject)
|
||||||
|
message = shared.fixPotentiallyInvalidUTF8Data(message)
|
||||||
|
try:
|
||||||
|
fromLabel = shared.config.get(fromAddress, 'label')
|
||||||
|
except:
|
||||||
|
fromLabel = ''
|
||||||
|
if fromLabel == '':
|
||||||
|
fromLabel = fromAddress
|
||||||
|
|
||||||
|
toLabel = ''
|
||||||
|
t = (toAddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put(
|
||||||
|
'''select label from addressbook where address=?''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
|
||||||
|
if queryreturn != []:
|
||||||
|
for row in queryreturn:
|
||||||
|
toLabel, = row
|
||||||
|
|
||||||
|
self.ui.tableWidgetSent.insertRow(0)
|
||||||
|
if toLabel == '':
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(toAddress, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(toAddress, 'utf-8'))
|
||||||
|
else:
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(toLabel, 'utf-8'))
|
||||||
|
newItem.setData(Qt.UserRole, str(toAddress))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
self.ui.tableWidgetSent.setItem(0, 0, newItem)
|
||||||
|
if fromLabel == '':
|
||||||
|
newItem = QtGui.QTableWidgetItem(
|
||||||
|
unicode(fromAddress, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(fromAddress, 'utf-8'))
|
||||||
|
else:
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(fromLabel, 'utf-8'))
|
||||||
|
newItem.setData(Qt.UserRole, str(fromAddress))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
self.ui.tableWidgetSent.setItem(0, 1, newItem)
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(subject, 'utf-8'))
|
||||||
|
newItem.setData(Qt.UserRole, unicode(message, 'utf-8)'))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
self.ui.tableWidgetSent.setItem(0, 2, newItem)
|
||||||
|
if status == 'awaitingpubkey':
|
||||||
|
statusText = _translate(
|
||||||
|
"MainWindow", "Waiting on their encryption key. Will request it again soon.")
|
||||||
|
elif status == 'doingpowforpubkey':
|
||||||
|
statusText = _translate(
|
||||||
|
"MainWindow", "Encryption key request queued.")
|
||||||
|
elif status == 'msgqueued':
|
||||||
|
statusText = _translate(
|
||||||
|
"MainWindow", "Queued.")
|
||||||
|
elif status == 'msgsent':
|
||||||
|
statusText = _translate("MainWindow", "Message sent. Waiting on acknowledgement. Sent at %1").arg(
|
||||||
|
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
||||||
|
elif status == 'doingmsgpow':
|
||||||
|
statusText = _translate(
|
||||||
|
"MainWindow", "Need to do work to send message. Work is queued.")
|
||||||
|
elif status == 'ackreceived':
|
||||||
|
statusText = _translate("MainWindow", "Acknowledgement of the message received %1").arg(
|
||||||
|
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
||||||
|
elif status == 'broadcastqueued':
|
||||||
|
statusText = _translate(
|
||||||
|
"MainWindow", "Broadcast queued.")
|
||||||
|
elif status == 'broadcastsent':
|
||||||
|
statusText = _translate("MainWindow", "Broadcast on %1").arg(unicode(strftime(
|
||||||
|
shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
||||||
|
elif status == 'toodifficult':
|
||||||
|
statusText = _translate("MainWindow", "Problem: The work demanded by the recipient is more difficult than you are willing to do. %1").arg(
|
||||||
|
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
||||||
|
elif status == 'badkey':
|
||||||
|
statusText = _translate("MainWindow", "Problem: The recipient\'s encryption key is no good. Could not encrypt message. %1").arg(
|
||||||
|
unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
||||||
|
elif status == 'forcepow':
|
||||||
|
statusText = _translate(
|
||||||
|
"MainWindow", "Forced difficulty override. Send should start soon.")
|
||||||
|
else:
|
||||||
|
statusText = _translate("MainWindow", "Unknown status: %1 %2").arg(status).arg(unicode(
|
||||||
|
strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(lastactiontime)),'utf-8'))
|
||||||
|
newItem = myTableWidgetItem(statusText)
|
||||||
|
newItem.setToolTip(statusText)
|
||||||
|
newItem.setData(Qt.UserRole, QByteArray(ackdata))
|
||||||
|
newItem.setData(33, int(lastactiontime))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
self.ui.tableWidgetSent.setItem(0, 3, newItem)
|
||||||
|
self.ui.tableWidgetSent.sortItems(3, Qt.DescendingOrder)
|
||||||
|
self.ui.tableWidgetSent.keyPressEvent = self.tableWidgetSentKeyPressEvent
|
||||||
|
|
||||||
|
# Load inbox from messages database file
|
||||||
|
def loadInbox(self, where="", what=""):
|
||||||
|
what = "%" + what + "%"
|
||||||
|
if where == "To":
|
||||||
|
where = "toaddress"
|
||||||
|
elif where == "From":
|
||||||
|
where = "fromaddress"
|
||||||
|
elif where == "Subject":
|
||||||
|
where = "subject"
|
||||||
|
elif where == "Message":
|
||||||
|
where = "message"
|
||||||
|
else:
|
||||||
|
where = "toaddress || fromaddress || subject || message"
|
||||||
|
|
||||||
|
sqlQuery = '''
|
||||||
|
SELECT msgid, toaddress, fromaddress, subject, received, message, read
|
||||||
|
FROM inbox WHERE folder="inbox" AND %s LIKE ?
|
||||||
|
ORDER BY received
|
||||||
|
''' % (where,)
|
||||||
|
|
||||||
|
while self.ui.tableWidgetInbox.rowCount() > 0:
|
||||||
|
self.ui.tableWidgetInbox.removeRow(0)
|
||||||
|
|
||||||
|
font = QFont()
|
||||||
|
font.setBold(True)
|
||||||
|
t = (what,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put(sqlQuery)
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
for row in queryreturn:
|
||||||
|
msgid, toAddress, fromAddress, subject, received, message, read = row
|
||||||
|
subject = shared.fixPotentiallyInvalidUTF8Data(subject)
|
||||||
|
message = shared.fixPotentiallyInvalidUTF8Data(message)
|
||||||
|
try:
|
||||||
|
if toAddress == self.str_broadcast_subscribers:
|
||||||
|
toLabel = self.str_broadcast_subscribers
|
||||||
|
else:
|
||||||
|
toLabel = shared.config.get(toAddress, 'label')
|
||||||
|
except:
|
||||||
|
toLabel = ''
|
||||||
|
if toLabel == '':
|
||||||
|
toLabel = toAddress
|
||||||
|
|
||||||
|
fromLabel = ''
|
||||||
|
t = (fromAddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put(
|
||||||
|
'''select label from addressbook where address=?''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
|
||||||
|
if queryreturn != []:
|
||||||
|
for row in queryreturn:
|
||||||
|
fromLabel, = row
|
||||||
|
|
||||||
|
if fromLabel == '': # If this address wasn't in our address book...
|
||||||
|
t = (fromAddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put(
|
||||||
|
'''select label from subscriptions where address=?''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
|
||||||
|
if queryreturn != []:
|
||||||
|
for row in queryreturn:
|
||||||
|
fromLabel, = row
|
||||||
|
|
||||||
|
self.ui.tableWidgetInbox.insertRow(0)
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(toLabel, 'utf-8'))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
if not read:
|
||||||
|
newItem.setFont(font)
|
||||||
|
newItem.setData(Qt.UserRole, str(toAddress))
|
||||||
|
if shared.safeConfigGetBoolean(toAddress, 'mailinglist'):
|
||||||
|
newItem.setTextColor(QtGui.QColor(137, 04, 177))
|
||||||
|
self.ui.tableWidgetInbox.setItem(0, 0, newItem)
|
||||||
|
if fromLabel == '':
|
||||||
|
newItem = QtGui.QTableWidgetItem(
|
||||||
|
unicode(fromAddress, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(fromAddress, 'utf-8'))
|
||||||
|
else:
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(fromLabel, 'utf-8'))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
if not read:
|
||||||
|
newItem.setFont(font)
|
||||||
|
newItem.setData(Qt.UserRole, str(fromAddress))
|
||||||
|
|
||||||
|
self.ui.tableWidgetInbox.setItem(0, 1, newItem)
|
||||||
|
newItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(subject, 'utf-8'))
|
||||||
|
newItem.setData(Qt.UserRole, unicode(message, 'utf-8)'))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
if not read:
|
||||||
|
newItem.setFont(font)
|
||||||
|
self.ui.tableWidgetInbox.setItem(0, 2, newItem)
|
||||||
|
newItem = myTableWidgetItem(unicode(strftime(shared.config.get(
|
||||||
|
'bitmessagesettings', 'timeformat'), localtime(int(received))), 'utf-8'))
|
||||||
|
newItem.setToolTip(unicode(strftime(shared.config.get(
|
||||||
|
'bitmessagesettings', 'timeformat'), localtime(int(received))), 'utf-8'))
|
||||||
|
newItem.setData(Qt.UserRole, QByteArray(msgid))
|
||||||
|
newItem.setData(33, int(received))
|
||||||
|
newItem.setFlags(
|
||||||
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
|
if not read:
|
||||||
|
newItem.setFont(font)
|
||||||
|
self.ui.tableWidgetInbox.setItem(0, 3, newItem)
|
||||||
|
self.ui.tableWidgetInbox.sortItems(3, Qt.DescendingOrder)
|
||||||
|
self.ui.tableWidgetInbox.keyPressEvent = self.tableWidgetInboxKeyPressEvent
|
||||||
|
|
||||||
# create application indicator
|
# create application indicator
|
||||||
def appIndicatorInit(self, app):
|
def appIndicatorInit(self, app):
|
||||||
self.tray = QSystemTrayIcon(QtGui.QIcon(
|
self.tray = QSystemTrayIcon(QtGui.QIcon(
|
||||||
|
@ -1778,6 +1838,8 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.settingsDialogInstance.ui.lineEditSocksUsername.text()))
|
self.settingsDialogInstance.ui.lineEditSocksUsername.text()))
|
||||||
shared.config.set('bitmessagesettings', 'sockspassword', str(
|
shared.config.set('bitmessagesettings', 'sockspassword', str(
|
||||||
self.settingsDialogInstance.ui.lineEditSocksPassword.text()))
|
self.settingsDialogInstance.ui.lineEditSocksPassword.text()))
|
||||||
|
shared.config.set('bitmessagesettings', 'sockslisten', str(
|
||||||
|
self.settingsDialogInstance.ui.checkBoxSocksListen.isChecked()))
|
||||||
|
|
||||||
shared.config.set('bitmessagesettings', 'namecoinrpctype',
|
shared.config.set('bitmessagesettings', 'namecoinrpctype',
|
||||||
self.settingsDialogInstance.getNamecoinType())
|
self.settingsDialogInstance.getNamecoinType())
|
||||||
|
@ -1842,7 +1904,14 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.knownNodesLock.release()
|
shared.knownNodesLock.release()
|
||||||
os.remove(shared.appdata + 'keys.dat')
|
os.remove(shared.appdata + 'keys.dat')
|
||||||
os.remove(shared.appdata + 'knownnodes.dat')
|
os.remove(shared.appdata + 'knownnodes.dat')
|
||||||
|
previousAppdataLocation = shared.appdata
|
||||||
shared.appdata = ''
|
shared.appdata = ''
|
||||||
|
debug.restartLoggingInUpdatedAppdataLocation()
|
||||||
|
try:
|
||||||
|
os.remove(previousAppdataLocation + 'debug.log')
|
||||||
|
os.remove(previousAppdataLocation + 'debug.log.1')
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
if shared.appdata == '' and not self.settingsDialogInstance.ui.checkBoxPortableMode.isChecked(): # If we ARE using portable mode now but the user selected that we shouldn't...
|
if shared.appdata == '' and not self.settingsDialogInstance.ui.checkBoxPortableMode.isChecked(): # If we ARE using portable mode now but the user selected that we shouldn't...
|
||||||
shared.appdata = shared.lookupAppdataFolder()
|
shared.appdata = shared.lookupAppdataFolder()
|
||||||
|
@ -1862,6 +1931,12 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.knownNodesLock.release()
|
shared.knownNodesLock.release()
|
||||||
os.remove('keys.dat')
|
os.remove('keys.dat')
|
||||||
os.remove('knownnodes.dat')
|
os.remove('knownnodes.dat')
|
||||||
|
debug.restartLoggingInUpdatedAppdataLocation()
|
||||||
|
try:
|
||||||
|
os.remove('debug.log')
|
||||||
|
os.remove('debug.log.1')
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
def click_radioButtonBlacklist(self):
|
def click_radioButtonBlacklist(self):
|
||||||
if shared.config.get('bitmessagesettings', 'blackwhitelist') == 'white':
|
if shared.config.get('bitmessagesettings', 'blackwhitelist') == 'white':
|
||||||
|
@ -2533,6 +2608,20 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.popMenuSent.addAction(self.actionForceSend)
|
self.popMenuSent.addAction(self.actionForceSend)
|
||||||
self.popMenuSent.exec_(self.ui.tableWidgetSent.mapToGlobal(point))
|
self.popMenuSent.exec_(self.ui.tableWidgetSent.mapToGlobal(point))
|
||||||
|
|
||||||
|
def inboxSearchLineEditPressed(self):
|
||||||
|
searchKeyword = self.ui.inboxSearchLineEdit.text().toUtf8().data()
|
||||||
|
searchOption = self.ui.inboxSearchOptionCB.currentText().toUtf8().data()
|
||||||
|
self.ui.inboxSearchLineEdit.setText(QString(""))
|
||||||
|
self.ui.textEditInboxMessage.setPlainText(QString(""))
|
||||||
|
self.loadInbox(searchOption, searchKeyword)
|
||||||
|
|
||||||
|
def sentSearchLineEditPressed(self):
|
||||||
|
searchKeyword = self.ui.sentSearchLineEdit.text().toUtf8().data()
|
||||||
|
searchOption = self.ui.sentSearchOptionCB.currentText().toUtf8().data()
|
||||||
|
self.ui.sentSearchLineEdit.setText(QString(""))
|
||||||
|
self.ui.textEditInboxMessage.setPlainText(QString(""))
|
||||||
|
self.loadSent(searchOption, searchKeyword)
|
||||||
|
|
||||||
def tableWidgetInboxItemClicked(self):
|
def tableWidgetInboxItemClicked(self):
|
||||||
currentRow = self.ui.tableWidgetInbox.currentRow()
|
currentRow = self.ui.tableWidgetInbox.currentRow()
|
||||||
if currentRow >= 0:
|
if currentRow >= 0:
|
||||||
|
@ -2717,6 +2806,8 @@ class settingsDialog(QtGui.QDialog):
|
||||||
shared.config.get('bitmessagesettings', 'port')))
|
shared.config.get('bitmessagesettings', 'port')))
|
||||||
self.ui.checkBoxAuthentication.setChecked(shared.config.getboolean(
|
self.ui.checkBoxAuthentication.setChecked(shared.config.getboolean(
|
||||||
'bitmessagesettings', 'socksauthentication'))
|
'bitmessagesettings', 'socksauthentication'))
|
||||||
|
self.ui.checkBoxSocksListen.setChecked(shared.config.getboolean(
|
||||||
|
'bitmessagesettings', 'sockslisten'))
|
||||||
if str(shared.config.get('bitmessagesettings', 'socksproxytype')) == 'none':
|
if str(shared.config.get('bitmessagesettings', 'socksproxytype')) == 'none':
|
||||||
self.ui.comboBoxProxyType.setCurrentIndex(0)
|
self.ui.comboBoxProxyType.setCurrentIndex(0)
|
||||||
self.ui.lineEditSocksHostname.setEnabled(False)
|
self.ui.lineEditSocksHostname.setEnabled(False)
|
||||||
|
@ -2724,6 +2815,7 @@ class settingsDialog(QtGui.QDialog):
|
||||||
self.ui.lineEditSocksUsername.setEnabled(False)
|
self.ui.lineEditSocksUsername.setEnabled(False)
|
||||||
self.ui.lineEditSocksPassword.setEnabled(False)
|
self.ui.lineEditSocksPassword.setEnabled(False)
|
||||||
self.ui.checkBoxAuthentication.setEnabled(False)
|
self.ui.checkBoxAuthentication.setEnabled(False)
|
||||||
|
self.ui.checkBoxSocksListen.setEnabled(False)
|
||||||
elif str(shared.config.get('bitmessagesettings', 'socksproxytype')) == 'SOCKS4a':
|
elif str(shared.config.get('bitmessagesettings', 'socksproxytype')) == 'SOCKS4a':
|
||||||
self.ui.comboBoxProxyType.setCurrentIndex(1)
|
self.ui.comboBoxProxyType.setCurrentIndex(1)
|
||||||
self.ui.lineEditTCPPort.setEnabled(False)
|
self.ui.lineEditTCPPort.setEnabled(False)
|
||||||
|
@ -2811,11 +2903,13 @@ class settingsDialog(QtGui.QDialog):
|
||||||
self.ui.lineEditSocksUsername.setEnabled(False)
|
self.ui.lineEditSocksUsername.setEnabled(False)
|
||||||
self.ui.lineEditSocksPassword.setEnabled(False)
|
self.ui.lineEditSocksPassword.setEnabled(False)
|
||||||
self.ui.checkBoxAuthentication.setEnabled(False)
|
self.ui.checkBoxAuthentication.setEnabled(False)
|
||||||
|
self.ui.checkBoxSocksListen.setEnabled(False)
|
||||||
self.ui.lineEditTCPPort.setEnabled(True)
|
self.ui.lineEditTCPPort.setEnabled(True)
|
||||||
elif comboBoxIndex == 1 or comboBoxIndex == 2:
|
elif comboBoxIndex == 1 or comboBoxIndex == 2:
|
||||||
self.ui.lineEditSocksHostname.setEnabled(True)
|
self.ui.lineEditSocksHostname.setEnabled(True)
|
||||||
self.ui.lineEditSocksPort.setEnabled(True)
|
self.ui.lineEditSocksPort.setEnabled(True)
|
||||||
self.ui.checkBoxAuthentication.setEnabled(True)
|
self.ui.checkBoxAuthentication.setEnabled(True)
|
||||||
|
self.ui.checkBoxSocksListen.setEnabled(True)
|
||||||
if self.ui.checkBoxAuthentication.isChecked():
|
if self.ui.checkBoxAuthentication.isChecked():
|
||||||
self.ui.lineEditSocksUsername.setEnabled(True)
|
self.ui.lineEditSocksUsername.setEnabled(True)
|
||||||
self.ui.lineEditSocksPassword.setEnabled(True)
|
self.ui.lineEditSocksPassword.setEnabled(True)
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="newPrefix">
|
<qresource prefix="newPrefix">
|
||||||
<file>images/can-icon-24px-yellow.png</file>
|
<file>../images/can-icon-24px-yellow.png</file>
|
||||||
<file>images/can-icon-24px-red.png</file>
|
<file>../images/can-icon-24px-red.png</file>
|
||||||
<file>images/can-icon-24px-green.png</file>
|
<file>../images/can-icon-24px-green.png</file>
|
||||||
<file>images/can-icon-24px.png</file>
|
<file>../images/can-icon-24px.png</file>
|
||||||
<file>images/can-icon-16px.png</file>
|
<file>../images/can-icon-16px.png</file>
|
||||||
<file>images/greenicon.png</file>
|
<file>../images/greenicon.png</file>
|
||||||
<file>images/redicon.png</file>
|
<file>../images/redicon.png</file>
|
||||||
<file>images/yellowicon.png</file>
|
<file>../images/yellowicon.png</file>
|
||||||
<file>images/addressbook.png</file>
|
<file>../images/addressbook.png</file>
|
||||||
<file>images/blacklist.png</file>
|
<file>../images/blacklist.png</file>
|
||||||
<file>images/identities.png</file>
|
<file>../images/identities.png</file>
|
||||||
<file>images/networkstatus.png</file>
|
<file>../images/networkstatus.png</file>
|
||||||
<file>images/sent.png</file>
|
<file>../images/sent.png</file>
|
||||||
<file>images/subscriptions.png</file>
|
<file>../images/subscriptions.png</file>
|
||||||
<file>images/send.png</file>
|
<file>../images/send.png</file>
|
||||||
<file>images/inbox.png</file>
|
<file>../images/inbox.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'bitmessageui.ui'
|
# Form implementation generated from reading ui file 'bitmessageui.ui'
|
||||||
#
|
#
|
||||||
# Created: Thu Jul 4 22:00:02 2013
|
# Created: Wed Jul 17 18:15:14 2013
|
||||||
# by: PyQt4 UI code generator 4.9.3
|
# by: PyQt4 UI code generator 4.9.3
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
@ -45,6 +45,21 @@ class Ui_MainWindow(object):
|
||||||
self.inbox.setObjectName(_fromUtf8("inbox"))
|
self.inbox.setObjectName(_fromUtf8("inbox"))
|
||||||
self.verticalLayout_2 = QtGui.QVBoxLayout(self.inbox)
|
self.verticalLayout_2 = QtGui.QVBoxLayout(self.inbox)
|
||||||
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
|
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
|
||||||
|
self.horizontalLayoutSearch = QtGui.QHBoxLayout()
|
||||||
|
self.horizontalLayoutSearch.setContentsMargins(-1, 0, -1, -1)
|
||||||
|
self.horizontalLayoutSearch.setObjectName(_fromUtf8("horizontalLayoutSearch"))
|
||||||
|
self.inboxSearchLineEdit = QtGui.QLineEdit(self.inbox)
|
||||||
|
self.inboxSearchLineEdit.setObjectName(_fromUtf8("inboxSearchLineEdit"))
|
||||||
|
self.horizontalLayoutSearch.addWidget(self.inboxSearchLineEdit)
|
||||||
|
self.inboxSearchOptionCB = QtGui.QComboBox(self.inbox)
|
||||||
|
self.inboxSearchOptionCB.setObjectName(_fromUtf8("inboxSearchOptionCB"))
|
||||||
|
self.inboxSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.inboxSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.inboxSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.inboxSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.inboxSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.horizontalLayoutSearch.addWidget(self.inboxSearchOptionCB)
|
||||||
|
self.verticalLayout_2.addLayout(self.horizontalLayoutSearch)
|
||||||
self.tableWidgetInbox = QtGui.QTableWidget(self.inbox)
|
self.tableWidgetInbox = QtGui.QTableWidget(self.inbox)
|
||||||
self.tableWidgetInbox.setAlternatingRowColors(True)
|
self.tableWidgetInbox.setAlternatingRowColors(True)
|
||||||
self.tableWidgetInbox.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
|
self.tableWidgetInbox.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
|
||||||
|
@ -154,6 +169,21 @@ class Ui_MainWindow(object):
|
||||||
self.sent.setObjectName(_fromUtf8("sent"))
|
self.sent.setObjectName(_fromUtf8("sent"))
|
||||||
self.verticalLayout = QtGui.QVBoxLayout(self.sent)
|
self.verticalLayout = QtGui.QVBoxLayout(self.sent)
|
||||||
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
|
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
|
||||||
|
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||||
|
self.horizontalLayout.setContentsMargins(-1, 0, -1, -1)
|
||||||
|
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
|
||||||
|
self.sentSearchLineEdit = QtGui.QLineEdit(self.sent)
|
||||||
|
self.sentSearchLineEdit.setObjectName(_fromUtf8("sentSearchLineEdit"))
|
||||||
|
self.horizontalLayout.addWidget(self.sentSearchLineEdit)
|
||||||
|
self.sentSearchOptionCB = QtGui.QComboBox(self.sent)
|
||||||
|
self.sentSearchOptionCB.setObjectName(_fromUtf8("sentSearchOptionCB"))
|
||||||
|
self.sentSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.sentSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.sentSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.sentSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.sentSearchOptionCB.addItem(_fromUtf8(""))
|
||||||
|
self.horizontalLayout.addWidget(self.sentSearchOptionCB)
|
||||||
|
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||||
self.tableWidgetSent = QtGui.QTableWidget(self.sent)
|
self.tableWidgetSent = QtGui.QTableWidget(self.sent)
|
||||||
self.tableWidgetSent.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
|
self.tableWidgetSent.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
|
||||||
self.tableWidgetSent.setAlternatingRowColors(True)
|
self.tableWidgetSent.setAlternatingRowColors(True)
|
||||||
|
@ -464,6 +494,12 @@ class Ui_MainWindow(object):
|
||||||
|
|
||||||
def retranslateUi(self, MainWindow):
|
def retranslateUi(self, MainWindow):
|
||||||
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Bitmessage", None, QtGui.QApplication.UnicodeUTF8))
|
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Bitmessage", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.inboxSearchLineEdit.setPlaceholderText(QtGui.QApplication.translate("MainWindow", "Search", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.inboxSearchOptionCB.setItemText(0, QtGui.QApplication.translate("MainWindow", "All", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.inboxSearchOptionCB.setItemText(1, QtGui.QApplication.translate("MainWindow", "To", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.inboxSearchOptionCB.setItemText(2, QtGui.QApplication.translate("MainWindow", "From", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.inboxSearchOptionCB.setItemText(3, QtGui.QApplication.translate("MainWindow", "Subject", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.inboxSearchOptionCB.setItemText(4, QtGui.QApplication.translate("MainWindow", "Message", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.tableWidgetInbox.setSortingEnabled(True)
|
self.tableWidgetInbox.setSortingEnabled(True)
|
||||||
item = self.tableWidgetInbox.horizontalHeaderItem(0)
|
item = self.tableWidgetInbox.horizontalHeaderItem(0)
|
||||||
item.setText(QtGui.QApplication.translate("MainWindow", "To", None, QtGui.QApplication.UnicodeUTF8))
|
item.setText(QtGui.QApplication.translate("MainWindow", "To", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
@ -490,6 +526,12 @@ class Ui_MainWindow(object):
|
||||||
self.pushButtonSend.setText(QtGui.QApplication.translate("MainWindow", "Send", None, QtGui.QApplication.UnicodeUTF8))
|
self.pushButtonSend.setText(QtGui.QApplication.translate("MainWindow", "Send", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.labelSendBroadcastWarning.setText(QtGui.QApplication.translate("MainWindow", "Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them.", None, QtGui.QApplication.UnicodeUTF8))
|
self.labelSendBroadcastWarning.setText(QtGui.QApplication.translate("MainWindow", "Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them.", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), QtGui.QApplication.translate("MainWindow", "Send", None, QtGui.QApplication.UnicodeUTF8))
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), QtGui.QApplication.translate("MainWindow", "Send", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.sentSearchLineEdit.setPlaceholderText(QtGui.QApplication.translate("MainWindow", "Search", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.sentSearchOptionCB.setItemText(0, QtGui.QApplication.translate("MainWindow", "All", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.sentSearchOptionCB.setItemText(1, QtGui.QApplication.translate("MainWindow", "To", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.sentSearchOptionCB.setItemText(2, QtGui.QApplication.translate("MainWindow", "From", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.sentSearchOptionCB.setItemText(3, QtGui.QApplication.translate("MainWindow", "Subject", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.sentSearchOptionCB.setItemText(4, QtGui.QApplication.translate("MainWindow", "Message", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.tableWidgetSent.setSortingEnabled(True)
|
self.tableWidgetSent.setSortingEnabled(True)
|
||||||
item = self.tableWidgetSent.horizontalHeaderItem(0)
|
item = self.tableWidgetSent.horizontalHeaderItem(0)
|
||||||
item.setText(QtGui.QApplication.translate("MainWindow", "To", None, QtGui.QApplication.UnicodeUTF8))
|
item.setText(QtGui.QApplication.translate("MainWindow", "To", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<string>Bitmessage</string>
|
<string>Bitmessage</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon">
|
<property name="windowIcon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/can-icon-24px.png</normaloff>:/newPrefix/images/can-icon-24px.png</iconset>
|
<normaloff>:/newPrefix/images/can-icon-24px.png</normaloff>:/newPrefix/images/can-icon-24px.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="tabShape">
|
<property name="tabShape">
|
||||||
|
@ -61,13 +61,56 @@
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="inbox">
|
<widget class="QWidget" name="inbox">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/inbox.png</normaloff>:/newPrefix/images/inbox.png</iconset>
|
<normaloff>:/newPrefix/images/inbox.png</normaloff>:/newPrefix/images/inbox.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Inbox</string>
|
<string>Inbox</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutSearch">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="inboxSearchLineEdit">
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>Search</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="inboxSearchOptionCB">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>All</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>To</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>From</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Subject</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Message</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTableWidget" name="tableWidgetInbox">
|
<widget class="QTableWidget" name="tableWidgetInbox">
|
||||||
<property name="alternatingRowColors">
|
<property name="alternatingRowColors">
|
||||||
|
@ -145,7 +188,7 @@
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="send">
|
<widget class="QWidget" name="send">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/send.png</normaloff>:/newPrefix/images/send.png</iconset>
|
<normaloff>:/newPrefix/images/send.png</normaloff>:/newPrefix/images/send.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
@ -315,13 +358,56 @@ p, li { white-space: pre-wrap; }
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="sent">
|
<widget class="QWidget" name="sent">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/sent.png</normaloff>:/newPrefix/images/sent.png</iconset>
|
<normaloff>:/newPrefix/images/sent.png</normaloff>:/newPrefix/images/sent.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Sent</string>
|
<string>Sent</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="sentSearchLineEdit">
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>Search</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="sentSearchOptionCB">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>All</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>To</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>From</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Subject</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Message</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTableWidget" name="tableWidgetSent">
|
<widget class="QTableWidget" name="tableWidgetSent">
|
||||||
<property name="dragDropMode">
|
<property name="dragDropMode">
|
||||||
|
@ -392,7 +478,7 @@ p, li { white-space: pre-wrap; }
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="youridentities">
|
<widget class="QWidget" name="youridentities">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/identities.png</normaloff>:/newPrefix/images/identities.png</iconset>
|
<normaloff>:/newPrefix/images/identities.png</normaloff>:/newPrefix/images/identities.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
@ -492,7 +578,7 @@ p, li { white-space: pre-wrap; }
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="subscriptions">
|
<widget class="QWidget" name="subscriptions">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/subscriptions.png</normaloff>:/newPrefix/images/subscriptions.png</iconset>
|
<normaloff>:/newPrefix/images/subscriptions.png</normaloff>:/newPrefix/images/subscriptions.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
@ -577,7 +663,7 @@ p, li { white-space: pre-wrap; }
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="addressbook">
|
<widget class="QWidget" name="addressbook">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/addressbook.png</normaloff>:/newPrefix/images/addressbook.png</iconset>
|
<normaloff>:/newPrefix/images/addressbook.png</normaloff>:/newPrefix/images/addressbook.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
@ -659,7 +745,7 @@ p, li { white-space: pre-wrap; }
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="blackwhitelist">
|
<widget class="QWidget" name="blackwhitelist">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/blacklist.png</normaloff>:/newPrefix/images/blacklist.png</iconset>
|
<normaloff>:/newPrefix/images/blacklist.png</normaloff>:/newPrefix/images/blacklist.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
@ -751,7 +837,7 @@ p, li { white-space: pre-wrap; }
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="networkstatus">
|
<widget class="QWidget" name="networkstatus">
|
||||||
<attribute name="icon">
|
<attribute name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/networkstatus.png</normaloff>:/newPrefix/images/networkstatus.png</iconset>
|
<normaloff>:/newPrefix/images/networkstatus.png</normaloff>:/newPrefix/images/networkstatus.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
@ -770,7 +856,7 @@ p, li { white-space: pre-wrap; }
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="bitmessage_icons.qrc">
|
<iconset>
|
||||||
<normaloff>:/newPrefix/images/redicon.png</normaloff>:/newPrefix/images/redicon.png</iconset>
|
<normaloff>:/newPrefix/images/redicon.png</normaloff>:/newPrefix/images/redicon.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="flat">
|
<property name="flat">
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'settings.ui'
|
# Form implementation generated from reading ui file 'settings.ui'
|
||||||
#
|
#
|
||||||
# Created: Sun Jul 7 19:23:55 2013
|
# Created: Wed Jul 17 18:15:35 2013
|
||||||
# by: PyQt4 UI code generator 4.9.3
|
# by: PyQt4 UI code generator 4.9.3
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
@ -122,6 +122,9 @@ class Ui_settingsDialog(object):
|
||||||
self.lineEditSocksPassword.setEchoMode(QtGui.QLineEdit.Password)
|
self.lineEditSocksPassword.setEchoMode(QtGui.QLineEdit.Password)
|
||||||
self.lineEditSocksPassword.setObjectName(_fromUtf8("lineEditSocksPassword"))
|
self.lineEditSocksPassword.setObjectName(_fromUtf8("lineEditSocksPassword"))
|
||||||
self.gridLayout_2.addWidget(self.lineEditSocksPassword, 2, 5, 1, 1)
|
self.gridLayout_2.addWidget(self.lineEditSocksPassword, 2, 5, 1, 1)
|
||||||
|
self.checkBoxSocksListen = QtGui.QCheckBox(self.groupBox_2)
|
||||||
|
self.checkBoxSocksListen.setObjectName(_fromUtf8("checkBoxSocksListen"))
|
||||||
|
self.gridLayout_2.addWidget(self.checkBoxSocksListen, 3, 1, 1, 4)
|
||||||
self.gridLayout_4.addWidget(self.groupBox_2, 1, 0, 1, 1)
|
self.gridLayout_4.addWidget(self.groupBox_2, 1, 0, 1, 1)
|
||||||
spacerItem2 = QtGui.QSpacerItem(20, 70, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
spacerItem2 = QtGui.QSpacerItem(20, 70, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||||
self.gridLayout_4.addItem(spacerItem2, 2, 0, 1, 1)
|
self.gridLayout_4.addItem(spacerItem2, 2, 0, 1, 1)
|
||||||
|
@ -304,7 +307,8 @@ class Ui_settingsDialog(object):
|
||||||
settingsDialog.setTabOrder(self.lineEditSocksPort, self.checkBoxAuthentication)
|
settingsDialog.setTabOrder(self.lineEditSocksPort, self.checkBoxAuthentication)
|
||||||
settingsDialog.setTabOrder(self.checkBoxAuthentication, self.lineEditSocksUsername)
|
settingsDialog.setTabOrder(self.checkBoxAuthentication, self.lineEditSocksUsername)
|
||||||
settingsDialog.setTabOrder(self.lineEditSocksUsername, self.lineEditSocksPassword)
|
settingsDialog.setTabOrder(self.lineEditSocksUsername, self.lineEditSocksPassword)
|
||||||
settingsDialog.setTabOrder(self.lineEditSocksPassword, self.buttonBox)
|
settingsDialog.setTabOrder(self.lineEditSocksPassword, self.checkBoxSocksListen)
|
||||||
|
settingsDialog.setTabOrder(self.checkBoxSocksListen, self.buttonBox)
|
||||||
|
|
||||||
def retranslateUi(self, settingsDialog):
|
def retranslateUi(self, settingsDialog):
|
||||||
settingsDialog.setWindowTitle(QtGui.QApplication.translate("settingsDialog", "Settings", None, QtGui.QApplication.UnicodeUTF8))
|
settingsDialog.setWindowTitle(QtGui.QApplication.translate("settingsDialog", "Settings", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
@ -327,6 +331,7 @@ class Ui_settingsDialog(object):
|
||||||
self.checkBoxAuthentication.setText(QtGui.QApplication.translate("settingsDialog", "Authentication", None, QtGui.QApplication.UnicodeUTF8))
|
self.checkBoxAuthentication.setText(QtGui.QApplication.translate("settingsDialog", "Authentication", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.label_5.setText(QtGui.QApplication.translate("settingsDialog", "Username:", None, QtGui.QApplication.UnicodeUTF8))
|
self.label_5.setText(QtGui.QApplication.translate("settingsDialog", "Username:", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.label_6.setText(QtGui.QApplication.translate("settingsDialog", "Pass:", None, QtGui.QApplication.UnicodeUTF8))
|
self.label_6.setText(QtGui.QApplication.translate("settingsDialog", "Pass:", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.checkBoxSocksListen.setText(QtGui.QApplication.translate("settingsDialog", "Listen for incoming connections when using proxy", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabNetworkSettings), QtGui.QApplication.translate("settingsDialog", "Network Settings", None, QtGui.QApplication.UnicodeUTF8))
|
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabNetworkSettings), QtGui.QApplication.translate("settingsDialog", "Network Settings", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.label_8.setText(QtGui.QApplication.translate("settingsDialog", "When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. ", None, QtGui.QApplication.UnicodeUTF8))
|
self.label_8.setText(QtGui.QApplication.translate("settingsDialog", "When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. ", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.label_9.setText(QtGui.QApplication.translate("settingsDialog", "Total difficulty:", None, QtGui.QApplication.UnicodeUTF8))
|
self.label_9.setText(QtGui.QApplication.translate("settingsDialog", "Total difficulty:", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
|
|
@ -247,6 +247,13 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="1" colspan="4">
|
||||||
|
<widget class="QCheckBox" name="checkBoxSocksListen">
|
||||||
|
<property name="text">
|
||||||
|
<string>Listen for incoming connections when using proxy</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -691,6 +698,7 @@
|
||||||
<tabstop>checkBoxAuthentication</tabstop>
|
<tabstop>checkBoxAuthentication</tabstop>
|
||||||
<tabstop>lineEditSocksUsername</tabstop>
|
<tabstop>lineEditSocksUsername</tabstop>
|
||||||
<tabstop>lineEditSocksPassword</tabstop>
|
<tabstop>lineEditSocksPassword</tabstop>
|
||||||
|
<tabstop>checkBoxSocksListen</tabstop>
|
||||||
<tabstop>buttonBox</tabstop>
|
<tabstop>buttonBox</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|
|
@ -528,13 +528,7 @@ class receiveDataThread(threading.Thread):
|
||||||
print 'fromAddress:', fromAddress
|
print 'fromAddress:', fromAddress
|
||||||
|
|
||||||
if messageEncodingType == 2:
|
if messageEncodingType == 2:
|
||||||
bodyPositionIndex = string.find(message, '\nBody:')
|
subject, body = self.decodeType2Message(message)
|
||||||
if bodyPositionIndex > 1:
|
|
||||||
subject = message[8:bodyPositionIndex]
|
|
||||||
body = message[bodyPositionIndex + 6:]
|
|
||||||
else:
|
|
||||||
subject = ''
|
|
||||||
body = message
|
|
||||||
elif messageEncodingType == 1:
|
elif messageEncodingType == 1:
|
||||||
body = message
|
body = message
|
||||||
subject = ''
|
subject = ''
|
||||||
|
@ -684,13 +678,7 @@ class receiveDataThread(threading.Thread):
|
||||||
print 'fromAddress:', fromAddress
|
print 'fromAddress:', fromAddress
|
||||||
|
|
||||||
if messageEncodingType == 2:
|
if messageEncodingType == 2:
|
||||||
bodyPositionIndex = string.find(message, '\nBody:')
|
subject, body = self.decodeType2Message(message)
|
||||||
if bodyPositionIndex > 1:
|
|
||||||
subject = message[8:bodyPositionIndex]
|
|
||||||
body = message[bodyPositionIndex + 6:]
|
|
||||||
else:
|
|
||||||
subject = ''
|
|
||||||
body = message
|
|
||||||
elif messageEncodingType == 1:
|
elif messageEncodingType == 1:
|
||||||
body = message
|
body = message
|
||||||
subject = ''
|
subject = ''
|
||||||
|
@ -1005,15 +993,7 @@ class receiveDataThread(threading.Thread):
|
||||||
toLabel = toAddress
|
toLabel = toAddress
|
||||||
|
|
||||||
if messageEncodingType == 2:
|
if messageEncodingType == 2:
|
||||||
bodyPositionIndex = string.find(message, '\nBody:')
|
subject, body = self.decodeType2Message(message)
|
||||||
if bodyPositionIndex > 1:
|
|
||||||
subject = message[8:bodyPositionIndex]
|
|
||||||
subject = subject[
|
|
||||||
:500] # Only save and show the first 500 characters of the subject. Any more is probably an attak.
|
|
||||||
body = message[bodyPositionIndex + 6:]
|
|
||||||
else:
|
|
||||||
subject = ''
|
|
||||||
body = message
|
|
||||||
elif messageEncodingType == 1:
|
elif messageEncodingType == 1:
|
||||||
body = message
|
body = message
|
||||||
subject = ''
|
subject = ''
|
||||||
|
@ -1086,6 +1066,21 @@ class receiveDataThread(threading.Thread):
|
||||||
print 'Time to decrypt this message successfully:', timeRequiredToAttemptToDecryptMessage
|
print 'Time to decrypt this message successfully:', timeRequiredToAttemptToDecryptMessage
|
||||||
print 'Average time for all message decryption successes since startup:', sum / len(shared.successfullyDecryptMessageTimings)
|
print 'Average time for all message decryption successes since startup:', sum / len(shared.successfullyDecryptMessageTimings)
|
||||||
|
|
||||||
|
def decodeType2Message(self, message):
|
||||||
|
bodyPositionIndex = string.find(message, '\nBody:')
|
||||||
|
if bodyPositionIndex > 1:
|
||||||
|
subject = message[8:bodyPositionIndex]
|
||||||
|
# Only save and show the first 500 characters of the subject.
|
||||||
|
# Any more is probably an attack.
|
||||||
|
subject = subject[:500]
|
||||||
|
body = message[bodyPositionIndex + 6:]
|
||||||
|
else:
|
||||||
|
subject = ''
|
||||||
|
body = message
|
||||||
|
# Throw away any extra lines (headers) after the subject.
|
||||||
|
if subject:
|
||||||
|
subject = subject.splitlines()[0]
|
||||||
|
return subject, body
|
||||||
|
|
||||||
def isAckDataValid(self, ackData):
|
def isAckDataValid(self, ackData):
|
||||||
if len(ackData) < 24:
|
if len(ackData) < 24:
|
||||||
|
|
|
@ -21,10 +21,11 @@ class singleListener(threading.Thread):
|
||||||
self.selfInitiatedConnections = selfInitiatedConnections
|
self.selfInitiatedConnections = selfInitiatedConnections
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
# We don't want to accept incoming connections if the user is using a
|
# We typically don't want to accept incoming connections if the user is using a
|
||||||
# SOCKS proxy. If they eventually select proxy 'none' then this will
|
# SOCKS proxy, unless they have configured otherwise. If they eventually select
|
||||||
# start listening for connections.
|
# proxy 'none' or configure SOCKS listening then this will start listening for
|
||||||
while shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS':
|
# connections.
|
||||||
|
while shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS' and not shared.config.getboolean('bitmessagesettings', 'sockslisten'):
|
||||||
time.sleep(300)
|
time.sleep(300)
|
||||||
|
|
||||||
with shared.printLock:
|
with shared.printLock:
|
||||||
|
@ -40,10 +41,11 @@ class singleListener(threading.Thread):
|
||||||
sock.listen(2)
|
sock.listen(2)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
# We don't want to accept incoming connections if the user is using
|
# We typically don't want to accept incoming connections if the user is using a
|
||||||
# a SOCKS proxy. If the user eventually select proxy 'none' then
|
# SOCKS proxy, unless they have configured otherwise. If they eventually select
|
||||||
# this will start listening for connections.
|
# proxy 'none' or configure SOCKS listening then this will start listening for
|
||||||
while shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS':
|
# connections.
|
||||||
|
while shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS' and not shared.config.getboolean('bitmessagesettings', 'sockslisten'):
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
while len(shared.connectedHostsList) > 220:
|
while len(shared.connectedHostsList) > 220:
|
||||||
with shared.printLock:
|
with shared.printLock:
|
||||||
|
|
|
@ -414,10 +414,10 @@ class singleWorker(threading.Thread):
|
||||||
# Update the status of the message in the 'sent' table to have
|
# Update the status of the message in the 'sent' table to have
|
||||||
# a 'broadcastsent' status
|
# a 'broadcastsent' status
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = ('broadcastsent', int(
|
t = (inventoryHash,'broadcastsent', int(
|
||||||
time.time()), fromaddress, subject, body, 'broadcastqueued')
|
time.time()), fromaddress, subject, body, 'broadcastqueued')
|
||||||
shared.sqlSubmitQueue.put(
|
shared.sqlSubmitQueue.put(
|
||||||
'UPDATE sent SET status=?, lastactiontime=? WHERE fromaddress=? AND subject=? AND message=? AND status=?')
|
'UPDATE sent SET msgid=?, status=?, lastactiontime=? WHERE fromaddress=? AND subject=? AND message=? AND status=?')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
@ -774,8 +774,8 @@ class singleWorker(threading.Thread):
|
||||||
# Update the status of the message in the 'sent' table to have a
|
# Update the status of the message in the 'sent' table to have a
|
||||||
# 'msgsent' status
|
# 'msgsent' status
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = (ackdata,)
|
t = (inventoryHash,ackdata,)
|
||||||
shared.sqlSubmitQueue.put('''UPDATE sent SET status='msgsent' WHERE ackdata=?''')
|
shared.sqlSubmitQueue.put('''UPDATE sent SET msgid=?, status='msgsent' WHERE ackdata=?''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
|
|
@ -5,6 +5,7 @@ import time
|
||||||
import shutil # used for moving the messages.dat file
|
import shutil # used for moving the messages.dat file
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
from debug import logger
|
||||||
|
|
||||||
# This thread exists because SQLITE3 is so un-threadsafe that we must
|
# 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
|
# submit queries to it and it puts results back in a different queue. They
|
||||||
|
@ -80,6 +81,7 @@ class sqlThread(threading.Thread):
|
||||||
shared.config.set('bitmessagesettings', 'socksauthentication', 'false')
|
shared.config.set('bitmessagesettings', 'socksauthentication', 'false')
|
||||||
shared.config.set('bitmessagesettings', 'socksusername', '')
|
shared.config.set('bitmessagesettings', 'socksusername', '')
|
||||||
shared.config.set('bitmessagesettings', 'sockspassword', '')
|
shared.config.set('bitmessagesettings', 'sockspassword', '')
|
||||||
|
shared.config.set('bitmessagesettings', 'sockslisten', 'false')
|
||||||
shared.config.set('bitmessagesettings', 'keysencrypted', 'false')
|
shared.config.set('bitmessagesettings', 'keysencrypted', 'false')
|
||||||
shared.config.set('bitmessagesettings', 'messagesencrypted', 'false')
|
shared.config.set('bitmessagesettings', 'messagesencrypted', 'false')
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
|
86
src/debug.py
86
src/debug.py
|
@ -18,48 +18,64 @@ Use: `from debug import logger` to import this facility into whatever module you
|
||||||
'''
|
'''
|
||||||
import logging
|
import logging
|
||||||
import logging.config
|
import logging.config
|
||||||
|
import shared
|
||||||
|
|
||||||
# TODO(xj9): Get from a config file.
|
# TODO(xj9): Get from a config file.
|
||||||
log_level = 'DEBUG'
|
log_level = 'DEBUG'
|
||||||
|
|
||||||
logging.config.dictConfig({
|
def configureLogging():
|
||||||
'version': 1,
|
logging.config.dictConfig({
|
||||||
'formatters': {
|
'version': 1,
|
||||||
'default': {
|
'formatters': {
|
||||||
'format': '%(asctime)s - %(levelname)s - %(message)s',
|
'default': {
|
||||||
|
'format': '%(asctime)s - %(levelname)s - %(message)s',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
'handlers': {
|
||||||
'handlers': {
|
'console': {
|
||||||
'console': {
|
'class': 'logging.StreamHandler',
|
||||||
'class': 'logging.StreamHandler',
|
'formatter': 'default',
|
||||||
'formatter': 'default',
|
'level': log_level,
|
||||||
'level': log_level,
|
'stream': 'ext://sys.stdout'
|
||||||
'stream': 'ext://sys.stdout'
|
},
|
||||||
|
'file': {
|
||||||
|
'class': 'logging.handlers.RotatingFileHandler',
|
||||||
|
'formatter': 'default',
|
||||||
|
'level': log_level,
|
||||||
|
'filename': shared.appdata + 'debug.log',
|
||||||
|
'maxBytes': 2097152, # 2 MiB
|
||||||
|
'backupCount': 1,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
'file': {
|
'loggers': {
|
||||||
'class': 'logging.handlers.RotatingFileHandler',
|
'console_only': {
|
||||||
'formatter': 'default',
|
'handlers': ['console'],
|
||||||
|
'propagate' : 0
|
||||||
|
},
|
||||||
|
'file_only': {
|
||||||
|
'handlers': ['file'],
|
||||||
|
'propagate' : 0
|
||||||
|
},
|
||||||
|
'both': {
|
||||||
|
'handlers': ['console', 'file'],
|
||||||
|
'propagate' : 0
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'root': {
|
||||||
'level': log_level,
|
'level': log_level,
|
||||||
'filename': 'bm.log',
|
|
||||||
'maxBytes': 1024,
|
|
||||||
'backupCount': 0,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'loggers': {
|
|
||||||
'console_only': {
|
|
||||||
'handlers': ['console'],
|
'handlers': ['console'],
|
||||||
},
|
},
|
||||||
'file_only': {
|
})
|
||||||
'handlers': ['file'],
|
|
||||||
},
|
|
||||||
'both': {
|
|
||||||
'handlers': ['console', 'file'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'root': {
|
|
||||||
'level': log_level,
|
|
||||||
'handlers': ['console'],
|
|
||||||
},
|
|
||||||
})
|
|
||||||
# TODO (xj9): Get from a config file.
|
# TODO (xj9): Get from a config file.
|
||||||
logger = logging.getLogger('console_only')
|
#logger = logging.getLogger('console_only')
|
||||||
|
configureLogging()
|
||||||
|
logger = logging.getLogger('both')
|
||||||
|
|
||||||
|
def restartLoggingInUpdatedAppdataLocation():
|
||||||
|
global logger
|
||||||
|
for i in list(logger.handlers):
|
||||||
|
logger.removeHandler(i)
|
||||||
|
i.flush()
|
||||||
|
i.close()
|
||||||
|
configureLogging()
|
||||||
|
logger = logging.getLogger('both')
|
|
@ -33,7 +33,7 @@ def dns():
|
||||||
print 'Adding', item[4][0], 'to knownNodes based on DNS boostrap method'
|
print 'Adding', item[4][0], 'to knownNodes based on DNS boostrap method'
|
||||||
shared.knownNodes[1][item[4][0]] = (8080, int(time.time()))
|
shared.knownNodes[1][item[4][0]] = (8080, int(time.time()))
|
||||||
except:
|
except:
|
||||||
print 'bootstrap8080.bitmessage.org DNS bootstraping failed.'
|
print 'bootstrap8080.bitmessage.org DNS bootstrapping failed.'
|
||||||
try:
|
try:
|
||||||
for item in socket.getaddrinfo('bootstrap8444.bitmessage.org', 80):
|
for item in socket.getaddrinfo('bootstrap8444.bitmessage.org', 80):
|
||||||
print 'Adding', item[4][0], 'to knownNodes based on DNS boostrap method'
|
print 'Adding', item[4][0], 'to knownNodes based on DNS boostrap method'
|
||||||
|
|
|
@ -52,6 +52,8 @@ def loadConfig():
|
||||||
shared.config.set('bitmessagesettings', 'socksport', '9050')
|
shared.config.set('bitmessagesettings', 'socksport', '9050')
|
||||||
shared.config.set(
|
shared.config.set(
|
||||||
'bitmessagesettings', 'socksauthentication', 'false')
|
'bitmessagesettings', 'socksauthentication', 'false')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'sockslisten', 'false')
|
||||||
shared.config.set('bitmessagesettings', 'socksusername', '')
|
shared.config.set('bitmessagesettings', 'socksusername', '')
|
||||||
shared.config.set('bitmessagesettings', 'sockspassword', '')
|
shared.config.set('bitmessagesettings', 'sockspassword', '')
|
||||||
shared.config.set('bitmessagesettings', 'keysencrypted', 'false')
|
shared.config.set('bitmessagesettings', 'keysencrypted', 'false')
|
||||||
|
@ -77,5 +79,13 @@ def loadConfig():
|
||||||
print 'Creating new config files in', shared.appdata
|
print 'Creating new config files in', shared.appdata
|
||||||
if not os.path.exists(shared.appdata):
|
if not os.path.exists(shared.appdata):
|
||||||
os.makedirs(shared.appdata)
|
os.makedirs(shared.appdata)
|
||||||
|
if not sys.platform.startswith('win'):
|
||||||
|
os.umask(0o077)
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
shared.config.write(configfile)
|
shared.config.write(configfile)
|
||||||
|
|
||||||
|
# Initialize settings that may be missing due to upgrades and could
|
||||||
|
# cause errors if missing.
|
||||||
|
if not shared.config.has_option('bitmessagesettings', 'sockslisten'):
|
||||||
|
shared.config.set('bitmessagesettings', 'sockslisten', 'false')
|
||||||
|
|
||||||
|
|
159
src/shared.py
159
src/shared.py
|
@ -8,19 +8,25 @@ maximumAgeOfNodesThatIAdvertiseToOthers = 10800 # Equals three hours
|
||||||
useVeryEasyProofOfWorkForTesting = False # If you set this to True while on the normal network, you won't be able to send or sometimes receive messages.
|
useVeryEasyProofOfWorkForTesting = False # If you set this to True while on the normal network, you won't be able to send or sometimes receive messages.
|
||||||
|
|
||||||
|
|
||||||
import threading
|
# Libraries.
|
||||||
|
import ConfigParser
|
||||||
|
import os
|
||||||
|
import pickle
|
||||||
|
import Queue
|
||||||
|
import random
|
||||||
|
import socket
|
||||||
import sys
|
import sys
|
||||||
|
import stat
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
# Project imports.
|
||||||
from addresses import *
|
from addresses import *
|
||||||
import highlevelcrypto
|
import highlevelcrypto
|
||||||
import Queue
|
|
||||||
import pickle
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
import ConfigParser
|
|
||||||
import socket
|
|
||||||
import random
|
|
||||||
import highlevelcrypto
|
|
||||||
import shared
|
import shared
|
||||||
|
import helper_startup
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
config = ConfigParser.SafeConfigParser()
|
config = ConfigParser.SafeConfigParser()
|
||||||
myECCryptorObjects = {}
|
myECCryptorObjects = {}
|
||||||
|
@ -62,8 +68,6 @@ ackdataForWhichImWatching = {}
|
||||||
networkDefaultProofOfWorkNonceTrialsPerByte = 320 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work.
|
networkDefaultProofOfWorkNonceTrialsPerByte = 320 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work.
|
||||||
networkDefaultPayloadLengthExtraBytes = 14000 #To make sending short messages a little more difficult, this value is added to the payload length for use in calculating the proof of work target.
|
networkDefaultPayloadLengthExtraBytes = 14000 #To make sending short messages a little more difficult, this value is added to the payload length for use in calculating the proof of work target.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def isInSqlInventory(hash):
|
def isInSqlInventory(hash):
|
||||||
t = (hash,)
|
t = (hash,)
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
|
@ -118,7 +122,11 @@ def lookupAppdataFolder():
|
||||||
if "HOME" in environ:
|
if "HOME" in environ:
|
||||||
dataFolder = path.join(os.environ["HOME"], "Library/Application Support/", APPNAME) + '/'
|
dataFolder = path.join(os.environ["HOME"], "Library/Application Support/", APPNAME) + '/'
|
||||||
else:
|
else:
|
||||||
print 'Could not find home folder, please report this message and your OS X version to the BitMessage Github.'
|
stringToLog = 'Could not find home folder, please report this message and your OS X version to the BitMessage Github.'
|
||||||
|
if 'logger' in globals():
|
||||||
|
logger.critical(stringToLog)
|
||||||
|
else:
|
||||||
|
print stringToLog
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
elif 'win32' in sys.platform or 'win64' in sys.platform:
|
elif 'win32' in sys.platform or 'win64' in sys.platform:
|
||||||
|
@ -129,13 +137,19 @@ def lookupAppdataFolder():
|
||||||
dataFolder = path.join(environ["XDG_CONFIG_HOME"], APPNAME)
|
dataFolder = path.join(environ["XDG_CONFIG_HOME"], APPNAME)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
dataFolder = path.join(environ["HOME"], ".config", APPNAME)
|
dataFolder = path.join(environ["HOME"], ".config", APPNAME)
|
||||||
|
|
||||||
# Migrate existing data to the proper location if this is an existing install
|
# Migrate existing data to the proper location if this is an existing install
|
||||||
try:
|
try:
|
||||||
print "Moving data folder to ~/.config/%s" % APPNAME
|
|
||||||
move(path.join(environ["HOME"], ".%s" % APPNAME), dataFolder)
|
move(path.join(environ["HOME"], ".%s" % APPNAME), dataFolder)
|
||||||
dataFolder = dataFolder + '/'
|
stringToLog = "Moving data folder to %s" % (dataFolder)
|
||||||
|
if 'logger' in globals():
|
||||||
|
logger.info(stringToLog)
|
||||||
|
else:
|
||||||
|
print stringToLog
|
||||||
except IOError:
|
except IOError:
|
||||||
dataFolder = dataFolder + '/'
|
# Old directory may not exist.
|
||||||
|
pass
|
||||||
|
dataFolder = dataFolder + '/'
|
||||||
return dataFolder
|
return dataFolder
|
||||||
|
|
||||||
def isAddressInMyAddressBook(address):
|
def isAddressInMyAddressBook(address):
|
||||||
|
@ -179,51 +193,63 @@ def isAddressInMyAddressBookSubscriptionsListOrWhitelist(address):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def safeConfigGetBoolean(section,field):
|
def safeConfigGetBoolean(section,field):
|
||||||
try:
|
try:
|
||||||
return config.getboolean(section,field)
|
return config.getboolean(section,field)
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def decodeWalletImportFormat(WIFstring):
|
def decodeWalletImportFormat(WIFstring):
|
||||||
fullString = arithmetic.changebase(WIFstring,58,256)
|
fullString = arithmetic.changebase(WIFstring,58,256)
|
||||||
privkey = fullString[:-4]
|
privkey = fullString[:-4]
|
||||||
if fullString[-4:] != hashlib.sha256(hashlib.sha256(privkey).digest()).digest()[:4]:
|
if fullString[-4:] != hashlib.sha256(hashlib.sha256(privkey).digest()).digest()[:4]:
|
||||||
sys.stderr.write('Major problem! When trying to decode one of your private keys, the checksum failed. Here is the PRIVATE key: %s\n' % str(WIFstring))
|
logger.error('Major problem! When trying to decode one of your private keys, the checksum '
|
||||||
|
'failed. Here is the PRIVATE key: %s\n' % str(WIFstring))
|
||||||
return ""
|
return ""
|
||||||
else:
|
else:
|
||||||
#checksum passed
|
#checksum passed
|
||||||
if privkey[0] == '\x80':
|
if privkey[0] == '\x80':
|
||||||
return privkey[1:]
|
return privkey[1:]
|
||||||
else:
|
else:
|
||||||
sys.stderr.write('Major problem! When trying to decode one of your private keys, the checksum passed but the key doesn\'t begin with hex 80. Here is the PRIVATE key: %s\n' % str(WIFstring))
|
logger.error('Major problem! When trying to decode one of your private keys, the '
|
||||||
|
'checksum passed but the key doesn\'t begin with hex 80. Here is the '
|
||||||
|
'PRIVATE key: %s\n' % str(WIFstring))
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
def reloadMyAddressHashes():
|
def reloadMyAddressHashes():
|
||||||
printLock.acquire()
|
logger.debug('reloading keys from keys.dat file')
|
||||||
print 'reloading keys from keys.dat file'
|
|
||||||
printLock.release()
|
|
||||||
myECCryptorObjects.clear()
|
myECCryptorObjects.clear()
|
||||||
myAddressesByHash.clear()
|
myAddressesByHash.clear()
|
||||||
#myPrivateKeys.clear()
|
#myPrivateKeys.clear()
|
||||||
|
|
||||||
|
keyfileSecure = checkSensitiveFilePermissions(appdata + 'keys.dat')
|
||||||
configSections = config.sections()
|
configSections = config.sections()
|
||||||
|
hasEnabledKeys = False
|
||||||
for addressInKeysFile in configSections:
|
for addressInKeysFile in configSections:
|
||||||
if addressInKeysFile <> 'bitmessagesettings':
|
if addressInKeysFile <> 'bitmessagesettings':
|
||||||
isEnabled = config.getboolean(addressInKeysFile, 'enabled')
|
isEnabled = config.getboolean(addressInKeysFile, 'enabled')
|
||||||
if isEnabled:
|
if isEnabled:
|
||||||
|
hasEnabledKeys = True
|
||||||
status,addressVersionNumber,streamNumber,hash = decodeAddress(addressInKeysFile)
|
status,addressVersionNumber,streamNumber,hash = decodeAddress(addressInKeysFile)
|
||||||
if addressVersionNumber == 2 or addressVersionNumber == 3:
|
if addressVersionNumber == 2 or addressVersionNumber == 3:
|
||||||
privEncryptionKey = decodeWalletImportFormat(config.get(addressInKeysFile, 'privencryptionkey')).encode('hex') #returns a simple 32 bytes of information encoded in 64 Hex characters, or null if there was an error
|
# Returns a simple 32 bytes of information encoded in 64 Hex characters,
|
||||||
|
# or null if there was an error.
|
||||||
|
privEncryptionKey = decodeWalletImportFormat(
|
||||||
|
config.get(addressInKeysFile, 'privencryptionkey')).encode('hex')
|
||||||
|
|
||||||
if len(privEncryptionKey) == 64:#It is 32 bytes encoded as 64 hex characters
|
if len(privEncryptionKey) == 64:#It is 32 bytes encoded as 64 hex characters
|
||||||
myECCryptorObjects[hash] = highlevelcrypto.makeCryptor(privEncryptionKey)
|
myECCryptorObjects[hash] = highlevelcrypto.makeCryptor(privEncryptionKey)
|
||||||
myAddressesByHash[hash] = addressInKeysFile
|
myAddressesByHash[hash] = addressInKeysFile
|
||||||
|
|
||||||
else:
|
else:
|
||||||
sys.stderr.write('Error in reloadMyAddressHashes: Can\'t handle address versions other than 2 or 3.\n')
|
logger.error('Error in reloadMyAddressHashes: Can\'t handle address '
|
||||||
|
'versions other than 2 or 3.\n')
|
||||||
|
|
||||||
|
if not keyfileSecure:
|
||||||
|
fixSensitiveFilePermissions(appdata + 'keys.dat', hasEnabledKeys)
|
||||||
|
|
||||||
def reloadBroadcastSendersForWhichImWatching():
|
def reloadBroadcastSendersForWhichImWatching():
|
||||||
printLock.acquire()
|
logger.debug('reloading subscriptions...')
|
||||||
print 'reloading subscriptions...'
|
|
||||||
printLock.release()
|
|
||||||
broadcastSendersForWhichImWatching.clear()
|
broadcastSendersForWhichImWatching.clear()
|
||||||
MyECSubscriptionCryptorObjects.clear()
|
MyECSubscriptionCryptorObjects.clear()
|
||||||
sqlLock.acquire()
|
sqlLock.acquire()
|
||||||
|
@ -246,46 +272,45 @@ def doCleanShutdown():
|
||||||
knownNodesLock.acquire()
|
knownNodesLock.acquire()
|
||||||
UISignalQueue.put(('updateStatusBar','Saving the knownNodes list of peers to disk...'))
|
UISignalQueue.put(('updateStatusBar','Saving the knownNodes list of peers to disk...'))
|
||||||
output = open(appdata + 'knownnodes.dat', 'wb')
|
output = open(appdata + 'knownnodes.dat', 'wb')
|
||||||
print 'finished opening knownnodes.dat. Now pickle.dump'
|
logger.info('finished opening knownnodes.dat. Now pickle.dump')
|
||||||
pickle.dump(knownNodes, output)
|
pickle.dump(knownNodes, output)
|
||||||
print 'Completed pickle.dump. Closing output...'
|
logger.info('Completed pickle.dump. Closing output...')
|
||||||
output.close()
|
output.close()
|
||||||
knownNodesLock.release()
|
knownNodesLock.release()
|
||||||
printLock.acquire()
|
logger.info('Finished closing knownnodes.dat output file.')
|
||||||
print 'Finished closing knownnodes.dat output file.'
|
|
||||||
printLock.release()
|
|
||||||
UISignalQueue.put(('updateStatusBar','Done saving the knownNodes list of peers to disk.'))
|
UISignalQueue.put(('updateStatusBar','Done saving the knownNodes list of peers to disk.'))
|
||||||
|
|
||||||
broadcastToSendDataQueues((0, 'shutdown', 'all'))
|
broadcastToSendDataQueues((0, 'shutdown', 'all'))
|
||||||
|
|
||||||
printLock.acquire()
|
logger.info('Flushing inventory in memory out to disk...')
|
||||||
print 'Flushing inventory in memory out to disk...'
|
UISignalQueue.put((
|
||||||
printLock.release()
|
'updateStatusBar',
|
||||||
UISignalQueue.put(('updateStatusBar','Flushing inventory in memory out to disk. This should normally only take a second...'))
|
'Flushing inventory in memory out to disk. This should normally only take a second...'))
|
||||||
flushInventory()
|
flushInventory()
|
||||||
|
|
||||||
#This one last useless query will guarantee that the previous flush committed before we close the program.
|
# This one last useless query will guarantee that the previous flush committed before we close
|
||||||
|
# the program.
|
||||||
sqlLock.acquire()
|
sqlLock.acquire()
|
||||||
sqlSubmitQueue.put('SELECT address FROM subscriptions')
|
sqlSubmitQueue.put('SELECT address FROM subscriptions')
|
||||||
sqlSubmitQueue.put('')
|
sqlSubmitQueue.put('')
|
||||||
sqlReturnQueue.get()
|
sqlReturnQueue.get()
|
||||||
sqlSubmitQueue.put('exit')
|
sqlSubmitQueue.put('exit')
|
||||||
sqlLock.release()
|
sqlLock.release()
|
||||||
printLock.acquire()
|
logger.info('Finished flushing inventory.')
|
||||||
print 'Finished flushing inventory.'
|
|
||||||
printLock.release()
|
|
||||||
|
|
||||||
time.sleep(.25) #Wait long enough to guarantee that any running proof of work worker threads will check the shutdown variable and exit. If the main thread closes before they do then they won't stop.
|
# Wait long enough to guarantee that any running proof of work worker threads will check the
|
||||||
|
# shutdown variable and exit. If the main thread closes before they do then they won't stop.
|
||||||
|
time.sleep(.25)
|
||||||
|
|
||||||
if safeConfigGetBoolean('bitmessagesettings','daemon'):
|
if safeConfigGetBoolean('bitmessagesettings','daemon'):
|
||||||
printLock.acquire()
|
logger.info('Clean shutdown complete.')
|
||||||
print 'Done.'
|
|
||||||
printLock.release()
|
|
||||||
os._exit(0)
|
os._exit(0)
|
||||||
|
|
||||||
#When you want to command a sendDataThread to do something, like shutdown or send some data, this function puts your data into the queues for each of the sendDataThreads. The sendDataThreads are responsible for putting their queue into (and out of) the sendDataQueues list.
|
# When you want to command a sendDataThread to do something, like shutdown or send some data, this
|
||||||
|
# function puts your data into the queues for each of the sendDataThreads. The sendDataThreads are
|
||||||
|
# responsible for putting their queue into (and out of) the sendDataQueues list.
|
||||||
def broadcastToSendDataQueues(data):
|
def broadcastToSendDataQueues(data):
|
||||||
#print 'running broadcastToSendDataQueues'
|
# logger.debug('running broadcastToSendDataQueues')
|
||||||
for q in sendDataQueues:
|
for q in sendDataQueues:
|
||||||
q.put((data))
|
q.put((data))
|
||||||
|
|
||||||
|
@ -309,3 +334,41 @@ def fixPotentiallyInvalidUTF8Data(text):
|
||||||
except:
|
except:
|
||||||
output = 'Part of the message is corrupt. The message cannot be displayed the normal way.\n\n' + repr(text)
|
output = 'Part of the message is corrupt. The message cannot be displayed the normal way.\n\n' + repr(text)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
# Checks sensitive file permissions for inappropriate umask during keys.dat creation.
|
||||||
|
# (Or unwise subsequent chmod.)
|
||||||
|
#
|
||||||
|
# Returns true iff file appears to have appropriate permissions.
|
||||||
|
def checkSensitiveFilePermissions(filename):
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
# TODO: This might deserve extra checks by someone familiar with
|
||||||
|
# Windows systems.
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
present_permissions = os.stat(filename)[0]
|
||||||
|
disallowed_permissions = stat.S_IRWXG | stat.S_IRWXO
|
||||||
|
return present_permissions & disallowed_permissions == 0
|
||||||
|
|
||||||
|
# Fixes permissions on a sensitive file.
|
||||||
|
def fixSensitiveFilePermissions(filename, hasEnabledKeys):
|
||||||
|
if hasEnabledKeys:
|
||||||
|
logger.warning('Keyfile had insecure permissions, and there were enabled keys. '
|
||||||
|
'The truly paranoid should stop using them immediately.')
|
||||||
|
else:
|
||||||
|
logger.warning('Keyfile had insecure permissions, but there were no enabled keys.')
|
||||||
|
try:
|
||||||
|
present_permissions = os.stat(filename)[0]
|
||||||
|
disallowed_permissions = stat.S_IRWXG | stat.S_IRWXO
|
||||||
|
allowed_permissions = ((1<<32)-1) ^ disallowed_permissions
|
||||||
|
new_permissions = (
|
||||||
|
allowed_permissions & present_permissions)
|
||||||
|
os.chmod(filename, new_permissions)
|
||||||
|
|
||||||
|
logger.info('Keyfile permissions automatically fixed.')
|
||||||
|
|
||||||
|
except Exception, e:
|
||||||
|
logger.exception('Keyfile permissions could not be fixed.')
|
||||||
|
raise
|
||||||
|
|
||||||
|
helper_startup.loadConfig()
|
||||||
|
from debug import logger
|
30
src/translations/bitmessage_ru_RU.pro
Normal file
30
src/translations/bitmessage_ru_RU.pro
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
SOURCES += ../addresses.py
|
||||||
|
SOURCES += ../bitmessagemain.py
|
||||||
|
SOURCES += ../class_addressGenerator.py
|
||||||
|
SOURCES += ../class_outgoingSynSender.py
|
||||||
|
SOURCES += ../class_receiveDataThread.py
|
||||||
|
SOURCES += ../class_sendDataThread.py
|
||||||
|
SOURCES += ../class_singleCleaner.py
|
||||||
|
SOURCES += ../class_singleListener.py
|
||||||
|
SOURCES += ../class_singleWorker.py
|
||||||
|
SOURCES += ../class_sqlThread.py
|
||||||
|
SOURCES += ../helper_bitcoin.py
|
||||||
|
SOURCES += ../helper_bootstrap.py
|
||||||
|
SOURCES += ../helper_generic.py
|
||||||
|
SOURCES += ../helper_inbox.py
|
||||||
|
SOURCES += ../helper_sent.py
|
||||||
|
SOURCES += ../helper_startup.py
|
||||||
|
SOURCES += ../shared.py
|
||||||
|
SOURCES += ../bitmessageqt/__init__.py
|
||||||
|
SOURCES += ../bitmessageqt/about.py
|
||||||
|
SOURCES += ../bitmessageqt/bitmessageui.py
|
||||||
|
SOURCES += ../bitmessageqt/help.py
|
||||||
|
SOURCES += ../bitmessageqt/iconglossary.py
|
||||||
|
SOURCES += ../bitmessageqt/newaddressdialog.py
|
||||||
|
SOURCES += ../bitmessageqt/newchandialog.py
|
||||||
|
SOURCES += ../bitmessageqt/newsubscriptiondialog.py
|
||||||
|
SOURCES += ../bitmessageqt/regenerateaddresses.py
|
||||||
|
SOURCES += ../bitmessageqt/settings.py
|
||||||
|
SOURCES += ../bitmessageqt/specialaddressbehavior.py
|
||||||
|
|
||||||
|
TRANSLATIONS = bitmessage_ru_RU.ts
|
BIN
src/translations/bitmessage_ru_RU.qm
Normal file
BIN
src/translations/bitmessage_ru_RU.qm
Normal file
Binary file not shown.
1260
src/translations/bitmessage_ru_RU.ts
Normal file
1260
src/translations/bitmessage_ru_RU.ts
Normal file
|
@ -0,0 +1,1260 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.0" language="ru_RU">
|
||||||
|
<context>
|
||||||
|
<name>MainWindow</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="68"/>
|
||||||
|
<source>One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now?</source>
|
||||||
|
<translation>Один из Ваших адресов, %1, является устаревшим адресом версии 1. Адреса версии 1 больше не поддерживаются. Хотите ли Вы удалить его сейчас?</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="136"/>
|
||||||
|
<source>Reply</source>
|
||||||
|
<translation>Ответить</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="138"/>
|
||||||
|
<source>Add sender to your Address Book</source>
|
||||||
|
<translation>Добавить отправителя в адресную книгу</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="239"/>
|
||||||
|
<source>Move to Trash</source>
|
||||||
|
<translation>Поместить в корзину</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="142"/>
|
||||||
|
<source>View HTML code as formatted text</source>
|
||||||
|
<translation>Просмотреть HTML код как отформатированный текст</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="144"/>
|
||||||
|
<source>Save message as...</source>
|
||||||
|
<translation>Сохранить сообщение как ...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="505"/>
|
||||||
|
<source>New</source>
|
||||||
|
<translation>Новый адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="262"/>
|
||||||
|
<source>Enable</source>
|
||||||
|
<translation>Включить</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="264"/>
|
||||||
|
<source>Disable</source>
|
||||||
|
<translation>Выключить</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="260"/>
|
||||||
|
<source>Copy address to clipboard</source>
|
||||||
|
<translation>Скопировать адрес в буфер обмена</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="170"/>
|
||||||
|
<source>Special address behavior...</source>
|
||||||
|
<translation>Особое поведение адресов...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="188"/>
|
||||||
|
<source>Send message to this address</source>
|
||||||
|
<translation>Отправить сообщение на этот адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="192"/>
|
||||||
|
<source>Subscribe to this address</source>
|
||||||
|
<translation>Подписаться на рассылку с этого адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="194"/>
|
||||||
|
<source>Add New Address</source>
|
||||||
|
<translation>Добавить новый адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="258"/>
|
||||||
|
<source>Delete</source>
|
||||||
|
<translation>Удалить</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="241"/>
|
||||||
|
<source>Copy destination address to clipboard</source>
|
||||||
|
<translation>Скопировать адрес отправки в буфер обмена</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="243"/>
|
||||||
|
<source>Force send</source>
|
||||||
|
<translation>Форсировать отправку</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="532"/>
|
||||||
|
<source>Add new entry</source>
|
||||||
|
<translation>Добавить новую запись</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="466"/>
|
||||||
|
<source>Waiting on their encryption key. Will request it again soon.</source>
|
||||||
|
<translation>Ожидаем ключ шифрования от Вашего собеседника. Запрос будет повторен через некоторое время.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="469"/>
|
||||||
|
<source>Encryption key request queued.</source>
|
||||||
|
<translation>Запрос ключа шифрования поставлен в очередь.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="472"/>
|
||||||
|
<source>Queued.</source>
|
||||||
|
<translation>В очереди.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="475"/>
|
||||||
|
<source>Message sent. Waiting on acknowledgement. Sent at %1</source>
|
||||||
|
<translation>Сообщение отправлено. Ожидаем подтверждения. Отправлено в %1 </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="478"/>
|
||||||
|
<source>Need to do work to send message. Work is queued.</source>
|
||||||
|
<translation>Нужно провести требуемые вычисления, чтобы отправить сообщение. Вычисления ожидают очереди.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="481"/>
|
||||||
|
<source>Acknowledgement of the message received %1</source>
|
||||||
|
<translation>Сообщение получено %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="484"/>
|
||||||
|
<source>Broadcast queued.</source>
|
||||||
|
<translation>Рассылка ожидает очереди.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="487"/>
|
||||||
|
<source>Broadcast on %1</source>
|
||||||
|
<translation>Рассылка на %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="490"/>
|
||||||
|
<source>Problem: The work demanded by the recipient is more difficult than you are willing to do. %1</source>
|
||||||
|
<translation>Проблема: Ваш получатель требует более сложных вычислений, чем максимум, указанный в Ваших настройках. %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="493"/>
|
||||||
|
<source>Problem: The recipient's encryption key is no good. Could not encrypt message. %1</source>
|
||||||
|
<translation>Проблема: ключ получателя неправильный. Невозможно зашифровать сообщение. %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="496"/>
|
||||||
|
<source>Forced difficulty override. Send should start soon.</source>
|
||||||
|
<translation>Форсирована смена сложности. Отправляем через некоторое время.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="499"/>
|
||||||
|
<source>Unknown status: %1 %2</source>
|
||||||
|
<translation>Неизвестный статус: %1 %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="553"/>
|
||||||
|
<source>Since startup on %1</source>
|
||||||
|
<translation>С начала работы %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1082"/>
|
||||||
|
<source>Not Connected</source>
|
||||||
|
<translation>Не соединено</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="710"/>
|
||||||
|
<source>Show Bitmessage</source>
|
||||||
|
<translation>Показать Bitmessage</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="494"/>
|
||||||
|
<source>Send</source>
|
||||||
|
<translation>Отправка</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="725"/>
|
||||||
|
<source>Subscribe</source>
|
||||||
|
<translation>Подписки</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="529"/>
|
||||||
|
<source>Address Book</source>
|
||||||
|
<translation>Адресная книга</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="554"/>
|
||||||
|
<source>Quit</source>
|
||||||
|
<translation>Выйти</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="931"/>
|
||||||
|
<source>You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file.</source>
|
||||||
|
<translation>Вы можете управлять Вашими ключами, отредактировав файл keys.dat, находящийся в той же папке, что и эта программа.
|
||||||
|
Создайте резервную копию этого файла перед тем как будете его редактировать.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="935"/>
|
||||||
|
<source>You may manage your keys by editing the keys.dat file stored in
|
||||||
|
%1
|
||||||
|
It is important that you back up this file.</source>
|
||||||
|
<translation>Вы можете управлять Вашими ключами, отредактировав файл keys.dat, находящийся в
|
||||||
|
%1
|
||||||
|
Создайте резервную копию этого файла перед тем как будете его редактировать.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="942"/>
|
||||||
|
<source>Open keys.dat?</source>
|
||||||
|
<translation>Открыть файл keys.dat?</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="939"/>
|
||||||
|
<source>You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.)</source>
|
||||||
|
<translation>Вы можете управлять Вашими ключами, отредактировав файл keys.dat, находящийся в той же папке, что и эта программа.
|
||||||
|
Создайте резервную копию этого файла перед тем как будете его редактировать. Хотели бы Вы открыть этот файл сейчас?
|
||||||
|
(пожалуйста, закройте Bitmessage до того как Вы внесете в этот файл какие-либо изменения.)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="942"/>
|
||||||
|
<source>You may manage your keys by editing the keys.dat file stored in
|
||||||
|
%1
|
||||||
|
It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.)</source>
|
||||||
|
<translation>Вы можете управлять Вашими ключами, отредактировав файл keys.dat, находящийся в
|
||||||
|
%1
|
||||||
|
Создайте резервную копию этого файла перед тем как будете его редактировать. Хотели бы Вы открыть этот файл сейчас?
|
||||||
|
(пожалуйста, закройте Bitmessage до того как Вы внесете в этот файл какие-либо изменения.)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="948"/>
|
||||||
|
<source>Delete trash?</source>
|
||||||
|
<translation>Очистить корзину?</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="948"/>
|
||||||
|
<source>Are you sure you want to delete all trashed messages?</source>
|
||||||
|
<translation>Вы уверены, что хотите очистить корзину?</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="959"/>
|
||||||
|
<source>bad passphrase</source>
|
||||||
|
<translation>Неподходящая секретная фраза</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="959"/>
|
||||||
|
<source>You must type your passphrase. If you don't have one then this is not the form for you.</source>
|
||||||
|
<translation>Вы должны ввести секретную фразу. Если Вы не хотите это делать, то Вы выбрали неправильную опцию.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1004"/>
|
||||||
|
<source>Processed %1 person-to-person messages.</source>
|
||||||
|
<translation>Обработано %1 сообщений.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1009"/>
|
||||||
|
<source>Processed %1 broadcast messages.</source>
|
||||||
|
<translation>Обработано %1 рассылок.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1014"/>
|
||||||
|
<source>Processed %1 public keys.</source>
|
||||||
|
<translation>Обработано %1 открытых ключей.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1058"/>
|
||||||
|
<source>Total Connections: %1</source>
|
||||||
|
<translation>Всего соединений: %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1077"/>
|
||||||
|
<source>Connection lost</source>
|
||||||
|
<translation>Соединение потеряно</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1115"/>
|
||||||
|
<source>Connected</source>
|
||||||
|
<translation>Соединено</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1161"/>
|
||||||
|
<source>Message trashed</source>
|
||||||
|
<translation>Сообщение удалено</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1295"/>
|
||||||
|
<source>Error: Bitmessage addresses start with BM- Please check %1</source>
|
||||||
|
<translation>Ошибка: Bitmessage адреса начинаются с BM- Пожалуйста, проверьте %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1298"/>
|
||||||
|
<source>Error: The address %1 is not typed or copied correctly. Please check it.</source>
|
||||||
|
<translation>Ошибка: адрес %1 внесен или скопирован неправильно. Пожалуйста, перепроверьте.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1301"/>
|
||||||
|
<source>Error: The address %1 contains invalid characters. Please check it.</source>
|
||||||
|
<translation>Ошибка: адрес %1 содержит запрещенные символы. Пожалуйста, перепроверьте.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1304"/>
|
||||||
|
<source>Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever.</source>
|
||||||
|
<translation>Ошибка: версия адреса в %1 слишком новая. Либо Вам нужно обновить Bitmessage, либо Ваш собеседник дал неправильный адрес.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1307"/>
|
||||||
|
<source>Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance.</source>
|
||||||
|
<translation>Ошибка: некоторые данные, закодированные в адресе %1, слишком короткие. Возможно, что-то не так с программой Вашего собеседника.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1310"/>
|
||||||
|
<source>Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance.</source>
|
||||||
|
<translation>Ошибка: некоторые данные, закодированные в адресе %1, слишком длинные. Возможно, что-то не так с программой Вашего собеседника.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1313"/>
|
||||||
|
<source>Error: Something is wrong with the address %1.</source>
|
||||||
|
<translation>Ошибка: что-то не так с адресом %1.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1381"/>
|
||||||
|
<source>Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab.</source>
|
||||||
|
<translation>Вы должны указать адрес в поле "От кого". Вы можете найти Ваш адрес во вкладе "Ваши Адреса".</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1325"/>
|
||||||
|
<source>Sending to your address</source>
|
||||||
|
<translation>Отправка на Ваш собственный адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1325"/>
|
||||||
|
<source>Error: One of the addresses to which you are sending a message, %1, is yours. Unfortunately the Bitmessage client cannot process its own messages. Please try running a second client on a different computer or within a VM.</source>
|
||||||
|
<translation>Ошибка: Один из адресов, на который Вы отправляете сообщение, %1, принадлежит Вам. К сожалению, Bitmessage не может отправлять сообщения самому себе. Попробуйте запустить второго клиента на другом компьютере или на виртуальной машине.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1331"/>
|
||||||
|
<source>Address version number</source>
|
||||||
|
<translation>Версия адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1331"/>
|
||||||
|
<source>Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version.</source>
|
||||||
|
<translation>По поводу адреса %1: Bitmessage не поддерживаем адреса версии %2. Возможно, Вам нужно обновить клиент Bitmessage.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1335"/>
|
||||||
|
<source>Stream number</source>
|
||||||
|
<translation>Номер потока</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1335"/>
|
||||||
|
<source>Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version.</source>
|
||||||
|
<translation>По поводу адреса %1: Bitmessage не поддерживаем стрим номер %2. Возможно, Вам нужно обновить клиент Bitmessage.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1340"/>
|
||||||
|
<source>Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect.</source>
|
||||||
|
<translation>Внимание: Вы не подключены к сети. Bitmessage проделает необходимые вычисления, чтобы отправить сообщение, но не отправит его до тех пор, пока Вы не подсоединитесь к сети.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1377"/>
|
||||||
|
<source>Your 'To' field is empty.</source>
|
||||||
|
<translation>Вы не заполнили поле 'Кому'.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1432"/>
|
||||||
|
<source>Work is queued.</source>
|
||||||
|
<translation>Вычисления поставлены в очередь.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1454"/>
|
||||||
|
<source>Right click one or more entries in your address book and select 'Send message to this address'.</source>
|
||||||
|
<translation>Нажмите правую кнопку мышки на каком-либо адресе и выберите "Отправить сообщение на этот адрес".</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1521"/>
|
||||||
|
<source>Work is queued. %1</source>
|
||||||
|
<translation>Вычисления поставлены в очередь. %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1588"/>
|
||||||
|
<source>New Message</source>
|
||||||
|
<translation>Новое сообщение</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1588"/>
|
||||||
|
<source>From </source>
|
||||||
|
<translation>От </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2823"/>
|
||||||
|
<source>Address is valid.</source>
|
||||||
|
<translation>Адрес введен правильно.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2099"/>
|
||||||
|
<source>Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want.</source>
|
||||||
|
<translation>Ошибка: Вы не можете добавлять один и тот же адрес в Адресную Книгу несколько раз. Просто переименуйте существующий адрес.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1908"/>
|
||||||
|
<source>The address you entered was invalid. Ignoring it.</source>
|
||||||
|
<translation>Вы ввели неправильный адрес. Это адрес проигнорирован.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2269"/>
|
||||||
|
<source>Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want.</source>
|
||||||
|
<translation>Ошибка: Вы не можете добавлять один и тот же адрес в подписку несколько раз. Просто переименуйте существующую подписку.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1751"/>
|
||||||
|
<source>Restart</source>
|
||||||
|
<translation>Перезапустить</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1745"/>
|
||||||
|
<source>You must restart Bitmessage for the port number change to take effect.</source>
|
||||||
|
<translation>Вы должны перезапустить Bitmessage, чтобы смена номера порта имела эффект.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1751"/>
|
||||||
|
<source>Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections.</source>
|
||||||
|
<translation>Bitmessage будет использовать Ваш прокси в дальнейшем, тем не менее, мы рекомендуем перезапустить Bitmessage в ручную, чтобы закрыть уже существующие соединения.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1905"/>
|
||||||
|
<source>Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want.</source>
|
||||||
|
<translation>Ошибка: Вы не можете добавлять один и тот же адрес в список несколько раз. Просто переименуйте существующий адрес.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1961"/>
|
||||||
|
<source>Passphrase mismatch</source>
|
||||||
|
<translation>Секретная фраза не подходит</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1961"/>
|
||||||
|
<source>The passphrase you entered twice doesn't match. Try again.</source>
|
||||||
|
<translation>Вы ввели две разные секретные фразы. Пожалуйста, повторите заново.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1964"/>
|
||||||
|
<source>Choose a passphrase</source>
|
||||||
|
<translation>Придумайте секретную фразу</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1964"/>
|
||||||
|
<source>You really do need a passphrase.</source>
|
||||||
|
<translation>Вы действительно должны ввести секретную фразу.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="1992"/>
|
||||||
|
<source>All done. Closing user interface...</source>
|
||||||
|
<translation>Программа завершена. Закрываем пользовательский интерфейс...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2040"/>
|
||||||
|
<source>Address is gone</source>
|
||||||
|
<translation>Адрес утерян</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2040"/>
|
||||||
|
<source>Bitmessage cannot find your address %1. Perhaps you removed it?</source>
|
||||||
|
<translation>Bitmessage не может найти Ваш адрес %1. Возможно Вы удалили его?</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2044"/>
|
||||||
|
<source>Address disabled</source>
|
||||||
|
<translation>Адрес выключен</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2044"/>
|
||||||
|
<source>Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it.</source>
|
||||||
|
<translation>Ошибка: адрес, с которого Вы пытаетесь отправить, выключен. Вам нужно будет включить этот адрес во вкладке "Ваши адреса".</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2096"/>
|
||||||
|
<source>Entry added to the Address Book. Edit the label to your liking.</source>
|
||||||
|
<translation>Запись добавлена в Адресную Книгу. Вы можете ее отредактировать.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2161"/>
|
||||||
|
<source>Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back.</source>
|
||||||
|
<translation>Удалено в корзину. Чтобы попасть в корзину, Вам нужно будет найти файл корзины на диске.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2135"/>
|
||||||
|
<source>Save As...</source>
|
||||||
|
<translation>Сохранить как ...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2144"/>
|
||||||
|
<source>Write error.</source>
|
||||||
|
<translation>Ошибка записи.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2255"/>
|
||||||
|
<source>No addresses selected.</source>
|
||||||
|
<translation>Вы не выбрали адрес.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2687"/>
|
||||||
|
<source>Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system.</source>
|
||||||
|
<translation>Опции были отключены, потому что ли они либо не подходят, либо еще не выполнены под Вашу операционную систему.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2805"/>
|
||||||
|
<source>The address should start with ''BM-''</source>
|
||||||
|
<translation>Адрес должен начинаться с "BM-"</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2808"/>
|
||||||
|
<source>The address is not typed or copied correctly (the checksum failed).</source>
|
||||||
|
<translation>Адрес введен или скопирован неверно (контрольная сумма не сходится).</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2811"/>
|
||||||
|
<source>The version number of this address is higher than this software can support. Please upgrade Bitmessage.</source>
|
||||||
|
<translation>Версия этого адреса более поздняя, чем Ваша программа. Пожалуйста, обновите программу Bitmessage.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2814"/>
|
||||||
|
<source>The address contains invalid characters.</source>
|
||||||
|
<translation>Адрес содержит запрещенные символы.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2817"/>
|
||||||
|
<source>Some data encoded in the address is too short.</source>
|
||||||
|
<translation>Данные, закодированные в адресе, слишком короткие.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2820"/>
|
||||||
|
<source>Some data encoded in the address is too long.</source>
|
||||||
|
<translation>Данные, закодированные в адресе, слишком длинные.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/__init__.py" line="2865"/>
|
||||||
|
<source>You are using TCP port %1. (This can be changed in the settings).</source>
|
||||||
|
<translation>Вы используете TCP порт %1 (Его можно поменять в настройках).</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="469"/>
|
||||||
|
<source>Bitmessage</source>
|
||||||
|
<translation>Bitmessage</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="497"/>
|
||||||
|
<source>To</source>
|
||||||
|
<translation>Кому</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="499"/>
|
||||||
|
<source>From</source>
|
||||||
|
<translation>От кого</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="501"/>
|
||||||
|
<source>Subject</source>
|
||||||
|
<translation>Тема</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="478"/>
|
||||||
|
<source>Received</source>
|
||||||
|
<translation>Получено</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="479"/>
|
||||||
|
<source>Inbox</source>
|
||||||
|
<translation>Входящие</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="480"/>
|
||||||
|
<source>Load from Address book</source>
|
||||||
|
<translation>Взять из адресной книги</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="481"/>
|
||||||
|
<source>Message:</source>
|
||||||
|
<translation>Сообщение:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="482"/>
|
||||||
|
<source>Subject:</source>
|
||||||
|
<translation>Тема:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="483"/>
|
||||||
|
<source>Send to one or more specific people</source>
|
||||||
|
<translation>Отправить одному или нескольким указанным получателям</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="484"/>
|
||||||
|
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||||
|
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
|
p, li { white-space: pre-wrap; }
|
||||||
|
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||||
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></source>
|
||||||
|
<translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||||
|
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
|
p, li { white-space: pre-wrap; }
|
||||||
|
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||||
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="489"/>
|
||||||
|
<source>To:</source>
|
||||||
|
<translation>Кому:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="490"/>
|
||||||
|
<source>From:</source>
|
||||||
|
<translation>От:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="491"/>
|
||||||
|
<source>Broadcast to everyone who is subscribed to your address</source>
|
||||||
|
<translation>Рассылка всем, кто подписался на Ваш адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="493"/>
|
||||||
|
<source>Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them.</source>
|
||||||
|
<translation>Пожалуйста, учитывайте, что рассылки шифруются лишь Вашим адресом. Любой человек, который знает Ваш адрес, сможет прочитать Вашу рассылку.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="503"/>
|
||||||
|
<source>Status</source>
|
||||||
|
<translation>Статус</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="504"/>
|
||||||
|
<source>Sent</source>
|
||||||
|
<translation>Отправленные</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="508"/>
|
||||||
|
<source>Label (not shown to anyone)</source>
|
||||||
|
<translation>Название (не показывается никому)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="537"/>
|
||||||
|
<source>Address</source>
|
||||||
|
<translation>Адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="512"/>
|
||||||
|
<source>Stream</source>
|
||||||
|
<translation>Поток</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="513"/>
|
||||||
|
<source>Your Identities</source>
|
||||||
|
<translation>Ваши Адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="514"/>
|
||||||
|
<source>Here you can subscribe to 'broadcast messages' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab.</source>
|
||||||
|
<translation>Здесь Вы можете подписаться на рассылки от других пользователей. Все рассылки будут появляться у Вас во Входящих. Вы будете следить за всеми адресами, указанными здесь, даже если они в черном списке.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="515"/>
|
||||||
|
<source>Add new Subscription</source>
|
||||||
|
<translation>Добавить новую подписку</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="518"/>
|
||||||
|
<source>Label</source>
|
||||||
|
<translation>Название</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="521"/>
|
||||||
|
<source>Subscriptions</source>
|
||||||
|
<translation>Подписки</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="522"/>
|
||||||
|
<source>The Address book is useful for adding names or labels to other people's Bitmessage addresses so that you can recognize them more easily in your inbox. You can add entries here using the 'Add' button, or from your inbox by right-clicking on a message.</source>
|
||||||
|
<translation>Адресная книга удобна для присвоения осмысленных имен Bitmessage адресам Ваших друзей. Вы можете добавлять новые записи с помощью кнопки "Добавить новую запись", или же правым кликом мышки на сообщении.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="535"/>
|
||||||
|
<source>Name or Label</source>
|
||||||
|
<translation>Название</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="530"/>
|
||||||
|
<source>Use a Blacklist (Allow all incoming messages except those on the Blacklist)</source>
|
||||||
|
<translation>Использовать черный список (Разрешить все входящие сообщения, кроме указанных в черном списке)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="531"/>
|
||||||
|
<source>Use a Whitelist (Block all incoming messages except those on the Whitelist)</source>
|
||||||
|
<translation>Использовать белый список (блокировать все входящие сообщения, кроме указанных в белом списке)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="538"/>
|
||||||
|
<source>Blacklist</source>
|
||||||
|
<translation>Черный список</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="540"/>
|
||||||
|
<source>Stream #</source>
|
||||||
|
<translation>№ потока</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="542"/>
|
||||||
|
<source>Connections</source>
|
||||||
|
<translation>Соединений</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="543"/>
|
||||||
|
<source>Total connections: 0</source>
|
||||||
|
<translation>Всего соединений: 0</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="544"/>
|
||||||
|
<source>Since startup at asdf:</source>
|
||||||
|
<translation>С начала работы программы в asdf:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="545"/>
|
||||||
|
<source>Processed 0 person-to-person message.</source>
|
||||||
|
<translation>Обработано 0 сообщений.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="546"/>
|
||||||
|
<source>Processed 0 public key.</source>
|
||||||
|
<translation>Обработано 0 открытых ключей.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="547"/>
|
||||||
|
<source>Processed 0 broadcast.</source>
|
||||||
|
<translation>Обработано 0 рассылок.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="548"/>
|
||||||
|
<source>Network Status</source>
|
||||||
|
<translation>Статус сети</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="549"/>
|
||||||
|
<source>File</source>
|
||||||
|
<translation>Файл</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="557"/>
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation>Настройки</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="555"/>
|
||||||
|
<source>Help</source>
|
||||||
|
<translation>Помощь</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="552"/>
|
||||||
|
<source>Import keys</source>
|
||||||
|
<translation>Импортировать ключи</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="553"/>
|
||||||
|
<source>Manage keys</source>
|
||||||
|
<translation>Управлять ключами</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="556"/>
|
||||||
|
<source>About</source>
|
||||||
|
<translation>О программе</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="558"/>
|
||||||
|
<source>Regenerate deterministic addresses</source>
|
||||||
|
<translation>Сгенерировать заново все адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/bitmessageui.py" line="559"/>
|
||||||
|
<source>Delete all trashed messages</source>
|
||||||
|
<translation>Стереть все сообщения из корзины</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewAddressDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="173"/>
|
||||||
|
<source>Create new Address</source>
|
||||||
|
<translation>Создать новый адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="174"/>
|
||||||
|
<source>Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged. You may generate addresses by using either random numbers or by using a passphrase. If you use a passphrase, the address is called a "deterministic" address.
|
||||||
|
The 'Random Number' option is selected by default but deterministic addresses have several pros and cons:</source>
|
||||||
|
<translation>Здесь Вы сможете сгенерировать столько адресов сколько хотите. На самом деле, создание и выкидывание адресов даже поощряется. Вы можете сгенерировать адреса используя либо генератор случайных чисел либо придумав секретную фразу. Если Вы используете секретную фразу, то адреса будут называться "детерминистическими". Генератор случайных чисел выбран по умолчанию, однако детерминистические адреса имеют следующие плюсы и минусы по сравнению с ними:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="176"/>
|
||||||
|
<source><html><head/><body><p><span style=" font-weight:600;">Pros:<br/></span>You can recreate your addresses on any computer from memory. <br/>You need-not worry about backing up your keys.dat file as long as you can remember your passphrase. <br/><span style=" font-weight:600;">Cons:<br/></span>You must remember (or write down) your passphrase if you expect to be able to recreate your keys if they are lost. <br/>You must remember the address version number and the stream number along with your passphrase. <br/>If you choose a weak passphrase and someone on the Internet can brute-force it, they can read your messages and send messages as you.</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p><span style=" font-weight:600;">Плюсы:<br/></span>Вы сможете восстановить адрес по памяти на любом компьютере<br/>Вам не нужно беспокоиться о сохранении файла keys.dat, если Вы запомнили секретную фразу<br/><span style=" font-weight:600;">Минусы:<br/></span>Вы должны запомнить (или записать) секретную фразу, если Вы хотите когда-либо восстановить Ваш адрес на другом компьютере <br/>Вы должны также запомнить версию адреса и номер потока вместе с секретной фразой<br/>Если Вы выберите слишком короткую секретную фразу, кто-нибудь в интернете сможет подобрать ключ и, как следствие, читать и отправлять от Вашего имени сообщения.</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="177"/>
|
||||||
|
<source>Use a random number generator to make an address</source>
|
||||||
|
<translation>Использовать генератор случайных чисел для создания адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="178"/>
|
||||||
|
<source>Use a passphrase to make addresses</source>
|
||||||
|
<translation>Использовать секретную фразу для создания адресов</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="179"/>
|
||||||
|
<source>Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter</source>
|
||||||
|
<translation>Потратить несколько лишних минут, чтобы сделать адрес(а) короче на 1 или 2 символа</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="180"/>
|
||||||
|
<source>Make deterministic addresses</source>
|
||||||
|
<translation>Создать детерминистический адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="181"/>
|
||||||
|
<source>Address version number: 3</source>
|
||||||
|
<translation>Версия адреса: 3</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="182"/>
|
||||||
|
<source>In addition to your passphrase, you must remember these numbers:</source>
|
||||||
|
<translation>В дополнение к секретной фразе, Вам необходимо запомнить эти числа:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="183"/>
|
||||||
|
<source>Passphrase</source>
|
||||||
|
<translation>Придумайте секретную фразу</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="184"/>
|
||||||
|
<source>Number of addresses to make based on your passphrase:</source>
|
||||||
|
<translation>Кол-во адресов, которые Вы хотите получить из секретной фразы:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="185"/>
|
||||||
|
<source>Stream number: 1</source>
|
||||||
|
<translation>Номер потока: 1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="186"/>
|
||||||
|
<source>Retype passphrase</source>
|
||||||
|
<translation>Повторите секретную фразу</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="187"/>
|
||||||
|
<source>Randomly generate address</source>
|
||||||
|
<translation>Сгенерировать случайный адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="188"/>
|
||||||
|
<source>Label (not shown to anyone except you)</source>
|
||||||
|
<translation>Название (не показывается никому кроме Вас)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="189"/>
|
||||||
|
<source>Use the most available stream</source>
|
||||||
|
<translation>Использовать наиболее доступный поток</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="190"/>
|
||||||
|
<source> (best if this is the first of many addresses you will create)</source>
|
||||||
|
<translation> (выберите этот вариант, если это лишь первый из многих адресов, которые Вы планируете создать)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="191"/>
|
||||||
|
<source>Use the same stream as an existing address</source>
|
||||||
|
<translation>Использовать тот же поток, что и указанный существующий адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newaddressdialog.py" line="192"/>
|
||||||
|
<source>(saves you some bandwidth and processing power)</source>
|
||||||
|
<translation>(немного сэкономит Вам пропускную способность сети и вычислительную мощь)</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewChanDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="89"/>
|
||||||
|
<source>Dialog</source>
|
||||||
|
<translation>Новый chan</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="90"/>
|
||||||
|
<source>Create a new chan</source>
|
||||||
|
<translation>Создать новый chan</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="92"/>
|
||||||
|
<source>Join a chan</source>
|
||||||
|
<translation>Присоединиться к chan</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="93"/>
|
||||||
|
<source><html><head/><body><p>A chan is a set of encryption keys that is shared by a group of people. The keys and bitmessage address used by a chan is generated from a human-friendly word or phrase (the chan name).</p><p>Chans are experimental and are unmoderatable.</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>Chan - это набор ключей шифрования, которые известны некоторой группе людей. Ключи и Bitmessage-адрес используемый chan-ом генерируется из слова или фразы (имя chan-а).</p><p>Chan-ы - это экспериментальная новинка.</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="98"/>
|
||||||
|
<source>Chan name:</source>
|
||||||
|
<translation>Имя chan:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="95"/>
|
||||||
|
<source>Chan bitmessage address:</source>
|
||||||
|
<translation>Bitmessage адрес chan:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="96"/>
|
||||||
|
<source>Create a chan</source>
|
||||||
|
<translation>Создать chan</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newchandialog.py" line="97"/>
|
||||||
|
<source>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private.</source>
|
||||||
|
<translation>Введите имя Вашего chan-a. Если Вы выберете достаточно сложное имя для chan-а (например, сложную и необычную секретную фразу) и никто из Ваших друзей не опубликует эту фразу, то Вам chan будет надежно зашифрован.</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewSubscriptionDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newsubscriptiondialog.py" line="57"/>
|
||||||
|
<source>Add new entry</source>
|
||||||
|
<translation>Добавить новую запись</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newsubscriptiondialog.py" line="58"/>
|
||||||
|
<source>Label</source>
|
||||||
|
<translation>Название</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/newsubscriptiondialog.py" line="59"/>
|
||||||
|
<source>Address</source>
|
||||||
|
<translation>Адрес</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SpecialAddressBehaviorDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/specialaddressbehavior.py" line="59"/>
|
||||||
|
<source>Special Address Behavior</source>
|
||||||
|
<translation>Особое поведение адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/specialaddressbehavior.py" line="60"/>
|
||||||
|
<source>Behave as a normal address</source>
|
||||||
|
<translation>Вести себя как обычный адрес</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/specialaddressbehavior.py" line="61"/>
|
||||||
|
<source>Behave as a pseudo-mailing-list address</source>
|
||||||
|
<translation>Вести себя как адрес псевдо-рассылки</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/specialaddressbehavior.py" line="62"/>
|
||||||
|
<source>Mail received to a pseudo-mailing-list address will be automatically broadcast to subscribers (and thus will be public).</source>
|
||||||
|
<translation>Почта, полученная на адрес псевдо-рассылки, будет автоматически разослана всем подписчикам (и поэтому будет доступна общей публике).</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/specialaddressbehavior.py" line="63"/>
|
||||||
|
<source>Name of the pseudo-mailing-list:</source>
|
||||||
|
<translation>Имя псевдо-рассылки:</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>aboutDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/about.py" line="57"/>
|
||||||
|
<source>About</source>
|
||||||
|
<translation>О программе</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/about.py" line="58"/>
|
||||||
|
<source>PyBitmessage</source>
|
||||||
|
<translation>PyBitmessage</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/about.py" line="59"/>
|
||||||
|
<source>version ?</source>
|
||||||
|
<translation>версия ?</translation>
|
||||||
|
</message>
|
||||||
|
<message utf8="true">
|
||||||
|
<location filename="../bitmessageqt/about.py" line="60"/>
|
||||||
|
<source>Copyright © 2013 Jonathan Warren</source>
|
||||||
|
<translation>Копирайт © 2013 Джонатан Уоррен</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/about.py" line="61"/>
|
||||||
|
<source><html><head/><body><p>Distributed under the MIT/X11 software license; see <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>Программа распространяется в соответствии с лицензией MIT/X11; см. <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/about.py" line="62"/>
|
||||||
|
<source>This is Beta software.</source>
|
||||||
|
<translation>Это бета версия программы.</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>helpDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/help.py" line="45"/>
|
||||||
|
<source>Help</source>
|
||||||
|
<translation>Помощь</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/help.py" line="46"/>
|
||||||
|
<source><a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a></source>
|
||||||
|
<translation><a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/help.py" line="47"/>
|
||||||
|
<source>As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki:</source>
|
||||||
|
<translation>Bitmessage - общественный проект. Вы можете найти подсказки и советы на Wiki-страничке Bitmessage:</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>iconGlossaryDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/iconglossary.py" line="82"/>
|
||||||
|
<source>Icon Glossary</source>
|
||||||
|
<translation>Описание значков</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/iconglossary.py" line="83"/>
|
||||||
|
<source>You have no connections with other peers. </source>
|
||||||
|
<translation>Нет соединения с другими участниками сети.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/iconglossary.py" line="84"/>
|
||||||
|
<source>You have made at least one connection to a peer using an outgoing connection but you have not yet received any incoming connections. Your firewall or home router probably isn't configured to forward incoming TCP connections to your computer. Bitmessage will work just fine but it would help the Bitmessage network if you allowed for incoming connections and will help you be a better-connected node.</source>
|
||||||
|
<translation>На текущий момент Вы установили по-крайней мере одно исходящее соединение, но пока ни одного входящего. Ваш файрвол или маршрутизатор скорее всего не настроен на переброс входящих TCP соединений к Вашему компьютеру. Bitmessage будет прекрасно работать и без этого, но Вы могли бы помочь сети если бы разрешили и входящие соединения тоже. Это помогло бы Вам стать более важным узлом сети.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/iconglossary.py" line="85"/>
|
||||||
|
<source>You are using TCP port ?. (This can be changed in the settings).</source>
|
||||||
|
<translation>Вы используете TCP порт ?. (Его можно поменять в настройках).</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/iconglossary.py" line="86"/>
|
||||||
|
<source>You do have connections with other peers and your firewall is correctly configured.</source>
|
||||||
|
<translation>Вы установили соединение с другими участниками сети и ваш файрвол настроен правильно.</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>regenerateAddressesDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="104"/>
|
||||||
|
<source>Regenerate Existing Addresses</source>
|
||||||
|
<translation>Сгенерировать заново существующие адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="105"/>
|
||||||
|
<source>Regenerate existing addresses</source>
|
||||||
|
<translation>Сгенерировать заново существующие адреса</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="106"/>
|
||||||
|
<source>Passphrase</source>
|
||||||
|
<translation>Секретная фраза</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="107"/>
|
||||||
|
<source>Number of addresses to make based on your passphrase:</source>
|
||||||
|
<translation>Кол-во адресов, которые Вы хотите получить из Вашей секретной фразы:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="108"/>
|
||||||
|
<source>Address version Number:</source>
|
||||||
|
<translation>Версия адреса:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="109"/>
|
||||||
|
<source>3</source>
|
||||||
|
<translation>3</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="110"/>
|
||||||
|
<source>Stream number:</source>
|
||||||
|
<translation>Номер потока:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="111"/>
|
||||||
|
<source>1</source>
|
||||||
|
<translation>1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="112"/>
|
||||||
|
<source>Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter</source>
|
||||||
|
<translation>Потратить несколько лишних минут, чтобы сделать адрес(а) короче на 1 или 2 символа</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="113"/>
|
||||||
|
<source>You must check (or not check) this box just like you did (or didn't) when you made your addresses the first time.</source>
|
||||||
|
<translation>Вы должны кликнуть эту галочку (или не кликать) точно также как Вы сделали в самый первый раз, когда создавали Ваши адреса.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/regenerateaddresses.py" line="114"/>
|
||||||
|
<source>If you have previously made deterministic addresses but lost them due to an accident (like hard drive failure), you can regenerate them here. If you used the random number generator to make your addresses then this form will be of no use to you.</source>
|
||||||
|
<translation>Если Вы ранее делали детерминистические адреса, но случайно потеряли их, Вы можете их восстановить здесь. Если же Вы использовали генератор случайных чисел, чтобы создать Ваши адреса, то Вы не сможете их здесь восстановить.</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>settingsDialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="241"/>
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation>Настройки</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="242"/>
|
||||||
|
<source>Start Bitmessage on user login</source>
|
||||||
|
<translation>Запускать Bitmessage при входе в систему</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="243"/>
|
||||||
|
<source>Start Bitmessage in the tray (don't show main window)</source>
|
||||||
|
<translation>Запускать Bitmessage в свернутом виде (не показывать главное окно)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="244"/>
|
||||||
|
<source>Minimize to tray</source>
|
||||||
|
<translation>Сворачивать в трей</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="245"/>
|
||||||
|
<source>Show notification when message received</source>
|
||||||
|
<translation>Показывать уведомления при получении новых сообщений</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="246"/>
|
||||||
|
<source>Run in Portable Mode</source>
|
||||||
|
<translation>Запустить в переносном режиме</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="247"/>
|
||||||
|
<source>In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive.</source>
|
||||||
|
<translation>В переносном режиме, все сообщения и конфигурационные файлы сохраняются в той же самой папке что и сама программа. Это делает более удобным использование Bitmessage с USB-флэшки.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="248"/>
|
||||||
|
<source>User Interface</source>
|
||||||
|
<translation>Пользовательские</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="249"/>
|
||||||
|
<source>Listening port</source>
|
||||||
|
<translation>Порт прослушивания</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="250"/>
|
||||||
|
<source>Listen for connections on port:</source>
|
||||||
|
<translation>Прослушивать соединения на порту:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="251"/>
|
||||||
|
<source>Proxy server / Tor</source>
|
||||||
|
<translation>Прокси сервер / Tor</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="252"/>
|
||||||
|
<source>Type:</source>
|
||||||
|
<translation>Тип:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="253"/>
|
||||||
|
<source>none</source>
|
||||||
|
<translation>отсутствует</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="254"/>
|
||||||
|
<source>SOCKS4a</source>
|
||||||
|
<translation>SOCKS4a</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="255"/>
|
||||||
|
<source>SOCKS5</source>
|
||||||
|
<translation>SOCKS5</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="256"/>
|
||||||
|
<source>Server hostname:</source>
|
||||||
|
<translation>Адрес сервера:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="257"/>
|
||||||
|
<source>Port:</source>
|
||||||
|
<translation>Порт:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="258"/>
|
||||||
|
<source>Authentication</source>
|
||||||
|
<translation>Авторизация</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="259"/>
|
||||||
|
<source>Username:</source>
|
||||||
|
<translation>Имя пользователя:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="260"/>
|
||||||
|
<source>Pass:</source>
|
||||||
|
<translation>Прль:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="261"/>
|
||||||
|
<source>Network Settings</source>
|
||||||
|
<translation>Сетевые настройки</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="262"/>
|
||||||
|
<source>When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. </source>
|
||||||
|
<translation>Когда кто-либо отправляет Вам сообщение, его компьютер должен сперва решить определенную вычислительную задачу. Сложность этой задачи по умолчанию равна 1. Вы можете повысить эту сложность для новых адресов, которые Вы создадите, здесь. Таким образом, любые новые адреса, которые Вы создадите, могут требовать от отправителей сложность большую чем 1. Однако, есть одно исключение: если Вы специально добавите Вашего собеседника в адресную книгу, то Bitmessage автоматически уведомит его о том, что для него минимальная сложность будет составлять всегда всего лишь 1.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="263"/>
|
||||||
|
<source>Total difficulty:</source>
|
||||||
|
<translation>Общая сложность:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="264"/>
|
||||||
|
<source>Small message difficulty:</source>
|
||||||
|
<translation>Сложность для маленьких сообщений:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="265"/>
|
||||||
|
<source>The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages.</source>
|
||||||
|
<translation>"Сложность для маленьких сообщений" влияет исключительно на небольшие сообщения. Увеличив это число в два раза, вы сделаете отправку маленьких сообщений в два раза сложнее, в то время как сложность отправки больших сообщений не изменится.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="266"/>
|
||||||
|
<source>The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work.</source>
|
||||||
|
<translation>"Общая сложность" влияет на абсолютное количество вычислений, которые отправитель должен провести, чтобы отправить сообщение. Увеличив это число в два раза, вы увеличите в два раза объем требуемых вычислений.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="267"/>
|
||||||
|
<source>Demanded difficulty</source>
|
||||||
|
<translation>Требуемая сложность</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="268"/>
|
||||||
|
<source>Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable.</source>
|
||||||
|
<translation>Здесь Вы можете установить максимальную вычислительную работу, которую Вы согласны проделать, чтобы отправить сообщение другому пользователю. Ноль означает, чтобы любое значение допустимо.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="269"/>
|
||||||
|
<source>Maximum acceptable total difficulty:</source>
|
||||||
|
<translation>Макс допустимая общая сложность:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="270"/>
|
||||||
|
<source>Maximum acceptable small message difficulty:</source>
|
||||||
|
<translation>Макс допустимая сложность для маленький сообщений:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../bitmessageqt/settings.py" line="271"/>
|
||||||
|
<source>Max acceptable difficulty</source>
|
||||||
|
<translation>Макс допустимая сложность</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
Loading…
Reference in New Issue
Block a user