From eb9339052da0f59746f21849d01cfbb55ec45929 Mon Sep 17 00:00:00 2001 From: Jonathan Warren <git@jonwarren.org> Date: Tue, 21 May 2013 14:10:48 -0400 Subject: [PATCH 1/2] adjust tab order --- src/bitmessagemain.py | 2 +- src/bitmessageui.py | 26 +++++++++++++++++++++++++- src/bitmessageui.ui | 27 +++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index 9bb61177..35d64144 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -216,7 +216,7 @@ class singleListener(threading.Thread): #The following code will, unfortunately, block an incoming connection if someone else on the same LAN is already connected because the two computers will share the same external IP. This is here to prevent connection flooding. while HOST in shared.connectedHostsList: shared.printLock.acquire() - print 'incoming connection is from a host in shared.connectedHostsList (we are already connected to it). Ignoring it.' + print 'We are already connected to', HOST+'. Ignoring connection.' shared.printLock.release() a.close() a,(HOST,PORT) = sock.accept() diff --git a/src/bitmessageui.py b/src/bitmessageui.py index a7c85206..ca2d8b0b 100644 --- a/src/bitmessageui.py +++ b/src/bitmessageui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'bitmessageui.ui' # -# Created: Mon Apr 22 16:34:47 2013 +# Created: Tue May 21 14:09:58 2013 # by: PyQt4 UI code generator 4.9.4 # # WARNING! All changes made in this file will be lost! @@ -428,6 +428,30 @@ class Ui_MainWindow(object): QtCore.QObject.connect(self.radioButtonSpecific, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.labelSendBroadcastWarning.hide) QtCore.QObject.connect(self.radioButtonBroadcast, QtCore.SIGNAL(_fromUtf8("clicked()")), self.labelSendBroadcastWarning.show) QtCore.QMetaObject.connectSlotsByName(MainWindow) + MainWindow.setTabOrder(self.tabWidget, self.tableWidgetInbox) + MainWindow.setTabOrder(self.tableWidgetInbox, self.textEditInboxMessage) + MainWindow.setTabOrder(self.textEditInboxMessage, self.radioButtonSpecific) + MainWindow.setTabOrder(self.radioButtonSpecific, self.radioButtonBroadcast) + MainWindow.setTabOrder(self.radioButtonBroadcast, self.comboBoxSendFrom) + MainWindow.setTabOrder(self.comboBoxSendFrom, self.lineEditTo) + MainWindow.setTabOrder(self.lineEditTo, self.pushButtonLoadFromAddressBook) + MainWindow.setTabOrder(self.pushButtonLoadFromAddressBook, self.lineEditSubject) + MainWindow.setTabOrder(self.lineEditSubject, self.textEditMessage) + MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) + MainWindow.setTabOrder(self.pushButtonSend, self.tableWidgetSent) + MainWindow.setTabOrder(self.tableWidgetSent, self.textEditSentMessage) + MainWindow.setTabOrder(self.textEditSentMessage, self.pushButtonNewAddress) + MainWindow.setTabOrder(self.pushButtonNewAddress, self.tableWidgetYourIdentities) + MainWindow.setTabOrder(self.tableWidgetYourIdentities, self.pushButtonAddSubscription) + MainWindow.setTabOrder(self.pushButtonAddSubscription, self.tableWidgetSubscriptions) + MainWindow.setTabOrder(self.tableWidgetSubscriptions, self.pushButtonAddAddressBook) + MainWindow.setTabOrder(self.pushButtonAddAddressBook, self.tableWidgetAddressBook) + MainWindow.setTabOrder(self.tableWidgetAddressBook, self.radioButtonBlacklist) + MainWindow.setTabOrder(self.radioButtonBlacklist, self.radioButtonWhitelist) + MainWindow.setTabOrder(self.radioButtonWhitelist, self.pushButtonAddBlacklist) + MainWindow.setTabOrder(self.pushButtonAddBlacklist, self.tableWidgetBlacklist) + MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) + MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Bitmessage", None, QtGui.QApplication.UnicodeUTF8)) diff --git a/src/bitmessageui.ui b/src/bitmessageui.ui index cef8cd69..8487b673 100644 --- a/src/bitmessageui.ui +++ b/src/bitmessageui.ui @@ -1003,6 +1003,33 @@ p, li { white-space: pre-wrap; } </property> </action> </widget> + <tabstops> + <tabstop>tabWidget</tabstop> + <tabstop>tableWidgetInbox</tabstop> + <tabstop>textEditInboxMessage</tabstop> + <tabstop>radioButtonSpecific</tabstop> + <tabstop>radioButtonBroadcast</tabstop> + <tabstop>comboBoxSendFrom</tabstop> + <tabstop>lineEditTo</tabstop> + <tabstop>pushButtonLoadFromAddressBook</tabstop> + <tabstop>lineEditSubject</tabstop> + <tabstop>textEditMessage</tabstop> + <tabstop>pushButtonSend</tabstop> + <tabstop>tableWidgetSent</tabstop> + <tabstop>textEditSentMessage</tabstop> + <tabstop>pushButtonNewAddress</tabstop> + <tabstop>tableWidgetYourIdentities</tabstop> + <tabstop>pushButtonAddSubscription</tabstop> + <tabstop>tableWidgetSubscriptions</tabstop> + <tabstop>pushButtonAddAddressBook</tabstop> + <tabstop>tableWidgetAddressBook</tabstop> + <tabstop>radioButtonBlacklist</tabstop> + <tabstop>radioButtonWhitelist</tabstop> + <tabstop>pushButtonAddBlacklist</tabstop> + <tabstop>tableWidgetBlacklist</tabstop> + <tabstop>tableWidgetConnectionCount</tabstop> + <tabstop>pushButtonStatusIcon</tabstop> + </tabstops> <resources> <include location="bitmessage_icons.qrc"/> </resources> -- 2.45.1 From 4705c4f78ac22420729bc87faa65b6ce66f3992f Mon Sep 17 00:00:00 2001 From: Jonathan Warren <me@jonwarren.org> Date: Wed, 22 May 2013 22:01:35 -0400 Subject: [PATCH 2/2] New tray icon, also use existing local-IP rejection function for received addr messages also --- src/bitmessagemain.py | 33 ++++++++++++++-------------- src/images/can-icon-24px-green.png | Bin 885 -> 4326 bytes src/images/can-icon-24px-red.png | Bin 867 -> 4325 bytes src/images/can-icon-24px-yellow.png | Bin 872 -> 4315 bytes 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index 35d64144..e8d82521 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -1667,10 +1667,7 @@ class receiveDataThread(threading.Thread): if data[28+lengthOfNumberOfAddresses+(34*i)] == '\x7F': print 'Ignoring IP address in loopback range:', hostFromAddrMessage continue - if data[28+lengthOfNumberOfAddresses+(34*i)] == '\x0A': - print 'Ignoring IP address in private range:', hostFromAddrMessage - continue - if data[28+lengthOfNumberOfAddresses+(34*i):30+lengthOfNumberOfAddresses+(34*i)] == '\xC0A8': + if isHostInPrivateIPRange(hostFromAddrMessage): print 'Ignoring IP address in private range:', hostFromAddrMessage continue timeSomeoneElseReceivedMessageFromThisNode, = unpack('>I',data[lengthOfNumberOfAddresses+(34*i):4+lengthOfNumberOfAddresses+(34*i)]) #This is the 'time' value in the received addr message. @@ -1836,21 +1833,21 @@ class receiveDataThread(threading.Thread): for i in range(500): random.seed() HOST, = random.sample(shared.knownNodes[self.streamNumber], 1) - if self.isHostInPrivateIPRange(HOST): + if isHostInPrivateIPRange(HOST): continue addrsInMyStream[HOST] = shared.knownNodes[self.streamNumber][HOST] if len(shared.knownNodes[self.streamNumber*2]) > 0: for i in range(250): random.seed() HOST, = random.sample(shared.knownNodes[self.streamNumber*2], 1) - if self.isHostInPrivateIPRange(HOST): + if isHostInPrivateIPRange(HOST): continue addrsInChildStreamLeft[HOST] = shared.knownNodes[self.streamNumber*2][HOST] if len(shared.knownNodes[(self.streamNumber*2)+1]) > 0: for i in range(250): random.seed() HOST, = random.sample(shared.knownNodes[(self.streamNumber*2)+1], 1) - if self.isHostInPrivateIPRange(HOST): + if isHostInPrivateIPRange(HOST): continue addrsInChildStreamRight[HOST] = shared.knownNodes[(self.streamNumber*2)+1][HOST] shared.knownNodesLock.release() @@ -1992,16 +1989,7 @@ class receiveDataThread(threading.Thread): if self.verackReceived == True: self.connectionFullyEstablished() - def isHostInPrivateIPRange(self,host): - if host[:3] == '10.': - return True - if host[:4] == '172.': - if host[6] == '.': - if int(host[4:6]) >= 16 and int(host[4:6]) <= 31: - return True - if host[:8] == '192.168.': - return True - return False + #Every connection to a peer has a sendDataThread (and also a receiveDataThread). class sendDataThread(threading.Thread): @@ -2294,6 +2282,17 @@ def assembleVersionMessage(remoteHost,remotePort,myStreamNumber): datatosend = datatosend + hashlib.sha512(payload).digest()[0:4] return datatosend + payload +def isHostInPrivateIPRange(host): + if host[:3] == '10.': + return True + if host[:4] == '172.': + if host[6] == '.': + if int(host[4:6]) >= 16 and int(host[4:6]) <= 31: + return True + if host[:8] == '192.168.': + return True + return False + #This thread exists because SQLITE3 is so un-threadsafe that we must submit queries to it and it puts results back in a different queue. They won't let us just use locks. class sqlThread(threading.Thread): def __init__(self): diff --git a/src/images/can-icon-24px-green.png b/src/images/can-icon-24px-green.png index 5e7e52ec5db725d3838086b0be80bc465e8c18b0..247bebc7ef1b3df4dc2e443ca361139ecb988ef9 100644 GIT binary patch literal 4326 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 U4h;ITBLDyZ07*qoM6N<$g7O7k4gdfE delta 862 zcmV-k1EKupA@v53B!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$S@<~KNR7i=nm0L(taU93L zzyHprQ!_*gDzhclBBCBzuI)hrBWi&cG>X7jg+yRdPhALtE`JZzLj*lUfti#@QbveH z7w{n~tC3~5nVDKBKIEpgi|w5A>p^GR+-WNHd;9+`-_P%N&i_KpjQ?rUbdp<IS|roF zl#>j$10XP7OOkSKVXpnNRt-&K0_t(MbulBGD5|l30yT$p-z#%-H;u*?iK(jhx}O~Z zkP{;g0P{h-Q-4x3p7wP-&X~~zeVs1~R95dNZit^tsk|;L%N7WG5>D`~^XUSW)w-$V z0<=c<i7SzwzZSV%F1^gU8vy1e79S&kk>CBHZON1XnQ8JFjP01I8)2SK;7~%q7k673 zfc?`FA2$Zg|0|&T<MX8iRL?|wjG+280Rt{qijLHq0Dor9R35~aH37fU<ckbiF+*{H z`MAk!yBA(Yor6zrpH%t%zVpnCWMeXtlai(@f7@iXmP9%xPUVB<dW!&+rWjN9fZ5~m zdM$#a(u|Ds#p&s@5}pAfbSaYLjP*|dg27;!B2ZM|*y<g3H2^sHu(|$#*E8(QTDV}P z5TvCaP=6VvIXSC`V*?YN5tFgF*y)W;Snt?&?x)YUrMLI%OU+w_Y42jQ^-a9cpV0;R z@7$@5yK@{RJ30eFUqyfaK*yvY;gV@t-c=3sAAk^QolX|JwGti0&i26QuScV!Q8%(n z7DH89HBkUZk+TC#*^Q00nOe!xp#SjqA#eCI4u65UEcOk^f0aKcE&u?KtUsY=KHJdH zkQNWH&gl%wp^zH@6QSI+Y;8|CW^q|&+uqvRL;BF5?VasLT)^hd+dZnJ95qV53wLi_ z&x!{L$;t=;rxq=>Hb?pm2E#T0t1xz>Zn3_zu9`dnfWpFE{Q)_(Qh~g$sj;Ra^2ayb ztXEm0D9XShv-MbP9qYI~V);Wa>AQghFIv;>+B~RS${-_=s)EIc!AGYzl$ZPB<=fxe oH?qp>g%H<Tm$$Yj1pEv84OO)x8LIH$&;S4c07*qoM6N<$g0d8v@Bjb+ diff --git a/src/images/can-icon-24px-red.png b/src/images/can-icon-24px-red.png index 942daa7eed549356acbf5ccf05178bed0d53a69f..ca32b9ae25426ea4df70adb34729e4c3065defcc 100644 GIT binary patch literal 4325 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 T`ygSn00000NkvXXu0mjfqIzE} delta 844 zcmV-S1GD_)A>#&+B!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$S;7LS5R7i=nm0L)YVHn5% z&$rLqOpPH09-HFnBJv{B^dbaBYK8|?vcQ-{L=aL}9k81Y7k|}-1YJadm6V9X6p<Aj zz>CO34J?D2nW=^1g*vrwZf^UYE<A4Tb92;l_dbXJ?|EL{12HrHr-@rh?&|6ib<trr z7@P}$!1yGJ?)v!T+#gCcw1o+1#L_#&j07T&#>NR`a;m1zB_|(tcozwQs*hTFt^i2# z5(j`75Z8#ZwtstU;GH(83C0FL<jX9-^4}2miQ73ZE-q(b#p8E^--F$;GRsYY<N~zc zB?*t#dp0dHo6R9ER<!`w<zIY>0LH=Lue~V&0iwcPx3P3$0yjdmO28$*fS;D$3IOM~ zB))76irEw}{H-sQfQDeimk6>=5inskhp9+z1rQOeJb#EEDgqY6UH2KZCrELC`I;^* z=jF=M;~sqf^1jw)lkPGz)EYI^p`lxqZ`Y+|m#ufK-pbde=1c)p9;OL91Lm0-t2I*~ zv0ST-OpJ_-@OuY{Fyt0RgSUSbV7J>V+yYAS^+&DCE+c@8Z%oY>tTVHQxcJz;f<Q|8 z3o@fTDSv6-tao6wGh)(|mKv<y2?hG9`ahCXIXe35qvET=bT%<9`?Igm+UNq=IyxGB zo*aGIiNOWCbb5SzVqim%@IaTI^+W-^1`q_fN#znwDJAMl4gCv_#kUTJ$BS%s3DdPo zH68$ciD3Xt32kkSQA)|;r0w$5v~^`0r@>sY;eQVx+UXMj08ocq4`IGzG#bNw0rCt6 zyUXdc0AM0i>(UR5tP|b=qJ99AAZqamC@MNWBa7}jjVRrF@%&kwFNo9So+IGq?$m6P zSEvd=1^@z338D-@;lnW+jo})V?J9_eWR=`pTzqmK06JSAr)&!itt&iotOkJWQACst zphahSH4h*b%=4T6Xr1kiS&+G$K^h`i1`BiBB)U~tT`l=6AUXt~0Kii)_bX2DFYPa9 Wn-%D`i#v$`0000<MNUMnLSTY-g?k79 diff --git a/src/images/can-icon-24px-yellow.png b/src/images/can-icon-24px-yellow.png index e7eb0589d169ec867b69efe259311ffd44dc1ba7..6470b0002ab4c2fde0218d5a80ccbfbcf3cfee86 100644 GIT binary patch literal 4315 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 JPDHLkV1ge!T~`1A delta 849 zcmV-X1FrnrA?OB>B!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$S<w-<AR7i=nl}SjHVHn5% z&o|#VGp5EM1+I<ac8EM=njS(>q{eVTB@2wPhzLUJ)Ph}F4u91_f(}t&B_-luipUf# z;30CU0n4B?Gqq4WsN*u5GxI$iTxXomaipHx`z-(8^SrzZF*E+BiNPdyc6N%osL-1X z&H+GRd=^DdU0hPmPq`WjVgec&=ow;0Jdsyp;{-Cf6jSGul8!iii-fJJj}CNS1(4_? z4gk?0t`;S2*MC_5d+oL+7#sYUC$aQ8a6{ZH?%>?m*lhcXC*TBs2D@S;mKwK`3(x_# zRd~GKvuTmpY*xBi(F|aBVDTja7>9<x^(1cz5E<sagQXL*bt6P61Y8aX_%+Z|4&Xvi z;>*UM=uH8`-+NOCsNatG5<#-b0w&DnPz6aX0K&H`4}aoEvVg@f_X7s)-KIFed|j8C z{c2_Dbq{`g{ZM1GS?@73)EYI^Dpj!ZZMxK~()EtjTlvP+lp%o1LN%dh!8|i#v1AA& zmT9#S2@w(D0q+12hCHHZ@b#|(91cghM?i6&{+MOiWdv~Pt*PmvWoFh88yB-r5J*nn zE-}gy6My&5`UX}zBPLBriNWHVkgu<-Td-OyMn`{tl6_T}&LyN~eeoAs8(kn<dwad# zlcO&^IcRrS&y0^x^lu0f9_rFEpUR-u0D>SjD%`?pxkP=5q0jDIeCKp}y~t*_FkK^8 z;|0(c8~VW%-`d&`DVHox+OAAZTUNGl8qDPz{(pc4+T|Aj08lG$D4FjXjm9v4fLw#Y z;dZ$O05B1%bZG}i)}pi%PU?dalW<bAUqE5ui5W@s)M`ZQ{g*GE$NGb~+@3iCZtY3Q zGI<4@s05G>fB;m$Md^UdhhsDv!!!!pH4qO;3aP26=+ry_bhJE44pFIU3yvPI1|WGA z*-9x30=k!1^H3oM;Q38|w2rohOh{bDAPtcufrYscE8Q-rs<QemaMED_`4I37O74@L b;9uHb$vzswMIc+=00000NkvXXu0mjfSP6PA -- 2.45.1