Example #1
0
    def initUI(self):
        """
            Initialize gui components. Create dock widgets.
        """        
#         self.resize(300, 300)
        self.setWindowTitle("UserPass Manager " + AppSettings.APP_VERSION)
        self.resize(1000, 600)
        self.center()
        
        # create main splitter, splits passwords table and gorups
        self._main_splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.setCentralWidget(self._main_splitter)
        
        # create groups widget with label, and groups
        groups_mw = QtGui.QWidget()
        groups_vl = QtGui.QVBoxLayout()
        
        groups_mw.setLayout(groups_vl)
        
        # create label
        groups_label = QtGui.QLabel("<b>" + tr("Groups") + "</b>")
        groups_vl.addWidget(groups_label)
        
        # create groups tree widget
        self._groups_tw = GroupsWidget(self)
        
        groups_vl.addWidget(self._groups_tw)

        self._main_splitter.addWidget(groups_mw)
        
        # create password central widget
        self._passwords_cw = QtGui.QWidget()
        self._main_splitter.addWidget(self._passwords_cw)
        self._main_splitter.setStretchFactor(1, 1)
        
        # create passwords layout, will contain passwords table and detail widget with spliter
        self._passwords_vl = QtGui.QVBoxLayout()
        self._passwords_cw.setLayout(self._passwords_vl)
        
        # add table widget
        self._passwords_table = PasswordsWidget(self)
        
        # create password and detail splitter
        self._passwd_splitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        
        # create label
        passwdords_label = QtGui.QLabel("<b>" + tr("Passwords") + "</b>")
        self._passwords_vl.addWidget(passwdords_label)
        
        # add splitter to layout
        self._passwords_vl.addWidget(self._passwd_splitter)
        
        # create detail widget
        self._detail_w = DetailWidget(self, self._passwords_table._show_pass)
        
        # add widgets to splitter
        self._passwd_splitter.addWidget(self._passwords_table)
        self._passwd_splitter.addWidget(self._detail_w)
        
        # set stretch factor for password table
        self._passwd_splitter.setStretchFactor(0, 1)
Example #2
0
class MainWindow(QtGui.QMainWindow):
    """
        MainWindow class represents main window.
    """
    # public attr:
    _db_ctrl = None
    
    def __init__(self, db_ctrl, user = None):
        self._db_ctrl = db_ctrl
        self._user = user
        
        super(MainWindow, self).__init__()
        
        self._close_act = None
        
        self.initUI()
        self.createActions()
        self.createMenu()
        self.initConections()
        
    def closeEvent(self, event):
        """
            Do matters on close event. In example delete clipboard.
        """
        logging.debug("deleting clipboard")
        QtGui.QApplication.clipboard().clear()
        
        try:
            logging.info("removing tmp dir: '%s'", AppSettings.TMP_PATH)
            
            # remove tmp files
            shutil.rmtree(AppSettings.decodePath(AppSettings.TMP_PATH))
        except Exception as e:
            logging.exception(e)
            
            InfoMsgBoxes.showErrorMsg(e)
        
    def initUI(self):
        """
            Initialize gui components. Create dock widgets.
        """        
#         self.resize(300, 300)
        self.setWindowTitle("UserPass Manager " + AppSettings.APP_VERSION)
        self.resize(1000, 600)
        self.center()
        
        # create main splitter, splits passwords table and gorups
        self._main_splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.setCentralWidget(self._main_splitter)
        
        # create groups widget with label, and groups
        groups_mw = QtGui.QWidget()
        groups_vl = QtGui.QVBoxLayout()
        
        groups_mw.setLayout(groups_vl)
        
        # create label
        groups_label = QtGui.QLabel("<b>" + tr("Groups") + "</b>")
        groups_vl.addWidget(groups_label)
        
        # create groups tree widget
        self._groups_tw = GroupsWidget(self)
        
        groups_vl.addWidget(self._groups_tw)

        self._main_splitter.addWidget(groups_mw)
        
        # create password central widget
        self._passwords_cw = QtGui.QWidget()
        self._main_splitter.addWidget(self._passwords_cw)
        self._main_splitter.setStretchFactor(1, 1)
        
        # create passwords layout, will contain passwords table and detail widget with spliter
        self._passwords_vl = QtGui.QVBoxLayout()
        self._passwords_cw.setLayout(self._passwords_vl)
        
        # add table widget
        self._passwords_table = PasswordsWidget(self)
        
        # create password and detail splitter
        self._passwd_splitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        
        # create label
        passwdords_label = QtGui.QLabel("<b>" + tr("Passwords") + "</b>")
        self._passwords_vl.addWidget(passwdords_label)
        
        # add splitter to layout
        self._passwords_vl.addWidget(self._passwd_splitter)
        
        # create detail widget
        self._detail_w = DetailWidget(self, self._passwords_table._show_pass)
        
        # add widgets to splitter
        self._passwd_splitter.addWidget(self._passwords_table)
        self._passwd_splitter.addWidget(self._detail_w)
        
        # set stretch factor for password table
        self._passwd_splitter.setStretchFactor(0, 1)
        
    def setUserReloadShow(self, username, master):
        """
            Load user from database and reload items.
        """
        user_ctrl = UserController(self._db_ctrl)
        
        username = str(username.toUtf8())
        master = str(master.toUtf8())
        
        self._user = user_ctrl.selectByNameMaster(username, master)
        
        if (self._user):
            self.reloadItems()
        else:
            logging.error("something wrong, can't log in user.")
        self.show()
        
    def initConections(self):
        """
            Initialize all connections, handling events.
            
            @requires: initUI() first
        """
        # create connection to update table view
        self._groups_tw.signalGroupSelChanged.connect(self._passwords_table.showPasswords)
        self._groups_tw.signalGroupSelChanged.connect(self._detail_w.handleTypePassword)
        self._passwords_table.signalShowDetailPasswd.connect(self._detail_w.setPassword)
        
        # show edit passwd dialog
        self._passwords_table.signalEditPasswd.connect(self.showEditPasswdDialog)
        self._groups_tw.signalEditPasswd.connect(self.showEditPasswdDialog)
        
        # enable/disable delete action, depends on selection type in tree widget
        self._groups_tw.signalGroupSelChanged.connect(self.enDisPassGrpActions)
        
        # enable/disable delete action with selection password talbe
        self._passwords_table.signalSelChangedTypeId.connect(self.enDisPassGrpActions)
        
    def createActions(self):
        """
            Initialize all actions, i.e. Close, Save etc.
        """
        # init close
        self._close_act = QtGui.QAction(tr("&Close"), self)
        self._close_act.setShortcuts(QtGui.QKeySequence.Close)
        self._close_act.setToolTip(tr("Close application"))
        
        # connect to slot
        self._close_act.triggered.connect(QtCore.QCoreApplication.instance().quit)
        
        # init about action
        self._about_act = QtGui.QAction(tr("About"), self)
        self._about_act.setToolTip(tr("About UserPass Manager"))
        
        self._about_act.triggered.connect(self.aboutDialog)
        
        # new password action
        self._new_passwd = QtGui.QAction(tr("New"), self)
        self._new_passwd.setShortcuts(QtGui.QKeySequence.New)
        self._new_passwd.setToolTip(tr("Add new password to DB"))
        
        self._new_passwd.triggered.connect(self.showNewPasswdDialog)
        
        # displayed in groups tree
        self._new_passwd_g = QtGui.QAction(tr("New password"), self)
        self._new_passwd_g.setToolTip(tr("Add new password to DB"))
        
        self._new_passwd_g.triggered.connect(self.showNewPasswdDialog)
        
        # delete password action
        self._del_passwd = QtGui.QAction(tr("Delete"), self)
        self._del_passwd.setShortcuts(QtGui.QKeySequence.Delete)
        self._del_passwd.setToolTip(tr("Delete password from DB"))
        self._del_passwd.setDisabled(True)
        
        self._del_passwd.triggered.connect(self.deletePassword)
        
        # displayed in groups tree
        self._del_passwd_g = QtGui.QAction(tr("Delete password"), self)
        self._del_passwd_g.setToolTip(tr("Delete password from DB"))
        self._del_passwd_g.setDisabled(True)
        
        self._del_passwd_g.triggered.connect(self.deletePassword)
        
        # new group action
        self._new_group = QtGui.QAction(tr("New"), self)
        self._new_group.setToolTip(tr("Add new group to DB"))
        
        self._new_group.triggered.connect(self.showNewGroupDialog)
        
        # new group action in groups tree right click menu
        self._new_group_g = QtGui.QAction(tr("New group"), self)
        self._new_group_g.setToolTip(tr("Add new group to DB"))
        
        self._new_group_g.triggered.connect(self.showNewGroupDialog)
        
        # edit group action
        self._edit_group = QtGui.QAction(tr("Edit"), self)
        self._edit_group.setToolTip(tr("Edit selected group"))
        self._edit_group.setDisabled(True)
        
        self._edit_group.triggered.connect(self.showEditGroupDialog)
        
        # edit group action in groups tree right click menu
        self._edit_group_g = QtGui.QAction(tr("Edit group"), self)
        self._edit_group_g.setToolTip(tr("Edit selected group"))
        self._edit_group_g.setDisabled(True)
        
        self._edit_group_g.triggered.connect(self.showEditGroupDialog)
        
        # delete group in groups tree
        self._del_group = QtGui.QAction(tr("Delete"), self)
        self._del_group.setToolTip(tr("Delete group from DB"))
        self._del_group.setDisabled(True)
        
        self._del_group.triggered.connect(self.deleteGroup)
        
        # delete group displayed in groups tree
        self._del_group_g = QtGui.QAction(tr("Delete group"), self)
        self._del_group_g.setToolTip(tr("Delete group from DB"))
        self._del_group_g.setDisabled(True)
        
        self._del_group_g.triggered.connect(self.deleteGroup)
        
        # add to table actions
        self._passwords_table.addAction(self._new_passwd)
        self._passwords_table.addAction(self._del_passwd)
        
        # add to groups tree actions
        self._groups_tw.addAction(self._new_passwd_g)
        self._groups_tw.addAction(self._del_passwd_g)
        self._groups_tw.addAction(self._new_group_g)
        self._groups_tw.addAction(self._edit_group_g)
        self._groups_tw.addAction(self._del_group_g)
        
    def enDisPassGrpActions(self, item_type, item_id):
        """
            Disable delete password action.
        """
        if (item_type == self._groups_tw._TYPE_PASS):
            self._del_passwd.setEnabled(True)
            self._del_passwd_g.setEnabled(True)
        else:
            self._del_passwd.setEnabled(False)
            self._del_passwd_g.setEnabled(False)
        
        if (item_type == self._groups_tw._TYPE_GROUP):
            self._del_group.setEnabled(True)
            self._del_group_g.setEnabled(True)
            self._edit_group.setEnabled(True)
            self._edit_group_g.setEnabled(True)
        else:
            self._del_group.setEnabled(False)
            self._del_group_g.setEnabled(False)
            self._edit_group.setEnabled(False)
            self._edit_group_g.setEnabled(False)
        
    def createMenu(self):
        """
            Initialize menu, add actions to menu.
        """
        # create menu bar
        menubar = QtGui.QMenuBar()
        self.setMenuBar(menubar)
        
        # create menu options and add actions
        file_menu = self.menuBar().addMenu(tr("&File"))
        file_menu.addAction(self._close_act)
        
        password_menu = self.menuBar().addMenu(tr("Password"))
        password_menu.addAction(self._new_passwd)
        password_menu.addAction(self._del_passwd)
        
        group_menu = self.menuBar().addMenu(tr("Group"))
        group_menu.addAction(self._new_group)
        group_menu.addAction(self._edit_group)
        group_menu.addAction(self._del_group)
        
        settings_menu = self.menuBar().addMenu(tr("Settings"))
        
        about_menu = self.menuBar().addMenu(tr("About"))
        about_menu.addAction(self._about_act)
        
    def center(self):
        """
            Center window.
        """
        # get frame geometry
        wg = self.frameGeometry()
        
        # get screen center
        cs = QtGui.QDesktopWidget().availableGeometry().center()
        wg.moveCenter(cs)
        
        self.move(wg.topLeft())
        
    def aboutDialog(self):
        QtGui.QMessageBox(QtGui.QMessageBox.Information, tr("About"), tr("ABOUT_TEXT_1") + " " + AppSettings.APP_VERSION + "\n" + tr("ABOUT_TEXT_2") + """

MIT License

Copyright (c) 2013-2016 Frantisek Uhrecky

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.""").exec_()
        
    def showEditPasswdDialog(self, p_id):
        """
            Show edit password dialog.
            
            @param p_id: password id to edit
        """
        edit_dialog = EditPasswdDialog(self, p_id, self._passwords_table._show_pass)
        edit_dialog.signalPasswdSaved.connect(self.reloadItems)
        
        edit_dialog.exec_()
        
    def showNewPasswdDialog(self):
        """
            Password dialog to add new password.
        """
        new_pass_dialog = NewPasswdDialog(self, self._groups_tw.currentItemGroupID(), self._passwords_table._show_pass)
        
        if (new_pass_dialog.exec_() == QtGui.QDialog.Accepted):
            # all done
            self.reloadItems()
        
    def showNewGroupDialog(self):
        """
            Group dialog to add new password.
        """
        new_group_dialog = NewGroupDialog(self)
        if (new_group_dialog.exec_() == QtGui.QDialog.Accepted):
            # all done
            self.reloadItems()
        
    def deletePassword(self):
        """
            Delete password from database.
        """
        # frist check tree widget
        title = self._groups_tw.currentPasswordTitle()
        p_id = self._groups_tw.currentPasswordId()

        # also chck in table widget
        if (not title):
            title = self._passwords_table.currentItemTitle()
            p_id = self._passwords_table.currentItemID()
        
        logging.debug("delete password title: %s, ID: %i", title, p_id)
        
        if (title != False):
            msg = QtGui.QMessageBox(QtGui.QMessageBox.Question, title ,tr("Do you want delete password '") 
                              + title + "'?")
            msg.addButton(QtGui.QMessageBox.Yes)
            msg.addButton(QtGui.QMessageBox.No)
            
            ret = msg.exec_()
            
            if (ret == QtGui.QMessageBox.Yes):
                # delete password
                self._passwords_table.deletePassword(p_id)
                self.reloadItems()
        logging.debug("Not password selected title: %s", title)
        
    def deleteGroup(self):
        """
            Delete group from database and also all passwords in this group, if foreign key are enabled.
        """
        # frist check tree widget
        title = self._groups_tw.currentItemGroupName()
        g_id = self._groups_tw.currentItemGroupID()
        
        logging.debug("delete group title: %s, ID: %i", title, g_id)
        
        if (title != False):
            msg = QtGui.QMessageBox(QtGui.QMessageBox.Question, title ,tr("Do you want delete group '") 
                              + title + "' and also containing passwords?")
            msg.addButton(QtGui.QMessageBox.Yes)
            msg.addButton(QtGui.QMessageBox.No)
            
            ret = msg.exec_()
            
            if (ret == QtGui.QMessageBox.Yes):
                # delete password
                self._groups_tw.deleteGroup(g_id)
                self.reloadItems()
        logging.debug("Not group selected title: %s", title)
        
    def showEditGroupDialog(self):
        """
            Edit selected group.
        """
        g_id = self._groups_tw.currentItemGroupID()
        
        if (g_id):
            # is group selected
            edit_group_dialog = EditGroupDialog(self, g_id)
            
            if (edit_group_dialog.exec_() == QtGui.QDialog.Accepted):
                # all done
                self.reloadItems()
            
    def reloadItems(self, p_id = -1):
        """
            Reload groups, passwords.
            
            @param p_id: password id to display, if is < 0, doesn't display
        """
        try:
            self._groups_tw.reloadItems()
            self._passwords_table.reloadItems()

            if (p_id >= 0):
                self._detail_w.setPassword(p_id)
            else:
                self._detail_w.setHidden(True)
        except Exception as e:
            logging.exception(e)
            
            InfoMsgBoxes.showErrorMsg(e)