Browse Source

restrict plugins to the gui

283
thomasv 12 years ago
parent
commit
190f733de2
  1. 7
      electrum
  2. 52
      gui/gui_classic.py
  3. 30
      lib/wallet.py
  4. 47
      plugins/pointofsale.py
  5. 8
      plugins/qrscanner.py

7
electrum

@ -41,12 +41,6 @@ if os.path.exists("lib"):
imp.load_module('electrum', fp, pathname, description) imp.load_module('electrum', fp, pathname, description)
fp, pathname, description = imp.find_module('gui') fp, pathname, description = imp.find_module('gui')
imp.load_module('electrum_gui', fp, pathname, description) imp.load_module('electrum_gui', fp, pathname, description)
fp, pathname, description = imp.find_module('plugins')
imp.load_module('electrum_plugins', fp, pathname, description)
plugin_names = [name for _, name, _ in pkgutil.iter_modules(['plugins'])]
plugins = map(lambda name: imp.load_source('electrum_plugins.'+name, os.path.join(pathname,name+'.py')), plugin_names)
else:
plugins = []
from electrum import * from electrum import *
@ -109,7 +103,6 @@ if __name__ == '__main__':
config = SimpleConfig(config_options) config = SimpleConfig(config_options)
wallet = Wallet(config) wallet = Wallet(config)
wallet.init_plugins(plugins)
if len(args)==0: if len(args)==0:

52
gui/gui_classic.py

@ -269,6 +269,8 @@ class ElectrumWindow(QMainWindow):
self.lite = None self.lite = None
self.wallet = wallet self.wallet = wallet
self.config = config self.config = config
self.init_plugins()
self.wallet.interface.register_callback('updated', self.update_callback) self.wallet.interface.register_callback('updated', self.update_callback)
self.wallet.interface.register_callback('banner', lambda: self.emit(QtCore.SIGNAL('banner_signal')) ) self.wallet.interface.register_callback('banner', lambda: self.emit(QtCore.SIGNAL('banner_signal')) )
self.wallet.interface.register_callback('disconnected', self.update_callback) self.wallet.interface.register_callback('disconnected', self.update_callback)
@ -321,25 +323,51 @@ class ElectrumWindow(QMainWindow):
# set initial message # set initial message
self.console.showMessage(self.wallet.banner) self.console.showMessage(self.wallet.banner)
#init plugins
for p in self.wallet.plugins: # plugins
def init_plugins(self):
if os.path.exists("plugins"):
import imp, pkgutil
fp, pathname, description = imp.find_module('plugins')
imp.load_module('electrum_plugins', fp, pathname, description)
plugin_names = [name for a, name, b in pkgutil.iter_modules(['plugins'])]
self.plugins = map(lambda name: imp.load_source('electrum_plugins.'+name, os.path.join(pathname,name+'.py')), plugin_names)
else:
self.plugins = []
self.plugin_hooks = {}
for p in self.plugins:
try: try:
p.init_gui(self) p.init(self)
except: except:
print_msg("Error:cannot initialize plugin",p) print_msg("Error:cannot initialize plugin",p)
traceback.print_exc(file=sys.stdout) traceback.print_exc(file=sys.stdout)
def set_hook(self, name, callback):
h = self.plugin_hooks.get(name, [])
h.append(callback)
self.plugin_hooks[name] = h
def unset_hook(self, name, callback):
h = self.plugin_hooks.get(name,[])
if callback in h: h.remove(callback)
self.plugin_hooks[name] = h
def run_hook(self, name, args):
for cb in self.plugin_hooks.get(name,[]):
apply(cb, args)
def close(self): def close(self):
QMainWindow.close(self) QMainWindow.close(self)
self.wallet.run_hook('close_main_window', (self,)) self.run_hook('close_main_window', (self,))
def connect_slots(self, sender): def connect_slots(self, sender):
self.connect(sender, QtCore.SIGNAL('timersignal'), self.timer_actions) self.connect(sender, QtCore.SIGNAL('timersignal'), self.timer_actions)
self.previous_payto_e='' self.previous_payto_e=''
def timer_actions(self): def timer_actions(self):
self.wallet.run_hook('timer_actions', (self,)) self.run_hook('timer_actions', (self,))
if self.payto_e.hasFocus(): if self.payto_e.hasFocus():
return return
@ -547,11 +575,11 @@ class ElectrumWindow(QMainWindow):
self.current_item_changed(item) self.current_item_changed(item)
self.wallet.run_hook('item_changed',(self, item, column)) self.run_hook('item_changed',(self, item, column))
def current_item_changed(self, a): def current_item_changed(self, a):
self.wallet.run_hook('current_item_changed',(self, a)) self.run_hook('current_item_changed',(self, a))
@ -697,7 +725,7 @@ class ElectrumWindow(QMainWindow):
self.amount_e.textChanged.connect(lambda: entry_changed(False) ) self.amount_e.textChanged.connect(lambda: entry_changed(False) )
self.fee_e.textChanged.connect(lambda: entry_changed(True) ) self.fee_e.textChanged.connect(lambda: entry_changed(True) )
self.wallet.run_hook('create_send_tab',(self,grid)) self.run_hook('create_send_tab',(self,grid))
return w2 return w2
@ -760,7 +788,7 @@ class ElectrumWindow(QMainWindow):
self.show_message(str(e)) self.show_message(str(e))
return return
self.wallet.run_hook('send_tx', (wallet, self, tx)) self.run_hook('send_tx', (wallet, self, tx))
if label: if label:
self.wallet.labels[tx.hash()] = label self.wallet.labels[tx.hash()] = label
@ -953,7 +981,7 @@ class ElectrumWindow(QMainWindow):
t = _("Unprioritize") if addr in self.wallet.prioritized_addresses else _("Prioritize") t = _("Unprioritize") if addr in self.wallet.prioritized_addresses else _("Prioritize")
menu.addAction(t, lambda: self.toggle_priority(addr)) menu.addAction(t, lambda: self.toggle_priority(addr))
self.wallet.run_hook('receive_menu', (self, menu,)) self.run_hook('receive_menu', (self, menu,))
menu.exec_(self.receive_list.viewport().mapToGlobal(position)) menu.exec_(self.receive_list.viewport().mapToGlobal(position))
@ -1010,7 +1038,7 @@ class ElectrumWindow(QMainWindow):
label = self.wallet.labels.get(address,'') label = self.wallet.labels.get(address,'')
item.setData(1,0,label) item.setData(1,0,label)
self.wallet.run_hook('update_receive_item', (self, address, item)) self.run_hook('update_receive_item', (self, address, item))
c, u = self.wallet.get_addr_balance(address) c, u = self.wallet.get_addr_balance(address)
balance = format_satoshis( c + u, False, self.wallet.num_zeros ) balance = format_satoshis( c + u, False, self.wallet.num_zeros )
@ -2019,7 +2047,7 @@ class ElectrumWindow(QMainWindow):
tabs.addTab(tab5, _('Plugins') ) tabs.addTab(tab5, _('Plugins') )
def mk_toggle(cb, p): def mk_toggle(cb, p):
return lambda: cb.setChecked(p.toggle(self)) return lambda: cb.setChecked(p.toggle(self))
for i, p in enumerate(self.wallet.plugins): for i, p in enumerate(self.plugins):
try: try:
name, description = p.get_info() name, description = p.get_info()
cb = QCheckBox(name) cb = QCheckBox(name)

30
lib/wallet.py

@ -106,10 +106,6 @@ class Wallet:
except: except:
print_msg("Warning: Cannot deserialize transactions. skipping") print_msg("Warning: Cannot deserialize transactions. skipping")
# plugins
self.plugins = []
self.plugin_hooks = {}
# not saved # not saved
self.prevout_values = {} # my own transaction outputs self.prevout_values = {} # my own transaction outputs
self.spent_outputs = [] self.spent_outputs = []
@ -134,32 +130,6 @@ class Wallet:
self.update_tx_outputs(tx_hash) self.update_tx_outputs(tx_hash)
# plugins
def set_hook(self, name, callback):
h = self.plugin_hooks.get(name, [])
h.append(callback)
self.plugin_hooks[name] = h
def unset_hook(self, name, callback):
h = self.plugin_hooks.get(name,[])
if callback in h: h.remove(callback)
self.plugin_hooks[name] = h
def run_hook(self, name, args):
for cb in self.plugin_hooks.get(name,[]):
apply(cb, args)
def init_plugins(self, plugins):
self.plugins = plugins
for p in plugins:
try:
p.init(self)
except:
import traceback
print_msg("Error:cannot initialize plugin",p)
traceback.print_exc(file=sys.stdout)
def set_up_to_date(self,b): def set_up_to_date(self,b):
with self.lock: self.up_to_date = b with self.lock: self.up_to_date = b

47
plugins/pointofsale.py

@ -96,11 +96,8 @@ class QR_Window(QWidget):
def get_info(): def get_info():
return 'Point of Sale', _('Show QR code window and amounts requested for each address. Add menu item to request amount.') return 'Point of Sale', _('Show QR code window and amounts requested for each address. Add menu item to request amount.')
def init(wallet): def init(gui):
wallet.requested_amounts = wallet.config.get('requested_amounts',{}) gui.requested_amounts = gui.config.get('requested_amounts',{})
def init_gui(gui):
gui.qr_window = None gui.qr_window = None
@ -116,19 +113,19 @@ def toggle(gui):
toggle_QR_window(gui, enabled) toggle_QR_window(gui, enabled)
if enabled: if enabled:
gui.wallet.set_hook('item_changed', item_changed) gui.set_hook('item_changed', item_changed)
gui.wallet.set_hook('current_item_changed', recv_changed) gui.set_hook('current_item_changed', recv_changed)
gui.wallet.set_hook('receive_menu', receive_menu) gui.set_hook('receive_menu', receive_menu)
gui.wallet.set_hook('update_receive_item', update_receive_item) gui.set_hook('update_receive_item', update_receive_item)
gui.wallet.set_hook('timer_actions', timer_actions) gui.set_hook('timer_actions', timer_actions)
gui.wallet.set_hook('close_main_window', close_main_window) gui.set_hook('close_main_window', close_main_window)
else: else:
gui.wallet.unset_hook('item_changed', item_changed) gui.unset_hook('item_changed', item_changed)
gui.wallet.unset_hook('current_item_changed', recv_changed) gui.unset_hook('current_item_changed', recv_changed)
gui.wallet.unset_hook('receive_menu', receive_menu) gui.unset_hook('receive_menu', receive_menu)
gui.wallet.unset_hook('update_receive_item', update_receive_item) gui.unset_hook('update_receive_item', update_receive_item)
gui.wallet.unset_hook('timer_actions', timer_actions) gui.unset_hook('timer_actions', timer_actions)
gui.wallet.unset_hook('close_main_window', close_main_window) gui.unset_hook('close_main_window', close_main_window)
return enabled return enabled
@ -143,7 +140,7 @@ def toggle_QR_window(self, show):
if item: if item:
address = str(item.text(1)) address = str(item.text(1))
label = self.wallet.labels.get(address) label = self.wallet.labels.get(address)
amount, currency = self.wallet.requested_amounts.get(address, (None, None)) amount, currency = self.requested_amounts.get(address, (None, None))
self.qr_window.set_content( address, label, amount, currency ) self.qr_window.set_content( address, label, amount, currency )
elif show and self.qr_window and not self.qr_window.isVisible(): elif show and self.qr_window and not self.qr_window.isVisible():
@ -182,8 +179,8 @@ def item_changed(self, item, column):
else: else:
currency = currency.upper() currency = currency.upper()
self.wallet.requested_amounts[address] = (amount, currency) self.requested_amounts[address] = (amount, currency)
self.wallet.config.set_key('requested_amounts', self.wallet.requested_amounts, True) self.wallet.config.set_key('requested_amounts', self.requested_amounts, True)
label = self.wallet.labels.get(address) label = self.wallet.labels.get(address)
if label is None: if label is None:
@ -195,8 +192,8 @@ def item_changed(self, item, column):
else: else:
item.setText(column,'') item.setText(column,'')
if address in self.wallet.requested_amounts: if address in self.requested_amounts:
self.wallet.requested_amounts.pop(address) self.requested_amounts.pop(address)
self.update_receive_item(self.receive_list.currentItem()) self.update_receive_item(self.receive_list.currentItem())
@ -206,7 +203,7 @@ def recv_changed(self, a):
address = str(a.text(0)) address = str(a.text(0))
label = self.wallet.labels.get(address) label = self.wallet.labels.get(address)
try: try:
amount, currency = self.wallet.requested_amounts.get(address, (None, None)) amount, currency = self.requested_amounts.get(address, (None, None))
except: except:
amount, currency = None, None amount, currency = None, None
self.qr_window.set_content( address, label, amount, currency ) self.qr_window.set_content( address, label, amount, currency )
@ -226,9 +223,9 @@ def receive_menu(self, menu):
def update_receive_item(self, address, item): def update_receive_item(self, address, item):
try: try:
amount, currency = self.wallet.requested_amounts.get(address, (None, None)) amount, currency = self.requested_amounts.get(address, (None, None))
except: except:
print "cannot get requested amount", address, self.wallet.requested_amounts.get(address) print "cannot get requested amount", address, self.requested_amounts.get(address)
amount, currency = None, None amount, currency = None, None
amount_str = amount + (' ' + currency if currency else '') if amount is not None else '' amount_str = amount + (' ' + currency if currency else '') if amount is not None else ''

8
plugins/qrscanner.py

@ -7,14 +7,12 @@ except ImportError:
zbar = None zbar = None
def init(wallet):
pass
def init_gui(gui): def init(gui):
if is_enabled(): if is_enabled():
gui.wallet.set_hook('create_send_tab', create_send_tab) gui.set_hook('create_send_tab', create_send_tab)
else: else:
gui.wallet.unset_hook('create_send_tab', create_send_tab) gui.unset_hook('create_send_tab', create_send_tab)
def get_info(): def get_info():
return 'QR scans', "QR Scans.\nInstall the zbar package to enable this plugin" return 'QR scans', "QR Scans.\nInstall the zbar package to enable this plugin"

Loading…
Cancel
Save