Skip to content
Snippets Groups Projects
Commit 07a3eeaf authored by inso's avatar inso
Browse files

Accounts are now saved in their specific folder

We can export and import accounts
parent cb3ffc7f
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>GenerateKeyDialog</class>
<widget class="QDialog" name="GenerateKeyDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>269</width>
<height>176</height>
</rect>
</property>
<property name="windowTitle">
<string>Generate a key</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Key parameters</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Your name</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="edit_name">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="placeholderText">
<string>John Doo</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Passphrase</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="edit_password">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Type it again</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="edit_password_bis">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_errors">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="button_box">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>button_box</sender>
<signal>accepted()</signal>
<receiver>GenerateKeyDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>button_box</sender>
<signal>rejected()</signal>
<receiver>GenerateKeyDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>edit_name</sender>
<signal>textEdited(QString)</signal>
<receiver>GenerateKeyDialog</receiver>
<slot>check()</slot>
<hints>
<hint type="sourcelabel">
<x>165</x>
<y>42</y>
</hint>
<hint type="destinationlabel">
<x>134</x>
<y>87</y>
</hint>
</hints>
</connection>
<connection>
<sender>edit_password</sender>
<signal>textEdited(QString)</signal>
<receiver>GenerateKeyDialog</receiver>
<slot>check()</slot>
<hints>
<hint type="sourcelabel">
<x>167</x>
<y>73</y>
</hint>
<hint type="destinationlabel">
<x>134</x>
<y>87</y>
</hint>
</hints>
</connection>
<connection>
<sender>edit_password_bis</sender>
<signal>textEdited(QString)</signal>
<receiver>GenerateKeyDialog</receiver>
<slot>check()</slot>
<hints>
<hint type="sourcelabel">
<x>170</x>
<y>104</y>
</hint>
<hint type="destinationlabel">
<x>134</x>
<y>87</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>check()</slot>
</slots>
</ui>
......@@ -130,7 +130,9 @@
<addaction name="menu_change_account"/>
<addaction name="action_add_account"/>
<addaction name="separator"/>
<addaction name="action_save"/>
<addaction name="action_export"/>
<addaction name="action_import"/>
<addaction name="separator"/>
<addaction name="action_quit"/>
</widget>
<widget class="QMenu" name="menu_contacts">
......@@ -233,6 +235,16 @@
<string>Configure</string>
</property>
</action>
<action name="action_import">
<property name="text">
<string>Import</string>
</property>
</action>
<action name="action_export">
<property name="text">
<string>Export</string>
</property>
</action>
</widget>
<resources/>
<connections>
......@@ -252,22 +264,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>action_save</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>save()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>225</x>
<y>199</y>
</hint>
</hints>
</connection>
<connection>
<sender>action_quit</sender>
<signal>triggered()</signal>
......@@ -348,14 +344,47 @@
</hint>
</hints>
</connection>
<connection>
<sender>action_import</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>import_account()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>248</x>
<y>218</y>
</hint>
</hints>
</connection>
<connection>
<sender>action_export</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>export_account()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>248</x>
<y>218</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>open_add_account_dialog()</slot>
<slot>save()</slot>
<slot>import_account()</slot>
<slot>open_transfer_money_dialog()</slot>
<slot>open_add_contact_dialog()</slot>
<slot>open_configure_account_dialog()</slot>
<slot>refresh_main_window()</slot>
<slot>refresh_wallet_content(QModelIndex)</slot>
<slot>export_account()</slot>
</slots>
</ui>
......@@ -7,11 +7,14 @@ Created on 1 févr. 2014
import os
import logging
import json
import tarfile
import gnupg
from cutecoin.core import config
from cutecoin.tools.exceptions import KeyAlreadyUsed
from cutecoin.tools.exceptions import NameAlreadyExists, BadAccountFile
from cutecoin.models.account import Account
from cutecoin.models.account.communities import Communities
from cutecoin.models.account.wallets import Wallets
class Core(object):
......@@ -36,13 +39,22 @@ class Core(object):
if name == a.name:
return a
def add_account(self, account):
def create_account(self, name):
for a in self.accounts:
if a.keyid == account.keyid:
raise KeyAlreadyUsed(account, account.keyid, a)
if a.name == name:
raise NameAlreadyExists(name)
account_path = os.path.join(config.parameters['home'], name)
if not os.path.exists(account_path):
logging.info("Creating account directory")
os.makedirs(account_path)
account = Account.create(name,
Communities.create(),
Wallets.create(),
config.parameters)
self.accounts.append(account)
self.current_account = account
return account
def del_account(self, account):
self.accounts.remove(account)
......@@ -61,19 +73,55 @@ class Core(object):
data = json.load(json_data)
json_data.close()
for accountData in data['localAccounts']:
self.accounts.append(Account.load(accountData))
for account_name in data['local_accounts']:
account_path = os.path.join(config.parameters['home'],
account_name, 'properties')
json_data = open(account_path, 'r')
data = json.load(json_data)
self.accounts.append(Account.load(data))
def save(self):
def save(self, account):
with open(config.parameters['data'], 'w') as outfile:
json.dump(self.jsonify(), outfile, indent=4, sort_keys=True)
account_path = os.path.join(config.parameters['home'],
account.name, 'properties')
with open(account_path, 'w') as outfile:
json.dump(account.jsonify(), outfile, indent=4, sort_keys=True)
def import_account(self, file, name):
with tarfile.open(file, "r") as tar:
path = os.path.join(config.parameters['home'],
name)
for obj in ["properties", "keyring", "secretkeyring"]:
try:
tar.getmember(obj)
except KeyError:
raise BadAccountFile(file)
return
tar.extractall(path)
account_path = os.path.join(config.parameters['home'],
name, 'properties')
json_data = open(account_path, 'r')
data = json.load(json_data)
account = Account.load(data)
self.accounts.append(account)
self.save(account)
def export_account(self, file, account):
with tarfile.open(file, "w") as tar:
for file in ["properties", "keyring", "secretkeyring"]:
path = os.path.join(config.parameters['home'],
account.name, file)
tar.add(path, file)
def jsonify_accounts(self):
data = []
for account in self.accounts:
data.append(account.jsonify())
data.append(account.name)
return data
def jsonify(self):
data = {'localAccounts': self.jsonify_accounts()}
data = {'local_accounts': self.jsonify_accounts()}
return data
......@@ -4,12 +4,13 @@ Created on 1 févr. 2014
@author: inso
'''
from cutecoin.gen_resources.mainwindow_uic import Ui_MainWindow
from PyQt5.QtWidgets import QMainWindow, QAction
from PyQt5.QtWidgets import QMainWindow, QAction, QFileDialog
from PyQt5.QtCore import QSignalMapper, QModelIndex
from cutecoin.gui.processConfigureAccount import ProcessConfigureAccount
from cutecoin.gui.transferMoneyDialog import TransferMoneyDialog
from cutecoin.gui.communityTabWidget import CommunityTabWidget
from cutecoin.gui.addContactDialog import AddContactDialog
from cutecoin.gui.importAccountDialog import ImportAccountDialog
from cutecoin.models.account.wallets.listModel import WalletsListModel
from cutecoin.models.coin.listModel import CoinsListModel
from cutecoin.models.transaction.sentListModel import SentListModel
......@@ -39,9 +40,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
dialog.accepted.connect(self.refresh)
dialog.exec_()
def save(self):
self.core.save()
def action_change_account(self, account_name):
self.core.current_account = self.core.get_account(account_name)
logging.info('Changing account to ' + self.core.current_account.name)
......@@ -122,6 +120,24 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def refresh_wallet_content(self, index):
if index.isValid():
current_wallet = self.core.current_account.wallets[index.row()]
self.list_wallet_content.setModel(CoinsListModel(current_wallet, current_wallet.coins))
self.list_wallet_content.setModel(CoinsListModel(current_wallet,
current_wallet.coins))
else:
self.list_wallet_content.setModel(CoinsListModel(None, []))
def import_account(self):
dialog = ImportAccountDialog(self.core, self)
dialog.accepted.connect(self.refresh)
dialog.exec_()
def export_account(self):
selected_file = QFileDialog.getSaveFileName(self,
"Export an account",
"",
"All account files (*.acc)")
path = ""
if selected_file[0][-4:] == ".acc":
path = selected_file[0]
else:
path = selected_file[0] + ".acc"
self.core.export_account(path, self.core.current_account)
......@@ -7,17 +7,11 @@ from cutecoin.gen_resources.accountConfigurationDialog_uic import Ui_AccountConf
from cutecoin.gui.generateKeyDialog import GenerateKeyDialog
from cutecoin.gui.processConfigureCommunity import ProcessConfigureCommunity
from cutecoin.models.account.communities.listModel import CommunitiesListModel
from cutecoin.tools.exceptions import KeyAlreadyUsed
from cutecoin.models.account import Account
from cutecoin.models.account.communities import Communities
from cutecoin.models.account.wallets import Wallets
from cutecoin.tools.exceptions import KeyAlreadyUsed, Error
from cutecoin.models.node import Node
from cutecoin.core import config
from PyQt5.QtWidgets import QDialog, QErrorMessage, QFileDialog, QMessageBox
import gnupg
class Step():
def __init__(self, config_dialog, previous_step=None, next_step=None):
......@@ -38,11 +32,8 @@ class StepPageInit(Step):
def process_next(self):
if self.config_dialog.account is None:
self.config_dialog.account = Account.create(
self.config_dialog.edit_account_name.text(),
Communities.create(),
Wallets.create(),
config.parameters)
name = self.config_dialog.edit_account_name.text()
self.config_dialog.account = self.config_dialog.core.create_account(name)
else:
name = self.config_dialog.edit_account_name.text()
self.config_dialog.account.name = name
......@@ -193,11 +184,15 @@ class ProcessConfigureAccount(QDialog, Ui_AccountConfigurationDialog):
def next(self):
if self.step.next_step is not None:
if self.step.is_valid():
self.step.process_next()
self.step = self.step.next_step
next_index = self.stacked_pages.currentIndex() + 1
self.stacked_pages.setCurrentIndex(next_index)
self.step.display_page()
try:
self.step.process_next()
self.step = self.step.next_step
next_index = self.stacked_pages.currentIndex() + 1
self.stacked_pages.setCurrentIndex(next_index)
self.step.display_page()
except Error as e:
QErrorMessage(self).showMessage(e.message)
else:
self.accept()
......@@ -215,5 +210,6 @@ class ProcessConfigureAccount(QDialog, Ui_AccountConfigurationDialog):
self.core.add_account(self.account)
except KeyAlreadyUsed as e:
QErrorMessage(self).showMessage(e.message)
self.core.save(self.account)
self.accepted.emit()
self.close()
......@@ -8,6 +8,7 @@ import ucoin
import gnupg
import logging
import json
import os
from cutecoin.models.account.wallets import Wallets
from cutecoin.models.account.communities import Communities
from cutecoin.models.community import Community
......@@ -44,8 +45,8 @@ class Account(object):
'''
Constructor
'''
keyring = confpath['home'] + name + "_keyring"
secret_keyring = confpath['home'] + name + "_secretkeyring"
keyring = os.path.join(confpath['home'], name, "keyring")
secret_keyring = os.path.join(confpath['home'], name, "secretkeyring")
account = cls('', name, communities, wallets, [],
keyring, secret_keyring)
return account
......
......@@ -83,3 +83,39 @@ class KeyAlreadyUsed(Error):
keyid +
" is already used by " +
found_account.name)
class NameAlreadyExists(Error):
'''
Exception raised trying to add an account using
a key already used for another account.
'''
def __init__(self, account):
'''
Constructor
'''
super(
KeyAlreadyUsed,
self) .__init__(
"Cannot add account " +
account.name +
" the name already exists")
class BadAccountFile(Error):
'''
Exception raised trying to add an account using
a key already used for another account.
'''
def __init__(self, path):
'''
Constructor
'''
super(
BadAccountFile,
self) .__init__(
"File " + path + " is not an account file")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment