commit
8fa0121206
|
@ -158,7 +158,7 @@ def encodeAddress(version, stream, ripe):
|
|||
raise Exception(
|
||||
'Programming error in encodeAddress: The length of'
|
||||
' a given ripe hash was not 20.')
|
||||
ripe = ripe.lstrip('\x00')
|
||||
ripe = ripe.lstrip('\x00'.encode('utf-8'))
|
||||
|
||||
storedBinaryData = encodeVarint(version) + encodeVarint(stream) + ripe
|
||||
|
||||
|
@ -180,7 +180,6 @@ def decodeAddress(address):
|
|||
data (almost certainly a ripe hash))
|
||||
"""
|
||||
# pylint: disable=too-many-return-statements,too-many-statements,too-many-return-statements,too-many-branches
|
||||
|
||||
address = str(address).strip()
|
||||
|
||||
if address[:3] == 'BM-':
|
||||
|
@ -192,7 +191,7 @@ def decodeAddress(address):
|
|||
return status, 0, 0, ''
|
||||
# after converting to hex, the string will be prepended
|
||||
# with a 0x and appended with a L
|
||||
hexdata = hex(integer)[2:-1]
|
||||
hexdata = hex(integer)[2:]
|
||||
|
||||
if len(hexdata) % 2 != 0:
|
||||
hexdata = '0' + hexdata
|
||||
|
@ -248,7 +247,7 @@ def decodeAddress(address):
|
|||
embeddedRipeData
|
||||
elif len(embeddedRipeData) == 18:
|
||||
return status, addressVersionNumber, streamNumber, \
|
||||
'\x00\x00' + embeddedRipeData
|
||||
'\x00\x00'.encode('utf-8') + embeddedRipeData
|
||||
elif len(embeddedRipeData) < 18:
|
||||
return 'ripetooshort', 0, 0, ''
|
||||
elif len(embeddedRipeData) > 20:
|
||||
|
@ -265,7 +264,8 @@ def decodeAddress(address):
|
|||
return 'ripetoolong', 0, 0, ''
|
||||
elif len(embeddedRipeData) < 4:
|
||||
return 'ripetooshort', 0, 0, ''
|
||||
x00string = '\x00' * (20 - len(embeddedRipeData))
|
||||
x00string = '\x00'.encode('utf-8') * (20 - len(embeddedRipeData))
|
||||
|
||||
return status, addressVersionNumber, streamNumber, \
|
||||
x00string + embeddedRipeData
|
||||
|
||||
|
|
|
@ -46,13 +46,13 @@ def generate_hash(string):
|
|||
# make input case insensitive
|
||||
string = str.lower(string)
|
||||
hash_object = hashlib.md5(str.encode(string))
|
||||
print hash_object.hexdigest()
|
||||
print(hash_object.hexdigest())
|
||||
|
||||
# returned object is a hex string
|
||||
return hash_object.hexdigest()
|
||||
|
||||
except IndexError:
|
||||
print "Error: Please enter a string as an argument."
|
||||
print("Error: Please enter a string as an argument.")
|
||||
|
||||
|
||||
def random_color(hash_string):
|
||||
|
|
|
@ -1,43 +1,38 @@
|
|||
|
||||
#:import Toolbar kivymd.toolbar.Toolbar
|
||||
#:import MDToolbar kivymd.uix.toolbar.MDToolbar
|
||||
#:import ThemeManager kivymd.theming.ThemeManager
|
||||
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
|
||||
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
|
||||
#:import NavigationDrawerDivider kivymd.navigationdrawer.NavigationDrawerDivider
|
||||
#:import NavigationDrawerToolbar kivymd.navigationdrawer.NavigationDrawerToolbar
|
||||
#:import NavigationDrawerSubheader kivymd.navigationdrawer.NavigationDrawerSubheader
|
||||
#:import MDCheckbox kivymd.selectioncontrols.MDCheckbox
|
||||
#:import MDSwitch kivymd.selectioncontrols.MDSwitch
|
||||
#:import MDList kivymd.list.MDList
|
||||
#:import OneLineListItem kivymd.list.OneLineListItem
|
||||
#:import TwoLineListItem kivymd.list.TwoLineListItem
|
||||
#:import ThreeLineListItem kivymd.list.ThreeLineListItem
|
||||
#:import OneLineAvatarListItem kivymd.list.OneLineAvatarListItem
|
||||
#:import OneLineIconListItem kivymd.list.OneLineIconListItem
|
||||
#:import OneLineAvatarIconListItem kivymd.list.OneLineAvatarIconListItem
|
||||
#:import MDTextField kivymd.textfields.MDTextField
|
||||
#:import MDSpinner kivymd.spinner.MDSpinner
|
||||
#:import MDCard kivymd.card.MDCard
|
||||
#:import MDSeparator kivymd.card.MDSeparator
|
||||
#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
|
||||
#:import MDNavigationDrawer kivymd.uix.navigationdrawer.MDNavigationDrawer
|
||||
#:import NavigationLayout kivymd.uix.navigationdrawer.NavigationLayout
|
||||
#:import NavigationDrawerDivider kivymd.uix.navigationdrawer.NavigationDrawerDivider
|
||||
#:import NavigationDrawerToolbar kivymd.uix.navigationdrawer.NavigationDrawerToolbar
|
||||
#:import NavigationDrawerSubheader kivymd.uix.navigationdrawer.NavigationDrawerSubheader
|
||||
#:import MDCheckbox kivymd.uix.selectioncontrol.MDCheckbox
|
||||
#:import MDSwitch kivymd.uix.selectioncontrol.MDSwitch
|
||||
#:import MDList kivymd.uix.list.MDList
|
||||
#:import OneLineListItem kivymd.uix.list.OneLineListItem
|
||||
#:import TwoLineListItem kivymd.uix.list.TwoLineListItem
|
||||
#:import ThreeLineListItem kivymd.uix.list.ThreeLineListItem
|
||||
#:import OneLineAvatarListItem kivymd.uix.list.OneLineAvatarListItem
|
||||
#:import OneLineIconListItem kivymd.uix.list.OneLineIconListItem
|
||||
#:import OneLineAvatarIconListItem kivymd.uix.list.OneLineAvatarIconListItem
|
||||
#:import MDTextField kivymd.uix.textfield.MDTextField
|
||||
#:import MDSpinner kivymd.uix.spinner.MDSpinner
|
||||
#:import MDCard kivymd.uix.card.MDCard
|
||||
#:import MDSeparator kivymd.uix.card.MDSeparator
|
||||
#:import MDDropdownMenu kivymd.uix.menu.MDDropdownMenu
|
||||
#:import get_color_from_hex kivy.utils.get_color_from_hex
|
||||
#:import colors kivymd.color_definitions.colors
|
||||
#:import SmartTile kivymd.grid.SmartTile
|
||||
#:import MDSlider kivymd.slider.MDSlider
|
||||
#:import MDTabbedPanel kivymd.tabs.MDTabbedPanel
|
||||
#:import MDTab kivymd.tabs.MDTab
|
||||
#:import MDProgressBar kivymd.progressbar.MDProgressBar
|
||||
#:import MDAccordion kivymd.accordion.MDAccordion
|
||||
#:import MDAccordionItem kivymd.accordion.MDAccordionItem
|
||||
#:import MDAccordionSubItem kivymd.accordion.MDAccordionSubItem
|
||||
#:import MDThemePicker kivymd.theme_picker.MDThemePicker
|
||||
#:import MDBottomNavigation kivymd.tabs.MDBottomNavigation
|
||||
#:import MDBottomNavigationItem kivymd.tabs.MDBottomNavigationItem
|
||||
#:import MDFloatingActionButton kivymd.button.MDFloatingActionButton
|
||||
#:import MDSlider kivymd.uix.slider.MDSlider
|
||||
#:import MDTabs kivymd.uix.tab.MDTabs
|
||||
#:import MDProgressBar kivymd.uix.progressbar.MDProgressBar
|
||||
#:import MDAccordion kivymd.uix.accordion.MDAccordion
|
||||
#:import MDAccordionItem kivymd.uix.accordion.MDAccordionItem
|
||||
#:import MDAccordionSubItem kivymd.uix.accordion.MDAccordionSubItem
|
||||
#:import MDFloatingActionButton kivymd.uix.button.MDFloatingActionButton
|
||||
#:import Factory kivy.factory.Factory
|
||||
#:import MDTextButton kivymd.button.MDTextButton
|
||||
#:import MDTextButton kivymd.uix.button.MDTextButton
|
||||
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
|
||||
#:import MDScrollViewRefreshLayout kivymd.refreshlayout.MDScrollViewRefreshLayout
|
||||
#:import MDScrollViewRefreshLayout kivymd.uix.refreshlayout.MDScrollViewRefreshLayout
|
||||
|
||||
#:set color_button (0.784, 0.443, 0.216, 1) # brown
|
||||
#:set color_button_pressed (0.659, 0.522, 0.431, 1) # darker brown
|
||||
|
@ -176,7 +171,7 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
id: box_layout
|
||||
orientation: 'vertical'
|
||||
Toolbar:
|
||||
MDToolbar:
|
||||
id: toolbar
|
||||
title: app.current_address_label()
|
||||
opacity: 1 if app.addressexist() else 0
|
||||
|
@ -339,10 +334,9 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .6, .35
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: root.available_credits
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -388,7 +382,6 @@ NavigationLayout:
|
|||
txt_input: txt_input
|
||||
rv: rv
|
||||
size : (890, 60)
|
||||
size_hint: 1,1
|
||||
MyTextInput:
|
||||
id: txt_input
|
||||
size_hint_y: None
|
||||
|
@ -419,11 +412,10 @@ NavigationLayout:
|
|||
spacing:50
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: 1, None
|
||||
height: dp(40)
|
||||
on_press: root.reset_composer()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'reset'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -517,11 +509,10 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .5, .35
|
||||
height: dp(40)
|
||||
on_press: app.root.ids.scr_mngr.current = 'random'
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'proceed'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -561,12 +552,11 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .5, None
|
||||
height: dp(40)
|
||||
on_release: root.generateaddress(app)
|
||||
opposite_colors: True
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'next'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -591,10 +581,9 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .6, .55
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Server'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -604,10 +593,9 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .6, .55
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Import or export data'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -617,10 +605,9 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .6, .55
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Restart background service'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -638,7 +625,6 @@ NavigationLayout:
|
|||
BoxLayout:
|
||||
MDCheckbox:
|
||||
id: chkbox
|
||||
size_hint: None, None
|
||||
size: dp(48), dp(64)
|
||||
active: True
|
||||
MDLabel:
|
||||
|
@ -698,20 +684,20 @@ NavigationLayout:
|
|||
size: self.size
|
||||
MDLabel:
|
||||
size_hint_y: None
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: 'Platinum'
|
||||
halign: 'center'
|
||||
color: 1,1,1,1
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: 'We provide subscriptions for proof of work calculation for first month. '
|
||||
halign: 'center'
|
||||
color: 1,1,1,1
|
||||
MDLabel:
|
||||
id: free_pak
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: '€ 50.0'
|
||||
halign: 'center'
|
||||
|
@ -723,11 +709,10 @@ NavigationLayout:
|
|||
Rectangle:
|
||||
pos: self.pos
|
||||
size: self.size
|
||||
size_hint: 1, None
|
||||
height: dp(40)
|
||||
on_press: root.get_available_credits(self)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Get Free Credits'
|
||||
font_size: '13sp'
|
||||
color: (0,0,0,1)
|
||||
|
@ -744,19 +729,19 @@ NavigationLayout:
|
|||
size: self.size
|
||||
MDLabel:
|
||||
size_hint_y: None
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: 'Silver'
|
||||
halign: 'center'
|
||||
color: 1,1,1,1
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: 'We provide for proof of work calculation for six month. '
|
||||
halign: 'center'
|
||||
color: 1,1,1,1
|
||||
MDLabel:
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: '€ 100.0'
|
||||
halign: 'center'
|
||||
|
@ -768,10 +753,9 @@ NavigationLayout:
|
|||
Rectangle:
|
||||
pos: self.pos
|
||||
size: self.size
|
||||
size_hint: 1, None
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Get Monthly Credits'
|
||||
font_size: '13sp'
|
||||
color: (0,0,0,1)
|
||||
|
@ -788,19 +772,19 @@ NavigationLayout:
|
|||
size: self.size
|
||||
MDLabel:
|
||||
size_hint_y: None
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: 'Gold'
|
||||
halign: 'center'
|
||||
color: 1,1,1,1
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: 'We provide for proof of work calculation for 1years. '
|
||||
halign: 'center'
|
||||
color: 1,1,1,1
|
||||
MDLabel:
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: '€ 500.0'
|
||||
halign: 'center'
|
||||
|
@ -812,10 +796,9 @@ NavigationLayout:
|
|||
Rectangle:
|
||||
pos: self.pos
|
||||
size: self.size
|
||||
size_hint: 1, None
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Get Yearly Credits'
|
||||
font_size: '13sp'
|
||||
color: (0,0,0,1)
|
||||
|
@ -824,7 +807,6 @@ NavigationLayout:
|
|||
|
||||
<GrashofPopup>:
|
||||
id: popup
|
||||
size_hint : (None,None)
|
||||
height: 2*(label.height + address.height) + 10
|
||||
width :app.window_size[0] - app.window_size[0]/10
|
||||
title: 'add contact\'s'
|
||||
|
@ -857,32 +839,29 @@ NavigationLayout:
|
|||
orientation: 'horizontal'
|
||||
MDRaisedButton:
|
||||
id: save_addr
|
||||
size_hint: 1.5, None
|
||||
height: dp(40)
|
||||
on_release:
|
||||
root.savecontact()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Save'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDRaisedButton:
|
||||
size_hint: 1.5, None
|
||||
height: dp(40)
|
||||
on_press: root.dismiss()
|
||||
on_press: root.close_pop()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Cancel'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDRaisedButton:
|
||||
size_hint: 2, None
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Scan QR code'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -891,93 +870,8 @@ NavigationLayout:
|
|||
|
||||
<NetworkStat>:
|
||||
name: 'networkstat'
|
||||
MDTabbedPanel:
|
||||
id: tab_panel
|
||||
tab_display_mode:'text'
|
||||
|
||||
MDTab:
|
||||
name: 'connections'
|
||||
text: "Total connections"
|
||||
ScrollView:
|
||||
do_scroll_x: False
|
||||
MDList:
|
||||
id: ml
|
||||
size_hint_y: None
|
||||
height: dp(200)
|
||||
OneLineListItem:
|
||||
text: "Total Connections"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .6, .35
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
text: root.text_variable_1
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDTab:
|
||||
name: 'processes'
|
||||
text: 'Processes'
|
||||
ScrollView:
|
||||
do_scroll_x: False
|
||||
MDList:
|
||||
id: ml
|
||||
size_hint_y: None
|
||||
height: dp(500)
|
||||
OneLineListItem:
|
||||
text: "person-to-person"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .7, .6
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
text: root.text_variable_2
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
OneLineListItem:
|
||||
text: "Brodcast"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .7, .6
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
text: root.text_variable_3
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
OneLineListItem:
|
||||
text: "publickeys"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .7, .6
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
text: root.text_variable_4
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
OneLineListItem:
|
||||
text: "objects"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .7, .6
|
||||
height: dp(40)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
text: root.text_variable_5
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
Label:
|
||||
text:"surbhi"
|
||||
|
||||
<MailDetail>:
|
||||
name: 'mailDetail'
|
||||
|
@ -989,31 +883,31 @@ NavigationLayout:
|
|||
height: dp(500) + self.minimum_height
|
||||
padding: dp(32)
|
||||
MDLabel:
|
||||
font_style: 'Headline'
|
||||
font_style: 'Subtitle1'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.subject
|
||||
halign: 'left'
|
||||
font_size: '20sp'
|
||||
CopyTextBtn:
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: "From: " + root.from_addr
|
||||
halign: 'left'
|
||||
CopyTextBtn:
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: "To: " + root.to_addr
|
||||
halign: 'left'
|
||||
CopyTextBtn:
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.status
|
||||
halign: 'left'
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.message
|
||||
halign: 'left'
|
||||
|
@ -1055,7 +949,6 @@ NavigationLayout:
|
|||
|
||||
<MyaddDetailPopup>:
|
||||
id: myadd_popup
|
||||
size_hint : (None,None)
|
||||
height: 4.5*(myaddr_label.height+ my_add_btn.children[0].height)
|
||||
width :app.window_size[0] - app.window_size[0]/10
|
||||
background: './images/popup.jpeg'
|
||||
|
@ -1072,25 +965,25 @@ NavigationLayout:
|
|||
spacing:dp(25)
|
||||
MDLabel:
|
||||
id: myaddr_label
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: "Label"
|
||||
font_size: '17sp'
|
||||
halign: 'left'
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.address_label
|
||||
font_size: '15sp'
|
||||
halign: 'left'
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: "Address"
|
||||
font_size: '17sp'
|
||||
halign: 'left'
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.address
|
||||
font_size: '15sp'
|
||||
|
@ -1100,34 +993,31 @@ NavigationLayout:
|
|||
spacing:5
|
||||
orientation: 'horizontal'
|
||||
MDRaisedButton:
|
||||
size_hint: 2, None
|
||||
height: dp(40)
|
||||
on_press: root.send_message_from()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Send message from'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDRaisedButton:
|
||||
size_hint: 1.5, None
|
||||
height: dp(40)
|
||||
on_press: root.dismiss()
|
||||
on_press: app.root.ids.scr_mngr.current = 'showqrcode'
|
||||
on_press: app.root.ids.sc15.qrdisplay()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Show QR code'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDRaisedButton:
|
||||
size_hint: 1.5, None
|
||||
height: dp(40)
|
||||
on_press: root.dismiss()
|
||||
on_press: root.close_pop()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Cancel'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
@ -1135,7 +1025,6 @@ NavigationLayout:
|
|||
|
||||
<AddbookDetailPopup>:
|
||||
id: addbook_popup
|
||||
size_hint : (None,None)
|
||||
height: 4*(add_label.height)
|
||||
width :app.window_size[0] - app.window_size[0]/10
|
||||
background: './images/popup.jpeg'
|
||||
|
@ -1151,14 +1040,14 @@ NavigationLayout:
|
|||
orientation: 'vertical'
|
||||
spacing:dp(20)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: "Label"
|
||||
font_size: '17sp'
|
||||
halign: 'left'
|
||||
MDTextField:
|
||||
id: add_label
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
font_size: '15sp'
|
||||
halign: 'left'
|
||||
text: root.address_label
|
||||
|
@ -1166,13 +1055,13 @@ NavigationLayout:
|
|||
required: True
|
||||
helper_text_mode: "on_error"
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: "Address"
|
||||
font_size: '17sp'
|
||||
halign: 'left'
|
||||
MDLabel:
|
||||
font_style: 'Subhead'
|
||||
font_style: 'H4'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.address
|
||||
font_size: '15sp'
|
||||
|
@ -1182,33 +1071,30 @@ NavigationLayout:
|
|||
spacing:5
|
||||
orientation: 'horizontal'
|
||||
MDRaisedButton:
|
||||
size_hint: 2, None
|
||||
height: dp(40)
|
||||
on_press: root.send_message_to()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Send message to'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDRaisedButton:
|
||||
size_hint: 1.5, None
|
||||
height: dp(40)
|
||||
font_size: '10sp'
|
||||
on_press: root.update_addbook_label(root.address)
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Save'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
halign: 'center'
|
||||
MDRaisedButton:
|
||||
size_hint: 1.5, None
|
||||
height: dp(40)
|
||||
on_press: root.dismiss()
|
||||
on_press: root.close_pop()
|
||||
MDLabel:
|
||||
font_style: 'Title'
|
||||
font_style: 'H4'
|
||||
text: 'Cancel'
|
||||
font_size: '13sp'
|
||||
color: (1,1,1,1)
|
||||
|
|
|
@ -35,27 +35,31 @@ from kivy.uix.screenmanager import Screen
|
|||
from kivy.uix.spinner import Spinner
|
||||
from kivy.uix.textinput import TextInput
|
||||
from kivy.utils import platform
|
||||
import kivy_helper_search
|
||||
from kivymd.button import MDIconButton
|
||||
from kivymd.dialog import MDDialog
|
||||
from kivymd.label import MDLabel
|
||||
from kivymd.list import (
|
||||
from bitmessagekivy import kivy_helper_search
|
||||
from kivymd.uix.dialog import MDDialog
|
||||
from kivymd.uix.button import MDIconButton
|
||||
from kivymd.uix.label import MDLabel
|
||||
from kivymd.uix.list import (
|
||||
ILeftBody,
|
||||
ILeftBodyTouch,
|
||||
IRightBodyTouch,
|
||||
TwoLineAvatarIconListItem,
|
||||
TwoLineListItem)
|
||||
from kivymd.navigationdrawer import (
|
||||
from kivymd.uix.navigationdrawer import (
|
||||
MDNavigationDrawer,
|
||||
NavigationDrawerHeaderBase)
|
||||
from kivymd.selectioncontrols import MDCheckbox
|
||||
from kivymd.uix.selectioncontrol import MDCheckbox
|
||||
from kivymd.theming import ThemeManager
|
||||
import queues
|
||||
from semaphores import kivyuisignaler
|
||||
import state
|
||||
from uikivysignaler import UIkivySignaler
|
||||
|
||||
import identiconGeneration
|
||||
from bitmessagekivy.uikivysignaler import UIkivySignaler
|
||||
# pylint: disable=unused-argument, too-few-public-methods, import-error
|
||||
|
||||
from bitmessagekivy import identiconGeneration
|
||||
import os
|
||||
from kivy.core.clipboard import Clipboard
|
||||
# pylint: disable=unused-argument, too-few-public-methods
|
||||
|
||||
|
||||
|
@ -89,7 +93,7 @@ class Inbox(Screen):
|
|||
def init_ui(self, dt=0):
|
||||
"""Clock Schdule for method inbox accounts."""
|
||||
self.inboxaccounts()
|
||||
print dt
|
||||
print(dt)
|
||||
|
||||
def inboxaccounts(self):
|
||||
"""Load inbox accounts."""
|
||||
|
@ -305,6 +309,7 @@ class MyAddress(Screen):
|
|||
self.init_ui()
|
||||
self.ids.refresh_layout.refresh_done()
|
||||
self.tick = 0
|
||||
|
||||
Clock.schedule_once(refresh_callback, 1)
|
||||
|
||||
@staticmethod
|
||||
|
@ -329,7 +334,7 @@ class AddressBook(Screen):
|
|||
def init_ui(self, dt=0):
|
||||
"""Clock Schdule for method AddressBook."""
|
||||
self.loadAddresslist(None, 'All', '')
|
||||
print dt
|
||||
print (dt)
|
||||
|
||||
def loadAddresslist(self, account, where="", what=""):
|
||||
"""Clock Schdule for method AddressBook."""
|
||||
|
@ -428,7 +433,7 @@ class SelectableLabel(RecycleDataViewBehavior, Label):
|
|||
"""Respond to the selection of items in the view."""
|
||||
self.selected = is_selected
|
||||
if is_selected:
|
||||
print "selection changed to {0}".format(rv.data[index])
|
||||
print("selection changed to {0}".format(rv.data[index]))
|
||||
rv.parent.txt_input.text = rv.parent.txt_input.text.replace(
|
||||
rv.parent.txt_input.text, rv.data[index]['text'])
|
||||
|
||||
|
@ -455,7 +460,7 @@ class DropDownWidget(BoxLayout):
|
|||
subject = self.ids.subject.text.encode('utf-8').strip()
|
||||
message = self.ids.body.text.encode('utf-8').strip()
|
||||
encoding = 3
|
||||
print "message: ", self.ids.body.text
|
||||
print ("message: ", self.ids.body.text)
|
||||
sendMessageToPeople = True
|
||||
if sendMessageToPeople:
|
||||
if toAddress != '' and subject and message:
|
||||
|
@ -483,12 +488,12 @@ class DropDownWidget(BoxLayout):
|
|||
toAddress = addBMIfNotPresent(toAddress)
|
||||
statusIconColor = 'red'
|
||||
if addressVersionNumber > 4 or addressVersionNumber <= 1:
|
||||
print "addressVersionNumber > 4 \
|
||||
or addressVersionNumber <= 1"
|
||||
print("addressVersionNumber > 4 \
|
||||
or addressVersionNumber <= 1")
|
||||
if streamNumber > 1 or streamNumber == 0:
|
||||
print "streamNumber > 1 or streamNumber == 0"
|
||||
print("streamNumber > 1 or streamNumber == 0")
|
||||
if statusIconColor == 'red':
|
||||
print "shared.statusIconColor == 'red'"
|
||||
print("shared.statusIconColor == 'red'")
|
||||
stealthLevel = BMConfigParser().safeGetInt(
|
||||
'bitmessagesettings', 'ackstealthlevel')
|
||||
from helper_ackPayload import genAckPayload
|
||||
|
@ -523,7 +528,7 @@ class DropDownWidget(BoxLayout):
|
|||
toLabel = ''
|
||||
|
||||
queues.workerQueue.put(('sendmessage', toAddress))
|
||||
print "sqlExecute successfully #######################"
|
||||
print ("sqlExecute successfully #######################")
|
||||
self.parent.parent.current = 'inbox'
|
||||
state.in_composer = True
|
||||
navApp.back_press()
|
||||
|
@ -718,7 +723,7 @@ class Sent(Screen):
|
|||
def init_ui(self, dt=0):
|
||||
"""Clock Schdule for method sent accounts."""
|
||||
self.sentaccounts()
|
||||
print dt
|
||||
print(dt)
|
||||
|
||||
def sentaccounts(self):
|
||||
"""Load sent accounts."""
|
||||
|
@ -984,6 +989,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
|
|||
|
||||
def build(self):
|
||||
"""Method builds the widget."""
|
||||
import os
|
||||
main_widget = Builder.load_file(
|
||||
os.path.join(os.path.dirname(__file__), 'main.kv'))
|
||||
self.nav_drawer = Navigatorss()
|
||||
|
@ -1087,7 +1093,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
|
|||
if not os.path.exists(directory):
|
||||
os.makedirs(directory)
|
||||
except OSError:
|
||||
print 'Error: Creating directory. ' + directory
|
||||
print('Error: Creating directory. ' + directory)
|
||||
|
||||
@staticmethod
|
||||
def get_default_image():
|
||||
|
@ -1178,7 +1184,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
|
|||
@staticmethod
|
||||
def on_stop():
|
||||
"""On stop methos is used for stoping the runing script."""
|
||||
print "*******************EXITING FROM APPLICATION*******************"
|
||||
print("*******************EXITING FROM APPLICATION*******************")
|
||||
import shutdown
|
||||
shutdown.doCleanShutdown()
|
||||
|
||||
|
@ -1632,7 +1638,7 @@ class Draft(Screen):
|
|||
def init_ui(self, dt=0):
|
||||
"""Clock Schdule for method draft accounts."""
|
||||
self.sentaccounts()
|
||||
print dt
|
||||
print (dt)
|
||||
|
||||
def sentaccounts(self):
|
||||
"""Load draft accounts."""
|
||||
|
@ -1800,7 +1806,7 @@ class Allmails(Screen):
|
|||
def init_ui(self, dt=0):
|
||||
"""Clock Schdule for method all mails."""
|
||||
self.mailaccounts()
|
||||
print dt
|
||||
print (dt)
|
||||
|
||||
def mailaccounts(self):
|
||||
"""Load all mails for account."""
|
||||
|
|
|
@ -179,13 +179,13 @@ def signal_handler(signum, frame):
|
|||
if shared.thisapp.daemon or not state.enableGUI:
|
||||
shutdown.doCleanShutdown()
|
||||
else:
|
||||
print '# Thread: %s(%d)' % (thread.name, thread.ident)
|
||||
print ('# Thread: {}({})'.format(thread.name, thread.ident))
|
||||
for filename, lineno, name, line in traceback.extract_stack(frame):
|
||||
print 'File: "%s", line %d, in %s' % (filename, lineno, name)
|
||||
print ("File: '{}', line {}, in {}" .format(filename, lineno, name))
|
||||
if line:
|
||||
print ' %s' % line.strip()
|
||||
print 'Unfortunately you cannot use Ctrl+C when running the UI \
|
||||
because the UI captures the signal.'
|
||||
print (' {}'.format(line.strip()))
|
||||
print('Unfortunately you cannot use Ctrl+C when running the UI \
|
||||
because the UI captures the signal.')
|
||||
|
||||
|
||||
class Main: # pylint: disable=no-init, old-style-class
|
||||
|
@ -282,7 +282,7 @@ class Main: # pylint: disable=no-init, old-style-class
|
|||
|
||||
if daemon:
|
||||
with shared.printLock:
|
||||
print 'Running as a daemon. Send TERM signal to end.'
|
||||
print('Running as a daemon. Send TERM signal to end.')
|
||||
self.daemonize()
|
||||
|
||||
self.setSignalHandler()
|
||||
|
@ -358,7 +358,7 @@ class Main: # pylint: disable=no-init, old-style-class
|
|||
# Not needed if objproc disabled
|
||||
if state.enableObjProc:
|
||||
shared.reloadMyAddressHashes()
|
||||
shared.reloadBroadcastSendersForWhichImWatching()
|
||||
# shared.reloadBroadcastSendersForWhichImWatching()
|
||||
# API is also objproc dependent
|
||||
if config.safeGetBoolean('bitmessagesettings', 'apienabled'):
|
||||
import api # pylint: disable=relative-import
|
||||
|
@ -373,7 +373,7 @@ class Main: # pylint: disable=no-init, old-style-class
|
|||
asyncoreThread = BMNetworkThread()
|
||||
asyncoreThread.daemon = True
|
||||
asyncoreThread.start()
|
||||
for i in range(config.getint('threads', 'receive')):
|
||||
for i in range(config.safeGet('threads', 'receive')):
|
||||
receiveQueueThread = ReceiveQueueThread(i)
|
||||
receiveQueueThread.daemon = True
|
||||
receiveQueueThread.start()
|
||||
|
@ -405,7 +405,7 @@ class Main: # pylint: disable=no-init, old-style-class
|
|||
if state.curses:
|
||||
if not depends.check_curses():
|
||||
sys.exit()
|
||||
print 'Running with curses'
|
||||
print('Running with curses')
|
||||
import bitmessagecurses
|
||||
bitmessagecurses.runwrapper()
|
||||
|
||||
|
@ -498,10 +498,9 @@ class Main: # pylint: disable=no-init, old-style-class
|
|||
# signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
|
||||
@staticmethod
|
||||
def usage():
|
||||
"""After passing argument, method displays the usages"""
|
||||
print 'Usage: ' + sys.argv[0] + ' [OPTIONS]'
|
||||
print '''
|
||||
def usage(self):
|
||||
print('Usage: ' + sys.argv[0] + ' [OPTIONS]')
|
||||
print ('''
|
||||
Options:
|
||||
-h, --help show this help message and exit
|
||||
-c, --curses use curses (text mode) interface
|
||||
|
@ -509,12 +508,12 @@ Options:
|
|||
-t, --test dryrun, make testing
|
||||
|
||||
All parameters are optional.
|
||||
'''
|
||||
''')
|
||||
|
||||
def stop(self): # pylint: disable=no-self-use
|
||||
"""Method helps to stop the Bitmessage Deamon"""
|
||||
with shared.printLock:
|
||||
print 'Stopping Bitmessage Deamon.'
|
||||
print('Stopping Bitmessage Deamon.')
|
||||
shutdown.doCleanShutdown()
|
||||
|
||||
# ..todo: nice function but no one is using this
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from PyQt4 import QtCore, QtGui
|
||||
from Queue import Queue
|
||||
from queue.Queue import Queue
|
||||
from time import time
|
||||
|
||||
class BMStatusBar(QtGui.QStatusBar):
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
BMConfigParser class definition and default configuration settings
|
||||
"""
|
||||
|
||||
import ConfigParser
|
||||
import configparser
|
||||
import shutil
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
@ -42,35 +42,35 @@ BMConfigDefaults = {
|
|||
|
||||
|
||||
@Singleton
|
||||
class BMConfigParser(ConfigParser.SafeConfigParser):
|
||||
"""Singleton class inherited from ConfigParser.SafeConfigParser
|
||||
class BMConfigParser(configparser.ConfigParser):
|
||||
"""Singleton class inherited from ConfigParsedadfeConfigParser
|
||||
with additional methods specific to bitmessage config."""
|
||||
|
||||
_temp = {}
|
||||
|
||||
def set(self, section, option, value=None):
|
||||
if self._optcre is self.OPTCRE or value:
|
||||
if not isinstance(value, basestring):
|
||||
if not isinstance(value, str):
|
||||
raise TypeError("option values must be strings")
|
||||
if not self.validate(section, option, value):
|
||||
raise ValueError("Invalid value %s" % value)
|
||||
return ConfigParser.ConfigParser.set(self, section, option, value)
|
||||
return configparser.ConfigParser.set(self, section, option, value)
|
||||
|
||||
def get(self, section, option, raw=False, variables=None):
|
||||
try:
|
||||
if section == "bitmessagesettings" and option == "timeformat":
|
||||
return ConfigParser.ConfigParser.get(
|
||||
self, section, option, raw, variables)
|
||||
return configparser.ConfigParser.get(
|
||||
self, section, option, raw=True, vars=variables)
|
||||
try:
|
||||
return self._temp[section][option]
|
||||
except KeyError:
|
||||
pass
|
||||
return ConfigParser.ConfigParser.get(
|
||||
self, section, option, True, variables)
|
||||
except ConfigParser.InterpolationError:
|
||||
return ConfigParser.ConfigParser.get(
|
||||
self, section, option, True, variables)
|
||||
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) as e:
|
||||
return configparser.ConfigParser.get(
|
||||
self, section, option, raw=True, vars=variables)
|
||||
except configparser.InterpolationError:
|
||||
return configparser.ConfigParser.get(
|
||||
self, section, option, raw=True, vars=variables)
|
||||
except (configparser.NoSectionError, configparser.NoOptionError) as e:
|
||||
try:
|
||||
return BMConfigDefaults[section][option]
|
||||
except (KeyError, ValueError, AttributeError):
|
||||
|
@ -84,49 +84,58 @@ class BMConfigParser(ConfigParser.SafeConfigParser):
|
|||
self._temp[section] = {option: value}
|
||||
|
||||
def safeGetBoolean(self, section, field):
|
||||
config = configparser.ConfigParser()
|
||||
try:
|
||||
return self.getboolean(section, field)
|
||||
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError,
|
||||
#Used in the python2.7
|
||||
# return self.getboolean(section, field)
|
||||
#Used in the python3.5.2
|
||||
return config.getboolean(section, field)
|
||||
except (configparser.NoSectionError, configparser.NoOptionError,
|
||||
ValueError, AttributeError):
|
||||
return False
|
||||
|
||||
def safeGetInt(self, section, field, default=0):
|
||||
config = configparser.ConfigParser()
|
||||
try:
|
||||
return self.getint(section, field)
|
||||
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError,
|
||||
#Used in the python2.7
|
||||
# return self.getint(section, field)
|
||||
#Used in the python3.5.2
|
||||
return config.getint(section, field)
|
||||
except (configparser.NoSectionError, configparser.NoOptionError,
|
||||
ValueError, AttributeError):
|
||||
return default
|
||||
|
||||
def safeGet(self, section, option, default=None):
|
||||
try:
|
||||
return self.get(section, option)
|
||||
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError,
|
||||
except (configparser.NoSectionError, configparser.NoOptionError,
|
||||
ValueError, AttributeError):
|
||||
return default
|
||||
|
||||
def items(self, section, raw=False, variables=None):
|
||||
return ConfigParser.ConfigParser.items(self, section, True, variables)
|
||||
return configparser.ConfigParser.items(self, section, True, variables)
|
||||
|
||||
def addresses(self):
|
||||
return filter(
|
||||
lambda x: x.startswith('BM-'), BMConfigParser().sections())
|
||||
return [x for x in BMConfigParser().sections() if x.startswith('BM-')]
|
||||
|
||||
def read(self, filenames):
|
||||
ConfigParser.ConfigParser.read(self, filenames)
|
||||
configparser.ConfigParser.read(self, filenames)
|
||||
for section in self.sections():
|
||||
for option in self.options(section):
|
||||
try:
|
||||
if not self.validate(
|
||||
section, option,
|
||||
ConfigParser.ConfigParser.get(self, section, option)
|
||||
self[section][option]
|
||||
):
|
||||
try:
|
||||
newVal = BMConfigDefaults[section][option]
|
||||
except configparser.NoSectionError:
|
||||
continue
|
||||
except KeyError:
|
||||
continue
|
||||
ConfigParser.ConfigParser.set(
|
||||
configparser.ConfigParser.set(
|
||||
self, section, option, newVal)
|
||||
except ConfigParser.InterpolationError:
|
||||
except configparser.InterpolationError:
|
||||
continue
|
||||
|
||||
def save(self):
|
||||
|
@ -144,7 +153,7 @@ class BMConfigParser(ConfigParser.SafeConfigParser):
|
|||
# didn't exist before.
|
||||
fileNameExisted = False
|
||||
# write the file
|
||||
with open(fileName, 'wb') as configfile:
|
||||
with open(fileName, 'w') as configfile:
|
||||
self.write(configfile)
|
||||
# delete the backup
|
||||
if fileNameExisted:
|
||||
|
@ -152,7 +161,7 @@ class BMConfigParser(ConfigParser.SafeConfigParser):
|
|||
|
||||
def validate(self, section, option, value):
|
||||
try:
|
||||
return getattr(self, 'validate_%s_%s' % (section, option))(value)
|
||||
return getattr(self, 'validate_{}_{}'.format(section, option))(value)
|
||||
except AttributeError:
|
||||
return True
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ class addressGenerator(StoppableThread):
|
|||
super(addressGenerator, self).stopThread()
|
||||
|
||||
def run(self):
|
||||
|
||||
while state.shutdown == 0:
|
||||
queueValue = queues.addressGeneratorQueue.get()
|
||||
nonceTrialsPerByte = 0
|
||||
|
@ -134,7 +133,7 @@ class addressGenerator(StoppableThread):
|
|||
ripe = RIPEMD160Hash(sha.digest()).digest()
|
||||
if (
|
||||
ripe[:numberOfNullBytesDemandedOnFrontOfRipeHash] ==
|
||||
'\x00' * numberOfNullBytesDemandedOnFrontOfRipeHash
|
||||
'\x00'.encode('utf-8') * numberOfNullBytesDemandedOnFrontOfRipeHash
|
||||
):
|
||||
break
|
||||
logger.info(
|
||||
|
@ -151,19 +150,20 @@ class addressGenerator(StoppableThread):
|
|||
# The user must have a pretty fast computer.
|
||||
# time.time() - startTime equaled zero.
|
||||
pass
|
||||
|
||||
address = encodeAddress(
|
||||
addressVersionNumber, streamNumber, ripe)
|
||||
|
||||
# An excellent way for us to store our keys
|
||||
# is in Wallet Import Format. Let us convert now.
|
||||
# https://en.bitcoin.it/wiki/Wallet_import_format
|
||||
privSigningKey = '\x80' + potentialPrivSigningKey
|
||||
privSigningKey = '\x80'.encode('utf-8') + potentialPrivSigningKey
|
||||
checksum = hashlib.sha256(hashlib.sha256(
|
||||
privSigningKey).digest()).digest()[0:4]
|
||||
privSigningKeyWIF = arithmetic.changebase(
|
||||
privSigningKey + checksum, 256, 58)
|
||||
|
||||
privEncryptionKey = '\x80' + potentialPrivEncryptionKey
|
||||
privEncryptionKey = '\x80'.encode('utf-8') + potentialPrivEncryptionKey
|
||||
checksum = hashlib.sha256(hashlib.sha256(
|
||||
privEncryptionKey).digest()).digest()[0:4]
|
||||
privEncryptionKeyWIF = arithmetic.changebase(
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import Queue
|
||||
import queue as Queue
|
||||
import threading
|
||||
import time
|
||||
|
||||
|
|
|
@ -143,8 +143,8 @@ class singleCleaner(StoppableThread):
|
|||
|
||||
# inv/object tracking
|
||||
for connection in \
|
||||
BMConnectionPool().inboundConnections.values() + \
|
||||
BMConnectionPool().outboundConnections.values():
|
||||
list(BMConnectionPool().inboundConnections.values()) + \
|
||||
list(BMConnectionPool().outboundConnections.values()):
|
||||
connection.clean()
|
||||
|
||||
# discovery tracking
|
||||
|
|
|
@ -70,9 +70,11 @@ class sqlThread(threading.Thread):
|
|||
# If the settings version is equal to 2 or 3 then the
|
||||
# sqlThread will modify the pubkeys table and change
|
||||
# the settings version to 4.
|
||||
settingsversion = BMConfigParser().getint(
|
||||
'bitmessagesettings', 'settingsversion')
|
||||
|
||||
# settingsversion = BMConfigParser().getint('bitmessagesettings', 'settingsversion')
|
||||
# In the Python3 I am below condition converting into int
|
||||
# settingsversion = int(BMConfigParser().get('bitmessagesettings', 'settingsversion') \
|
||||
# if BMConfigParser().get('bitmessagesettings', 'settingsversion') else 0)
|
||||
settingsversion = BMConfigParser().safeGetInt('bitmessagesettings', 'settingsvesion')
|
||||
# People running earlier versions of PyBitmessage do not have the
|
||||
# usedpersonally field in their pubkeys table. Let's add it.
|
||||
if settingsversion == 2:
|
||||
|
|
|
@ -23,7 +23,7 @@ Use: `from debug import logger` to import this facility into whatever module you
|
|||
|
||||
"""
|
||||
|
||||
import ConfigParser
|
||||
import configparser
|
||||
import logging
|
||||
import logging.config
|
||||
import os
|
||||
|
@ -47,12 +47,13 @@ def configureLogging():
|
|||
fail_msg = ''
|
||||
try:
|
||||
logging_config = os.path.join(state.appdata, 'logging.dat')
|
||||
logging.config.fileConfig(logging_config)
|
||||
# right now I am commenting the logger
|
||||
# logging.config.fileConfig(logging_config, disable_existing_loggers=False)
|
||||
return (
|
||||
False,
|
||||
'Loaded logger configuration from %s' % logging_config
|
||||
)
|
||||
except (OSError, ConfigParser.NoSectionError):
|
||||
except (OSError, configparser.NoSectionError):
|
||||
if os.path.isfile(logging_config):
|
||||
fail_msg = \
|
||||
'Failed to load logger configuration from %s, using default' \
|
||||
|
|
|
@ -419,11 +419,11 @@ def check_dependencies(verbose=False, optional=False):
|
|||
'PyBitmessage requires Python 2.7.4 or greater'
|
||||
' (but not Python 3+)')
|
||||
has_all_dependencies = False
|
||||
if sys.hexversion >= 0x3000000:
|
||||
logger.error(
|
||||
'PyBitmessage does not support Python 3+. Python 2.7.4'
|
||||
' or greater is required.')
|
||||
has_all_dependencies = False
|
||||
# if sys.hexversion >= 0x3000000:
|
||||
# logger.error(
|
||||
# 'PyBitmessage does not support Python 3+. Python 2.7.4'
|
||||
# ' or greater is required.')
|
||||
# has_all_dependencies = False
|
||||
|
||||
check_functions = [check_ripemd160, check_sqlite, check_openssl]
|
||||
if optional:
|
||||
|
|
|
@ -4,7 +4,8 @@ from pyelliptic import arithmetic
|
|||
# This function expects that pubkey begin with \x04
|
||||
def calculateBitcoinAddressFromPubkey(pubkey):
|
||||
if len(pubkey) != 65:
|
||||
print 'Could not calculate Bitcoin address from pubkey because function was passed a pubkey that was', len(pubkey), 'bytes long rather than 65.'
|
||||
print ('Could not calculate Bitcoin address from pubkey because function was passed a pubkey that was'\
|
||||
'{}, bytes long rather than 65.'.format(len(pubkey)))
|
||||
return "error"
|
||||
ripe = hashlib.new('ripemd160')
|
||||
sha = hashlib.new('sha256')
|
||||
|
@ -25,7 +26,8 @@ def calculateBitcoinAddressFromPubkey(pubkey):
|
|||
|
||||
def calculateTestnetAddressFromPubkey(pubkey):
|
||||
if len(pubkey) != 65:
|
||||
print 'Could not calculate Bitcoin address from pubkey because function was passed a pubkey that was', len(pubkey), 'bytes long rather than 65.'
|
||||
print ('Could not calculate Bitcoin address from pubkey because function was passed a pubkey that was',\
|
||||
'{}, bytes long rather than 65.'.format(pubkey))
|
||||
return "error"
|
||||
ripe = hashlib.new('ripemd160')
|
||||
sha = hashlib.new('sha256')
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
"""Helper Sql performs sql operations."""
|
||||
|
||||
import threading
|
||||
import Queue
|
||||
import queue as Queue
|
||||
|
||||
sqlSubmitQueue = Queue.Queue()
|
||||
# SQLITE3 is so thread-unsafe that they won't even let you call it from different threads using your own locks.
|
||||
|
|
|
@ -7,7 +7,7 @@ Helper Start performs all the startup operations.
|
|||
# pylint: disable=too-many-branches,too-many-statements
|
||||
from __future__ import print_function
|
||||
|
||||
import ConfigParser
|
||||
import configparser
|
||||
import os
|
||||
import platform
|
||||
import sys
|
||||
|
@ -25,20 +25,23 @@ StoreConfigFilesInSameDirectoryAsProgramByDefault = False
|
|||
|
||||
|
||||
def _loadTrustedPeer():
|
||||
trustedPeer = ''
|
||||
try:
|
||||
trustedPeer = BMConfigParser().get('bitmessagesettings', 'trustedpeer')
|
||||
except ConfigParser.Error:
|
||||
except configparser.Error:
|
||||
# This probably means the trusted peer wasn't specified so we
|
||||
# can just leave it as None
|
||||
return
|
||||
try:
|
||||
|
||||
if trustedPeer != None:
|
||||
host, port = trustedPeer.split(':')
|
||||
state.trustedPeer = state.Peer(host, int(port))
|
||||
except ValueError:
|
||||
sys.exit(
|
||||
'Bad trustedpeer config setting! It should be set as'
|
||||
' trustedpeer=<hostname>:<portnumber>'
|
||||
)
|
||||
state.trustedPeer = state.Peer(host, int(port))
|
||||
|
||||
|
||||
def loadConfig():
|
||||
|
@ -137,11 +140,12 @@ def loadConfig():
|
|||
|
||||
_loadTrustedPeer()
|
||||
|
||||
|
||||
def updateConfig():
|
||||
"""Save the config"""
|
||||
config = BMConfigParser()
|
||||
settingsversion = config.getint('bitmessagesettings', 'settingsversion')
|
||||
# Used python2.7
|
||||
# settingsversion = int(BMConfigParser().get('bitmessagesettings', 'settingsversion') \
|
||||
settingsversion = BMConfigParser().safeGetInt('bitmessagesettings', 'settingsvesion')
|
||||
if settingsversion == 1:
|
||||
config.set('bitmessagesettings', 'socksproxytype', 'none')
|
||||
config.set('bitmessagesettings', 'sockshostname', 'localhost')
|
||||
|
|
|
@ -15,8 +15,8 @@ def makeCryptor(privkey):
|
|||
"""Return a private pyelliptic.ECC() instance"""
|
||||
private_key = a.changebase(privkey, 16, 256, minlen=32)
|
||||
public_key = pointMult(private_key)
|
||||
privkey_bin = '\x02\xca\x00\x20' + private_key
|
||||
pubkey_bin = '\x02\xca\x00\x20' + public_key[1:-32] + '\x00\x20' + public_key[-32:]
|
||||
privkey_bin = '\x02\xca\x00\x20'.encode('utf-8') + private_key
|
||||
pubkey_bin = '\x02\xca\x00\x20'.encode('utf-8') + public_key[1:-32] + '\x00\x20'.encode('utf-8') + public_key[-32:]
|
||||
cryptor = pyelliptic.ECC(curve='secp256k1', privkey=privkey_bin, pubkey=pubkey_bin)
|
||||
return cryptor
|
||||
|
||||
|
|
|
@ -40,8 +40,8 @@ def json_serialize_knownnodes(output):
|
|||
Reorganize knownnodes dict and write it as JSON to output
|
||||
"""
|
||||
_serialized = []
|
||||
for stream, peers in knownNodes.iteritems():
|
||||
for peer, info in peers.iteritems():
|
||||
for stream, peers in iter(knownNodes.items()):
|
||||
for peer, info in iter(peers.items()):
|
||||
info.update(rating=round(info.get('rating', 0), 2))
|
||||
_serialized.append({
|
||||
'stream': stream, 'peer': peer._asdict(), 'info': info
|
||||
|
@ -85,7 +85,7 @@ def saveKnownNodes(dirName=None):
|
|||
if dirName is None:
|
||||
dirName = state.appdata
|
||||
with knownNodesLock:
|
||||
with open(os.path.join(dirName, 'knownnodes.dat'), 'wb') as output:
|
||||
with open(os.path.join(dirName, 'knownnodes.dat'), 'w') as output:
|
||||
json_serialize_knownnodes(output)
|
||||
|
||||
|
||||
|
@ -106,7 +106,7 @@ def createDefaultKnownNodes():
|
|||
|
||||
def readKnownNodes():
|
||||
try:
|
||||
with open(state.appdata + 'knownnodes.dat', 'rb') as source:
|
||||
with open(state.appdata + 'knownnodes.dat', 'r') as source:
|
||||
with knownNodesLock:
|
||||
try:
|
||||
json_deserialize_knownnodes(source)
|
||||
|
|
24
src/l10n.py
24
src/l10n.py
|
@ -64,20 +64,30 @@ else:
|
|||
if time_format != DEFAULT_TIME_FORMAT:
|
||||
try:
|
||||
#Check day names
|
||||
for i in xrange(7):
|
||||
unicode(time.strftime(time_format, (0, 0, 0, 0, 0, 0, i, 0, 0)), encoding)
|
||||
new_time_format = time_format
|
||||
import sys
|
||||
if sys.version_info >= (3, 0, 0) and time_format == '%%c':
|
||||
time_format = '%c'
|
||||
for i in range(7):
|
||||
#this work for python2.7
|
||||
# unicode(time.strftime(time_format, (0, 0, 0, 0, 0, 0, i, 0, 0)), encoding)
|
||||
#this code for the python3
|
||||
(time.strftime(time_format, (0, 0, 0, 0, 0, 0, i, 0, 0))).encode()
|
||||
#Check month names
|
||||
for i in xrange(1, 13):
|
||||
unicode(time.strftime(time_format, (0, i, 0, 0, 0, 0, 0, 0, 0)), encoding)
|
||||
for i in range(1, 13):
|
||||
# unicode(time.strftime(time_format, (0, i, 0, 0, 0, 0, 0, 0, 0)), encoding)
|
||||
(time.strftime(time_format, (0, i, 0, 0, 0, 0, 0, 0, 0))).encode()
|
||||
|
||||
#Check AM/PM
|
||||
unicode(time.strftime(time_format, (0, 0, 0, 11, 0, 0, 0, 0, 0)), encoding)
|
||||
unicode(time.strftime(time_format, (0, 0, 0, 13, 0, 0, 0, 0, 0)), encoding)
|
||||
(time.strftime(time_format, (0, 0, 0, 11, 0, 0, 0, 0, 0))).encode()
|
||||
(time.strftime(time_format, (0, 0, 0, 13, 0, 0, 0, 0, 0))).encode()
|
||||
#Check DST
|
||||
unicode(time.strftime(time_format, (0, 0, 0, 0, 0, 0, 0, 0, 1)), encoding)
|
||||
(time.strftime(time_format, (0, 0, 0, 0, 0, 0, 0, 0, 1))).encode()
|
||||
except:
|
||||
logger.exception('Could not decode locale formatted timestamp')
|
||||
time_format = DEFAULT_TIME_FORMAT
|
||||
encoding = DEFAULT_ENCODING
|
||||
time_format = new_time_format
|
||||
|
||||
def setlocale(category, newlocale):
|
||||
locale.setlocale(category, newlocale)
|
||||
|
|
|
@ -4,7 +4,7 @@ src/messagetypes/__init__.py
|
|||
"""
|
||||
from importlib import import_module
|
||||
from os import path, listdir
|
||||
from string import lower
|
||||
|
||||
try:
|
||||
from kivy.utils import platform
|
||||
except:
|
||||
|
|
|
@ -3,7 +3,7 @@ src/multiqueue.py
|
|||
=================
|
||||
"""
|
||||
|
||||
import Queue
|
||||
import queue as Queue
|
||||
from collections import deque
|
||||
|
||||
import helper_random
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import Queue
|
||||
import queue as Queue
|
||||
|
||||
from helper_threading import StoppableThread
|
||||
from network.connectionpool import BMConnectionPool
|
||||
|
|
|
@ -30,7 +30,10 @@ class AdvancedDispatcher(asyncore.dispatcher):
|
|||
_buf_len = 131072 # 128kB
|
||||
|
||||
def __init__(self, sock=None):
|
||||
if not hasattr(self, '_map'):
|
||||
# python 2 below condition is used
|
||||
# if not hasattr(self, '_map'):
|
||||
# python 3 below condition is used
|
||||
if not '_map' in dir(self):
|
||||
asyncore.dispatcher.__init__(self, sock)
|
||||
self.read_buf = bytearray()
|
||||
self.write_buf = bytearray()
|
||||
|
|
|
@ -769,8 +769,8 @@ class dispatcher:
|
|||
try:
|
||||
retattr = getattr(self.socket, attr)
|
||||
except AttributeError:
|
||||
raise AttributeError("%s instance has no attribute '%s'"
|
||||
% (self.__class__.__name__, attr))
|
||||
raise AttributeError("{} instance has no attribute {}"
|
||||
.format(self.__class__.__name__, attr))
|
||||
else:
|
||||
msg = "%(me)s.%(attr)s is deprecated; use %(me)s.socket.%(attr)s " \
|
||||
"instead" % {'me': self.__class__.__name__, 'attr': attr}
|
||||
|
@ -788,7 +788,7 @@ class dispatcher:
|
|||
def log_info(self, message, log_type='info'):
|
||||
"""Conditionally print a message"""
|
||||
if log_type not in self.ignore_log_types:
|
||||
print '%s: %s' % (log_type, message)
|
||||
print ('{}: {}'.format((log_type, message)))
|
||||
|
||||
def handle_read_event(self):
|
||||
"""Handle a read event"""
|
||||
|
|
|
@ -11,7 +11,7 @@ import time
|
|||
from binascii import hexlify
|
||||
|
||||
import addresses
|
||||
import connectionpool
|
||||
import network.connectionpool
|
||||
import knownnodes
|
||||
import protocol
|
||||
import state
|
||||
|
@ -26,9 +26,9 @@ from network.bmobject import (
|
|||
BMObjectInvalidError, BMObjectAlreadyHaveError)
|
||||
from network.node import Node
|
||||
from network.proxy import ProxyError
|
||||
from objectracker import missingObjects, ObjectTracker
|
||||
from network.objectracker import missingObjects, ObjectTracker
|
||||
from queues import objectProcessorQueue, portCheckerQueue, invQueue, addrQueue
|
||||
from randomtrackingdict import RandomTrackingDict
|
||||
from network.randomtrackingdict import RandomTrackingDict
|
||||
|
||||
|
||||
class BMProtoError(ProxyError):
|
||||
|
@ -86,7 +86,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker):
|
|||
"""Process incoming header"""
|
||||
self.magic, self.command, self.payloadLength, self.checksum = \
|
||||
protocol.Header.unpack(self.read_buf[:protocol.Header.size])
|
||||
self.command = self.command.rstrip('\x00')
|
||||
self.command = self.command.rstrip('\x00'.encode('utf-8'))
|
||||
if self.magic != 0xE9BEB4D9:
|
||||
# skip 1 byte in order to sync
|
||||
self.set_state("bm_header", length=1)
|
||||
|
|
|
@ -7,20 +7,19 @@ import re
|
|||
import socket
|
||||
import time
|
||||
|
||||
import asyncore_pollchoose as asyncore
|
||||
import network.asyncore_pollchoose as asyncore
|
||||
import helper_random
|
||||
import knownnodes
|
||||
import protocol
|
||||
import state
|
||||
from bmconfigparser import BMConfigParser
|
||||
from connectionchooser import chooseConnection
|
||||
from network.connectionchooser import chooseConnection
|
||||
from debug import logger
|
||||
from proxy import Proxy
|
||||
from network.proxy import Proxy
|
||||
from singleton import Singleton
|
||||
from tcp import (
|
||||
bootstrap, Socks4aBMConnection, Socks5BMConnection,
|
||||
TCPConnection, TCPServer)
|
||||
from udp import UDPSocket
|
||||
from network.tcp import (
|
||||
TCPServer, Socks5BMConnection, Socks4aBMConnection, TCPConnection)
|
||||
from network.udp import UDPSocket
|
||||
|
||||
|
||||
@Singleton
|
||||
|
@ -237,7 +236,7 @@ class BMConnectionPool(object):
|
|||
except ValueError:
|
||||
Proxy.onion_proxy = None
|
||||
established = sum(
|
||||
1 for c in self.outboundConnections.values()
|
||||
1 for c in list(self.outboundConnections.values())
|
||||
if (c.connected and c.fullyEstablished))
|
||||
pending = len(self.outboundConnections) - established
|
||||
if established < BMConfigParser().safeGetInt(
|
||||
|
@ -275,10 +274,15 @@ class BMConnectionPool(object):
|
|||
continue
|
||||
|
||||
self.lastSpawned = time.time()
|
||||
|
||||
print('++++++++++++++++++++++++++++++++++++++++++')
|
||||
print('self.inboundConnections.values()-{}'.format(self.inboundConnections.values()))
|
||||
print('self.outboundConnections.values() -{}'.format(self.outboundConnections.values()))
|
||||
print('+++++++++++++++++++++++++++++++++++++++++++')
|
||||
else:
|
||||
for i in (
|
||||
self.inboundConnections.values() +
|
||||
self.outboundConnections.values()
|
||||
list(self.inboundConnections.values()) +
|
||||
list(self.outboundConnections.values())
|
||||
):
|
||||
# FIXME: rating will be increased after next connection
|
||||
i.handle_close()
|
||||
|
@ -324,8 +328,8 @@ class BMConnectionPool(object):
|
|||
|
||||
reaper = []
|
||||
for i in (
|
||||
self.inboundConnections.values() +
|
||||
self.outboundConnections.values()
|
||||
list(self.inboundConnections.values()) +
|
||||
list(self.outboundConnections.values())
|
||||
):
|
||||
minTx = time.time() - 20
|
||||
if i.fullyEstablished:
|
||||
|
@ -338,10 +342,10 @@ class BMConnectionPool(object):
|
|||
time.time() - i.lastTx)
|
||||
i.set_state("close")
|
||||
for i in (
|
||||
self.inboundConnections.values() +
|
||||
self.outboundConnections.values() +
|
||||
self.listeningSockets.values() +
|
||||
self.udpSockets.values()
|
||||
list(self.inboundConnections.values()) +
|
||||
list(self.outboundConnections.values()) +
|
||||
list(self.listeningSockets.values()) +
|
||||
list(self.udpSockets.values())
|
||||
):
|
||||
if not (i.accepting or i.connecting or i.connected):
|
||||
reaper.append(i)
|
||||
|
|
|
@ -7,7 +7,7 @@ from random import choice, sample, expovariate
|
|||
from threading import RLock
|
||||
from time import time
|
||||
|
||||
import connectionpool
|
||||
from network import connectionpool
|
||||
import state
|
||||
from debug import logging
|
||||
from queues import invQueue
|
||||
|
@ -99,12 +99,12 @@ class Dandelion(): # pylint: disable=old-style-class
|
|||
with self.lock:
|
||||
if len(self.stem) < MAX_STEMS:
|
||||
self.stem.append(connection)
|
||||
for k in (k for k, v in self.nodeMap.iteritems() if v is None):
|
||||
for k in (k for k, v in iter(self.nodeMap.items()) if v is None):
|
||||
self.nodeMap[k] = connection
|
||||
for k, v in {
|
||||
k: v for k, v in self.hashMap.iteritems()
|
||||
for k, v in iter({
|
||||
k: v for k, v in iter(self.hashMap.items())
|
||||
if v.child is None
|
||||
}.iteritems():
|
||||
}).items():
|
||||
self.hashMap[k] = Stem(
|
||||
connection, v.stream, self.poissonTimeout())
|
||||
invQueue.put((v.stream, k, v.child))
|
||||
|
@ -120,13 +120,13 @@ class Dandelion(): # pylint: disable=old-style-class
|
|||
self.stem.remove(connection)
|
||||
# active mappings to pointing to the removed node
|
||||
for k in (
|
||||
k for k, v in self.nodeMap.iteritems() if v == connection
|
||||
k for k, v in iter(self.nodeMap.items()) if v == connection
|
||||
):
|
||||
self.nodeMap[k] = None
|
||||
for k, v in {
|
||||
k: v for k, v in self.hashMap.iteritems()
|
||||
for k, v in iter({
|
||||
k: v for k, v in iter(self.hashMap.items())
|
||||
if v.child == connection
|
||||
}.iteritems():
|
||||
}).items():
|
||||
self.hashMap[k] = Stem(
|
||||
None, v.stream, self.poissonTimeout())
|
||||
|
||||
|
@ -167,7 +167,7 @@ class Dandelion(): # pylint: disable=old-style-class
|
|||
with self.lock:
|
||||
deadline = time()
|
||||
toDelete = [
|
||||
[v.stream, k, v.child] for k, v in self.hashMap.iteritems()
|
||||
[v.stream, k, v.child] for k, v in iter(self.hashMap.items())
|
||||
if v.timeout < deadline
|
||||
]
|
||||
|
||||
|
@ -182,8 +182,8 @@ class Dandelion(): # pylint: disable=old-style-class
|
|||
try:
|
||||
# random two connections
|
||||
self.stem = sample(
|
||||
connectionpool.BMConnectionPool(
|
||||
).outboundConnections.values(), MAX_STEMS)
|
||||
list(connectionpool.BMConnectionPool(
|
||||
).outboundConnections.values()), MAX_STEMS)
|
||||
# not enough stems available
|
||||
except ValueError:
|
||||
self.stem = connectionpool.BMConnectionPool(
|
||||
|
|
|
@ -7,12 +7,12 @@ import time
|
|||
import addresses
|
||||
import helper_random
|
||||
import protocol
|
||||
from dandelion import Dandelion
|
||||
from network.dandelion import Dandelion
|
||||
from debug import logger
|
||||
from helper_threading import StoppableThread
|
||||
from inventory import Inventory
|
||||
from network.connectionpool import BMConnectionPool
|
||||
from objectracker import missingObjects
|
||||
from network.objectracker import missingObjects
|
||||
|
||||
|
||||
class DownloadThread(StoppableThread):
|
||||
|
@ -32,7 +32,7 @@ class DownloadThread(StoppableThread):
|
|||
"""Expire pending downloads eventually"""
|
||||
deadline = time.time() - DownloadThread.requestExpires
|
||||
try:
|
||||
toDelete = [k for k, v in missingObjects.iteritems() if v < deadline]
|
||||
toDelete = [k for k, v in iter(missingObjects.items()) if v < deadline]
|
||||
except RuntimeError:
|
||||
pass
|
||||
else:
|
||||
|
@ -46,7 +46,7 @@ class DownloadThread(StoppableThread):
|
|||
# Choose downloading peers randomly
|
||||
connections = [
|
||||
x for x in
|
||||
BMConnectionPool().inboundConnections.values() + BMConnectionPool().outboundConnections.values()
|
||||
list(BMConnectionPool().inboundConnections.values()) + list(BMConnectionPool().outboundConnections.values())
|
||||
if x.fullyEstablished]
|
||||
helper_random.randomshuffle(connections)
|
||||
try:
|
||||
|
|
|
@ -2,7 +2,7 @@ import socket
|
|||
|
||||
from advanceddispatcher import AdvancedDispatcher
|
||||
import asyncore_pollchoose as asyncore
|
||||
from proxy import ProxyError
|
||||
from network.proxy import ProxyError
|
||||
from socks5 import Socks5Connection, Socks5Resolver
|
||||
from socks4a import Socks4aConnection, Socks4aResolver
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
src/network/invthread.py
|
||||
========================
|
||||
"""
|
||||
import Queue
|
||||
import queue as Queue
|
||||
import random
|
||||
from time import time
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ from threading import RLock
|
|||
|
||||
import network.connectionpool
|
||||
from network.dandelion import Dandelion
|
||||
from randomtrackingdict import RandomTrackingDict
|
||||
from network.randomtrackingdict import RandomTrackingDict
|
||||
|
||||
haveBloom = False
|
||||
|
||||
|
|
|
@ -6,9 +6,9 @@ src/network/proxy.py
|
|||
import socket
|
||||
import time
|
||||
|
||||
import asyncore_pollchoose as asyncore
|
||||
import network.asyncore_pollchoose as asyncore
|
||||
import state
|
||||
from advanceddispatcher import AdvancedDispatcher
|
||||
from network.advanceddispatcher import AdvancedDispatcher
|
||||
from bmconfigparser import BMConfigParser
|
||||
from debug import logger
|
||||
|
||||
|
|
|
@ -140,20 +140,20 @@ if __name__ == '__main__':
|
|||
k = RandomTrackingDict()
|
||||
d = {}
|
||||
|
||||
print "populating random tracking dict"
|
||||
print ("populating random tracking dict")
|
||||
a.append(time())
|
||||
for i in range(50000):
|
||||
k[randString()] = True
|
||||
a.append(time())
|
||||
print "done"
|
||||
print ("done")
|
||||
|
||||
while k:
|
||||
retval = k.randomKeys(1000)
|
||||
if not retval:
|
||||
print "error getting random keys"
|
||||
print ("error getting random keys")
|
||||
try:
|
||||
k.randomKeys(100)
|
||||
print "bad"
|
||||
print( "bad")
|
||||
except KeyError:
|
||||
pass
|
||||
for i in retval:
|
||||
|
@ -161,4 +161,4 @@ if __name__ == '__main__':
|
|||
a.append(time())
|
||||
|
||||
for x in range(len(a) - 1):
|
||||
print "%i: %.3f" % (x, a[x + 1] - a[x])
|
||||
print("{}i: {}.3f".format(x, a[x + 1] - a[x]))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import errno
|
||||
import Queue
|
||||
import queue as Queue
|
||||
import socket
|
||||
|
||||
from debug import logger
|
||||
|
|
|
@ -6,7 +6,7 @@ src/network/socks4a.py
|
|||
import socket
|
||||
import struct
|
||||
|
||||
from proxy import Proxy, ProxyError, GeneralProxyError
|
||||
from network.proxy import Proxy, ProxyError, GeneralProxyError
|
||||
|
||||
|
||||
class Socks4aError(ProxyError):
|
||||
|
@ -141,4 +141,4 @@ class Socks4aResolver(Socks4a):
|
|||
PyBitmessage, a callback needs to be implemented which hasn't
|
||||
been done yet.
|
||||
"""
|
||||
print "Resolved %s as %s" % (self.host, self.proxy_sock_name())
|
||||
print("Resolved {} as {}".format(self.host, self.proxy_sock_name()))
|
||||
|
|
|
@ -9,7 +9,7 @@ import socket
|
|||
import struct
|
||||
|
||||
import state
|
||||
from proxy import GeneralProxyError, Proxy, ProxyError
|
||||
from network.proxy import GeneralProxyError, Proxy, ProxyError
|
||||
|
||||
|
||||
class Socks5AuthError(ProxyError):
|
||||
|
@ -218,4 +218,4 @@ class Socks5Resolver(Socks5):
|
|||
To use this within PyBitmessage, a callback needs to be
|
||||
implemented which hasn't been done yet.
|
||||
"""
|
||||
print "Resolved %s as %s" % (self.host, self.proxy_sock_name())
|
||||
print("Resolved {} as {}".format(self.host, self.proxy_sock_name()))
|
||||
|
|
|
@ -4,9 +4,9 @@ src/network/stats.py
|
|||
"""
|
||||
import time
|
||||
|
||||
import asyncore_pollchoose as asyncore
|
||||
from network import asyncore_pollchoose as asyncore
|
||||
from network.connectionpool import BMConnectionPool
|
||||
from objectracker import missingObjects
|
||||
from network.objectracker import missingObjects
|
||||
|
||||
|
||||
lastReceivedTimestamp = time.time()
|
||||
|
@ -20,8 +20,8 @@ currentSentSpeed = 0
|
|||
def connectedHostsList():
|
||||
"""List of all the connected hosts"""
|
||||
retval = []
|
||||
for i in BMConnectionPool().inboundConnections.values() + \
|
||||
BMConnectionPool().outboundConnections.values():
|
||||
for i in list(BMConnectionPool().inboundConnections.values()) + \
|
||||
list(BMConnectionPool().outboundConnections.values()):
|
||||
if not i.fullyEstablished:
|
||||
continue
|
||||
try:
|
||||
|
|
|
@ -10,8 +10,8 @@ import socket
|
|||
import time
|
||||
|
||||
import addresses
|
||||
import asyncore_pollchoose as asyncore
|
||||
import connectionpool
|
||||
import network.asyncore_pollchoose as asyncore
|
||||
import network.connectionpool
|
||||
import helper_random
|
||||
import knownnodes
|
||||
import protocol
|
||||
|
@ -362,7 +362,7 @@ class TCPServer(AdvancedDispatcher):
|
|||
"""TCP connection server for Bitmessage protocol"""
|
||||
|
||||
def __init__(self, host='127.0.0.1', port=8444):
|
||||
if not hasattr(self, '_map'):
|
||||
if not '_map' in dir(self):
|
||||
AdvancedDispatcher.__init__(self)
|
||||
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.set_reuse_addr()
|
||||
|
|
|
@ -21,7 +21,12 @@ if sys.version_info >= (2, 7, 13):
|
|||
# this means TLSv1 or higher
|
||||
# in the future change to
|
||||
# ssl.PROTOCOL_TLS1.2
|
||||
# Right now I am using the python3.5.2 and I faced the ssl for protocol due to this I
|
||||
# have used try and catch
|
||||
try:
|
||||
sslProtocolVersion = ssl.PROTOCOL_TLS # pylint: disable=no-member
|
||||
except AttributeError:
|
||||
sslProtocolVersion = ssl.PROTOCOL_SSLv23
|
||||
elif sys.version_info >= (2, 7, 9):
|
||||
# this means any SSL/TLS. SSLv2 and 3 are excluded with an option after context is created
|
||||
sslProtocolVersion = ssl.PROTOCOL_SSLv23
|
||||
|
|
|
@ -7,9 +7,9 @@ import socket
|
|||
|
||||
import state
|
||||
import protocol
|
||||
from bmproto import BMProto
|
||||
from network.bmproto import BMProto
|
||||
from debug import logger
|
||||
from objectracker import ObjectTracker
|
||||
from network.objectracker import ObjectTracker
|
||||
from queues import receiveDataQueue
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ from helper_threading import StoppableThread
|
|||
from inventory import Inventory
|
||||
from network.connectionpool import BMConnectionPool
|
||||
from network.dandelion import Dandelion
|
||||
from randomtrackingdict import RandomTrackingDict
|
||||
from network.randomtrackingdict import RandomTrackingDict
|
||||
|
||||
|
||||
class UploadThread(StoppableThread):
|
||||
|
@ -26,8 +26,8 @@ class UploadThread(StoppableThread):
|
|||
while not self._stopped:
|
||||
uploaded = 0
|
||||
# Choose downloading peers randomly
|
||||
connections = [x for x in BMConnectionPool().inboundConnections.values() +
|
||||
BMConnectionPool().outboundConnections.values() if x.fullyEstablished]
|
||||
connections = [x for x in list(BMConnectionPool().inboundConnections.values()) +
|
||||
list(BMConnectionPool().outboundConnections.values()) if x.fullyEstablished]
|
||||
helper_random.randomshuffle(connections)
|
||||
for i in connections:
|
||||
now = time.time()
|
||||
|
|
|
@ -107,9 +107,10 @@ def do_opencl_pow(hash, target):
|
|||
#initCL()
|
||||
|
||||
if __name__ == "__main__":
|
||||
target = 54227212183L
|
||||
#in python3 I have change this 54227212183L to 54227212183
|
||||
target = 54227212183
|
||||
initialHash = "3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3".decode("hex")
|
||||
nonce = do_opencl_pow(initialHash.encode("hex"), target)
|
||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
||||
print "{} - value {} < {}".format(nonce, trialValue, target)
|
||||
print ("{} - value {} < {}".format(nonce, trialValue, target))
|
||||
|
||||
|
|
|
@ -94,9 +94,9 @@ def isBitSetWithinBitfield(fourByteString, n):
|
|||
def encodeHost(host):
|
||||
"""Encode a given host to be used in low-level socket operations"""
|
||||
if host.find('.onion') > -1:
|
||||
return '\xfd\x87\xd8\x7e\xeb\x43' + base64.b32decode(host.split(".")[0], True)
|
||||
return '\xfd\x87\xd8\x7e\xeb\x43'.encode('utf-8') + base64.b32decode(host.split(".")[0], True)
|
||||
elif host.find(':') == -1:
|
||||
return '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + \
|
||||
return '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF'.encode('utf-8') + \
|
||||
socket.inet_aton(host)
|
||||
return socket.inet_pton(socket.AF_INET6, host)
|
||||
|
||||
|
|
|
@ -30,17 +30,24 @@ def get_code_string(base):
|
|||
elif base == 58:
|
||||
return "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
||||
elif base == 256:
|
||||
return ''.join([chr(x) for x in range(256)])
|
||||
'''raw_unicode_escape is used because in the python3 after range(161) its genreate the'
|
||||
the speical character so avoiding that function we have used the raw_unicode method '''
|
||||
return ''.join([chr(x) for x in range(256)]).encode('raw_unicode_escape')
|
||||
else:
|
||||
raise ValueError("Invalid base!")
|
||||
|
||||
|
||||
def encode(val, base, minlen=0):
|
||||
code_string = get_code_string(base)
|
||||
result = ""
|
||||
result = ''
|
||||
# result = str.encode(result)
|
||||
count = 0
|
||||
while val > 0:
|
||||
result = code_string[val % base] + result
|
||||
val /= base
|
||||
count += 1
|
||||
print(f'code_string[int(val) % base:int(val) % base + 1] -{code_string[int(val) % base:int(val) % base + 1]}')
|
||||
print(f'result-{result}')
|
||||
result = code_string[int(val) % base:int(val) % base + 1] + result
|
||||
val = int(val / base)
|
||||
if len(result) < minlen:
|
||||
result = code_string[0] * (minlen - len(result)) + result
|
||||
return result
|
||||
|
|
|
@ -8,7 +8,7 @@ src/pyelliptic/cipher.py
|
|||
# Copyright (C) 2011 Yann GUIBET <yannguibet@gmail.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
from openssl import OpenSSL
|
||||
from .openssl import OpenSSL
|
||||
|
||||
|
||||
# pylint: disable=redefined-builtin
|
||||
|
|
|
@ -12,9 +12,9 @@ src/pyelliptic/ecc.py
|
|||
from hashlib import sha512
|
||||
from struct import pack, unpack
|
||||
|
||||
from cipher import Cipher
|
||||
from hash import equals, hmac_sha256
|
||||
from openssl import OpenSSL
|
||||
from pyelliptic.cipher import Cipher
|
||||
from pyelliptic.hash import equals, hmac_sha256
|
||||
from pyelliptic.openssl import OpenSSL
|
||||
|
||||
|
||||
class ECC(object):
|
||||
|
@ -137,18 +137,19 @@ class ECC(object):
|
|||
i += 2
|
||||
pubkey_x = pubkey[i:i + tmplen]
|
||||
i += tmplen
|
||||
i += int(tmplen / 3)
|
||||
tmplen = unpack('!H', pubkey[i:i + 2])[0]
|
||||
i += 2
|
||||
pubkey_y = pubkey[i:i + tmplen]
|
||||
i += tmplen
|
||||
return curve, pubkey_x, pubkey_y, i
|
||||
return curve, pubkey_x, pubkey_y, int(i)
|
||||
|
||||
@staticmethod
|
||||
def _decode_privkey(privkey):
|
||||
i = 0
|
||||
curve = unpack('!H', privkey[i:i + 2])[0]
|
||||
i += 2
|
||||
tmplen = unpack('!H', privkey[i:i + 2])[0]
|
||||
tmplen = pack('!s', privkey[i:i + 1])[0]
|
||||
i += 2
|
||||
privkey = privkey[i:i + tmplen]
|
||||
i += tmplen
|
||||
|
|
|
@ -7,7 +7,7 @@ src/pyelliptic/hash.py
|
|||
# Copyright (C) 2011 Yann GUIBET <yannguibet@gmail.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
from openssl import OpenSSL
|
||||
from .openssl import OpenSSL
|
||||
|
||||
|
||||
# For python3
|
||||
|
|
|
@ -90,7 +90,7 @@ class _OpenSSL:
|
|||
"""Build the wrapper"""
|
||||
self._lib = ctypes.CDLL(library)
|
||||
self._version, self._hexversion, self._cflags = get_version(self._lib)
|
||||
self._libreSSL = self._version.startswith("LibreSSL")
|
||||
self._libreSSL = (self._version).decode("utf-8").startswith("OpenSSL")
|
||||
|
||||
self.pointer = ctypes.pointer
|
||||
self.c_int = ctypes.c_int
|
||||
|
@ -674,6 +674,7 @@ def loadOpenSSL():
|
|||
elif 'win32' in sys.platform or 'win64' in sys.platform:
|
||||
libdir.append(path.join(sys._MEIPASS, 'libeay32.dll'))
|
||||
else:
|
||||
|
||||
libdir.extend([
|
||||
path.join(sys._MEIPASS, 'libcrypto.so'),
|
||||
path.join(sys._MEIPASS, 'libssl.so'),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import Queue
|
||||
import queue as Queue
|
||||
|
||||
from class_objectProcessorQueue import ObjectProcessorQueue
|
||||
from multiqueue import MultiQueue
|
||||
|
|
|
@ -125,7 +125,7 @@ def reloadMyAddressHashes():
|
|||
keyfileSecure = checkSensitiveFilePermissions(state.appdata + 'keys.dat')
|
||||
hasEnabledKeys = False
|
||||
for addressInKeysFile in BMConfigParser().addresses():
|
||||
isEnabled = BMConfigParser().getboolean(addressInKeysFile, 'enabled')
|
||||
isEnabled = BMConfigParser().safeGet(addressInKeysFile, 'enabled')
|
||||
if isEnabled:
|
||||
hasEnabledKeys = True
|
||||
# status
|
||||
|
@ -174,12 +174,9 @@ def reloadBroadcastSendersForWhichImWatching():
|
|||
# Now, for all addresses, even version 2 addresses,
|
||||
# we should create Cryptor objects in a dictionary which we will
|
||||
# use to attempt to decrypt encrypted broadcast messages.
|
||||
|
||||
if addressVersionNumber <= 3:
|
||||
privEncryptionKey = hashlib.sha512(
|
||||
encodeVarint(addressVersionNumber) +
|
||||
encodeVarint(streamNumber) + hash
|
||||
).digest()[:32]
|
||||
privEncryptionKey = hashlib.sha512((encodeVarint(addressVersionNumber) \
|
||||
+ encodeVarint(streamNumber) + hash)).digest()[:32]
|
||||
MyECSubscriptionCryptorObjects[hash] = \
|
||||
highlevelcrypto.makeCryptor(hexlify(privEncryptionKey))
|
||||
else:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import os
|
||||
import Queue
|
||||
import queue as Queue
|
||||
import threading
|
||||
import time
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ class singleinstance:
|
|||
fcntl.lockf(self.fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
||||
self.lockPid = os.getpid()
|
||||
except IOError:
|
||||
print 'Another instance of this application is already running'
|
||||
print ('Another instance of this application is already running')
|
||||
sys.exit(-1)
|
||||
else:
|
||||
pidLine = "%i\n" % self.lockPid
|
||||
|
@ -94,11 +94,11 @@ class singleinstance:
|
|||
os.close(self.fd)
|
||||
else:
|
||||
fcntl.lockf(self.fp, fcntl.LOCK_UN)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
return
|
||||
print "Cleaning up lockfile"
|
||||
print ("Cleaning up lockfile")
|
||||
try:
|
||||
if sys.platform == 'win32':
|
||||
if hasattr(self, 'fd'):
|
||||
|
|
|
@ -9,7 +9,7 @@ from threading import RLock
|
|||
import time
|
||||
|
||||
from paths import lookupAppdataFolder
|
||||
from storage import InventoryStorage, InventoryItem
|
||||
from storage.storage import InventoryStorage, InventoryItem
|
||||
|
||||
|
||||
class FilesystemInventory(InventoryStorage): # pylint: disable=too-many-ancestors, abstract-method
|
||||
|
@ -144,7 +144,7 @@ class FilesystemInventory(InventoryStorage): # pylint: disable=too-many-ances
|
|||
newInventory[streamNumber][hashId] = InventoryItem(
|
||||
objectType, streamNumber, None, expiresTime, tag)
|
||||
except KeyError:
|
||||
print "error loading %s" % (hexlify(hashId))
|
||||
print ("error loading {}".format((hexlify(hashId))))
|
||||
self._inventory = newInventory
|
||||
# for i, v in self._inventory.items():
|
||||
# print "loaded stream: %s, %i items" % (i, len(v))
|
||||
|
|
|
@ -6,8 +6,9 @@ import sqlite3
|
|||
import time
|
||||
from threading import RLock
|
||||
|
||||
|
||||
from helper_sql import sqlQuery, SqlBulkExecute, sqlExecute
|
||||
from storage import InventoryStorage, InventoryItem
|
||||
from storage.storage import InventoryStorage, InventoryItem
|
||||
|
||||
|
||||
class SqliteInventory(InventoryStorage): # pylint: disable=too-many-ancestors
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# Import the libraries.
|
||||
import pdb;pdb.set_trace()
|
||||
import pydenticon100000000000000000000000
|
||||
import hashlib
|
||||
# Set-up some test data.
|
||||
users = ["alice", "bob", "eve", "dave"]
|
||||
# Set-up a list of foreground colours (taken from Sigil).
|
||||
foreground = ["rgb(45,79,255)",
|
||||
"rgb(254,180,44)",
|
||||
"rgb(226,121,234)",
|
||||
"rgb(30,179,253)",
|
||||
"rgb(232,77,65)",
|
||||
"rgb(49,203,115)",
|
||||
"rgb(141,69,170)"]
|
||||
# Set-up a background colour (taken from Sigil).
|
||||
background = "rgb(224,224,224)"
|
||||
# Set-up the padding (top, bottom, left, right) in pixels.
|
||||
padding = (20, 20, 20, 20)
|
||||
# Instantiate a generator that will create 5x5 block identicons using SHA1
|
||||
# digest.
|
||||
generator = pydenticon.Generator(5, 5, digest=hashlib.sha1, foreground=foreground, background=background)
|
||||
|
||||
# identicon_ascii = generator.generate("john.doe@example.com", 200, 200,
|
||||
# output_format="ascii")
|
||||
|
||||
# print identicon_ascii
|
||||
for user in users:
|
||||
identicon = generator.generate(user, 200, 200, padding=padding, output_format="png")
|
||||
filename = user + ".png"
|
||||
with open(filename, "wb") as f:
|
||||
f.write(identicon)
|
|
@ -5,7 +5,7 @@ Tests for core and those that do not work outside
|
|||
|
||||
import os
|
||||
import pickle # nosec
|
||||
import Queue
|
||||
import queue as Queue
|
||||
import random # nosec
|
||||
import string
|
||||
import time
|
||||
|
|
|
@ -46,11 +46,11 @@ def translateText(context, text, n=None):
|
|||
try:
|
||||
from PyQt4 import QtCore, QtGui
|
||||
except Exception as err:
|
||||
print 'PyBitmessage requires PyQt unless you want to run it as a daemon and interact with it using the API\
|
||||
print ('PyBitmessage requires PyQt unless you want to run it as a daemon and interact with it using the API\
|
||||
.You can download PyQt from http://www.riverbankcomputing.com/software/pyqt/download\
|
||||
or by searching Google for \'PyQt Download\'.\
|
||||
If you want to run in daemon mode, see https://bitmessage.org/wiki/Daemon'
|
||||
print 'Error message:', err
|
||||
If you want to run in daemon mode, see https://bitmessage.org/wiki/Daemon')
|
||||
print ('Error message:', err)
|
||||
os._exit(0) # pylint: disable=protected-access
|
||||
if n is None:
|
||||
return QtGui.QApplication.translate(context, text)
|
||||
|
|
Reference in New Issue
Block a user