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