diff --git a/INSTALL.md b/INSTALL.md
index 0d7b6c61..111db5d9 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -68,8 +68,8 @@ cd PyBitmessage && python src/bitmessagemain.py
```
##Creating a package for installation
-If you really want, you can make a package for PyBitmessage which you may
-install yourself or distribute to friends. This isn't reccomended, since
+If you really want, you can make a package for PyBitmessage, which you may
+install yourself or distribute to friends. This isn't recommended, since
PyBitmessage is in Beta, and subject to frequent change.
####Linux
@@ -78,7 +78,7 @@ First off, since PyBitmessage uses something nifty called
[packagemonkey](https://github.com/fuzzgun/packagemonkey), go ahead and get
that installed. You may have to build it from source.
-Next, edit the generate.sh script. To your liking.
+Next, edit the generate.sh script to your liking.
Now, run the appropriate script for the type of package you'd like to make
```
diff --git a/README.md b/README.md
index c725c3bc..73b5329c 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ PyBitmessage
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
+authorities. It uses strong authentication, which means that the sender of a
message cannot be spoofed, and it aims to hide "non-content" data, like the
sender and receiver of messages, from passive eavesdroppers like those running
warrantless wiretapping programs.
diff --git a/arch.sh b/arch.sh
index e025ddcf..64c903a7 100755
--- a/arch.sh
+++ b/arch.sh
@@ -24,14 +24,14 @@ sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
make clean
rm -f archpackage/*.gz
-# having the root directory called name-version seems essential
+# 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
+# Rename the root directory without the version number
mv ../${APP}-${VERSION} ../${APP}
-# calculate the MD5 checksum
+# Calculate the MD5 checksum
CHECKSM=$(md5sum ${SOURCE})
sed -i "s/md5sums[^)]*)/md5sums=(${CHECKSM%% *})/g" archpackage/PKGBUILD
diff --git a/debian.sh b/debian.sh
index d80d9db9..0cb07fff 100755
--- a/debian.sh
+++ b/debian.sh
@@ -29,7 +29,7 @@ sed -i 's/-'${PREV_VERSION}'.so/-'${VERSION}'.so/g' debian/*.links
make clean
make
-# change the parent directory name to debian format
+# Change the parent directory name to Debian format
mv ../${APP} ../${DIR}
# Create a source archive
@@ -38,9 +38,9 @@ make source
# Build the package
dpkg-buildpackage -F
-# sign files
+# Sign files
gpg -ba ../${APP}_${VERSION}-1_${ARCH_TYPE}.deb
gpg -ba ../${APP}_${VERSION}.orig.tar.gz
-# restore the parent directory name
+# Restore the parent directory name
mv ../${DIR} ../${APP}
diff --git a/ebuild.sh b/ebuild.sh
index 59295718..e5550355 100755
--- a/ebuild.sh
+++ b/ebuild.sh
@@ -21,13 +21,13 @@ 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
+# 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
+# Rename the root directory without the version number
mv ../${APP}-${VERSION} ../${APP}
diff --git a/rpm.sh b/rpm.sh
index 074a4515..9b67ba61 100755
--- a/rpm.sh
+++ b/rpm.sh
@@ -24,25 +24,25 @@ 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
+# Setup the rpmbuild directory tree
rpmdev-setuptree
-# create the source code in the SOURCES directory
+# 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
+# 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
+# Rename the root directory without the version number
mv ../${APP}-${VERSION} ../${APP}
-# copy the spec file into the SPECS directory
+# Copy the spec file into the SPECS directory
cp -f rpmpackage/${APP}.spec ~/rpmbuild/SPECS
-# build
+# Build
cd ~/rpmbuild/SPECS
rpmbuild -ba ${APP}.spec
cd ${CURRDIR}
diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py
index 7125cb60..2ea16c3c 100644
--- a/src/bitmessageqt/__init__.py
+++ b/src/bitmessageqt/__init__.py
@@ -34,6 +34,7 @@ import hashlib
from pyelliptic.openssl import OpenSSL
import pickle
import platform
+import textwrap
import debug
from debug import logger
import subprocess
@@ -771,7 +772,7 @@ class MyForm(QtGui.QMainWindow):
if shared.config.has_section(fromAddress):
fromLabel = shared.config.get(fromAddress, 'label')
- if fromLabel == '':
+ else:
fromLabel = fromAddress
toLabel = ''
@@ -2250,6 +2251,8 @@ class MyForm(QtGui.QMainWindow):
self.settingsDialogInstance.ui.checkBoxWillinglySendToMobile.isChecked()))
shared.config.set('bitmessagesettings', 'useidenticons', str(
self.settingsDialogInstance.ui.checkBoxUseIdenticons.isChecked()))
+ shared.config.set('bitmessagesettings', 'replybelow', str(
+ self.settingsDialogInstance.ui.checkBoxReplyBelow.isChecked()))
lang_ind = int(self.settingsDialogInstance.ui.languageComboBox.currentIndex())
if not languages[lang_ind] == 'other':
@@ -2613,6 +2616,28 @@ class MyForm(QtGui.QMainWindow):
# We could also select upwards, but then our problem would be with the topmost message.
# self.ui.tableWidgetInbox.clearSelection() manages to mark the message as read again.
+ # Format predefined text on message reply.
+ def quoted_text(self, message):
+ if not shared.safeConfigGetBoolean('bitmessagesettings', 'replybelow'):
+ return '\n\n------------------------------------------------------\n' + message
+
+ quoteWrapper = textwrap.TextWrapper(replace_whitespace = False,
+ initial_indent = '> ',
+ subsequent_indent = '> ',
+ break_long_words = False,
+ break_on_hyphens = False)
+ def quote_line(line):
+ # Do quote empty lines.
+ if line == '' or line.isspace():
+ return '> '
+ # Quote already quoted lines, but do not wrap them.
+ elif line[0:2] == '> ':
+ return '> ' + line
+ # Wrap and quote lines/paragraphs new to this message.
+ else:
+ return quoteWrapper.fill(line)
+ return '\n'.join([quote_line(l) for l in message.splitlines()]) + '\n\n'
+
def on_action_InboxReply(self):
currentInboxRow = self.ui.tableWidgetInbox.currentRow()
toAddressAtCurrentInboxRow = str(self.ui.tableWidgetInbox.item(
@@ -2655,7 +2680,8 @@ class MyForm(QtGui.QMainWindow):
else:
self.ui.comboBoxSendFrom.setCurrentIndex(0)
- self.ui.textEditMessage.setText('\n\n------------------------------------------------------\n' + unicode(messageAtCurrentInboxRow, 'utf-8)'))
+ quotedText = self.quoted_text(unicode(messageAtCurrentInboxRow, 'utf-8'))
+ self.ui.textEditMessage.setText(quotedText)
if self.ui.tableWidgetInbox.item(currentInboxRow, 2).text()[0:3] in ['Re:', 'RE:']:
self.ui.lineEditSubject.setText(
self.ui.tableWidgetInbox.item(currentInboxRow, 2).text())
@@ -3318,9 +3344,11 @@ class settingsDialog(QtGui.QDialog):
shared.safeConfigGetBoolean('bitmessagesettings', 'willinglysendtomobile'))
self.ui.checkBoxUseIdenticons.setChecked(
shared.safeConfigGetBoolean('bitmessagesettings', 'useidenticons'))
+ self.ui.checkBoxReplyBelow.setChecked(
+ shared.safeConfigGetBoolean('bitmessagesettings', 'replybelow'))
global languages
- languages = ['system','en','eo','fr','de','es','ru','no','ar','zh_cn','en_pirate','other']
+ languages = ['system','en','eo','fr','de','es','ru','no','ar','zh_cn','ja','en_pirate','other']
user_countrycode = str(shared.config.get('bitmessagesettings', 'userlocale'))
if user_countrycode in languages:
curr_index = languages.index(user_countrycode)
diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py
index 293c133b..edb15e6b 100644
--- a/src/bitmessageqt/settings.py
+++ b/src/bitmessageqt/settings.py
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'settings.ui'
#
-# Created: Mon Jan 20 14:26:31 2014
+# Created: Wed Apr 30 18:35:41 2014
# by: PyQt4 UI code generator 4.10.3
#
# WARNING! All changes made in this file will be lost!
@@ -26,7 +26,7 @@ except AttributeError:
class Ui_settingsDialog(object):
def setupUi(self, settingsDialog):
settingsDialog.setObjectName(_fromUtf8("settingsDialog"))
- settingsDialog.resize(521, 399)
+ settingsDialog.resize(521, 413)
self.gridLayout = QtGui.QGridLayout(settingsDialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.buttonBox = QtGui.QDialogButtonBox(settingsDialog)
@@ -72,6 +72,9 @@ class Ui_settingsDialog(object):
self.checkBoxUseIdenticons = QtGui.QCheckBox(self.tabUserInterface)
self.checkBoxUseIdenticons.setObjectName(_fromUtf8("checkBoxUseIdenticons"))
self.formLayout.setWidget(7, QtGui.QFormLayout.LabelRole, self.checkBoxUseIdenticons)
+ self.checkBoxReplyBelow = QtGui.QCheckBox(self.tabUserInterface)
+ self.checkBoxReplyBelow.setObjectName(_fromUtf8("checkBoxReplyBelow"))
+ self.formLayout.setWidget(8, QtGui.QFormLayout.LabelRole, self.checkBoxReplyBelow)
self.groupBox = QtGui.QGroupBox(self.tabUserInterface)
self.groupBox.setObjectName(_fromUtf8("groupBox"))
self.formLayout_2 = QtGui.QFormLayout(self.groupBox)
@@ -91,8 +94,9 @@ class Ui_settingsDialog(object):
self.languageComboBox.addItem(_fromUtf8(""))
self.languageComboBox.addItem(_fromUtf8(""))
self.languageComboBox.addItem(_fromUtf8(""))
+ self.languageComboBox.addItem(_fromUtf8(""))
self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.languageComboBox)
- self.formLayout.setWidget(8, QtGui.QFormLayout.FieldRole, self.groupBox)
+ self.formLayout.setWidget(9, QtGui.QFormLayout.FieldRole, self.groupBox)
self.tabWidgetSettings.addTab(self.tabUserInterface, _fromUtf8(""))
self.tabNetworkSettings = QtGui.QWidget()
self.tabNetworkSettings.setObjectName(_fromUtf8("tabNetworkSettings"))
@@ -392,6 +396,7 @@ class Ui_settingsDialog(object):
self.PortableModeDescription.setText(_translate("settingsDialog", "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.", None))
self.checkBoxWillinglySendToMobile.setText(_translate("settingsDialog", "Willingly include unencrypted destination address when sending to a mobile device", None))
self.checkBoxUseIdenticons.setText(_translate("settingsDialog", "Use Identicons", None))
+ self.checkBoxReplyBelow.setText(_translate("settingsDialog", "Reply below Quote", None))
self.groupBox.setTitle(_translate("settingsDialog", "Interface Language", None))
self.languageComboBox.setItemText(0, _translate("settingsDialog", "System Settings", "system"))
self.languageComboBox.setItemText(1, _translate("settingsDialog", "English", "en"))
@@ -399,12 +404,13 @@ class Ui_settingsDialog(object):
self.languageComboBox.setItemText(3, _translate("settingsDialog", "Français", "fr"))
self.languageComboBox.setItemText(4, _translate("settingsDialog", "Deutsch", "de"))
self.languageComboBox.setItemText(5, _translate("settingsDialog", "Españl", "es"))
- self.languageComboBox.setItemText(6, _translate("settingsDialog", "русский язык", "ru"))
+ self.languageComboBox.setItemText(6, _translate("settingsDialog", "русский", "ru"))
self.languageComboBox.setItemText(7, _translate("settingsDialog", "Norsk", "no"))
self.languageComboBox.setItemText(8, _translate("settingsDialog", "العربية", "ar"))
self.languageComboBox.setItemText(9, _translate("settingsDialog", "简体中文", "zh_cn"))
- self.languageComboBox.setItemText(10, _translate("settingsDialog", "Pirate English", "en_pirate"))
- self.languageComboBox.setItemText(11, _translate("settingsDialog", "Other (set in keys.dat)", "other"))
+ self.languageComboBox.setItemText(10, _translate("settingsDialog", "日本語", "ja"))
+ self.languageComboBox.setItemText(11, _translate("settingsDialog", "Pirate English", "en_pirate"))
+ self.languageComboBox.setItemText(12, _translate("settingsDialog", "Other (set in keys.dat)", "other"))
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabUserInterface), _translate("settingsDialog", "User Interface", None))
self.groupBox1.setTitle(_translate("settingsDialog", "Listening port", None))
self.label.setText(_translate("settingsDialog", "Listen for connections on port:", None))
diff --git a/src/bitmessageqt/settings.ui b/src/bitmessageqt/settings.ui
index 2af19613..263796fa 100644
--- a/src/bitmessageqt/settings.ui
+++ b/src/bitmessageqt/settings.ui
@@ -7,7 +7,7 @@
0
0
521
- 399
+ 413
@@ -105,7 +105,14 @@
- -
+
-
+
+
+ Reply below Quote
+
+
+
+ -
Interface Language
@@ -151,7 +158,7 @@
-
- русский язык
+ русский
-
@@ -169,6 +176,11 @@
简体中文
+ -
+
+ 日本語
+
+
-
Pirate English
diff --git a/src/class_outgoingSynSender.py b/src/class_outgoingSynSender.py
index f7074b65..a1a04b51 100644
--- a/src/class_outgoingSynSender.py
+++ b/src/class_outgoingSynSender.py
@@ -22,26 +22,37 @@ class outgoingSynSender(threading.Thread):
self.streamNumber = streamNumber
self.selfInitiatedConnections = selfInitiatedConnections
+ def _getPeer(self):
+ # If the user has specified a trusted peer then we'll only
+ # ever connect to that. Otherwise we'll pick a random one from
+ # the known nodes
+ shared.knownNodesLock.acquire()
+ if shared.trustedPeer:
+ peer = shared.trustedPeer
+ shared.knownNodes[self.streamNumber][peer] = time.time()
+ else:
+ peer, = random.sample(shared.knownNodes[self.streamNumber], 1)
+ shared.knownNodesLock.release()
+
+ return peer
+
def run(self):
while shared.safeConfigGetBoolean('bitmessagesettings', 'dontconnect'):
time.sleep(2)
while shared.safeConfigGetBoolean('bitmessagesettings', 'sendoutgoingconnections'):
- while len(self.selfInitiatedConnections[self.streamNumber]) >= 8: # maximum number of outgoing connections = 8
+ maximumConnections = 1 if shared.trustedPeer else 8 # maximum number of outgoing connections = 8
+ while len(self.selfInitiatedConnections[self.streamNumber]) >= maximumConnections:
time.sleep(10)
if shared.shutdown:
break
random.seed()
- shared.knownNodesLock.acquire()
- peer, = random.sample(shared.knownNodes[self.streamNumber], 1)
- shared.knownNodesLock.release()
+ peer = self._getPeer()
shared.alreadyAttemptedConnectionsListLock.acquire()
while peer in shared.alreadyAttemptedConnectionsList or peer.host in shared.connectedHostsList:
shared.alreadyAttemptedConnectionsListLock.release()
# print 'choosing new sample'
random.seed()
- shared.knownNodesLock.acquire()
- peer, = random.sample(shared.knownNodes[self.streamNumber], 1)
- shared.knownNodesLock.release()
+ peer = self._getPeer()
time.sleep(1)
# Clear out the shared.alreadyAttemptedConnectionsList every half
# hour so that this program will again attempt a connection
diff --git a/src/class_receiveDataThread.py b/src/class_receiveDataThread.py
index 127f18a4..e78a7ae2 100644
--- a/src/class_receiveDataThread.py
+++ b/src/class_receiveDataThread.py
@@ -147,9 +147,9 @@ class receiveDataThread(threading.Thread):
with shared.printLock:
print 'remoteCommand', repr(remoteCommand.replace('\x00', '')), ' from', self.peer
- if remoteCommand == 'version\x00\x00\x00\x00\x00':
+ if remoteCommand == 'version\x00\x00\x00\x00\x00' and not self.connectionIsOrWasFullyEstablished:
self.recversion(self.data[24:self.payloadLength + 24])
- elif remoteCommand == 'verack\x00\x00\x00\x00\x00\x00':
+ elif remoteCommand == 'verack\x00\x00\x00\x00\x00\x00' and not self.connectionIsOrWasFullyEstablished:
self.recverack()
elif remoteCommand == 'addr\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
self.recaddr(self.data[24:self.payloadLength + 24])
@@ -237,7 +237,12 @@ class receiveDataThread(threading.Thread):
self.connectionFullyEstablished()
def connectionFullyEstablished(self):
+ if self.connectionIsOrWasFullyEstablished:
+ # there is no reason to run this function a second time
+ return
self.connectionIsOrWasFullyEstablished = True
+ # Command the corresponding sendDataThread to set its own connectionIsOrWasFullyEstablished variable to True also
+ self.sendDataThreadQueue.put((0, 'connectionIsOrWasFullyEstablished', 'no data'))
if not self.initiatedConnection:
shared.clientHasReceivedIncomingConnections = True
shared.UISignalQueue.put(('setStatusIcon', 'green'))
@@ -301,8 +306,9 @@ class receiveDataThread(threading.Thread):
self.sendinvMessageToJustThisOnePeer(
numberOfObjectsInInvMessage, payload)
- # Self explanatory. Notice that there is also a broadcastinv function for
- # broadcasting invs to everyone in our stream.
+ # Used to send a big inv message when the connection with a node is
+ # first fully established. Notice that there is also a broadcastinv
+ # function for broadcasting invs to everyone in our stream.
def sendinvMessageToJustThisOnePeer(self, numberOfObjects, payload):
payload = encodeVarint(numberOfObjects) + payload
headerData = '\xe9\xbe\xb4\xd9' # magic bits, slighly different from Bitcoin's magic bits.
@@ -313,6 +319,14 @@ class receiveDataThread(threading.Thread):
print 'Sending huge inv message with', numberOfObjects, 'objects to just this one peer'
self.sendDataThreadQueue.put((0, 'sendRawData', headerData + payload))
+ def _sleepForTimingAttackMitigation(self, sleepTime):
+ # We don't need to do the timing attack mitigation if we are
+ # only connected to the trusted peer because we can trust the
+ # peer not to attack
+ if sleepTime > 0 and doTimingAttackMitigation and shared.trustedPeer == None:
+ with shared.printLock:
+ print 'Timing attack mitigation: Sleeping for', sleepTime, 'seconds.'
+ time.sleep(sleepTime)
# We have received a broadcast message
def recbroadcast(self, data):
@@ -341,10 +355,7 @@ class receiveDataThread(threading.Thread):
sleepTime = lengthOfTimeWeShouldUseToProcessThisMessage - \
(time.time() - self.messageProcessingStartTime)
- if sleepTime > 0 and doTimingAttackMitigation:
- with shared.printLock:
- print 'Timing attack mitigation: Sleeping for', sleepTime, 'seconds.'
- time.sleep(sleepTime)
+ self._sleepForTimingAttackMitigation(sleepTime)
# We have received a msg message.
def recmsg(self, data):
@@ -373,10 +384,7 @@ class receiveDataThread(threading.Thread):
sleepTime = lengthOfTimeWeShouldUseToProcessThisMessage - \
(time.time() - self.messageProcessingStartTime)
- if sleepTime > 0 and doTimingAttackMitigation:
- with shared.printLock:
- print 'Timing attack mitigation: Sleeping for', sleepTime, 'seconds.'
- time.sleep(sleepTime)
+ self._sleepForTimingAttackMitigation(sleepTime)
# We have received a pubkey
def recpubkey(self, data):
@@ -387,11 +395,7 @@ class receiveDataThread(threading.Thread):
lengthOfTimeWeShouldUseToProcessThisMessage = .1
sleepTime = lengthOfTimeWeShouldUseToProcessThisMessage - \
(time.time() - self.pubkeyProcessingStartTime)
- if sleepTime > 0 and doTimingAttackMitigation:
- with shared.printLock:
- print 'Timing attack mitigation: Sleeping for', sleepTime, 'seconds.'
- time.sleep(sleepTime)
-
+ self._sleepForTimingAttackMitigation(sleepTime)
# We have received an inv message
def recinv(self, data):
@@ -665,7 +669,10 @@ class receiveDataThread(threading.Thread):
print 'knownNodes currently has', len(shared.knownNodes[self.streamNumber]), 'nodes for this stream.'
- # Send a big addr message to our peer
+ # Send a huge addr message to our peer. This is only used
+ # when we fully establish a connection with a
+ # peer (with the full exchange of version and verack
+ # messages).
def sendaddr(self):
addrsInMyStream = {}
addrsInChildStreamLeft = {}
@@ -750,58 +757,68 @@ class receiveDataThread(threading.Thread):
if len(data) < 83:
# This version message is unreasonably short. Forget it.
return
- elif not self.verackSent:
- self.remoteProtocolVersion, = unpack('>L', data[:4])
- if self.remoteProtocolVersion <= 1:
- shared.broadcastToSendDataQueues((0, 'shutdown', self.peer))
- with shared.printLock:
- print 'Closing connection to old protocol version 1 node: ', self.peer
- return
- # print 'remoteProtocolVersion', self.remoteProtocolVersion
- self.myExternalIP = socket.inet_ntoa(data[40:44])
- # print 'myExternalIP', self.myExternalIP
- self.remoteNodeIncomingPort, = unpack('>H', data[70:72])
- # print 'remoteNodeIncomingPort', self.remoteNodeIncomingPort
- useragentLength, lengthOfUseragentVarint = decodeVarint(
- data[80:84])
- readPosition = 80 + lengthOfUseragentVarint
- useragent = data[readPosition:readPosition + useragentLength]
- readPosition += useragentLength
- numberOfStreamsInVersionMessage, lengthOfNumberOfStreamsInVersionMessage = decodeVarint(
- data[readPosition:])
- readPosition += lengthOfNumberOfStreamsInVersionMessage
- self.streamNumber, lengthOfRemoteStreamNumber = decodeVarint(
- data[readPosition:])
+ if self.verackSent:
+ """
+ We must have already processed the remote node's version message.
+ There might be a time in the future when we Do want to process
+ a new version message, like if the remote node wants to update
+ the streams in which they are interested. But for now we'll
+ ignore this version message
+ """
+ return
+ self.remoteProtocolVersion, = unpack('>L', data[:4])
+ if self.remoteProtocolVersion <= 1:
+ shared.broadcastToSendDataQueues((0, 'shutdown', self.peer))
with shared.printLock:
- print 'Remote node useragent:', useragent, ' stream number:', self.streamNumber
+ print 'Closing connection to old protocol version 1 node: ', self.peer
+ return
+ # print 'remoteProtocolVersion', self.remoteProtocolVersion
+ self.myExternalIP = socket.inet_ntoa(data[40:44])
+ # print 'myExternalIP', self.myExternalIP
+ self.remoteNodeIncomingPort, = unpack('>H', data[70:72])
+ # print 'remoteNodeIncomingPort', self.remoteNodeIncomingPort
+ useragentLength, lengthOfUseragentVarint = decodeVarint(
+ data[80:84])
+ readPosition = 80 + lengthOfUseragentVarint
+ useragent = data[readPosition:readPosition + useragentLength]
+ readPosition += useragentLength
+ numberOfStreamsInVersionMessage, lengthOfNumberOfStreamsInVersionMessage = decodeVarint(
+ data[readPosition:])
+ readPosition += lengthOfNumberOfStreamsInVersionMessage
+ self.streamNumber, lengthOfRemoteStreamNumber = decodeVarint(
+ data[readPosition:])
+ with shared.printLock:
+ print 'Remote node useragent:', useragent, ' stream number:', self.streamNumber
- if self.streamNumber != 1:
- shared.broadcastToSendDataQueues((0, 'shutdown', self.peer))
- with shared.printLock:
- print 'Closed connection to', self.peer, 'because they are interested in stream', self.streamNumber, '.'
- return
- shared.connectedHostsList[
- self.peer.host] = 1 # We use this data structure to not only keep track of what hosts we are connected to so that we don't try to connect to them again, but also to list the connections count on the Network Status tab.
- # If this was an incoming connection, then the sendData thread
- # doesn't know the stream. We have to set it.
- if not self.initiatedConnection:
- shared.broadcastToSendDataQueues((
- 0, 'setStreamNumber', (self.peer, self.streamNumber)))
- if data[72:80] == shared.eightBytesOfRandomDataUsedToDetectConnectionsToSelf:
- shared.broadcastToSendDataQueues((0, 'shutdown', self.peer))
- with shared.printLock:
- print 'Closing connection to myself: ', self.peer
- return
- self.sendDataThreadQueue.put((0, 'setRemoteProtocolVersion', self.remoteProtocolVersion))
+ if self.streamNumber != 1:
+ shared.broadcastToSendDataQueues((0, 'shutdown', self.peer))
+ with shared.printLock:
+ print 'Closed connection to', self.peer, 'because they are interested in stream', self.streamNumber, '.'
+ return
+ shared.connectedHostsList[
+ self.peer.host] = 1 # We use this data structure to not only keep track of what hosts we are connected to so that we don't try to connect to them again, but also to list the connections count on the Network Status tab.
+ # If this was an incoming connection, then the sendData thread
+ # doesn't know the stream. We have to set it.
+ if not self.initiatedConnection:
+ self.sendDataThreadQueue.put((0, 'setStreamNumber', self.streamNumber))
+ if data[72:80] == shared.eightBytesOfRandomDataUsedToDetectConnectionsToSelf:
+ shared.broadcastToSendDataQueues((0, 'shutdown', self.peer))
+ with shared.printLock:
+ print 'Closing connection to myself: ', self.peer
+ return
+
+ # The other peer's protocol version is of interest to the sendDataThread but we learn of it
+ # in this version message. Let us inform the sendDataThread.
+ self.sendDataThreadQueue.put((0, 'setRemoteProtocolVersion', self.remoteProtocolVersion))
- shared.knownNodesLock.acquire()
- shared.knownNodes[self.streamNumber][shared.Peer(self.peer.host, self.remoteNodeIncomingPort)] = int(time.time())
- shared.needToWriteKnownNodesToDisk = True
- shared.knownNodesLock.release()
+ shared.knownNodesLock.acquire()
+ shared.knownNodes[self.streamNumber][shared.Peer(self.peer.host, self.remoteNodeIncomingPort)] = int(time.time())
+ shared.needToWriteKnownNodesToDisk = True
+ shared.knownNodesLock.release()
- self.sendverack()
- if self.initiatedConnection == False:
- self.sendversion()
+ self.sendverack()
+ if self.initiatedConnection == False:
+ self.sendversion()
# Sends a version message
def sendversion(self):
diff --git a/src/class_sendDataThread.py b/src/class_sendDataThread.py
index 7cb20c59..5aabaeb5 100644
--- a/src/class_sendDataThread.py
+++ b/src/class_sendDataThread.py
@@ -25,6 +25,7 @@ class sendDataThread(threading.Thread):
self.data = ''
self.objectHashHolderInstance = objectHashHolder(self.sendDataThreadQueue)
self.objectHashHolderInstance.start()
+ self.connectionIsOrWasFullyEstablished = False
def setup(
@@ -71,16 +72,6 @@ class sendDataThread(threading.Thread):
if data == self.peer or data == 'all':
with shared.printLock:
print 'sendDataThread (associated with', self.peer, ') ID:', id(self), 'shutting down now.'
-
- try:
- self.sock.shutdown(socket.SHUT_RDWR)
- self.sock.close()
- except:
- pass
- shared.sendDataQueues.remove(self.sendDataThreadQueue)
- with shared.printLock:
- print 'len of sendDataQueues', len(shared.sendDataQueues)
-
break
# When you receive an incoming connection, a sendDataThread is
# created even though you don't yet know what stream number the
@@ -89,12 +80,9 @@ class sendDataThread(threading.Thread):
# will continue on with the connection and will set the
# streamNumber of this send data thread here:
elif command == 'setStreamNumber':
- peerInMessage, specifiedStreamNumber = data
- if peerInMessage == self.peer:
- with shared.printLock:
- print 'setting the stream number in the sendData thread (ID:', id(self), ') to', specifiedStreamNumber
-
- self.streamNumber = specifiedStreamNumber
+ self.streamNumber = data
+ with shared.printLock:
+ print 'setting the stream number in the sendData thread (ID:', id(self), ') to', self.streamNumber
elif command == 'setRemoteProtocolVersion':
specifiedRemoteProtocolVersion = data
with shared.printLock:
@@ -103,6 +91,9 @@ class sendDataThread(threading.Thread):
elif command == 'advertisepeer':
self.objectHashHolderInstance.holdPeer(data)
elif command == 'sendaddr':
+ if not self.connectionIsOrWasFullyEstablished:
+ # not sending addr because we haven't sent and heard a verack from the remote node yet
+ return
numberOfAddressesInAddrMessage = len(
data)
payload = ''
@@ -127,17 +118,13 @@ class sendDataThread(threading.Thread):
self.lastTimeISentData = int(time.time())
except:
print 'sendaddr: self.sock.sendall failed'
- try:
- self.sock.shutdown(socket.SHUT_RDWR)
- self.sock.close()
- except:
- pass
- shared.sendDataQueues.remove(self.sendDataThreadQueue)
- print 'sendDataThread thread (ID:', str(id(self)) + ') ending now. Was connected to', self.peer
break
elif command == 'advertiseobject':
self.objectHashHolderInstance.holdHash(data)
elif command == 'sendinv':
+ if not self.connectionIsOrWasFullyEstablished:
+ # not sending inv because we haven't sent and heard a verack from the remote node yet
+ return
payload = ''
for hash in data:
if hash not in self.someObjectsOfWhichThisRemoteNodeIsAlreadyAware:
@@ -153,13 +140,6 @@ class sendDataThread(threading.Thread):
self.lastTimeISentData = int(time.time())
except:
print 'sendinv: self.sock.sendall failed'
- try:
- self.sock.shutdown(socket.SHUT_RDWR)
- self.sock.close()
- except:
- pass
- shared.sendDataQueues.remove(self.sendDataThreadQueue)
- print 'sendDataThread thread (ID:', str(id(self)) + ') ending now. Was connected to', self.peer
break
elif command == 'pong':
self.someObjectsOfWhichThisRemoteNodeIsAlreadyAware.clear() # To save memory, let us clear this data structure from time to time. As its function is to help us keep from sending inv messages to peers which sent us the same inv message mere seconds earlier, it will be fine to clear this data structure from time to time.
@@ -174,29 +154,26 @@ class sendDataThread(threading.Thread):
self.lastTimeISentData = int(time.time())
except:
print 'send pong failed'
- try:
- self.sock.shutdown(socket.SHUT_RDWR)
- self.sock.close()
- except:
- pass
- shared.sendDataQueues.remove(self.sendDataThreadQueue)
- print 'sendDataThread thread', self, 'ending now. Was connected to', self.peer
break
elif command == 'sendRawData':
try:
self.sock.sendall(data)
self.lastTimeISentData = int(time.time())
except:
- try:
- self.sock.shutdown(socket.SHUT_RDWR)
- self.sock.close()
- except:
- pass
- shared.sendDataQueues.remove(self.sendDataThreadQueue)
print 'Sending of data to', self.peer, 'failed. sendDataThread thread', self, 'ending now.'
break
+ elif command == 'connectionIsOrWasFullyEstablished':
+ self.connectionIsOrWasFullyEstablished = True
else:
with shared.printLock:
print 'sendDataThread ID:', id(self), 'ignoring command', command, 'because the thread is not in stream', deststream
+ try:
+ self.sock.shutdown(socket.SHUT_RDWR)
+ self.sock.close()
+ except:
+ pass
+ shared.sendDataQueues.remove(self.sendDataThreadQueue)
+ with shared.printLock:
+ print 'Number of queues remaining in sendDataQueues:', len(shared.sendDataQueues)
self.objectHashHolderInstance.close()
diff --git a/src/class_singleListener.py b/src/class_singleListener.py
index 5ff2ab7d..c5e0a1b6 100644
--- a/src/class_singleListener.py
+++ b/src/class_singleListener.py
@@ -39,6 +39,11 @@ class singleListener(threading.Thread):
return sock
def run(self):
+ # If there is a trusted peer then we don't want to accept
+ # incoming connections so we'll just abandon the thread
+ if shared.trustedPeer:
+ return
+
while shared.safeConfigGetBoolean('bitmessagesettings', 'dontconnect'):
time.sleep(1)
helper_bootstrap.dns()
diff --git a/src/defaultKnownNodes.py b/src/defaultKnownNodes.py
index 201e913d..bf98c351 100644
--- a/src/defaultKnownNodes.py
+++ b/src/defaultKnownNodes.py
@@ -11,17 +11,17 @@ def createDefaultKnownNodes(appdata):
############## Stream 1 ################
stream1 = {}
- stream1[shared.Peer('176.31.246.114', 8444)] = int(time.time())
- stream1[shared.Peer('109.229.197.133', 8444)] = int(time.time())
- stream1[shared.Peer('174.3.101.111', 8444)] = int(time.time())
- stream1[shared.Peer('90.188.238.79', 7829)] = int(time.time())
- stream1[shared.Peer('184.75.69.2', 8444)] = int(time.time())
- stream1[shared.Peer('60.225.209.243', 8444)] = int(time.time())
- stream1[shared.Peer('5.145.140.218', 8444)] = int(time.time())
- stream1[shared.Peer('5.19.255.216', 8444)] = int(time.time())
- stream1[shared.Peer('193.159.162.189', 8444)] = int(time.time())
- stream1[shared.Peer('86.26.15.171', 8444)] = int(time.time())
-
+ #stream1[shared.Peer('2604:2000:1380:9f:82e:148b:2746:d0c7', 8080)] = int(time.time())
+ stream1[shared.Peer('68.33.0.104', 8444)] = int(time.time())
+ stream1[shared.Peer('97.77.34.35', 8444)] = int(time.time())
+ stream1[shared.Peer('71.232.195.131', 8444)] = int(time.time())
+ stream1[shared.Peer('192.241.231.39', 8444)] = int(time.time())
+ stream1[shared.Peer('75.66.0.116', 8444)] = int(time.time())
+ stream1[shared.Peer('182.169.23.102', 8444)] = int(time.time())
+ stream1[shared.Peer('75.95.134.9', 8444)] = int(time.time())
+ stream1[shared.Peer('46.236.100.108', 48444)] = int(time.time())
+ stream1[shared.Peer('66.108.53.42', 8080)] = int(time.time())
+
############# Stream 2 #################
stream2 = {}
# None yet
diff --git a/src/helper_startup.py b/src/helper_startup.py
index abc4958f..fd14e528 100644
--- a/src/helper_startup.py
+++ b/src/helper_startup.py
@@ -12,6 +12,17 @@ from namecoin import ensureNamecoinOptions
storeConfigFilesInSameDirectoryAsProgramByDefault = False # The user may de-select Portable Mode in the settings if they want the config files to stay in the application data folder.
+def _loadTrustedPeer():
+ try:
+ trustedPeer = shared.config.get('bitmessagesettings', 'trustedpeer')
+ except ConfigParser.Error:
+ # This probably means the trusted peer wasn't specified so we
+ # can just leave it as None
+ return
+
+ host, port = trustedPeer.split(':')
+ shared.trustedPeer = shared.Peer(host, int(port))
+
def loadConfig():
if shared.appdata:
shared.config.read(shared.appdata + 'keys.dat')
@@ -90,6 +101,7 @@ def loadConfig():
shared.config.set('bitmessagesettings', 'userlocale', 'system')
shared.config.set('bitmessagesettings', 'useidenticons', 'True')
shared.config.set('bitmessagesettings', 'identiconsuffix', ''.join(random.choice("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") for x in range(12))) # a twelve character pseudo-password to salt the identicons
+ shared.config.set('bitmessagesettings', 'replybelow', 'False')
#start:UI setting to stop trying to send messages after X days/months
shared.config.set(
@@ -122,6 +134,8 @@ def loadConfig():
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
shared.config.write(configfile)
+ _loadTrustedPeer()
+
def isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections():
try:
VER_THIS=StrictVersion(platform.version())
@@ -130,4 +144,4 @@ def isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections():
return False
except Exception as err:
print 'An Exception occurred within isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections:', err
- return False
\ No newline at end of file
+ return False
diff --git a/src/shared.py b/src/shared.py
index 1ad5202e..96b9a7ce 100644
--- a/src/shared.py
+++ b/src/shared.py
@@ -92,6 +92,18 @@ namecoinDefaultRpcPort = "8336"
# binary distributions vs source distributions.
frozen = getattr(sys,'frozen', None)
+# If the trustedpeer option is specified in keys.dat then this will
+# contain a Peer which will be connected to instead of using the
+# addresses advertised by other peers. The client will only connect to
+# this peer and the timing attack mitigation will be disabled in order
+# to download data faster. The expected use case is where the user has
+# a fast connection to a trusted server where they run a BitMessage
+# daemon permanently. If they then run a second instance of the client
+# on a local machine periodically when they want to check for messages
+# it will sync with the network a lot faster without compromising
+# security.
+trustedPeer = None
+
def isInSqlInventory(hash):
queryreturn = sqlQuery('''select hash from inventory where hash=?''', hash)
return queryreturn != []
diff --git a/src/translations/bitmessage_de.ts b/src/translations/bitmessage_de.ts
index 880c9e67..77b90908 100644
--- a/src/translations/bitmessage_de.ts
+++ b/src/translations/bitmessage_de.ts
@@ -5,17 +5,17 @@
- Neuen Eintrag erstellen
+ Neuen Eintrag erstellen
-
+ Name oder Bezeichnung
- Adresse
+ Adresse
@@ -153,7 +153,7 @@
- Problem: Die vom Empfänger geforderte Arbeit ist schwerer als Sie bereit sind zu berechnen. %1
+ Problem: Die vom Empfänger geforderte Arbeit ist schwerer als Sie bereit sind, zu berechnen. %1
@@ -686,7 +686,7 @@ p, li { white-space: pre-wrap; }
- Das Adressbuch ist nützlich um die Bitmessage-Adressen anderer Personen Namen oder Beschreibungen zuzuordnen, so dass Sie sie einfacher im Posteingang erkennen können. Sie können Adressen über "Hinzufügen" eintragen, oder über einen Rechtsklick auf eine Nachricht im Posteingang.
+ Das Adressbuch ist nützlich, um die Bitmessage-Adressen anderer Personen Namen oder Beschreibungen zuzuordnen, sodass Sie sie einfacher im Posteingang erkennen können. Sie können Adressen über "Neuen Eintrag erstellen" hinzufügen, oder über einen Rechtsklick auf eine Nachricht im Posteingang.
@@ -946,7 +946,7 @@ p, li { white-space: pre-wrap; }
-
+ Avatar wählen...
@@ -966,7 +966,7 @@ p, li { white-space: pre-wrap; }
-
+ Inventory lookups pro Sekunde: %1
@@ -981,12 +981,12 @@ p, li { white-space: pre-wrap; }
-
+ Wollen Sie diesen Avatar wirklich entfernen?
-
+ Sie haben bereits einen Avatar für diese Adresse gewählt. Wollen Sie ihn wirklich überschreiben?
@@ -1040,7 +1040,7 @@ p, li { white-space: pre-wrap; }
-
+ Inventory lookups pro Sekunde: 0
@@ -1130,7 +1130,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- (zum generieren der erste Adresse empfohlen)
+ (Zum Generieren der ersten Adresse empfohlen)
@@ -1145,7 +1145,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Adress-Versionsnummer: 4
+ Adress-Versionsnummer: 4
@@ -1275,7 +1275,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Bei Bitmessage handelt es sich um ein kollaboratives Projekt, Hilfe finden Sie online in Bitmessage-Wiki:
+ Bitmessage ist ein kollaboratives Projekt. Hilfe finden Sie online im Bitmessage-Wiki:
@@ -1293,7 +1293,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Sie haben mindestes eine Verbindung mit einem Netzwerkteilnehmer über eine ausgehende Verbindung, aber Sie haben noch keine eingehende Verbindung. Ihre Firewall oder Router ist vermutlich nicht richtig konfiguriert um eingehende TCP-Verbindungen an Ihren Computer weiterzuleiten. Bittmessage wird gut funktionieren, jedoch helfen Sie dem Netzwerk, wenn Sie eingehende Verbindungen erlauben. Es hilft auch Ihnen schneller und mehr Verbindungen ins Netzwerk aufzubauen.
+ Sie haben mindestes eine Verbindung mit einem Netzwerkteilnehmer über eine ausgehende Verbindung, aber Sie haben noch keine eingehende Verbindung. Ihre Firewall oder Ihr Router ist vermutlich nicht richtig konfiguriert, um eingehende TCP-Verbindungen an Ihren Computer weiterzuleiten. Bitmessage wird gut funktionieren, jedoch helfen Sie dem Netzwerk, wenn Sie eingehende Verbindungen erlauben. Es hilft auch Ihnen schneller und mehr Verbindungen ins Netzwerk aufzubauen.
@@ -1336,7 +1336,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- <html><head/><body><p>Ein Chan existiert, wenn eine Gruppe von Leuten sich den gleichen Entschlüsselungscode teilen. Die Schlüssel und Bitmessage-Adressen werden basierend auf einem lesbaren Wort oder Satz generiert (Dem Chan-Namen). Um eine Nachricht an den Chan zu senden, senden Sie eine normale Person-zu-Person-Nachricht an die Chan-Adresse.</p><p>Chans sind experimentell and völlig unmoderierbar.</p><br></body></html>
+ <html><head/><body><p>Ein Chan existiert, wenn eine Gruppe von Leuten sich den gleichen Entschlüsselungscode teilen. Die Schlüssel und Bitmessage-Adressen werden basierend auf einem lesbaren Wort oder Satz generiert (dem Chan-Namen). Um eine Nachricht an den Chan zu senden, senden Sie eine normale Person-zu-Person-Nachricht an die Chan-Adresse.</p><p>Chans sind experimentell und völlig unmoderierbar.</p><br></body></html>
@@ -1346,7 +1346,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- <html><head/><body><p>Geben Sie einen Namen für Ihren Chan ein. Wenn Sie einen ausreichend komplexen Chan-Namen wählen (Wie einen starkes und einzigartigen Kennwortsatz) und keiner Ihrer Freunde ihn öffentlich weitergibt, wird der Chan sicher und privat bleiben. Wenn eine andere Person einen Chan mit dem gleichen Namen erzeugt, werden diese zu einem Chan.</p><br></body></html>
+ <html><head/><body><p>Geben Sie einen Namen für Ihren Chan ein. Wenn Sie einen ausreichend komplexen Chan-Namen wählen (wie einen starken, einzigartigen Kennwortsatz) und keiner Ihrer Freunde ihn öffentlich weitergibt, wird der Chan sicher und privat bleiben. Wenn eine andere Person einen Chan mit dem gleichen Namen erzeugt, werden diese zu einem Chan.</p><br></body></html>
@@ -1369,7 +1369,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Anzahl der Adressen die basierend auf diesem Kennwortsatz erzeugt werden sollen:
+ Anzahl der Adressen, die basierend auf diesem Kennwortsatz erzeugt werden sollen:
@@ -1384,7 +1384,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Stream Nummer:
+ Stream-Nummer:
@@ -1394,7 +1394,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Verwenden Sie einige Minuten extra Rechenleistung um die Adresse(n) ein bis zwei Zeichen kürzer zu machen
+ Verwenden Sie einige Minuten extra Rechenleistung, um die Adresse(n) ein bis zwei Zeichen kürzer zu machen
@@ -1404,12 +1404,12 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Wenn Sie bereits deterministische Adressen erstellt haben, aber diese durch einen Unfall wie eine defekte Festplatte verloren haben, können Sie sie hier regenerieren. Wenn Sie den Zufallsgenerator verwendet haben um Ihre Adressen erstmals zu erstellen, kann dieses Formular Ihnen nicht helfen.
+ Wenn Sie bereits deterministische Adressen erstellt haben, aber diese durch einen Unfall (zum Beispiel durch eine defekte Festplatte) verloren haben, können Sie sie hier regenerieren. Dies funktioniert nur dann, wenn Sie bei der erstmaligen Erstellung Ihrer Adressen nicht den Zufallsgenerator verwendet haben.
-
+ Adress-Versionsnummer:
@@ -1427,7 +1427,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Bitmessage minimiert starten (Zeigt das Hauptfenster nicht an)
+ Bitmessage minimiert starten (zeigt das Hauptfenster nicht an)
@@ -1442,12 +1442,12 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- In portablem Modus arbeiten
+ Im portablen Modus arbeiten
- Im portablen Modus werden Nachrichten und Konfigurationen im gleichen Ordner abgelegt, wie sich das Programm selbst befindet anstelle im normalen Anwendungsdaten-Ordner. Das macht es möglich Bitmessage auf einem USB-Stick zu betreiben.
+ Im portablen Modus werden Nachrichten und Konfigurationen im gleichen Ordner abgelegt, in dem sich das Programm selbst befindet (anstatt im normalen Anwendungsdaten-Ordner). Das macht es möglich, Bitmessage auf einem USB-Stick zu betreiben.
@@ -1522,7 +1522,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Wenn jemand Ihnen eine Nachricht schickt, muss der absendende Computer erst einige Arbeit verrichten. Die Schwierigkeit dieser Arbeit ist standardmäßig 1. Sie können diesen Wert für alle neuen Adressen, die Sie generieren hier ändern. Es gibt eine Ausnahme: Wenn Sie einen Freund oder Bekannten in Ihr Adressbuch übernehmen, wird Bitmessage ihn mit der nächsten Nachricht automatisch informieren, dass er nur noch die minimale Arbeit verrichten muss: Schwierigkeit 1.
+ Wenn jemand Ihnen eine Nachricht schickt, muss der absendende Computer erst einige Arbeit verrichten. Die Schwierigkeit dieser Arbeit ist standardmäßig 1. Sie können diesen Wert für alle neuen Adressen, die Sie generieren, hier ändern. Es gibt eine Ausnahme: Wenn Sie einen Freund oder Bekannten in Ihr Adressbuch übernehmen, wird Bitmessage ihn mit der nächsten Nachricht automatisch informieren, dass er nur noch die minimale Arbeit verrichten muss: Schwierigkeit 1.
@@ -1537,12 +1537,12 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Die "Schwierigkeit für kurze Nachrichten" trifft nur auf das senden kurzen Nachrichten zu. Verdoppelung des Wertes macht es fast doppelt so schwer kurze Nachrichten zu senden, aber hat keinen Effekt bei langen Nachrichten.
+ Die "Schwierigkeit für kurze Nachrichten" trifft nur auf das Senden kurzer Nachrichten zu. Verdoppelung dieses Wertes macht es fast doppelt so schwer, kurze Nachrichten zu senden, aber hat keinen Effekt bei langen Nachrichten.
- Die "Gesammtschwierigkeit" beeinflusst die absolute menge Arbeit die ein Sender verrichten muss. Verdoppelung dieses Wertes verdoppelt die Menge der Arbeit.
+ Die "Gesamtschwierigkeit" beeinflusst die absolute Menge Arbeit, die ein Sender verrichten muss. Verdoppelung dieses Wertes verdoppelt die Menge der Arbeit.
@@ -1557,7 +1557,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Maximale akzeptierte Gesammtschwierigkeit:
+ Maximale akzeptierte Gesamtschwierigkeit:
@@ -1572,7 +1572,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- Auf eingehende Verdindungen warten, auch wenn eine Proxy-Server verwendet wird
+ Auf eingehende Verdindungen warten, auch wenn ein Proxy-Server verwendet wird
@@ -1582,7 +1582,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
- <html><head/><body><p>Bitmessage kann ein anderes Bitcoin basiertes Programm namens Namecoin nutzen um Adressen leserlicher zu machen. Zum Beispiel: Anstelle Ihrem Bekannten Ihre lange Bitmessage-Adresse vorzulesen, können Sie ihm einfach sagen, er soll eine Nachricht an <span style=" font-style:italic;">test </span>senden.</p><p> (Ihre Bitmessage-Adresse in Namecoin zu speichern ist noch sehr umständlich)</p><p>Bitmessage kann direkt namecoind verwenden, oder eine nmcontrol Instanz.</p></body></html>
+ <html><head/><body><p>Bitmessage kann ein anderes Bitcoin basiertes Programm namens Namecoin nutzen, um Adressen leserlicher zu machen. Zum Beispiel: Anstelle Ihrem Bekannten Ihre lange Bitmessage-Adresse vorzulesen, können Sie ihm einfach sagen, er soll eine Nachricht an <span style=" font-style:italic;">test </span>senden.</p><p> (Ihre Bitmessage-Adresse in Namecoin zu speichern ist noch sehr umständlich)</p><p>Bitmessage kann direkt namecoind verwenden, oder eine nmcontrol Instanz.</p></body></html>
diff --git a/src/translations/bitmessage_ja.pro b/src/translations/bitmessage_ja.pro
new file mode 100644
index 00000000..f6e5ad63
--- /dev/null
+++ b/src/translations/bitmessage_ja.pro
@@ -0,0 +1,33 @@
+SOURCES = ../addresses.py\
+ ../bitmessagemain.py\
+ ../class_addressGenerator.py\
+ ../class_outgoingSynSender.py\
+ ../class_receiveDataThread.py\
+ ../class_sendDataThread.py\
+ ../class_singleCleaner.py\
+ ../class_singleListener.py\
+ ../class_singleWorker.py\
+ ../class_sqlThread.py\
+ ../helper_bitcoin.py\
+ ../helper_bootstrap.py\
+ ../helper_generic.py\
+ ../helper_inbox.py\
+ ../helper_sent.py\
+ ../helper_startup.py\
+ ../shared.py\
+ ../bitmessageqt/__init__.py\
+ ../bitmessageqt/about.py\
+ ../bitmessageqt/bitmessageui.py\
+ ../bitmessageqt/connect.py\
+ ../bitmessageqt/help.py\
+ ../bitmessageqt/iconglossary.py\
+ ../bitmessageqt/newaddressdialog.py\
+ ../bitmessageqt/newchandialog.py\
+ ../bitmessageqt/newsubscriptiondialog.py\
+ ../bitmessageqt/regenerateaddresses.py\
+ ../bitmessageqt/settings.py\
+ ../bitmessageqt/specialaddressbehavior.py
+
+
+TRANSLATIONS = bitmessage_ja.ts
+CODECFORTR = UTF-8
diff --git a/src/translations/bitmessage_ja.qm b/src/translations/bitmessage_ja.qm
new file mode 100644
index 00000000..0d78d13d
Binary files /dev/null and b/src/translations/bitmessage_ja.qm differ
diff --git a/src/translations/bitmessage_ja.ts b/src/translations/bitmessage_ja.ts
new file mode 100644
index 00000000..da9edc69
--- /dev/null
+++ b/src/translations/bitmessage_ja.ts
@@ -0,0 +1,1463 @@
+
+
+
+
+ MainWindow
+
+
+
+ %1は古いバージョン1のアドレスです。バージョン1のアドレスはサポートが終了しています。すぐに削除しますか?
+
+
+
+
+ .
+ 返信
+
+
+
+
+ 送信元をアドレス帳に追加
+
+
+
+
+ ゴミ箱へ移動
+
+
+
+
+ HTMLコードを整形したテキストで表示
+
+
+
+
+ 形式を選択してメッセージを保存
+
+
+
+
+ 未読にする
+
+
+
+
+ 新規
+
+
+
+
+ 有効
+
+
+
+
+ 無効
+
+
+
+
+ アドレスをコピー
+
+
+
+
+ アドレスの特別な動作
+
+
+
+
+ このアドレスへ送信
+
+
+
+
+ このアドレスを購読
+
+
+
+
+ アドレスを追加
+
+
+
+
+ 削除
+
+
+
+
+ 宛先アドレスをコピー
+
+
+
+
+ 強制的に送信
+
+
+
+
+ 新しい項目を追加
+
+
+
+
+ 起動日時 %1
+
+
+
+
+ 暗号化キーを待っています。再度リクエストします。
+
+
+
+
+ 暗号鍵のリクエストはキューに入りました。
+
+
+
+
+ キューに入りました。
+
+
+
+
+ メッセージは送信されました。確認街です。送信先: %1
+
+
+
+
+ メッセージは送信されました。送信先: %1
+
+
+
+
+ 送信のために処理を行う必要があります。処理はキューに入りました。
+
+
+
+
+ メッセージの確認を受け取りました %1
+
+
+
+
+ Broadcastがキューに入りました。
+
+
+
+
+ Broadcast: %1
+
+
+
+
+ 問題: 受信者が要求している処理は現在あなたが設定しているよりも高い難易度です。 %1
+
+
+
+
+ 問題: 受信者の暗号鍵は正当でない物です。メッセージを暗号化できません。 %1
+
+
+
+
+ 難易度を強制上書きしました。まもなく送信されます。
+
+
+
+
+ 不明なステータス: %1 %2
+
+
+
+
+ 未接続
+
+
+
+
+ Bitmessageを表示
+
+
+
+
+ 送る
+
+
+
+
+ 購読
+
+
+
+
+ アドレス帳
+
+
+
+
+ 終了
+
+
+
+
+ プログラムを同じディレクトリに保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。
+
+
+
+
+ %1に保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。
+
+
+
+
+ keys.datを開きますか?
+
+
+
+
+ プログラムを同じディレクトリに保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。すぐにファイルを開きますか?(必ず編集する前にBitmessageを終了してください)
+
+
+
+
+ %1に保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。すぐにファイルを開きますか?(必ず編集する前にBitmessageを終了してください)
+
+
+
+
+ ゴミ箱を空にしますか?
+
+
+
+
+ ゴミ箱内のメッセージを全て削除してもよろしいですか?
+
+
+
+
+ 不正なパスフレーズ
+
+
+
+
+ パスフレーズを入力してください。パスフレーズがない場合は入力する必要はありません。
+
+
+
+
+ Chan名が必要です
+
+
+
+
+ chan名が入力されていません。
+
+
+
+
+ アドレスは既に表示されています
+
+
+
+
+ chanを追加できません。既にアドレス一覧に含まれています。
+
+
+
+
+ 成功
+
+
+
+
+ chanの作成に成功しました。他の人がchanに参加できるようにするには、chanの名前とBitmessageアドレスを伝えてください: %1 アドレスは「アドレス一覧」に表示されます。
+
+
+
+
+ アドレスが新しすぎます
+
+
+
+
+ このBitmessageアドレスは正当ですが、バージョン番号が現在使用中の物より新しいです。Bitmessageをアップデートしてください。
+
+
+
+
+ アドレスが不正です
+
+
+
+
+ このBitmessageアドレスは不正です。
+
+
+
+
+ アドレスがchan名と一致しません
+
+
+
+
+ このBitmessageアドレスは正当ですが、chan名と一致していません。
+
+
+
+
+ chanに参加しました。
+
+
+
+
+ %1 通の1対1のメッセージを処理しました。
+
+
+
+
+ %1 件のBroadcastメッセージを処理しました。
+
+
+
+
+ %1 件の公開鍵を処理しました。
+
+
+
+
+ 接続数: %1
+
+
+
+
+ 接続が切断されました
+
+
+
+
+ 接続済み
+
+
+
+
+ メッセージが削除されました
+
+
+
+
+ エラー: Bitmessageアドレスは「BM-」で始まります。確認してください %1
+
+
+
+
+ エラー: アドレス %1 は正しく入力、またはコピーされていません。確認して下さい。
+
+
+
+
+ エラー: アドレス %1 は不正な文字を含んでいます。確認して下さい。
+
+
+
+
+ エラー: アドレスのバージョン %1 は現在使用中の物より新しいです。Bitmessageをアップデートする必要があるか、連絡先がより賢いです。
+
+
+
+
+ エラー: アドレス %1 でエンコードされたデータが短すぎます。連絡先のソフトウェアが何かしら誤っている可能性があります。
+
+
+
+
+ エラー: アドレス %1 でエンコードされたデータが長すぎます。連絡先のソフトウェアが何かしら誤っている可能性があります。
+
+
+
+
+ エラー: アドレス %1 には何かしら誤りがあります。
+
+
+
+
+ エラー: 送信元アドレスを指定してください。まだ作成していない場合には「アドレス一覧」のタブを開いてください。
+
+
+
+
+ アドレスへ送信中
+
+
+
+
+ エラー: 送信先アドレス %1 は自分自身のアドレスです。Bitmessageクライアントは自分自身へのメッセージを処理できません。別のPCか仮想マシン上でクライアントを立ち上げてください。
+
+
+
+
+ アドレスのバージョン番号
+
+
+
+
+ アドレス %1 に接続。%2 のバージョン番号は処理できません。Bitmessageを最新のバージョンへアップデートしてください。
+
+
+
+
+ ストリーム番号
+
+
+
+
+ アドレス %1 に接続。%2 のストリーム番号は処理できません。Bitmessageを最新のバージョンへアップデートしてください。
+
+
+
+
+ 警告: 接続されていません。Bitmessageはメッセージの処理を行いますが、ネットワークに接続するまで送信はされません。
+
+
+
+
+ 宛先が指定されていません。
+
+
+
+
+ 処理がキューに入りました。
+
+
+
+
+ アドレス帳から一つ、または複数のアドレスを右クリックして「このアドレスへ送信」を選んでください。
+
+
+
+
+ namecoin IDからアドレスを取得。
+
+
+
+
+ 処理がキューに入りました。 %1
+
+
+
+
+ 新規メッセージ
+
+
+
+
+ 送信元
+
+
+
+
+ アドレスが不正です。
+
+
+
+
+ 入力されたアドレスは不正です。無視されました。
+
+
+
+
+ エラー: 同じアドレスを複数アドレス帳に追加する事はできません。既存の項目をリネームしてください。
+
+
+
+
+ エラー: 同じアドレスを複数購読リストに追加する事はできません。既存の項目をリネームしてください。
+
+
+
+
+ 再開
+
+
+
+
+ ポート番号の変更を有効にするにはBitmessageを再起動してください。
+
+
+
+
+ プロキシの設定を有効にするには手動でBitmessageを再起動してください。既に接続がある場合は切断されます。
+
+
+
+
+ エラー: 同じアドレスを複数リストに追加する事はできません。既存の項目をリネームしてください。
+
+
+
+
+ パスフレーズが一致しません
+
+
+
+
+ 再度入力されたパスフレーズが一致しません。再入力してください。
+
+
+
+
+ パスフレーズを選択してください
+
+
+
+
+ パスフレーズが必要です。
+
+
+
+
+ 完了しました。ユーザーインターフェースを閉じています。
+
+
+
+
+ アドレスが無効になりました
+
+
+
+
+ アドレス %1 が見つかりません。既に削除していませんか?
+
+
+
+
+ アドレスが無効になりました
+
+
+
+
+ エラー: 送信しようとしたアドレスは無効になっています。使用する前に「アドレス一覧」で有効にしてください。
+
+
+
+
+ アドレス帳に項目が追加されました。ラベルは自由に編集できます。
+
+
+
+
+ アイテムをゴミ箱へ移動。ゴミ箱の内容を表示する画面はありませんが、もし元に戻したくなった場合に備えてディスク上に残されます。
+
+
+
+
+ 形式を選択して保存
+
+
+
+
+ 書き込みエラー。
+
+
+
+
+ アドレスが未選択です。
+
+
+
+
+ 現在のOS上で未実装、または実装できないためオプションは無効化されました。
+
+
+
+
+ テスト中
+
+
+
+
+ chanアドレスは仮想メーリングリストのアドレスには使用できません。
+
+
+
+
+ アドレスは「BM-」から始まります
+
+
+
+
+ このアドレスは正しく入力、またはコピーされていません。(チェックサムが一致しません)。
+
+
+
+
+ このアドレスのバージョン番号はこのプログラムのサポート範囲外です。Bitmessageをアップデートしてください。
+
+
+
+
+ 入力されたアドレスは不正な文字を含んでいます。
+
+
+
+
+ このアドレスでエンコードされたデータが短すぎます。
+
+
+
+
+ このアドレスでエンコードされたデータが長過ぎます。
+
+
+
+
+ 使用中のポート %1 (設定で変更できます)。
+
+
+
+
+
+
+
+
+
+ 検索
+
+
+
+
+ 全て
+
+
+
+
+ 宛先
+
+
+
+
+ 送信元
+
+
+
+
+ 題名
+
+
+
+
+ メッセージ
+
+
+
+
+ 受信日時
+
+
+
+
+ 受信箱
+
+
+
+
+ アドレス帳から読み込み
+
+
+
+
+ namecoin IDを取得
+
+
+
+
+ メッセージ:
+
+
+
+
+ 題名:
+
+
+
+
+ 一人、または複数のユーザーへ送信
+
+
+
+
+
+
+
+
+
+ 宛先:
+
+
+
+
+ 送信元:
+
+
+
+
+ 自分のアドレスを購読しているユーザー全員へ配信する
+
+
+
+
+ broadcastはあなたのアドレスのみで暗号化されます。あなたのアドレスを知っている人は全て読むことができます。
+
+
+
+
+ 状態
+
+
+
+
+ 送信済み
+
+
+
+
+ ラベル(他の人からは見えません)
+
+
+
+
+ アドレス
+
+
+
+
+ ストリーム
+
+
+
+
+ アドレス一覧
+
+
+
+
+ 他のユーザが送信した「broadcastメッセージ」を購読できます。メッセージは受信箱に表示されます。このリストのアドレスはブラックリストより優先されます。
+
+
+
+
+ 購読先を追加
+
+
+
+
+ ラベル
+
+
+
+
+ 購読リスト
+
+
+
+
+ アドレス帳は他のユーザのBitmessageアドレスにラベルや名前をつけることで受信箱を見やすくします。「追加」ボタンを押すか受信箱でメッセージを右クリックしてください。
+
+
+
+
+ 名前、ラベル
+
+
+
+
+ ブラックリストを使用(全てのメッセージを受信してブラックリストと一致する物だけ除外)
+
+
+
+
+ ホワイトリストを使用(全てのメッセージを受信拒否してホワイトリストと一致する物だけ許可)
+
+
+
+
+ ブラックリスト
+
+
+
+
+ ストリーム #
+
+
+
+
+ 接続
+
+
+
+
+ 接続数: 0
+
+
+
+
+ 起動してから asdf:
+
+
+
+
+ 0 通の1対1のメッセージを処理しました。
+
+
+
+
+ 0 件の公開鍵を処理しました。
+
+
+
+
+ 0 件のBroadcastメッセージを処理しました。
+
+
+
+
+ ネットワークの状態
+
+
+
+
+ ファイル
+
+
+
+
+ 設定
+
+
+
+
+ ヘルプ
+
+
+
+
+ 鍵をインポート
+
+
+
+
+ 鍵を管理
+
+
+
+
+ Ctrrl+Q
+
+
+
+
+
+
+
+
+
+ 概要
+
+
+
+
+ 「決定論的アドレス」ともヤクセルが
+ deterministicアドレスを再生成
+
+
+
+
+ ゴミ箱のメッセージを全て削除する
+
+
+
+
+ chanに参加 / 作成
+
+
+
+ NewAddressDialog
+
+
+
+ 新しいアドレスを作成
+
+
+
+
+ 複数のアドレスを生成できます。アドレスを自由に生成、破棄することができます。アドレスは乱数かパスフレーズを使って生成できます。もしパスフレーズを使う場合、アドレスはdeterministicアドレスになります。デフォルトでは乱数による生成が選択されますが、deterministicアドレスにも長所と短所があります:
+
+
+
+
+ <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>
+
+
+
+
+ アドレスの生成に乱数ジェネレーターを使う
+
+
+
+
+ Use yee passpharase to make arrddresses
+
+
+
+
+ アドレスを1、2文字短くするために数分間追加の計算処理を行う
+
+
+
+
+ deterministicアドレスを作る
+
+
+
+
+ アドレスのバージョン番号: 3
+
+
+
+
+ パスフレーズに加えて、これらの値を覚えておいてください:
+
+
+
+
+ パスフレーズ
+
+
+
+
+ パスフレーズから生成されたアドレスの数:
+
+
+
+
+ ストリーム数: 1
+
+
+
+
+ パスフレーズを再入力
+
+
+
+
+ ランダムなアドレスを生成する
+
+
+
+
+ ラベル(他の人からは見えません)
+
+
+
+
+ 最も有効なストリームを使う
+
+
+
+
+ (もしこれから複数のアドレスを生成するのであれば、最初の一つに最適です。)
+
+
+
+
+ 既存のアドレスと同じストリームを利用する
+
+
+
+
+ (帯域と処理能力を節約する)
+
+
+
+
+ アドレスの作成にパスフレーズを使う
+
+
+
+ NewSubscriptionDialog
+
+
+
+ 新しい項目を追加
+
+
+
+
+ ラベル
+
+
+
+
+ アドレス
+
+
+
+ SpecialAddressBehaviorDialog
+
+
+
+ アドレスの特別な動作
+
+
+
+
+ 通常のアドレスにする
+
+
+
+
+ 仮想メーリングリストとして使用する
+
+
+
+
+ 仮想メーリングリストのアドレスが受信したアドレスは自動的に購読するユーザーに配信(公開)されます。
+
+
+
+
+ 仮想メーリングリストの名前:
+
+
+
+ aboutDialog
+
+
+
+
+
+
+
+
+ Version ?
+
+
+
+
+ 概要
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ このソフトウェアはベータ版です。
+
+
+
+ connectDialog
+
+
+
+
+
+
+
+
+ Bitmessageはあなたが操作しない限りどこへも接続しません。
+
+
+
+
+ 接続
+
+
+
+
+ 最初に特別なネットワークの設定を行ってください
+
+
+
+ helpDialog
+
+
+
+ ヘルプ
+
+
+
+
+ <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a>
+
+
+
+
+ Bitmessageは協働プロジェクトです。ヘルプはBitmessage Wikiを参照してください:
+
+
+
+ iconGlossaryDialog
+
+
+
+ アイコン一覧
+
+
+
+
+ 他のpeerへ接続されていません。
+
+
+
+
+ Yee have made least one connection to a peer pirate usin' outgoing connection but yee not yet received any incoming connections. Yee firewall, witches nest, or home router probably shant configured to foward incoming TCP connections to yee computer. Bitmessage be workin' just fine but it help fellow pirates if yee allowed for incoming connections and will help yee be a better-connected node matey.
+
+
+
+
+ 使用中のポート ? (設定で変更できます)。
+
+
+
+
+ ファイアーウォールを適切に設定し、他のpeerへ接続してください。
+
+
+
+
+ 発信接続のために1つ以上のピアへ接続を行っていますが、まだ着信接続を受け取っていません。ファイアーウォールかホームルーターが外部からこのコンピューターへのTCP接続を受け取れるように設定されていないかも知れません。Bitmessageは正常に動作しますが、外部からの接続を許可してより良く接続されたノードになることはBitmessageネットワークへの助けになります。
+
+
+
+ newChanDialog
+
+
+
+ ダイアログ
+
+
+
+
+ 新しいchanを作成
+
+
+
+
+ chanに参加
+
+
+
+
+ chanを作成
+
+
+
+
+ <html><head/><body><p>chan名を入力してください。(強くて一意のパスフレーズのように)十分に複雑なchan名を選び、あなたの友人たちがそれを他人に教えない限りchanはセキュアでプライベートです。あなたと他の誰かが同じ名前のchanを作成した場合、現状では同じchanになる可能性が非常に高い。</p></body></html>
+
+
+
+
+ Chan名:
+
+
+
+
+ <html><head/><body><p>chanは人々のグループに復号鍵を共有されることで存在します。chanで使われる鍵とBitmessageアドレスは読みやすい単語、またはフレーズ(chan名)から生成されます。chanに居る人たちへメッセージを送るには、通常の一対一のメッセージをchanアドレスへ送ります。</p><p>chansは実験的機能で、内容を管理するモデレーターを設けることはできません。</p></body></html>
+
+
+
+
+ chanのbitmessageアドレス:
+
+
+
+ regenerateAddressesDialog
+
+
+
+ 既存のアドレスを再生成する
+
+
+
+
+ 既存のアドレスを再生成する
+
+
+
+
+ パスフレーズ
+
+
+
+
+ パスフレーズから生成されたアドレスの数:
+
+
+
+
+ アドレスのバージョン番号:
+
+
+
+
+
+
+
+
+
+ ストリーム数:
+
+
+
+
+
+
+
+
+
+ アドレスを1、2文字短くするために数分間追加の計算処理を行う
+
+
+
+
+ もしあなたが初めてアドレスを作ったのであればこのボックスをチェックする必要があります。(そうでない場合はしないでください)。
+
+
+
+
+ もし以前にdeterministicアドレスを作ったことがあり、何かしらのトラブル(ハードディスクの故障のような)でそれを紛失していた場合、ここで再生成することができます。もし乱数でアドレスを作っていたのであればこのフォームは再生成には使えません。
+
+
+
+ settingsDialog
+
+
+
+ 設定
+
+
+
+
+ ユーザのログイン時にBitmessageを起動
+
+
+
+
+ Bitmessageをトレイ内で起動する(メインウィンドウを表示しない)
+
+
+
+
+ タスクトレイへ最小化
+
+
+
+
+ メッセージの受信時に通知する
+
+
+
+
+ ポータブルモードで実行
+
+
+
+
+ ポータブルモード時、メッセージと設定ファイルは通常のアプリケーションデータのフォルダではなく同じディレクトリに保存されます。これによりBitmessageをUSBドライブから実行できます。
+
+
+
+
+ ユーザインターフェース
+
+
+
+
+ リスニングポート
+
+
+
+
+ 接続を待つポート:
+
+
+
+
+ プロキシサーバー/Tor
+
+
+
+
+ タイプ:
+
+
+
+
+ 無し
+
+
+
+
+ SOCKS4a
+
+
+
+
+ SOCKS5
+
+
+
+
+ サーバーホスト名:
+
+
+
+
+ ポート:
+
+
+
+
+ 認証
+
+
+
+
+ ユーザー名:
+
+
+
+
+ パス:
+
+
+
+
+ ネットワーク設定
+
+
+
+
+ 誰かがあなたにメッセージを送る時、相手のコンピューターはいくらか計算処理を行います。処理の難易度はデフォルトでは1です。この値を変更すると新しいアドレスではこのデフォルト値を引き上げることができます。その場合、新しいアドレスはメッセージの送信者により高い難易度を要求します。例外もあります: 友人や知り合いをアドレス帳に登録すると、Bitmessageは次にメッセージを送る際、自動的に要求される処理の難易度を最低限の1で済むように通知します。
+
+
+
+
+ 全体の難易度:
+
+
+
+
+ 小さいメッセージの難易度:
+
+
+
+
+ 「小さいメッセージの難易度」は小さいメッセージを行う時にだけ影響します。この値を二倍にすれば小さなメッセージに必要な処理の難易度は二倍になりますが、実際にはデータ量の多いメッセージには影響しません。
+
+
+
+
+ 「全体の難易度」は完全に全てのメッセージに影響します。この値を二倍にすると処理量も二倍になります。
+
+
+
+
+ 要求される難易度
+
+
+
+
+ 携帯端末にメッセージを送る時は暗号化されていないアドレスを許可する
+
+
+
+
+ 自動的に設定された言語・地域を上書きする(国コード、または言語コードを入力。例:「en_US」または「en」):
+
+
+
+
+ プロキシ使用時に外部からの接続を待機する
+
+
+
+
+ ここでは他のユーザーへメッセージを送る際に行うことを許可する処理量の上限を設定します。0を設定するとどんな量でも許容します。
+
+
+
+
+ 許可する難易度の上限:
+
+
+
+
+ 小さなメッセージに許可する難易度の上限:
+
+
+
+
+ 許可する最大の難易度
+
+
+
+
+ <html><head/><body><p>Bitmessageはアドレスを読みやすくするため、NamecoinというBitcoinベースの別のプログラムを利用できます。例えば、あなたの友人に長いBitmessageアドレスを伝える代わりに、単純に<span style=" font-style:italic;">テスト</span>でメッセージを送るよう伝えることができます。</p><p>(Bitmessageアドレスを独自にNamecoinにするのはかなり難しいです)。</p><p>Bitmessageは直接namecoindを使うか、nmcontrolインスタンスを使うことができます。</p></body></html>
+
+
+
+
+ ホスト:
+
+
+
+
+ パスワード:
+
+
+
+
+ テスト
+
+
+
+
+ 接続先:
+
+
+
+
+ Namecoind
+
+
+
+
+ NMControl
+
+
+
+
+ Namecoin連携
+
+
+
diff --git a/src/translations/bitmessage_ru.ts b/src/translations/bitmessage_ru.ts
index fcde0d02..e72011ca 100644
--- a/src/translations/bitmessage_ru.ts
+++ b/src/translations/bitmessage_ru.ts
@@ -1,11 +1,12 @@
-
+
+
AddAddressDialog
- Добавить новую запись
+ Добавить новую запись
@@ -1239,7 +1240,7 @@ The 'Random Number' option is selected by default but deterministic ad
версия ?
-
+
Копирайт © 2013 Джонатан Уоррен
@@ -1256,7 +1257,7 @@ The 'Random Number' option is selected by default but deterministic ad
-
+
@@ -1672,7 +1673,7 @@ The 'Random Number' option is selected by default but deterministic ad
-
+
fr
Francais
@@ -1684,13 +1685,13 @@ The 'Random Number' option is selected by default but deterministic ad
-
+
es
Espanol
-
+
ru
Русский
@@ -1713,13 +1714,13 @@ The 'Random Number' option is selected by default but deterministic ad
-
+
es
-
+
ru
diff --git a/src/translations/bitmessage_zh_cn.qm b/src/translations/bitmessage_zh_cn.qm
index dce69347..3f894afd 100644
Binary files a/src/translations/bitmessage_zh_cn.qm and b/src/translations/bitmessage_zh_cn.qm differ
diff --git a/src/translations/bitmessage_zh_cn.ts b/src/translations/bitmessage_zh_cn.ts
index 1812e4bf..adc055e5 100644
--- a/src/translations/bitmessage_zh_cn.ts
+++ b/src/translations/bitmessage_zh_cn.ts
@@ -862,7 +862,7 @@ It is important that you back up this file. Would you like to open the file now?
- 已经移动项目到回收站。没有图形化的界面可以查看您的回收站,不过如果您还想找回的化它还在您的硬盘上。
+ 已经移动项目到回收站。没有图形化的界面可以查看您的回收站,不过如果您还想找回的话它还在您的硬盘上。
@@ -882,7 +882,7 @@ It is important that you back up this file. Would you like to open the file now?
- 您真的想一处这个头像么?
+ 您真的想移除这个头像么?
@@ -984,6 +984,95 @@ It is important that you back up this file. Would you like to open the file now?
消息已经发送. 正在等待回执. 发送于 %1
+
+
+
+ 错误! 无法在文件 keys.dat 中找到发送者地址(你的地址)
+
+
+
+
+ 正在做一些必须的工作来发送广播.
+
+
+
+
+ 广播发送于 %1
+
+
+
+
+ 已在更早的时候得到加密密钥.
+
+
+
+
+ 正在请求收件人的加密密钥.
+
+
+
+
+ 正在查找收件人的公钥.
+
+
+
+
+ 错误: 目标是一个移动设备, 要求不加密目标地址, 但是你的设置中不允许这么做. %1
+
+
+
+
+ 正在做一些必要的工作来发送消息.
+这里要求的难度不像第2版的地址那样.
+
+
+
+
+ 正在做一些必要的工作来发送消息.
+接收者要求的难度为: %1 和 %2
+
+
+
+
+ 错误: 收件人要求的做工量(%1 和 %2)大于我们的最大接受做工量.
+
+
+
+
+ 错误: 你正在尝试发送消息到你自身或者一个频道, 但是你的加密密钥无法在文件keys.dat中找到. 无法加密消息. %1
+
+
+
+
+ 正在做一些必要的工作来发送消息.
+
+
+
+
+ 消息已经发送. 发送于 %1
+
+
+
+
+ 消息已经发送. 正在等待回执. 发送于 %1
+
+
+
+
+ 正在做一些必要的工作来请求加密密钥.
+
+
+
+
+ 正在广播公钥请求. 如果他们不在线, 这一过程将自动重试.
+
+
+
+
+ 正在发送公钥请求. 等待回应中. 请求于 %1
+
NewAddressDialog