Skip to content
Snippets Groups Projects
process_cfg_account.py 8.69 KiB
Newer Older
inso's avatar
inso committed
'''
Created on 6 mars 2014

@author: inso
'''
inso's avatar
inso committed
import logging
from ucoinpy.documents.peer import Peer
inso's avatar
inso committed
from ucoinpy.key import SigningKey
from cutecoin.gen_resources.account_cfg_uic import Ui_AccountConfigurationDialog
from cutecoin.gui.process_cfg_community import ProcessConfigureCommunity
from cutecoin.models.communities import CommunitiesListModel
from cutecoin.tools.exceptions import KeyAlreadyUsed, Error
inso's avatar
inso committed
from PyQt5.QtWidgets import QDialog, QErrorMessage, QInputDialog, QMessageBox, QLineEdit
inso's avatar
inso committed

class Step():
    def __init__(self, config_dialog, previous_step=None, next_step=None):
        self.previous_step = previous_step
        self.next_step = next_step
        self.config_dialog = config_dialog


class StepPageInit(Step):
    '''
    First step when adding a community
    '''
    def __init__(self, config_dialog):
        super().__init__(config_dialog)

    def is_valid(self):
        if len(self.config_dialog.edit_account_name.text()) > 2:
            return True
        else:
            return False

    def process_next(self):
inso's avatar
inso committed
        if self.config_dialog.account is None:
            name = self.config_dialog.edit_account_name.text()
            self.config_dialog.account = self.config_dialog.app.create_account(name)
inso's avatar
inso committed
        else:
            name = self.config_dialog.edit_account_name.text()
            self.config_dialog.account.name = name

    def display_page(self):
        if self.config_dialog.account is not None:
            self.config_dialog.edit_account_name.setText(self.config_dialog.account.name)
            model = CommunitiesListModel(self.config_dialog.account)
            self.config_dialog.list_communities.setModel(model)
inso's avatar
inso committed
            nb_wallets = len(self.config_dialog.account.wallets)
            self.config_dialog.spinbox_wallets.setValue(nb_wallets)
inso's avatar
inso committed

        self.config_dialog.button_previous.setEnabled(False)
inso's avatar
inso committed
        self.config_dialog.button_next.setEnabled(False)
inso's avatar
inso committed
class StepPageKey(Step):
inso's avatar
inso committed
    '''
    First step when adding a community
    '''
    def __init__(self, config_dialog):
        super().__init__(config_dialog)

    def is_valid(self):
        if len(self.config_dialog.edit_password.text()) < 2:
inso's avatar
inso committed
            return False

inso's avatar
inso committed
        if len(self.config_dialog.edit_salt.text()) < 2:
inso's avatar
inso committed
            return False

        if len(self.config_dialog.edit_password.text()) < 6:
            self.config_dialog.label_info.setText("Warning : password is too short")
inso's avatar
inso committed
        if self.config_dialog.edit_password.text() != \
            self.config_dialog.edit_password_repeat.text():
            self.config_dialog.label_info.setText("Error : passwords are different")
inso's avatar
inso committed
            return False

        self.config_dialog.label_info.setText("")
inso's avatar
inso committed
        return True
inso's avatar
inso committed

    def process_next(self):
inso's avatar
inso committed
        salt = self.config_dialog.edit_salt.text()
inso's avatar
inso committed
        password = self.config_dialog.edit_password.text()
        self.config_dialog.account.salt = salt
inso's avatar
inso committed
        self.config_dialog.account.pubkey = SigningKey(salt, password).pubkey
inso's avatar
inso committed
        model = CommunitiesListModel(self.config_dialog.account)
        self.config_dialog.list_communities.setModel(model)

    def display_page(self):
        self.config_dialog.button_previous.setEnabled(False)
inso's avatar
inso committed
        self.config_dialog.button_next.setEnabled(False)


class StepPageCommunities(Step):
    '''
    First step when adding a community
    '''
    def __init__(self, config_dialog):
        super().__init__(config_dialog)

    def is_valid(self):
        return True

    def process_next(self):
        '''
        We create the community
        '''
        logging.debug("Communities NEXT ")
        server = self.config_dialog.lineedit_server.text()
        port = self.config_dialog.spinbox_port.value()
        account = self.config_dialog.account
        self.config_dialog.community = account.add_community(server, port)
inso's avatar
inso committed
        self.config_dialog.refresh()

    def display_page(self):
        logging.debug("Communities DISPLAY")
        self.config_dialog.button_previous.setEnabled(False)
        self.config_dialog.button_next.setText("Ok")
        list_model = CommunitiesListModel(self.config_dialog.account)
        self.config_dialog.list_communities.setModel(list_model)


class ProcessConfigureAccount(QDialog, Ui_AccountConfigurationDialog):
inso's avatar
inso committed
    '''
    classdocs
    '''

    def __init__(self, app, account):
inso's avatar
inso committed
        '''
        Constructor
        '''
        # Set up the user interface from Designer.
inso's avatar
inso committed
        super().__init__()
inso's avatar
inso committed
        self.setupUi(self)
        self.account = account
        step_init = StepPageInit(self)
inso's avatar
inso committed
        step_key = StepPageKey(self)
        step_communities = StepPageCommunities(self)
inso's avatar
inso committed
        step_init.next_step = step_key
        step_key.next_step = step_communities
        self.step = step_init
        self.step.display_page()
        if self.account is None:
            self.setWindowTitle("New account")
        else:
inso's avatar
inso committed
            self.stacked_pages.removeWidget(self.stacked_pages.widget(1))
            step_init.next_step = step_communities
inso's avatar
inso committed
            self.button_next.setEnabled(True)
            self.setWindowTitle("Configure " + self.account.name)
inso's avatar
inso committed

inso's avatar
inso committed
    def open_process_add_community(self):
inso's avatar
inso committed
        logging.debug("Opening configure community dialog")
        dialog = ProcessConfigureCommunity(self.account, None)
        dialog.accepted.connect(self.action_add_community)
        dialog.exec_()
inso's avatar
inso committed

    def action_add_community(self):
        logging.debug("Action add community : done")
inso's avatar
inso committed
        self.list_communities.setModel(CommunitiesListModel(self.account))
        self.button_next.setEnabled(True)
        self.button_next.setText("Ok")
inso's avatar
inso committed

    def action_remove_community(self):
inso's avatar
inso committed
        for index in self.list_communities.selectedIndexes():
inso's avatar
inso committed
            community = self.account.communities[index.row()]
            self.account.communities.pop(index.row())
        self.list_communities.setModel(CommunitiesListModel(self.account))
inso's avatar
inso committed

    def action_edit_community(self):
inso's avatar
inso committed
        self.list_communities.setModel(CommunitiesListModel(self.account))

inso's avatar
inso committed
    def action_edit_account_key(self):
        if self.step.is_valid():
            self.button_next.setEnabled(True)
        else:
            self.button_next.setEnabled(False)

inso's avatar
inso committed
        salt = self.edit_salt.text()
        password = self.edit_password.text()
        pubkey = SigningKey(salt, password).pubkey
inso's avatar
inso committed
        QMessageBox.information(self, "Public key",
                                "These parameters pubkeys are : {0}".format(pubkey))
inso's avatar
inso committed
    def action_edit_account_parameters(self):
        if self.step.is_valid():
            self.button_next.setEnabled(True)
        else:
            self.button_next.setEnabled(False)

inso's avatar
inso committed
    def open_process_edit_community(self, index):
        community = self.account.communities[index.row()]
inso's avatar
inso committed
        dialog = ProcessConfigureCommunity(self.account, community)
        dialog.accepted.connect(self.action_edit_community)
inso's avatar
inso committed
        dialog.exec_()
inso's avatar
inso committed

    def next(self):
        if self.step.next_step is not None:
            if self.step.is_valid():
                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)
inso's avatar
inso committed
            self.accept()

    def previous(self):
        if self.step.previous_step is not None:
            self.step = self.step.previous_step
            previous_index = self.stacked_pages.currentIndex() - 1
            self.stacked_pages.setCurrentIndex(previous_index)
            self.step.display_page()

inso's avatar
inso committed
    def accept(self):
inso's avatar
inso committed
        password = ""
        if self.account.name not in self.app.accounts:
            self.account.name = self.edit_account_name.text()
inso's avatar
inso committed
            try:
                self.app.add_account(self.account)
inso's avatar
inso committed
            except KeyAlreadyUsed as e:
                QErrorMessage(self).showMessage(e.message)
inso's avatar
inso committed
            password = self.edit_password.text()
        else:
            message = "Please enter your password"

            while not self.account.check_password(password):
                password = QInputDialog.getText(self, "Account password",
                            message,
                            QLineEdit.Password)
                message = "Error, wrong password. Please enter your password"
                if password[1] is True:
                    password = password[0]
                else:
                    return
        nb_wallets = self.spinbox_wallets.value()
        self.account.set_walletpool_size(nb_wallets, password)
        self.app.save(self.account)
inso's avatar
inso committed
        self.accepted.emit()
inso's avatar
inso committed
        self.close()