structural change: wrap wallet instanciation inside the gui class

This commit is contained in:
ThomasV 2013-08-22 12:39:41 +02:00
parent 1b0db8414b
commit 084ed6776b
5 changed files with 443 additions and 316 deletions

View File

@ -22,6 +22,7 @@ import sys, os, time, json
import optparse import optparse
import platform import platform
from decimal import Decimal from decimal import Decimal
import traceback
try: try:
import ecdsa import ecdsa
@ -106,7 +107,6 @@ if __name__ == '__main__':
util.check_windows_wallet_migration() util.check_windows_wallet_migration()
config = SimpleConfig(config_options) config = SimpleConfig(config_options)
wallet = Wallet(config)
if len(args)==0: if len(args)==0:
@ -124,86 +124,22 @@ if __name__ == '__main__':
try: try:
gui = __import__('electrum_gui.gui_' + gui_name, fromlist=['electrum_gui']) gui = __import__('electrum_gui.gui_' + gui_name, fromlist=['electrum_gui'])
except ImportError: except ImportError:
sys.exit("Error: Unknown GUI: " + gui_name ) traceback.print_exc(file=sys.stdout)
sys.exit()
#sys.exit("Error: Unknown GUI: " + gui_name )
interface = Interface(config, True) gui = gui.ElectrumGui(config)
wallet.interface = interface
gui = gui.ElectrumGui(wallet, config)
found = config.wallet_file_exists
if not found:
a = gui.restore_or_create()
if not a: exit()
if a =='create':
wallet.init_seed(None)
gui.show_seed()
if gui.verify_seed():
wallet.save_seed()
else:
exit()
else:
# ask for seed and gap.
sg = gui.seed_dialog()
if not sg: exit()
seed, gap = sg
if not seed: exit()
wallet.gap_limit = gap
if len(seed) == 128:
wallet.seed = ''
wallet.init_sequence(str(seed))
else:
wallet.init_seed(str(seed))
wallet.save_seed()
# select a server.
s = gui.network_dialog()
if s is None:
config.set_key("server", None, True)
config.set_key('auto_cycle', False, True)
interface.start(wait = False)
interface.send([('server.peers.subscribe',[])])
# generate the first addresses, in case we are offline
if not found and ( s is None or a == 'create'):
wallet.synchronize()
verifier = WalletVerifier(interface, config)
verifier.start()
wallet.set_verifier(verifier)
synchronizer = WalletSynchronizer(wallet, config)
synchronizer.start()
if not found and a == 'restore' and s is not None:
try:
keep_it = gui.restore_wallet()
wallet.fill_addressbook()
except:
import traceback
traceback.print_exc(file=sys.stdout)
exit()
if not keep_it: exit()
if not found:
gui.password_dialog()
#wallet.save()
gui.main(url) gui.main(url)
#wallet.save()
verifier.stop()
synchronizer.stop()
interface.stop()
# we use daemon threads, their termination is enforced. # we use daemon threads, their termination is enforced.
# this sleep command gives them time to terminate cleanly. # this sleep command gives them time to terminate cleanly.
time.sleep(0.1) time.sleep(0.1)
sys.exit(0) sys.exit(0)
# instanciate wallet for command-line
wallet = Wallet(config)
if cmd not in known_commands: if cmd not in known_commands:
cmd = 'help' cmd = 'help'

View File

@ -42,7 +42,7 @@ except:
from electrum.wallet import format_satoshis from electrum.wallet import format_satoshis
from electrum.bitcoin import Transaction, is_valid from electrum.bitcoin import Transaction, is_valid
from electrum import mnemonic from electrum import mnemonic
from electrum import util, bitcoin, commands from electrum import util, bitcoin, commands, Interface, Wallet, WalletVerifier, WalletSynchronizer
import bmp, pyqrnative import bmp, pyqrnative
import exchange_rate import exchange_rate
@ -265,6 +265,7 @@ class ElectrumWindow(QMainWindow):
if reason == QSystemTrayIcon.DoubleClick: if reason == QSystemTrayIcon.DoubleClick:
self.showNormal() self.showNormal()
def __init__(self, wallet, config): def __init__(self, wallet, config):
QMainWindow.__init__(self) QMainWindow.__init__(self)
self._close_electrum = False self._close_electrum = False
@ -352,10 +353,21 @@ class ElectrumWindow(QMainWindow):
wallet_folder = self.wallet.config.path wallet_folder = self.wallet.config.path
re.sub("(\/\w*.dat)$", "", wallet_folder) re.sub("(\/\w*.dat)$", "", wallet_folder)
file_name = QFileDialog.getOpenFileName(self, "Select your wallet file", wallet_folder, "*.dat") file_name = QFileDialog.getOpenFileName(self, "Select your wallet file", wallet_folder, "*.dat")
if not file_name: return file_name
return
else: def open_wallet(self):
self.load_wallet(file_name) n = self.select_wallet_file()
if n:
self.load_wallet(n)
def new_wallet(self):
n = self.getOpenFileName("Select wallet file")
wizard = installwizard.InstallWizard(self.config, self.interface)
wallet = wizard.run()
if wallet:
self.load_wallet(wallet)
def init_menubar(self): def init_menubar(self):
@ -363,7 +375,10 @@ class ElectrumWindow(QMainWindow):
electrum_menu = menubar.addMenu(_("&File")) electrum_menu = menubar.addMenu(_("&File"))
open_wallet_action = electrum_menu.addAction(_("Open wallet")) open_wallet_action = electrum_menu.addAction(_("Open wallet"))
open_wallet_action.triggered.connect(self.select_wallet_file) open_wallet_action.triggered.connect(self.open_wallet)
new_wallet_action = electrum_menu.addAction(_("New wallet"))
new_wallet_action.triggered.connect(self.new_wallet)
preferences_name = _("Preferences") preferences_name = _("Preferences")
if sys.platform == 'darwin': if sys.platform == 'darwin':
@ -430,6 +445,7 @@ class ElectrumWindow(QMainWindow):
self.setMenuBar(menubar) self.setMenuBar(menubar)
def load_wallet(self, filename): def load_wallet(self, filename):
import electrum import electrum
@ -1395,7 +1411,7 @@ class ElectrumWindow(QMainWindow):
sb.addPermanentWidget( StatusBarButton( QIcon(":icons/switchgui.png"), _("Switch to Lite Mode"), self.go_lite ) ) sb.addPermanentWidget( StatusBarButton( QIcon(":icons/switchgui.png"), _("Switch to Lite Mode"), self.go_lite ) )
if self.wallet.seed: if self.wallet.seed:
self.lock_icon = QIcon(":icons/lock.png") if self.wallet.use_encryption else QIcon(":icons/unlock.png") self.lock_icon = QIcon(":icons/lock.png") if self.wallet.use_encryption else QIcon(":icons/unlock.png")
self.password_button = StatusBarButton( self.lock_icon, _("Password"), lambda: self.change_password_dialog(self.wallet, self) ) self.password_button = StatusBarButton( self.lock_icon, _("Password"), self.change_password_dialog )
sb.addPermanentWidget( self.password_button ) sb.addPermanentWidget( self.password_button )
sb.addPermanentWidget( StatusBarButton( QIcon(":icons/preferences.png"), _("Preferences"), self.settings_dialog ) ) sb.addPermanentWidget( StatusBarButton( QIcon(":icons/preferences.png"), _("Preferences"), self.settings_dialog ) )
if self.wallet.seed: if self.wallet.seed:
@ -1407,6 +1423,13 @@ class ElectrumWindow(QMainWindow):
self.setStatusBar(sb) self.setStatusBar(sb)
def change_password_dialog(self):
from password_dialog import PasswordDialog
d = PasswordDialog(self.wallet, self)
d.run()
def go_lite(self): def go_lite(self):
import gui_lite import gui_lite
self.config.set_key('gui', 'lite', True) self.config.set_key('gui', 'lite', True)
@ -1490,63 +1513,12 @@ class ElectrumWindow(QMainWindow):
except: except:
QMessageBox.warning(self, _('Error'), _('Incorrect Password'), _('OK')) QMessageBox.warning(self, _('Error'), _('Incorrect Password'), _('OK'))
return return
self.show_seed(seed, self.wallet.imported_keys, self)
from seed_dialog import SeedDialog
d = SeedDialog(self)
d.show_seed(seed, self.wallet.imported_keys)
@classmethod
def show_seed(self, seed, imported_keys, parent=None):
dialog = QDialog(parent)
dialog.setModal(1)
dialog.setWindowTitle('Electrum' + ' - ' + _('Seed'))
brainwallet = ' '.join(mnemonic.mn_encode(seed))
label1 = QLabel(_("Your wallet generation seed is")+ ":")
seed_text = QTextEdit(brainwallet)
seed_text.setReadOnly(True)
seed_text.setMaximumHeight(130)
msg2 = _("Please write down or memorize these 12 words (order is important).") + " " \
+ _("This seed will allow you to recover your wallet in case of computer failure.") + " " \
+ _("Your seed is also displayed as QR code, in case you want to transfer it to a mobile phone.") + "<p>" \
+ "<b>"+_("WARNING")+":</b> " + _("Never disclose your seed. Never type it on a website.") + "</b><p>"
if imported_keys:
msg2 += "<b>"+_("WARNING")+":</b> " + _("Your wallet contains imported keys. These keys cannot be recovered from seed.") + "</b><p>"
label2 = QLabel(msg2)
label2.setWordWrap(True)
logo = QLabel()
logo.setPixmap(QPixmap(":icons/seed.png").scaledToWidth(56))
logo.setMaximumWidth(60)
qrw = QRCodeWidget(seed)
ok_button = QPushButton(_("OK"))
ok_button.setDefault(True)
ok_button.clicked.connect(dialog.accept)
grid = QGridLayout()
#main_layout.addWidget(logo, 0, 0)
grid.addWidget(logo, 0, 0)
grid.addWidget(label1, 0, 1)
grid.addWidget(seed_text, 1, 0, 1, 2)
grid.addWidget(qrw, 0, 2, 2, 1)
vbox = QVBoxLayout()
vbox.addLayout(grid)
vbox.addWidget(label2)
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(ok_button)
vbox.addLayout(hbox)
dialog.setLayout(vbox)
dialog.exec_()
def show_qrcode(self, data, title = "QR code"): def show_qrcode(self, data, title = "QR code"):
if not data: return if not data: return
@ -1728,79 +1700,6 @@ class ElectrumWindow(QMainWindow):
@staticmethod
def change_password_dialog( wallet, parent=None ):
if not wallet.seed:
QMessageBox.information(parent, _('Error'), _('No seed'), _('OK'))
return
d = QDialog(parent)
d.setModal(1)
pw = QLineEdit()
pw.setEchoMode(2)
new_pw = QLineEdit()
new_pw.setEchoMode(2)
conf_pw = QLineEdit()
conf_pw.setEchoMode(2)
vbox = QVBoxLayout()
if parent:
msg = (_('Your wallet is encrypted. Use this dialog to change your password.')+'\n'\
+_('To disable wallet encryption, enter an empty new password.')) \
if wallet.use_encryption else _('Your wallet keys are not encrypted')
else:
msg = _("Please choose a password to encrypt your wallet keys.")+'\n'\
+_("Leave these fields empty if you want to disable encryption.")
vbox.addWidget(QLabel(msg))
grid = QGridLayout()
grid.setSpacing(8)
if wallet.use_encryption:
grid.addWidget(QLabel(_('Password')), 1, 0)
grid.addWidget(pw, 1, 1)
grid.addWidget(QLabel(_('New Password')), 2, 0)
grid.addWidget(new_pw, 2, 1)
grid.addWidget(QLabel(_('Confirm Password')), 3, 0)
grid.addWidget(conf_pw, 3, 1)
vbox.addLayout(grid)
vbox.addLayout(ok_cancel_buttons(d))
d.setLayout(vbox)
if not d.exec_(): return
password = unicode(pw.text()) if wallet.use_encryption else None
new_password = unicode(new_pw.text())
new_password2 = unicode(conf_pw.text())
try:
seed = wallet.decode_seed(password)
except:
QMessageBox.warning(parent, _('Error'), _('Incorrect Password'), _('OK'))
return
if new_password != new_password2:
QMessageBox.warning(parent, _('Error'), _('Passwords do not match'), _('OK'))
return ElectrumWindow.change_password_dialog(wallet, parent) # Retry
try:
wallet.update_password(seed, password, new_password)
except:
QMessageBox.warning(parent, _('Error'), _('Failed to update password'), _('OK'))
return
QMessageBox.information(parent, _('Success'), _('Password was updated successfully'), _('OK'))
if parent:
icon = QIcon(":icons/lock.png") if wallet.use_encryption else QIcon(":icons/unlock.png")
parent.password_button.setIcon( icon )
def generate_transaction_information_widget(self, tx): def generate_transaction_information_widget(self, tx):
tabs = QTabWidget(self) tabs = QTabWidget(self)
@ -2282,10 +2181,13 @@ class OpenFileEventFilter(QObject):
return True return True
return False return False
class ElectrumGui: class ElectrumGui:
def __init__(self, wallet, config, app=None): def __init__(self, config, app=None):
self.wallet = wallet self.interface = Interface(config, True)
self.config = config self.config = config
self.windows = [] self.windows = []
self.efilter = OpenFileEventFilter(self.windows) self.efilter = OpenFileEventFilter(self.windows)
@ -2293,116 +2195,32 @@ class ElectrumGui:
self.app = QApplication(sys.argv) self.app = QApplication(sys.argv)
self.app.installEventFilter(self.efilter) self.app.installEventFilter(self.efilter)
def restore_or_create(self):
msg = _("Wallet file not found.")+"\n"+_("Do you want to create a new wallet, or to restore an existing one?")
r = QMessageBox.question(None, _('Message'), msg, _('Create'), _('Restore'), _('Cancel'), 0, 2)
if r==2: return None
return 'restore' if r==1 else 'create'
def main(self, url):
def verify_seed(self): found = self.config.wallet_file_exists
r = self.seed_dialog(False) if not found:
if r != self.wallet.seed: import installwizard
QMessageBox.warning(None, _('Error'), 'incorrect seed', 'OK') wizard = installwizard.InstallWizard(self.config, self.interface)
return False wallet = wizard.run()
if not wallet:
exit()
else: else:
return True wallet = Wallet(self.config)
self.wallet = wallet
self.interface.start(wait = False)
self.interface.send([('server.peers.subscribe',[])])
wallet.interface = self.interface
verifier = WalletVerifier(self.interface, self.config)
verifier.start()
wallet.set_verifier(verifier)
synchronizer = WalletSynchronizer(wallet, self.config)
synchronizer.start()
def seed_dialog(self, is_restore=True):
d = QDialog()
d.setModal(1)
vbox = QVBoxLayout()
if is_restore:
msg = _("Please enter your wallet seed (or your master public key if you want to create a watching-only wallet)." + ' ')
else:
msg = _("Your seed is important! To make sure that you have properly saved your seed, please type it here." + ' ')
msg += _("Your seed can be entered as a sequence of words, or as a hexadecimal string."+ '\n')
label=QLabel(msg)
label.setWordWrap(True)
vbox.addWidget(label)
seed_e = QTextEdit()
seed_e.setMaximumHeight(100)
vbox.addWidget(seed_e)
if is_restore:
grid = QGridLayout()
grid.setSpacing(8)
gap_e = AmountEdit(None, True)
gap_e.setText("5")
grid.addWidget(QLabel(_('Gap limit')), 2, 0)
grid.addWidget(gap_e, 2, 1)
grid.addWidget(HelpButton(_('Keep the default value unless you modified this parameter in your wallet.')), 2, 3)
vbox.addLayout(grid)
vbox.addLayout(ok_cancel_buttons(d))
d.setLayout(vbox)
if not d.exec_(): return
try:
seed = str(seed_e.toPlainText())
seed.decode('hex')
except:
try:
seed = mnemonic.mn_decode( seed.split() )
except:
QMessageBox.warning(None, _('Error'), _('I cannot decode this'), _('OK'))
return
if not seed:
QMessageBox.warning(None, _('Error'), _('No seed'), _('OK'))
return
if not is_restore:
return seed
else:
try:
gap = int(unicode(gap_e.text()))
except:
QMessageBox.warning(None, _('Error'), 'error', 'OK')
return
return seed, gap
def network_dialog(self):
return NetworkDialog(self.wallet.interface, self.config, None).do_exec()
def show_seed(self):
ElectrumWindow.show_seed(self.wallet.seed, self.wallet.imported_keys)
def password_dialog(self):
if self.wallet.seed:
ElectrumWindow.change_password_dialog(self.wallet)
def restore_wallet(self):
wallet = self.wallet
# wait until we are connected, because the user might have selected another server
if not wallet.interface.is_connected:
waiting = lambda: False if wallet.interface.is_connected else "%s \n" % (_("Connecting..."))
waiting_dialog(waiting)
waiting = lambda: False if wallet.is_up_to_date() else "%s\n%s %d\n%s %.1f"\
%(_("Please wait..."),_("Addresses generated:"),len(wallet.addresses(True)),_("Kilobytes received:"), wallet.interface.bytes_received/1024.)
wallet.set_up_to_date(False)
wallet.interface.poke('synchronizer')
waiting_dialog(waiting)
if wallet.is_found():
print_error( "Recovery successful" )
else:
QMessageBox.information(None, _('Error'), _("No transactions found for this seed"), _('OK'))
return True
def main(self,url):
s = Timer() s = Timer()
s.start() s.start()
w = ElectrumWindow(self.wallet, self.config) w = ElectrumWindow(self.wallet, self.config)
@ -2415,4 +2233,8 @@ class ElectrumGui:
self.app.exec_() self.app.exec_()
verifier.stop()
synchronizer.stop()
self.interface.stop()

183
gui/installwizard.py Normal file
View File

@ -0,0 +1,183 @@
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import PyQt4.QtCore as QtCore
from i18n import _
from electrum import Wallet, mnemonic
from seed_dialog import SeedDialog
from network_dialog import NetworkDialog
from qt_util import *
class InstallWizard(QDialog):
def __init__(self, config, interface):
QDialog.__init__(self)
self.config = config
self.interface = interface
def restore_or_create(self):
msg = _("Wallet file not found.")+"\n"+_("Do you want to create a new wallet, or to restore an existing one?")
r = QMessageBox.question(None, _('Message'), msg, _('Create'), _('Restore'), _('Cancel'), 0, 2)
if r==2: return None
return 'restore' if r==1 else 'create'
def verify_seed(self, wallet):
r = self.seed_dialog(False)
if r != wallet.seed:
QMessageBox.warning(None, _('Error'), 'incorrect seed', 'OK')
return False
else:
return True
def seed_dialog(self, is_restore=True):
d = QDialog()
d.setModal(1)
vbox = QVBoxLayout()
if is_restore:
msg = _("Please enter your wallet seed (or your master public key if you want to create a watching-only wallet)." + ' ')
else:
msg = _("Your seed is important! To make sure that you have properly saved your seed, please type it here." + ' ')
msg += _("Your seed can be entered as a sequence of words, or as a hexadecimal string."+ '\n')
label=QLabel(msg)
label.setWordWrap(True)
vbox.addWidget(label)
seed_e = QTextEdit()
seed_e.setMaximumHeight(100)
vbox.addWidget(seed_e)
if is_restore:
grid = QGridLayout()
grid.setSpacing(8)
gap_e = AmountEdit(None, True)
gap_e.setText("5")
grid.addWidget(QLabel(_('Gap limit')), 2, 0)
grid.addWidget(gap_e, 2, 1)
grid.addWidget(HelpButton(_('Keep the default value unless you modified this parameter in your wallet.')), 2, 3)
vbox.addLayout(grid)
vbox.addLayout(ok_cancel_buttons(d))
d.setLayout(vbox)
if not d.exec_(): return
try:
seed = str(seed_e.toPlainText())
seed.decode('hex')
except:
try:
seed = mnemonic.mn_decode( seed.split() )
except:
QMessageBox.warning(None, _('Error'), _('I cannot decode this'), _('OK'))
return
if not seed:
QMessageBox.warning(None, _('Error'), _('No seed'), _('OK'))
return
if not is_restore:
return seed
else:
try:
gap = int(unicode(gap_e.text()))
except:
QMessageBox.warning(None, _('Error'), 'error', 'OK')
return
return seed, gap
def network_dialog(self):
return NetworkDialog(self.interface, self.config, None).do_exec()
def show_seed(self, wallet):
d = SeedDialog()
d.show_seed(wallet.seed, wallet.imported_keys)
def password_dialog(self, wallet):
from password_dialog import PasswordDialog
d = PasswordDialog(wallet)
d.run()
def restore_wallet(self):
wallet = self.wallet
# wait until we are connected, because the user might have selected another server
if not wallet.interface.is_connected:
waiting = lambda: False if wallet.interface.is_connected else "%s \n" % (_("Connecting..."))
waiting_dialog(waiting)
waiting = lambda: False if wallet.is_up_to_date() else "%s\n%s %d\n%s %.1f"\
%(_("Please wait..."),_("Addresses generated:"),len(wallet.addresses(True)),_("Kilobytes received:"), wallet.interface.bytes_received/1024.)
wallet.set_up_to_date(False)
wallet.interface.poke('synchronizer')
waiting_dialog(waiting)
if wallet.is_found():
print_error( "Recovery successful" )
else:
QMessageBox.information(None, _('Error'), _("No transactions found for this seed"), _('OK'))
return True
def run(self):
a = self.restore_or_create()
if not a: exit()
wallet = Wallet(self.config)
wallet.interface = self.interface
if a =='create':
wallet.init_seed(None)
self.show_seed(wallet)
if self.verify_seed(wallet):
wallet.save_seed()
else:
exit()
else:
# ask for seed and gap.
sg = gui.seed_dialog()
if not sg: exit()
seed, gap = sg
if not seed: exit()
wallet.gap_limit = gap
if len(seed) == 128:
wallet.seed = ''
wallet.init_sequence(str(seed))
else:
wallet.init_seed(str(seed))
wallet.save_seed()
# select a server.
s = self.network_dialog()
if s is None:
self.config.set_key("server", None, True)
self.config.set_key('auto_cycle', False, True)
# generate the first addresses, in case we are offline
if s is None or a == 'create':
wallet.synchronize()
if a == 'restore' and s is not None:
try:
keep_it = gui.restore_wallet()
wallet.fill_addressbook()
except:
import traceback
traceback.print_exc(file=sys.stdout)
exit()
if not keep_it: exit()
self.password_dialog(wallet)

104
gui/password_dialog.py Normal file
View File

@ -0,0 +1,104 @@
#!/usr/bin/env python
#
# Electrum - lightweight Bitcoin client
# Copyright (C) 2013 ecdsa@github
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from i18n import _
from qt_util import *
class PasswordDialog(QDialog):
def __init__(self, wallet, parent=None):
QDialog.__init__(self, parent)
self.setModal(1)
self.wallet = wallet
self.parent = parent
self.pw = QLineEdit()
self.pw.setEchoMode(2)
self.new_pw = QLineEdit()
self.new_pw.setEchoMode(2)
self.conf_pw = QLineEdit()
self.conf_pw.setEchoMode(2)
vbox = QVBoxLayout()
if parent:
msg = (_('Your wallet is encrypted. Use this dialog to change your password.')+'\n'\
+_('To disable wallet encryption, enter an empty new password.')) \
if wallet.use_encryption else _('Your wallet keys are not encrypted')
else:
msg = _("Please choose a password to encrypt your wallet keys.")+'\n'\
+_("Leave these fields empty if you want to disable encryption.")
vbox.addWidget(QLabel(msg))
grid = QGridLayout()
grid.setSpacing(8)
if wallet.use_encryption:
grid.addWidget(QLabel(_('Password')), 1, 0)
grid.addWidget(self.pw, 1, 1)
grid.addWidget(QLabel(_('New Password')), 2, 0)
grid.addWidget(self.new_pw, 2, 1)
grid.addWidget(QLabel(_('Confirm Password')), 3, 0)
grid.addWidget(self.conf_pw, 3, 1)
vbox.addLayout(grid)
vbox.addLayout(ok_cancel_buttons(self))
self.setLayout(vbox)
def run(self):
wallet = self.wallet
if not wallet.seed:
QMessageBox.information(parent, _('Error'), _('No seed'), _('OK'))
return
if not self.exec_(): return
password = unicode(self.pw.text()) if wallet.use_encryption else None
new_password = unicode(self.new_pw.text())
new_password2 = unicode(self.conf_pw.text())
try:
seed = wallet.decode_seed(password)
except:
QMessageBox.warning(self.parent, _('Error'), _('Incorrect Password'), _('OK'))
return
if new_password != new_password2:
QMessageBox.warning(self.parent, _('Error'), _('Passwords do not match'), _('OK'))
self.run() # Retry
try:
wallet.update_password(seed, password, new_password)
except:
QMessageBox.warning(self.parent, _('Error'), _('Failed to update password'), _('OK'))
return
QMessageBox.information(self.parent, _('Success'), _('Password was updated successfully'), _('OK'))
if self.parent:
icon = QIcon(":icons/lock.png") if wallet.use_encryption else QIcon(":icons/unlock.png")
self.parent.password_button.setIcon( icon )

82
gui/seed_dialog.py Normal file
View File

@ -0,0 +1,82 @@
#!/usr/bin/env python
#
# Electrum - lightweight Bitcoin client
# Copyright (C) 2013 ecdsa@github
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import PyQt4.QtCore as QtCore
from i18n import _
from electrum import mnemonic
from qrcodewidget import QRCodeWidget
class SeedDialog(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.setModal(1)
self.setWindowTitle('Electrum' + ' - ' + _('Seed'))
def show_seed(self, seed, imported_keys, parent=None):
brainwallet = ' '.join(mnemonic.mn_encode(seed))
label1 = QLabel(_("Your wallet generation seed is")+ ":")
seed_text = QTextEdit(brainwallet)
seed_text.setReadOnly(True)
seed_text.setMaximumHeight(130)
msg2 = _("Please write down or memorize these 12 words (order is important).") + " " \
+ _("This seed will allow you to recover your wallet in case of computer failure.") + " " \
+ _("Your seed is also displayed as QR code, in case you want to transfer it to a mobile phone.") + "<p>" \
+ "<b>"+_("WARNING")+":</b> " + _("Never disclose your seed. Never type it on a website.") + "</b><p>"
if imported_keys:
msg2 += "<b>"+_("WARNING")+":</b> " + _("Your wallet contains imported keys. These keys cannot be recovered from seed.") + "</b><p>"
label2 = QLabel(msg2)
label2.setWordWrap(True)
logo = QLabel()
logo.setPixmap(QPixmap(":icons/seed.png").scaledToWidth(56))
logo.setMaximumWidth(60)
qrw = QRCodeWidget(seed)
ok_button = QPushButton(_("OK"))
ok_button.setDefault(True)
ok_button.clicked.connect(self.accept)
grid = QGridLayout()
#main_layout.addWidget(logo, 0, 0)
grid.addWidget(logo, 0, 0)
grid.addWidget(label1, 0, 1)
grid.addWidget(seed_text, 1, 0, 1, 2)
grid.addWidget(qrw, 0, 2, 2, 1)
vbox = QVBoxLayout()
vbox.addLayout(grid)
vbox.addWidget(label2)
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(ok_button)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.exec_()