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 @@ Add new entry - Neuen Eintrag erstellen + Neuen Eintrag erstellen Label - + Name oder Bezeichnung Address - Adresse + Adresse @@ -153,7 +153,7 @@ Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 - 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; } 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. - 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; } Set avatar... - + Avatar wählen... @@ -966,7 +966,7 @@ p, li { white-space: pre-wrap; } Inventory lookups per second: %1 - + Inventory lookups pro Sekunde: %1 @@ -981,12 +981,12 @@ p, li { white-space: pre-wrap; } Do you really want to remove this avatar? - + Wollen Sie diesen Avatar wirklich entfernen? You have already set an avatar for this address. Do you really want to overwrite it? - + 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 per second: 0 - + Inventory lookups pro Sekunde: 0 @@ -1130,7 +1130,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei (best if this is the first of many addresses you will create) - (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 Address version number: 4 - Adress-Versionsnummer: 4 + Adress-Versionsnummer: 4 @@ -1275,7 +1275,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: - 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 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. - 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>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></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 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>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. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></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 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 Number of addresses to make based on your passphrase: - 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 number: - Stream Nummer: + Stream-Nummer: @@ -1394,7 +1394,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter - 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 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. - 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. Address version number: - + Adress-Versionsnummer: @@ -1427,7 +1427,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei Start Bitmessage in the tray (don't show main window) - 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 Run in Portable Mode - In portablem Modus arbeiten + Im portablen Modus arbeiten 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. - 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 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. - 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 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. - 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. The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. - 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 Maximum acceptable total difficulty: - Maximale akzeptierte Gesammtschwierigkeit: + Maximale akzeptierte Gesamtschwierigkeit: @@ -1572,7 +1572,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei Listen for incoming connections when using proxy - 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 can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</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> + <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 + + + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? + %1は古いバージョン1のアドレスです。バージョン1のアドレスはサポートが終了しています。すぐに削除しますか? + + + + Reply + . + 返信 + + + + Add sender to your Address Book + 送信元をアドレス帳に追加 + + + + Move to Trash + ゴミ箱へ移動 + + + + View HTML code as formatted text + HTMLコードを整形したテキストで表示 + + + + Save message as... + 形式を選択してメッセージを保存 + + + + Mark Unread + 未読にする + + + + New + 新規 + + + + Enable + 有効 + + + + Disable + 無効 + + + + Copy address to clipboard + アドレスをコピー + + + + Special address behavior... + アドレスの特別な動作 + + + + Send message to this address + このアドレスへ送信 + + + + Subscribe to this address + このアドレスを購読 + + + + Add New Address + アドレスを追加 + + + + Delete + 削除 + + + + Copy destination address to clipboard + 宛先アドレスをコピー + + + + Force send + 強制的に送信 + + + + Add new entry + 新しい項目を追加 + + + + Since startup on %1 + 起動日時 %1 + + + + Waiting on their encryption key. Will request it again soon. + 暗号化キーを待っています。再度リクエストします。 + + + + Encryption key request queued. + 暗号鍵のリクエストはキューに入りました。 + + + + Queued. + キューに入りました。 + + + + Message sent. Waiting on acknowledgement. Sent at %1 + メッセージは送信されました。確認街です。送信先: %1 + + + + Message sent. Sent at %1 + メッセージは送信されました。送信先: %1 + + + + Need to do work to send message. Work is queued. + 送信のために処理を行う必要があります。処理はキューに入りました。 + + + + Acknowledgement of the message received %1 + メッセージの確認を受け取りました %1 + + + + Broadcast queued. + Broadcastがキューに入りました。 + + + + Broadcast on %1 + Broadcast: %1 + + + + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 + 問題: 受信者が要求している処理は現在あなたが設定しているよりも高い難易度です。 %1 + + + + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 + 問題: 受信者の暗号鍵は正当でない物です。メッセージを暗号化できません。 %1 + + + + Forced difficulty override. Send should start soon. + 難易度を強制上書きしました。まもなく送信されます。 + + + + Unknown status: %1 %2 + 不明なステータス: %1 %2 + + + + Not Connected + 未接続 + + + + Show Bitmessage + Bitmessageを表示 + + + + Send + 送る + + + + Subscribe + 購読 + + + + Address Book + アドレス帳 + + + + Quit + 終了 + + + + 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. + プログラムを同じディレクトリに保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。 + + + + You may manage your keys by editing the keys.dat file stored in + %1 +It is important that you back up this file. + %1に保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。 + + + + Open keys.dat? + keys.datを開きますか? + + + + 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.) + プログラムを同じディレクトリに保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。すぐにファイルを開きますか?(必ず編集する前にBitmessageを終了してください) + + + + 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.) + %1に保存されているkeys.datファイルを編集することで鍵を管理できます。ファイルをバックアップしておくことも重要です。すぐにファイルを開きますか?(必ず編集する前にBitmessageを終了してください) + + + + Delete trash? + ゴミ箱を空にしますか? + + + + Are you sure you want to delete all trashed messages? + ゴミ箱内のメッセージを全て削除してもよろしいですか? + + + + bad passphrase + 不正なパスフレーズ + + + + You must type your passphrase. If you don't have one then this is not the form for you. + パスフレーズを入力してください。パスフレーズがない場合は入力する必要はありません。 + + + + Chan name needed + Chan名が必要です + + + + You didn't enter a chan name. + chan名が入力されていません。 + + + + Address already present + アドレスは既に表示されています + + + + Could not add chan because it appears to already be one of your identities. + chanを追加できません。既にアドレス一覧に含まれています。 + + + + Success + 成功 + + + + Successfully created chan. To let others join your chan, give them the chan name and this Bitmessage address: %1. This address also appears in 'Your Identities'. + chanの作成に成功しました。他の人がchanに参加できるようにするには、chanの名前とBitmessageアドレスを伝えてください: %1 アドレスは「アドレス一覧」に表示されます。 + + + + Address too new + アドレスが新しすぎます + + + + Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage. + このBitmessageアドレスは正当ですが、バージョン番号が現在使用中の物より新しいです。Bitmessageをアップデートしてください。 + + + + Address invalid + アドレスが不正です + + + + That Bitmessage address is not valid. + このBitmessageアドレスは不正です。 + + + + Address does not match chan name + アドレスがchan名と一致しません + + + + Although the Bitmessage address you entered was valid, it doesn't match the chan name. + このBitmessageアドレスは正当ですが、chan名と一致していません。 + + + + Successfully joined chan. + chanに参加しました。 + + + + Processed %1 person-to-person messages. + %1 通の1対1のメッセージを処理しました。 + + + + Processed %1 broadcast messages. + %1 件のBroadcastメッセージを処理しました。 + + + + Processed %1 public keys. + %1 件の公開鍵を処理しました。 + + + + Total Connections: %1 + 接続数: %1 + + + + Connection lost + 接続が切断されました + + + + Connected + 接続済み + + + + Message trashed + メッセージが削除されました + + + + Error: Bitmessage addresses start with BM- Please check %1 + エラー: Bitmessageアドレスは「BM-」で始まります。確認してください %1 + + + + Error: The address %1 is not typed or copied correctly. Please check it. + エラー: アドレス %1 は正しく入力、またはコピーされていません。確認して下さい。 + + + + Error: The address %1 contains invalid characters. Please check it. + エラー: アドレス %1 は不正な文字を含んでいます。確認して下さい。 + + + + Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. + エラー: アドレスのバージョン %1 は現在使用中の物より新しいです。Bitmessageをアップデートする必要があるか、連絡先がより賢いです。 + + + + Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance. + エラー: アドレス %1 でエンコードされたデータが短すぎます。連絡先のソフトウェアが何かしら誤っている可能性があります。 + + + + Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance. + エラー: アドレス %1 でエンコードされたデータが長すぎます。連絡先のソフトウェアが何かしら誤っている可能性があります。 + + + + Error: Something is wrong with the address %1. + エラー: アドレス %1 には何かしら誤りがあります。 + + + + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. + エラー: 送信元アドレスを指定してください。まだ作成していない場合には「アドレス一覧」のタブを開いてください。 + + + + Sending to your address + アドレスへ送信中 + + + + 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. + エラー: 送信先アドレス %1 は自分自身のアドレスです。Bitmessageクライアントは自分自身へのメッセージを処理できません。別のPCか仮想マシン上でクライアントを立ち上げてください。 + + + + Address version number + アドレスのバージョン番号 + + + + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. + アドレス %1 に接続。%2 のバージョン番号は処理できません。Bitmessageを最新のバージョンへアップデートしてください。 + + + + Stream number + ストリーム番号 + + + + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. + アドレス %1 に接続。%2 のストリーム番号は処理できません。Bitmessageを最新のバージョンへアップデートしてください。 + + + + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. + 警告: 接続されていません。Bitmessageはメッセージの処理を行いますが、ネットワークに接続するまで送信はされません。 + + + + Your 'To' field is empty. + 宛先が指定されていません。 + + + + Work is queued. + 処理がキューに入りました。 + + + + Right click one or more entries in your address book and select 'Send message to this address'. + アドレス帳から一つ、または複数のアドレスを右クリックして「このアドレスへ送信」を選んでください。 + + + + Fetched address from namecoin identity. + namecoin IDからアドレスを取得。 + + + + Work is queued. %1 + 処理がキューに入りました。 %1 + + + + New Message + 新規メッセージ + + + + From + 送信元 + + + + Address is valid. + アドレスが不正です。 + + + + The address you entered was invalid. Ignoring it. + 入力されたアドレスは不正です。無視されました。 + + + + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. + エラー: 同じアドレスを複数アドレス帳に追加する事はできません。既存の項目をリネームしてください。 + + + + Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want. + エラー: 同じアドレスを複数購読リストに追加する事はできません。既存の項目をリネームしてください。 + + + + Restart + 再開 + + + + You must restart Bitmessage for the port number change to take effect. + ポート番号の変更を有効にするにはBitmessageを再起動してください。 + + + + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). + プロキシの設定を有効にするには手動でBitmessageを再起動してください。既に接続がある場合は切断されます。 + + + + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. + エラー: 同じアドレスを複数リストに追加する事はできません。既存の項目をリネームしてください。 + + + + Passphrase mismatch + パスフレーズが一致しません + + + + The passphrase you entered twice doesn't match. Try again. + 再度入力されたパスフレーズが一致しません。再入力してください。 + + + + Choose a passphrase + パスフレーズを選択してください + + + + You really do need a passphrase. + パスフレーズが必要です。 + + + + All done. Closing user interface... + 完了しました。ユーザーインターフェースを閉じています。 + + + + Address is gone + アドレスが無効になりました + + + + Bitmessage cannot find your address %1. Perhaps you removed it? + アドレス %1 が見つかりません。既に削除していませんか? + + + + Address disabled + アドレスが無効になりました + + + + 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. + エラー: 送信しようとしたアドレスは無効になっています。使用する前に「アドレス一覧」で有効にしてください。 + + + + Entry added to the Address Book. Edit the label to your liking. + アドレス帳に項目が追加されました。ラベルは自由に編集できます。 + + + + 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. + アイテムをゴミ箱へ移動。ゴミ箱の内容を表示する画面はありませんが、もし元に戻したくなった場合に備えてディスク上に残されます。 + + + + Save As... + 形式を選択して保存 + + + + Write error. + 書き込みエラー。 + + + + No addresses selected. + アドレスが未選択です。 + + + + Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system. + 現在のOS上で未実装、または実装できないためオプションは無効化されました。 + + + + Testing... + テスト中 + + + + This is a chan address. You cannot use it as a pseudo-mailing list. + chanアドレスは仮想メーリングリストのアドレスには使用できません。 + + + + The address should start with ''BM-'' + アドレスは「BM-」から始まります + + + + The address is not typed or copied correctly (the checksum failed). + このアドレスは正しく入力、またはコピーされていません。(チェックサムが一致しません)。 + + + + The version number of this address is higher than this software can support. Please upgrade Bitmessage. + このアドレスのバージョン番号はこのプログラムのサポート範囲外です。Bitmessageをアップデートしてください。 + + + + The address contains invalid characters. + 入力されたアドレスは不正な文字を含んでいます。 + + + + Some data encoded in the address is too short. + このアドレスでエンコードされたデータが短すぎます。 + + + + Some data encoded in the address is too long. + このアドレスでエンコードされたデータが長過ぎます。 + + + + You are using TCP port %1. (This can be changed in the settings). + 使用中のポート %1 (設定で変更できます)。 + + + + Bitmessage + + + + + Search + 検索 + + + + All + 全て + + + + To + 宛先 + + + + From + 送信元 + + + + Subject + 題名 + + + + Message + メッセージ + + + + Received + 受信日時 + + + + Inbox + 受信箱 + + + + Load from Address book + アドレス帳から読み込み + + + + Fetch Namecoin ID + namecoin IDを取得 + + + + Message: + メッセージ: + + + + Subject: + 題名: + + + + Send to one or more specific people + 一人、または複数のユーザーへ送信 + + + + <!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> + + + + + To: + 宛先: + + + + From: + 送信元: + + + + Broadcast to everyone who is subscribed to your address + 自分のアドレスを購読しているユーザー全員へ配信する + + + + Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them. + broadcastはあなたのアドレスのみで暗号化されます。あなたのアドレスを知っている人は全て読むことができます。 + + + + Status + 状態 + + + + Sent + 送信済み + + + + Label (not shown to anyone) + ラベル(他の人からは見えません) + + + + Address + アドレス + + + + Stream + ストリーム + + + + Your Identities + アドレス一覧 + + + + 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. + 他のユーザが送信した「broadcastメッセージ」を購読できます。メッセージは受信箱に表示されます。このリストのアドレスはブラックリストより優先されます。 + + + + Add new Subscription + 購読先を追加 + + + + Label + ラベル + + + + Subscriptions + 購読リスト + + + + 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. + アドレス帳は他のユーザのBitmessageアドレスにラベルや名前をつけることで受信箱を見やすくします。「追加」ボタンを押すか受信箱でメッセージを右クリックしてください。 + + + + Name or Label + 名前、ラベル + + + + Use a Blacklist (Allow all incoming messages except those on the Blacklist) + ブラックリストを使用(全てのメッセージを受信してブラックリストと一致する物だけ除外) + + + + Use a Whitelist (Block all incoming messages except those on the Whitelist) + ホワイトリストを使用(全てのメッセージを受信拒否してホワイトリストと一致する物だけ許可) + + + + Blacklist + ブラックリスト + + + + Stream # + ストリーム # + + + + Connections + 接続 + + + + Total connections: 0 + 接続数: 0 + + + + Since startup at asdf: + 起動してから asdf: + + + + Processed 0 person-to-person message. + 0 通の1対1のメッセージを処理しました。 + + + + Processed 0 public key. + 0 件の公開鍵を処理しました。 + + + + Processed 0 broadcast. + 0 件のBroadcastメッセージを処理しました。 + + + + Network Status + ネットワークの状態 + + + + File + ファイル + + + + Settings + 設定 + + + + Help + ヘルプ + + + + Import keys + 鍵をインポート + + + + Manage keys + 鍵を管理 + + + + Ctrl+Q + Ctrrl+Q + + + + F1 + + + + + About + 概要 + + + + Regenerate deterministic addresses + 「決定論的アドレス」ともヤクセルが + deterministicアドレスを再生成 + + + + Delete all trashed messages + ゴミ箱のメッセージを全て削除する + + + + Join / Create chan + chanに参加 / 作成 + + + + NewAddressDialog + + + Create new Address + 新しいアドレスを作成 + + + + 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: + 複数のアドレスを生成できます。アドレスを自由に生成、破棄することができます。アドレスは乱数かパスフレーズを使って生成できます。もしパスフレーズを使う場合、アドレスはdeterministicアドレスになります。デフォルトでは乱数による生成が選択されますが、deterministicアドレスにも長所と短所があります: + + + + <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> + <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 a random number generator to make an address + アドレスの生成に乱数ジェネレーターを使う + + + + Use a passpharase to make addresses + Use yee passpharase to make arrddresses + + + + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter + アドレスを1、2文字短くするために数分間追加の計算処理を行う + + + + Make deterministic addresses + deterministicアドレスを作る + + + + Address version number: 3 + アドレスのバージョン番号: 3 + + + + In addition to your passphrase, you must remember these numbers: + パスフレーズに加えて、これらの値を覚えておいてください: + + + + Passphrase + パスフレーズ + + + + Number of addresses to make based on your passphrase: + パスフレーズから生成されたアドレスの数: + + + + Stream number: 1 + ストリーム数: 1 + + + + Retype passphrase + パスフレーズを再入力 + + + + Randomly generate address + ランダムなアドレスを生成する + + + + Label (not shown to anyone except you) + ラベル(他の人からは見えません) + + + + Use the most available stream + 最も有効なストリームを使う + + + + (best if this is the first of many addresses you will create) + (もしこれから複数のアドレスを生成するのであれば、最初の一つに最適です。) + + + + Use the same stream as an existing address + 既存のアドレスと同じストリームを利用する + + + + (saves you some bandwidth and processing power) + (帯域と処理能力を節約する) + + + + Use a passphrase to make addresses + アドレスの作成にパスフレーズを使う + + + + NewSubscriptionDialog + + + Add new entry + 新しい項目を追加 + + + + Label + ラベル + + + + Address + アドレス + + + + SpecialAddressBehaviorDialog + + + Special Address Behavior + アドレスの特別な動作 + + + + Behave as a normal address + 通常のアドレスにする + + + + Behave as a pseudo-mailing-list address + 仮想メーリングリストとして使用する + + + + Mail received to a pseudo-mailing-list address will be automatically broadcast to subscribers (and thus will be public). + 仮想メーリングリストのアドレスが受信したアドレスは自動的に購読するユーザーに配信(公開)されます。 + + + + Name of the pseudo-mailing-list: + 仮想メーリングリストの名前: + + + + aboutDialog + + + PyBitmessage + + + + + version ? + Version ? + + + + About + 概要 + + + + Copyright © 2013 Jonathan Warren + + + + + <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> + + + + + This is Beta software. + このソフトウェアはベータ版です。 + + + + connectDialog + + + Bitmessage + + + + + Bitmessage won't connect to anyone until you let it. + Bitmessageはあなたが操作しない限りどこへも接続しません。 + + + + Connect now + 接続 + + + + Let me configure special network settings first + 最初に特別なネットワークの設定を行ってください + + + + helpDialog + + + Help + ヘルプ + + + + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> + + + + As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: + Bitmessageは協働プロジェクトです。ヘルプはBitmessage Wikiを参照してください: + + + + iconGlossaryDialog + + + Icon Glossary + アイコン一覧 + + + + You have no connections with other peers. + 他のpeerへ接続されていません。 + + + + 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 foward 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. + 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. + + + + You are using TCP port ?. (This can be changed in the settings). + 使用中のポート ? (設定で変更できます)。 + + + + You do have connections with other peers and your firewall is correctly configured. + ファイアーウォールを適切に設定し、他のpeerへ接続してください。 + + + + 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. + 発信接続のために1つ以上のピアへ接続を行っていますが、まだ着信接続を受け取っていません。ファイアーウォールかホームルーターが外部からこのコンピューターへのTCP接続を受け取れるように設定されていないかも知れません。Bitmessageは正常に動作しますが、外部からの接続を許可してより良く接続されたノードになることはBitmessageネットワークへの助けになります。 + + + + newChanDialog + + + Dialog + ダイアログ + + + + Create a new chan + 新しいchanを作成 + + + + Join a chan + chanに参加 + + + + Create a chan + chanを作成 + + + + <html><head/><body><p>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. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html> + <html><head/><body><p>chan名を入力してください。(強くて一意のパスフレーズのように)十分に複雑なchan名を選び、あなたの友人たちがそれを他人に教えない限りchanはセキュアでプライベートです。あなたと他の誰かが同じ名前のchanを作成した場合、現状では同じchanになる可能性が非常に高い。</p></body></html> + + + + Chan name: + Chan名: + + + + <html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html> + <html><head/><body><p>chanは人々のグループに復号鍵を共有されることで存在します。chanで使われる鍵とBitmessageアドレスは読みやすい単語、またはフレーズ(chan名)から生成されます。chanに居る人たちへメッセージを送るには、通常の一対一のメッセージをchanアドレスへ送ります。</p><p>chansは実験的機能で、内容を管理するモデレーターを設けることはできません。</p></body></html> + + + + Chan bitmessage address: + chanのbitmessageアドレス: + + + + regenerateAddressesDialog + + + Regenerate Existing Addresses + 既存のアドレスを再生成する + + + + Regenerate existing addresses + 既存のアドレスを再生成する + + + + Passphrase + パスフレーズ + + + + Number of addresses to make based on your passphrase: + パスフレーズから生成されたアドレスの数: + + + + Address version Number: + アドレスのバージョン番号: + + + + 3 + + + + + Stream number: + ストリーム数: + + + + 1 + + + + + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter + アドレスを1、2文字短くするために数分間追加の計算処理を行う + + + + You must check (or not check) this box just like you did (or didn't) when you made your addresses the first time. + もしあなたが初めてアドレスを作ったのであればこのボックスをチェックする必要があります。(そうでない場合はしないでください)。 + + + + 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. + もし以前にdeterministicアドレスを作ったことがあり、何かしらのトラブル(ハードディスクの故障のような)でそれを紛失していた場合、ここで再生成することができます。もし乱数でアドレスを作っていたのであればこのフォームは再生成には使えません。 + + + + settingsDialog + + + Settings + 設定 + + + + Start Bitmessage on user login + ユーザのログイン時にBitmessageを起動 + + + + Start Bitmessage in the tray (don't show main window) + Bitmessageをトレイ内で起動する(メインウィンドウを表示しない) + + + + Minimize to tray + タスクトレイへ最小化 + + + + Show notification when message received + メッセージの受信時に通知する + + + + Run in Portable Mode + ポータブルモードで実行 + + + + 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. + ポータブルモード時、メッセージと設定ファイルは通常のアプリケーションデータのフォルダではなく同じディレクトリに保存されます。これによりBitmessageをUSBドライブから実行できます。 + + + + User Interface + ユーザインターフェース + + + + Listening port + リスニングポート + + + + Listen for connections on port: + 接続を待つポート: + + + + Proxy server / Tor + プロキシサーバー/Tor + + + + Type: + タイプ: + + + + none + 無し + + + + SOCKS4a + SOCKS4a + + + + SOCKS5 + SOCKS5 + + + + Server hostname: + サーバーホスト名: + + + + Port: + ポート: + + + + Authentication + 認証 + + + + Username: + ユーザー名: + + + + Pass: + パス: + + + + Network Settings + ネットワーク設定 + + + + 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. + 誰かがあなたにメッセージを送る時、相手のコンピューターはいくらか計算処理を行います。処理の難易度はデフォルトでは1です。この値を変更すると新しいアドレスではこのデフォルト値を引き上げることができます。その場合、新しいアドレスはメッセージの送信者により高い難易度を要求します。例外もあります: 友人や知り合いをアドレス帳に登録すると、Bitmessageは次にメッセージを送る際、自動的に要求される処理の難易度を最低限の1で済むように通知します。 + + + + Total difficulty: + 全体の難易度: + + + + Small message difficulty: + 小さいメッセージの難易度: + + + + 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. + 「小さいメッセージの難易度」は小さいメッセージを行う時にだけ影響します。この値を二倍にすれば小さなメッセージに必要な処理の難易度は二倍になりますが、実際にはデータ量の多いメッセージには影響しません。 + + + + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. + 「全体の難易度」は完全に全てのメッセージに影響します。この値を二倍にすると処理量も二倍になります。 + + + + Demanded difficulty + 要求される難易度 + + + + Willingly include unencrypted destination address when sending to a mobile device + 携帯端末にメッセージを送る時は暗号化されていないアドレスを許可する + + + + Override automatic language localization (use countycode or language code, e.g. 'en_US' or 'en'): + 自動的に設定された言語・地域を上書きする(国コード、または言語コードを入力。例:「en_US」または「en」): + + + + Listen for incoming connections when using proxy + プロキシ使用時に外部からの接続を待機する + + + + 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. + ここでは他のユーザーへメッセージを送る際に行うことを許可する処理量の上限を設定します。0を設定するとどんな量でも許容します。 + + + + Maximum acceptable total difficulty: + 許可する難易度の上限: + + + + Maximum acceptable small message difficulty: + 小さなメッセージに許可する難易度の上限: + + + + Max acceptable difficulty + 許可する最大の難易度 + + + + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> + <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> + + + + Host: + ホスト: + + + + Password: + パスワード: + + + + Test + テスト + + + + Connect to: + 接続先: + + + + Namecoind + Namecoind + + + + NMControl + NMControl + + + + Namecoin integration + 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 Add new entry - Добавить новую запись + Добавить новую запись @@ -1239,7 +1240,7 @@ The 'Random Number' option is selected by default but deterministic ad version ? версия ? - + Copyright © 2013 Jonathan Warren Копирайт © 2013 Джонатан Уоррен @@ -1256,7 +1257,7 @@ The 'Random Number' option is selected by default but deterministic ad - <html><head/><body><p>Copyright © 2012-2013 Jonathan Warren<br/>Copyright © 2013 The Bitmessage Developers</p></body></html> + <html><head/><body><p>Copyright © 2012-2013 Jonathan Warren<br/>Copyright © 2013 The Bitmessage Developers</p></body></html> @@ -1672,7 +1673,7 @@ The 'Random Number' option is selected by default but deterministic ad - Français + Français fr Francais @@ -1684,13 +1685,13 @@ The 'Random Number' option is selected by default but deterministic ad - Español + Español es Espanol - Русский + Русский ru Русский @@ -1713,13 +1714,13 @@ The 'Random Number' option is selected by default but deterministic ad - Españl + Españl 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? 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. - 已经移动项目到回收站。没有图形化的界面可以查看您的回收站,不过如果您还想找回的化它还在您的硬盘上。 + 已经移动项目到回收站。没有图形化的界面可以查看您的回收站,不过如果您还想找回的话它还在您的硬盘上。 @@ -882,7 +882,7 @@ It is important that you back up this file. Would you like to open the file now? Do you really want to remove this avatar? - 您真的想一处这个头像么? + 您真的想移除这个头像么? @@ -984,6 +984,95 @@ It is important that you back up this file. Would you like to open the file now? Message sent. Waiting for acknowledgement. Sent at %1 消息已经发送. 正在等待回执. 发送于 %1 + + + Error! Could not find sender address (your address) in the keys.dat file. + 错误! 无法在文件 keys.dat 中找到发送者地址(你的地址) + + + + Doing work necessary to send broadcast... + 正在做一些必须的工作来发送广播. + + + + Broadcast sent on %1 + 广播发送于 %1 + + + + Encryption key was requested earlier. + 已在更早的时候得到加密密钥. + + + + Sending a request for the recipient's encryption key. + 正在请求收件人的加密密钥. + + + + Looking up the receiver's public key + 正在查找收件人的公钥. + + + + Problem: Destination is a mobile device who requests that the destination be included in the message but this is disallowed in your settings. %1 + 错误: 目标是一个移动设备, 要求不加密目标地址, 但是你的设置中不允许这么做. %1 + + + + Doing work necessary to send message. +There is no required difficulty for version 2 addresses like this. + 正在做一些必要的工作来发送消息. +这里要求的难度不像第2版的地址那样. + + + + Doing work necessary to send message. +Receiver's required difficulty: %1 and %2 + 正在做一些必要的工作来发送消息. +接收者要求的难度为: %1 和 %2 + + + + Problem: The work demanded by the recipient (%1 and %2) is more difficult than you are willing to do. + 错误: 收件人要求的做工量(%1 和 %2)大于我们的最大接受做工量. + + + + Problem: You are trying to send a message to yourself or a chan but your encryption key could not be found in the keys.dat file. Could not encrypt message. %1 + 错误: 你正在尝试发送消息到你自身或者一个频道, 但是你的加密密钥无法在文件keys.dat中找到. 无法加密消息. %1 + + + + Doing work necessary to send message. + 正在做一些必要的工作来发送消息. + + + + Message sent. Sent on %1 + 消息已经发送. 发送于 %1 + + + + Message sent. Waiting for acknowledgement. Sent on %1 + 消息已经发送. 正在等待回执. 发送于 %1 + + + + Doing work necessary to request encryption key. + 正在做一些必要的工作来请求加密密钥. + + + + Broacasting the public key request. This program will auto-retry if they are offline. + 正在广播公钥请求. 如果他们不在线, 这一过程将自动重试. + + + + Sending public key request. Waiting for reply. Requested at %1 + 正在发送公钥请求. 等待回应中. 请求于 %1 + NewAddressDialog