Example #1
0
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, None)
        self.ui = Ui_SetupUsersWidget()
        self.ui.setupUi(self)

        self.edititemindex = None

        self.ui.pass_error.setVisible(False)
        self.ui.caps_error.setVisible(False)

        self.ui.advancedList.setVisible(False)
        self.ui.createButton.setVisible(False)
        self.ui.userIDCheck.setVisible(False)
        self.ui.userID.setVisible(False)

        self.ui.caps_error.setText(_("Caps Lock is on!"))

        # User Icons
        self.normalUserIcon = QtGui.QPixmap(":/gui/pics/user_normal.png")
        self.superUserIcon = QtGui.QPixmap(":/gui/pics/user_root.png")

        # KDE AutoLogin
        self.autoLoginUser = ""

        # Set disabled the create Button
        self.ui.createButton.setEnabled(False)

        #  Connections
        self.connect(self.ui.pass1, SIGNAL("textChanged(const QString &)"), self.slotTextChanged)
        self.connect(self.ui.pass2, SIGNAL("textChanged(const QString &)"), self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textChanged(const QString &)"), self.slotTextChanged)
        self.connect(self.ui.realname, SIGNAL("textChanged(const QString &)"), self.slotTextChanged)
        self.connect(self.ui.userID, SIGNAL("valueChanged(int)"), self.slotTextChanged)
        self.connect(self.ui.createButton, SIGNAL("clicked()"), self.slotCreateUser)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"), self.slotDeleteUser)
        self.connect(self.ui.editButton, SIGNAL("clicked()"), self.slotEditUser)
        self.connect(self.ui.addMoreUsers, SIGNAL("clicked()"), self.slotAdvanced)
        self.connect(self.ui.userList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self.slotEditUser)
        self.connect(self.ui.userList, SIGNAL("itemClicked(QListWidgetItem*)"), self.checkUsers)
        self.connect(self.ui.pass2, SIGNAL("returnPressed()"), self.slotReturnPressed)

        ctx.installData.users = []
        ctx.installData.autoLoginUser = None
        self.usedIDs = []
Example #2
0
    def __init__(self, *args):
        QtGui.QWidget.__init__(self,None)
        self.ui = Ui_SetupUsersWidget()
        self.ui.setupUi(self)

        self.edititemindex = None

        self.ui.pass_error.setVisible(False)
        self.ui.caps_error.setVisible(False)

        self.ui.caps_error.setText(_('<font color="#FF6D19">Caps Lock is on!</font>'))

        # User Icons
        self.normalUserIcon = QtGui.QPixmap(":/gui/pics/user_normal.png")
        self.superUserIcon = QtGui.QPixmap(":/gui/pics/user_root.png")

        # KDE AutoLogin
        self.autoLoginUser = ""

        # Give Admin Privileges default
        self.ui.admin.setChecked(True)

        # Set disabled the create Button
        self.ui.createButton.setEnabled(False)

        # Connections
        self.connect(self.ui.pass1, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.pass2, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.createButton, SIGNAL("clicked()"),
                     self.slotCreateUser)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),
                     self.slotDeleteUser)
        self.connect(self.ui.userList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"),
                     self.slotEditUser)
        self.connect(self.ui.pass2, SIGNAL("returnPressed()"),
                     self.slotReturnPressed)
Example #3
0
class Widget(QtGui.QWidget, ScreenWidget):
    title = _('Set Users')
    desc = _('Create users to use Pardus...')
    icon = "iconUser"
    help = _('''
<font size="+2">User setup</font>
<font size="+1">
<p>
Pardus 2009 allows multiple users to share the same computer.
You can assign management rights to the users you create; you can also
configure permissions to users for various operations through User Manager.
</p>
<p>
To create a new user, fill in the form and press the "Create User" button.
If you want a user to be automatically logged in to the system, select
the user from the list; if you want to delete a user, 
select his/her username from the list and press "Delete Selected User".
Proceed with the installation after you make your selections.
</p>
<p>
Click Next button to proceed.
</p>
</font>
''')

    def __init__(self, *args):
        QtGui.QWidget.__init__(self,None)
        self.ui = Ui_SetupUsersWidget()
        self.ui.setupUi(self)

        self.edititemindex = None

        self.ui.pass_error.setVisible(False)
        self.ui.caps_error.setVisible(False)

        self.ui.advancedList.setVisible(False)
        self.ui.createButton.setVisible(False)
        self.ui.cancelButton.setVisible(False)
        self.ui.userIDCheck.setVisible(False)
        self.ui.userID.setVisible(False)

        self.ui.caps_error.setText(_('Caps Lock is on!'))

        # User Icons
        self.normalUserIcon = QtGui.QPixmap(":/gui/pics/user_normal.png")
        self.superUserIcon = QtGui.QPixmap(":/gui/pics/user_root.png")

        # KDE AutoLogin
        self.autoLoginUser = ""

        # Set disabled the create Button
        self.ui.createButton.setEnabled(False)

        # Connections
        self.connect(self.ui.pass1, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.pass2, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.realname, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textEdited(const QString &)"),
                     self.slotUserNameChanged)
        self.connect(self.ui.realname, SIGNAL("textEdited(const QString &)"),
                     self.slotRealNameChanged)
        self.connect(self.ui.userID, SIGNAL("valueChanged(int)"),
                     self.slotTextChanged)
        self.connect(self.ui.createButton, SIGNAL("clicked()"),
                     self.slotCreateUser)
        self.connect(self.ui.cancelButton, SIGNAL("clicked()"),
                     self.resetWidgets)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),
                     self.slotDeleteUser)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),
                     self.slotEditUser)
        self.connect(self.ui.addMoreUsers, SIGNAL("clicked()"),
                     self.slotAdvanced)
        self.connect(self.ui.userList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"),
                     self.slotEditUser)
        self.connect(self.ui.pass2, SIGNAL("returnPressed()"),
                     self.slotReturnPressed)

        ctx.installData.users = []
        ctx.installData.autoLoginUser = None
        self.userNameChanged = False
        self.usedIDs = []

    def shown(self):
        self.ui.cancelButton.hide()
        self.ui.realname.setFocus()
        if len(yali4.users.pending_users) > 0 and self.ui.userList.count() == 0:
            for u in yali4.users.pending_users:
                pix = self.normalUserIcon
                if "wheel" in u.groups:
                    pix = self.superUserIcon
                UserItem(self.ui.userList, pix, user = u)
                self.ui.autoLogin.addItem(QString(u.username))
        if len(yali4.users.pending_users) == 1:
            self.slotEditUser(self.ui.userList.item(0))
        elif len(yali4.users.pending_users) > 1:
            self.ui.addMoreUsers.setChecked(True)
        self.checkUsers()
        self.checkCapsLock()

    def backCheck(self):
        self.refill()
        self.ui.cancelButton.hide()
        return True

    def refill(self):
        # reset and fill pending_users
        yali4.users.resetPendingUsers()
        for i in range(self.ui.userList.count()):
            u = self.ui.userList.item(i).getUser()
            ctx.installData.users.append(u)
            yali4.users.pending_users.append(u)

    def execute(self):

        if self.checkUsers():
            self.refill()
            ctx.installData.autoLoginUser = str(self.ui.autoLogin.currentText())
            if self.ui.createButton.text() == _("Update User"):
                return self.slotCreateUser()
            return True

        if not self.ui.addMoreUsers.isChecked():
            if not self.slotCreateUser():
                ctx.mainScreen.moveInc = 0
                return True

        self.refill()
        ctx.installData.autoLoginUser = str(self.ui.autoLogin.currentText())
        return True

    def checkCapsLock(self):
        if pardus.xorg.capslock.isOn():
            self.ui.caps_error.setVisible(True)
        else:
            self.ui.caps_error.setVisible(False)

    def keyReleaseEvent(self, e):
        self.checkCapsLock()

    def showError(self,message):
        self.ui.pass_error.setText("<center>%s</center>" % message)
        self.ui.pass_error.setVisible(True)
        self.ui.createButton.setEnabled(False)

    def slotAdvanced(self):
        self.checkUsers()

    def slotTextChanged(self):
        p1 = self.ui.pass1.text()
        p2 = self.ui.pass2.text()

        if not p1 == '' and (str(p1).lower() == str(self.ui.username.text()).lower() or \
                str(p1).lower() == str(self.ui.realname.text()).lower()):
            self.showError(_('Don\'t use your user name or name as a password.'))
            return
        elif p2 != p1 and p2:
            self.showError(_('Passwords do not match!'))
            return
        elif len(p1) == len(p2) and len(p2) < 4 and not p1=='':
            self.showError(_('Password is too short!'))
            return
        else:
            self.ui.pass_error.setVisible(False)

        if self.ui.username.text() and p1 and p2:
            self.ui.createButton.setEnabled(True)
            if not self.ui.addMoreUsers.isChecked():
                ctx.mainScreen.enableNext()
                ctx.mainScreen.enableBack()
        else:
            self.ui.createButton.setEnabled(False)
            if not self.ui.addMoreUsers.isChecked():
                ctx.mainScreen.disableNext()

    def currentUsers(self):
        ret = []
        for i in range(self.ui.userList.count()):
            ret.append(self.ui.userList.item(i).getUser().username)
        return ret

    def slotUserNameChanged(self):
        self.userNameChanged = True

    def slotRealNameChanged(self):
        if not self.userNameChanged:
            usedUsers = yali4.users.getUserList()
            usedUsers.extend(self.currentUsers())
            self.ui.username.setText(yali4.users.nickGuess(self.ui.realname.text(), usedUsers))

    def slotCreateUser(self):
        u = yali4.users.User()
        u.username = str(self.ui.username.text().toAscii())
        # ignore last character. see bug #887
        u.realname = unicode(self.ui.realname.text())
        u.passwd = unicode(self.ui.pass1.text())
        u.groups = ["users", "pnp", "pnpadmin", "removable", "disk", "audio", "video", "power", "dialout"]
        pix = self.normalUserIcon
        if self.ui.admin.isChecked():
            u.groups.append("wheel")
            pix = self.superUserIcon
        u.noPass = self.ui.noPass.isChecked()

        existsInList = u.username in self.currentUsers()

        # check user validity
        if u.exists() or (existsInList and self.edititemindex == None):
            self.showError(_('Username exists, choose another one!'))
            return False
        elif not u.usernameIsValid():
            self.showError(_('Username contains invalid characters!'))
            return False
        elif not u.realnameIsValid():
            self.showError(_('Realname contains invalid characters!'))
            return False

        # Dont check in edit mode
        if self.ui.addMoreUsers.isChecked() and self.ui.userIDCheck.isChecked():
            uid = self.ui.userID.value()
            if self.edititemindex == None:
                if uid in self.usedIDs:
                    self.showError(_('User ID used before, choose another one!'))
                    return False
            self.usedIDs.append(uid)
            u.uid = uid

        self.ui.createButton.setText(_("Create User"))
        self.ui.cancelButton.hide()
        updateItem = None

        try:
            self.ui.userList.takeItem(self.edititemindex)
            self.ui.autoLogin.removeItem(self.edititemindex + 1)
        except:
            updateItem = self.edititemindex
            # nothing wrong. just adding a new user...
            pass

        i = UserItem(self.ui.userList, pix, user = u)

        # add user to auto-login list.
        self.ui.autoLogin.addItem(QString(u.username))

        if updateItem:
            self.ui.autoLogin.setCurrentIndex(self.ui.autoLogin.count())

        # clear form
        self.resetWidgets()

        ctx.debugger.log("slotCreateUser :: user (%s) '%s (%s)' added/updated" % (u.uid, u.realname, u.username))
        ctx.debugger.log("slotCreateUser :: user groups are %s" % str(','.join(u.groups)))

        # give focus to realname widget for a new user. #3280
        self.ui.realname.setFocus()
        self.checkUsers()
        self.userNameChanged = False
        return True

    def slotDeleteUser(self):
        if self.ui.userList.currentRow()==self.edititemindex:
            self.resetWidgets()
            self.ui.autoLogin.setCurrentIndex(0)
        _cur = self.ui.userList.currentRow()
        item = self.ui.userList.item(_cur).getUser()
        if item.uid in self.usedIDs:
            self.usedIDs.remove(item.uid)
        self.ui.userList.takeItem(_cur)
        self.ui.autoLogin.removeItem(_cur + 1)
        self.ui.createButton.setText(_("Create User"))
        self.ui.cancelButton.hide()
        self.checkUsers()

    def slotEditUser(self, item=None):
        if not item:
            item = self.ui.userList.currentItem()
        self.ui.userList.setCurrentItem(item)
        u = item.getUser()
        if u.uid > -1:
            self.ui.userIDCheck.setChecked(True)
            self.ui.userID.setValue(u.uid)
        self.ui.username.setText(QString(u.username))
        self.ui.realname.setText(QString(u.realname))
        self.ui.pass1.setText(QString(u.passwd))
        self.ui.pass2.setText(QString(u.passwd))

        if "wheel" in u.groups:
            self.ui.admin.setChecked(True)
        else:
            self.ui.admin.setChecked(False)

        self.ui.noPass.setChecked(u.noPass)

        self.edititemindex = self.ui.userList.currentRow()
        self.ui.createButton.setText(_("Update User"))
        self.ui.cancelButton.setVisible(self.ui.createButton.isVisible())

    def checkUsers(self):
        if self.ui.userList.count() > 0:
            self.ui.userList.setCurrentRow(0)
            self.ui.deleteButton.setEnabled(True)
            self.ui.editButton.setEnabled(True)
            self.ui.autoLogin.setEnabled(True)
            ctx.mainScreen.enableNext()
            ctx.mainScreen.enableBack()
            return True
        # there is no user in list so noting to delete
        self.ui.deleteButton.setEnabled(False)
        self.ui.editButton.setEnabled(False)
        self.ui.autoLogin.setEnabled(False)
        ctx.mainScreen.disableNext()
        return False


    def resetWidgets(self):
        # clear all
        self.edititemindex = None
        self.ui.username.clear()
        self.ui.realname.clear()
        self.ui.pass1.clear()
        self.ui.pass2.clear()
        self.ui.admin.setChecked(False)
        self.ui.noPass.setChecked(False)
        self.ui.userIDCheck.setChecked(False)
        self.ui.createButton.setEnabled(False)
        if self.ui.cancelButton.isVisible():
            self.ui.cancelButton.setHidden(self.sender() == self.ui.cancelButton)
            self.checkUsers()
        self.ui.createButton.setText(_("Create User"))

    def slotReturnPressed(self):
        if self.ui.createButton.isEnabled() and self.ui.addMoreUsers.isChecked():
            self.slotCreateUser()
Example #4
0
class Widget(QtGui.QWidget, ScreenWidget):
    title = _('Set Users')
    desc = _('Create users to use Pardus..')
    icon = "iconUser"
    help = _('''
<font size="+2">User setup</font>

<font size="+1">
<p>
Other than the system administrator user,
you can create a user account for your 
daily needs, i.e reading your e-mail, surfing
on the web and searching for daily recipe
offerings. Usual password assignment
rules also apply here: This password should 
be unique and private. Choose a password 
difficult to guess, but easy to remember. 
</p>
<p>
Click Next button to proceed.
</p>
</font>
''')

    def __init__(self, *args):
        QtGui.QWidget.__init__(self,None)
        self.ui = Ui_SetupUsersWidget()
        self.ui.setupUi(self)

        self.edititemindex = None

        self.ui.pass_error.setVisible(False)
        self.ui.caps_error.setVisible(False)

        self.ui.caps_error.setText(_('<font color="#FF6D19">Caps Lock is on!</font>'))

        # User Icons
        self.normalUserIcon = QtGui.QPixmap(":/gui/pics/user_normal.png")
        self.superUserIcon = QtGui.QPixmap(":/gui/pics/user_root.png")

        # KDE AutoLogin
        self.autoLoginUser = ""

        # Give Admin Privileges default
        self.ui.admin.setChecked(True)

        # Set disabled the create Button
        self.ui.createButton.setEnabled(False)

        # Connections
        self.connect(self.ui.pass1, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.pass2, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.createButton, SIGNAL("clicked()"),
                     self.slotCreateUser)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),
                     self.slotDeleteUser)
        self.connect(self.ui.userList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"),
                     self.slotEditUser)
        self.connect(self.ui.pass2, SIGNAL("returnPressed()"),
                     self.slotReturnPressed)

    def shown(self):
        ctx.installData.users = []
        ctx.installData.autoLoginUser = None

        self.checkUsers()
        self.checkCapsLock()
        self.ui.username.setFocus()

    def execute(self):
        isAdminSet = False
        for i in range(self.ui.userList.count()):
            u = self.ui.userList.item(i).getUser()
            if "wheel" in u.groups:
                isAdminSet = True

        if not isAdminSet:
            # show confirmation dialog
            w = WarningWidget(self)
            w.warning.setText(_('''<b>
<p>You have not defined an administrator!</p>

<p>A user without administrative rights cannot complete system maintenance 
tasks. You are strongly encouraged to define an administrator user.</p>

<p>Click "Cancel" to define an administrator user (recommended) or "OK" to 
go to next screen.</p>
</b>
'''))
            self.dialog = WarningDialog(w, self)
            if not self.dialog.exec_():
                ctx.mainScreen.enableBack()
                ctx.mainScreen.enableNext()
                return False

        # reset and fill pending_users
        yali4.users.reset_pending_users()

        ctx.installData.autoLoginUser = str(self.ui.autoLogin.currentText())

        for i in range(self.ui.userList.count()):
            u = self.ui.userList.item(i).getUser()
            ctx.installData.users.append(u)
            yali4.users.pending_users.append(u)

        return True

    def checkCapsLock(self):
        if pardus.xorg.capslock.isOn():
            self.ui.caps_error.setVisible(True)
        else:
            self.ui.caps_error.setVisible(False)

    def keyReleaseEvent(self, e):
        self.checkCapsLock()

    def showError(self,message):
        self.ui.pass_error.setText("<center>%s</center>" % message)
        self.ui.pass_error.setVisible(True)
        self.ui.createButton.setEnabled(False)

    def slotTextChanged(self):
        p1 = self.ui.pass1.text()
        p2 = self.ui.pass2.text()

        if not p1 == '' and (p1 == self.ui.username.text() or p1 == self.ui.realname.text()):
            self.showError(_('<font color="#FF6D19">Don\'t use your user name or name as a password.</font>'))
            return
        elif p2 != p1 and p2:
            self.showError(_('<font color="#FF6D19">Passwords do not match!</font>'))
            return
        elif len(p1) == len(p2) and len(p2) < 4 and not p1=='':
            self.showError(_('<font color="#FF6D19">Password is too short!</font>'))
            return
        else:
            self.ui.pass_error.setVisible(False)

        if self.ui.username.text() and p1 and p2:
            self.ui.createButton.setEnabled(True)
        else:
            self.ui.createButton.setEnabled(False)

    def slotCreateUser(self):
        u = yali4.users.User()
        u.username = str(self.ui.username.text().toAscii())
        # ignore last character. see bug #887
        u.realname = unicode(self.ui.realname.text())
        u.passwd = unicode(self.ui.pass1.text())
        u.groups = ["users", "pnp", "pnpadmin", "removable", "disk", "audio", "video", "power", "dialout"]
        pix = self.normalUserIcon
        if self.ui.admin.isChecked():
            u.groups.append("wheel")
            pix = self.superUserIcon

        existsInList = [i for i in range(self.ui.userList.count())
                        if self.ui.userList.item(i).getUser().username == u.username]

        # check user validity
        if u.exists() or (existsInList and self.edititemindex == None):
            self.showError(_('<font color="#FF6D19">Username exists, choose another one!</font>'))
            return
        elif not u.usernameIsValid():
            self.showError(_('<font color="#FF6D19">Username contains invalid characters!</font>'))
            return
        elif not u.realnameIsValid():
            self.showError(_('<font color="#FF6D19">Realname contains invalid characters!</font>'))
            return

        self.ui.createButton.setText(_("Create User"))
        updateItem = None

        try:
            self.ui.userList.takeItem(self.edititemindex)
            self.ui.autoLogin.removeItem(self.edititemindex + 1)
        except:
            updateItem = self.edititemindex
            # nothing wrong. just adding a new user...
            pass

        self.edititemindex = None

        i = UserItem(self.ui.userList, pix, user = u)

        # add user to auto-login list.
        self.ui.autoLogin.addItem(QString(u.username))

        if updateItem:
            self.ui.autoLogin.setCurrentIndex(self.ui.autoLogin.count())

        # clear form
        self.resetWidgets()

        ctx.debugger.log("slotCreateUser :: user '%s (%s)' added/updated" % (u.realname,u.username))
        ctx.debugger.log("slotCreateUser :: user groups are %s" % str(','.join(u.groups)))

        # give focus to username widget for a new user. #3280
        self.ui.username.setFocus()
        self.checkUsers()

    def slotDeleteUser(self):
        if self.ui.userList.currentRow()==self.edititemindex:
            self.resetWidgets()
            self.ui.autoLogin.setCurrentIndex(0)
        _cur = self.ui.userList.currentRow()
        self.ui.userList.takeItem(_cur)
        self.ui.autoLogin.removeItem(_cur + 1)
        self.checkUsers()

    def slotEditUser(self, item):
        u = item.getUser()

        self.ui.username.setText(QString(u.username))
        self.ui.realname.setText(QString(u.realname))
        self.ui.pass1.setText(QString(u.passwd))
        self.ui.pass2.setText(QString(u.passwd))

        if "wheel" in u.groups:
            self.ui.admin.setChecked(True)
        else:
            self.ui.admin.setChecked(False)

        self.edititemindex = self.ui.userList.currentRow()
        self.ui.createButton.setText(_("Update User"))

    def checkUsers(self):
        if self.ui.userList.count():
            self.ui.deleteButton.setEnabled(True)
            self.ui.autoLogin.setEnabled(True)
            ctx.mainScreen.enableNext()
        else:
            # there is no user in list so noting to delete
            self.ui.deleteButton.setEnabled(False)
            self.ui.autoLogin.setEnabled(False)
            ctx.mainScreen.disableNext()

    def resetWidgets(self):
        # clear all
        self.ui.username.clear()
        self.ui.realname.clear()
        self.ui.pass1.clear()
        self.ui.pass2.clear()
        self.ui.admin.setChecked(False)
        self.ui.createButton.setEnabled(False)

    def slotReturnPressed(self):
        self.slotCreateUser()
Example #5
0
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, None)
        self.ui = Ui_SetupUsersWidget()
        self.ui.setupUi(self)

        self.edititemindex = None

        self.ui.pass_error.setVisible(False)
        self.ui.caps_error.setVisible(False)

        self.ui.advancedList.setVisible(False)
        self.ui.createButton.setVisible(False)
        self.ui.cancelButton.setVisible(False)
        self.ui.userIDCheck.setVisible(False)
        self.ui.userID.setVisible(False)

        self.ui.caps_error.setText(_('Caps Lock is on!'))

        # User Icons
        self.normalUserIcon = QtGui.QPixmap(":/gui/pics/user_normal.png")
        self.superUserIcon = QtGui.QPixmap(":/gui/pics/user_root.png")

        # KDE AutoLogin
        self.autoLoginUser = ""

        # Set disabled the create Button
        self.ui.createButton.setEnabled(False)

        # Connections
        self.connect(self.ui.pass1, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.pass2, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.realname, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textEdited(const QString &)"),
                     self.slotUserNameChanged)
        self.connect(self.ui.realname, SIGNAL("textEdited(const QString &)"),
                     self.slotRealNameChanged)
        self.connect(self.ui.userID, SIGNAL("valueChanged(int)"),
                     self.slotTextChanged)
        self.connect(self.ui.createButton, SIGNAL("clicked()"),
                     self.slotCreateUser)
        self.connect(self.ui.cancelButton, SIGNAL("clicked()"),
                     self.resetWidgets)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),
                     self.slotDeleteUser)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),
                     self.slotEditUser)
        self.connect(self.ui.addMoreUsers, SIGNAL("clicked()"),
                     self.slotAdvanced)
        self.connect(self.ui.userList,
                     SIGNAL("itemDoubleClicked(QListWidgetItem*)"),
                     self.slotEditUser)
        self.connect(self.ui.pass2, SIGNAL("returnPressed()"),
                     self.slotReturnPressed)

        ctx.installData.users = []
        ctx.installData.autoLoginUser = None
        self.userNameChanged = False
        self.usedIDs = []
Example #6
0
class Widget(QtGui.QWidget, ScreenWidget):
    title = _('Set Users')
    desc = _('Create users to use Pardus...')
    icon = "iconUser"
    help = _('''
<font size="+2">User setup</font>
<font size="+1">
<p>
Pardus 2009 allows multiple users to share the same computer.
You can assign management rights to the users you create; you can also
configure permissions to users for various operations through User Manager.
</p>
<p>
To create a new user, fill in the form and press the "Create User" button.
If you want a user to be automatically logged in to the system, select
the user from the list; if you want to delete a user, 
select his/her username from the list and press "Delete Selected User".
Proceed with the installation after you make your selections.
</p>
<p>
Click Next button to proceed.
</p>
</font>
''')

    def __init__(self, *args):
        QtGui.QWidget.__init__(self, None)
        self.ui = Ui_SetupUsersWidget()
        self.ui.setupUi(self)

        self.edititemindex = None

        self.ui.pass_error.setVisible(False)
        self.ui.caps_error.setVisible(False)

        self.ui.advancedList.setVisible(False)
        self.ui.createButton.setVisible(False)
        self.ui.cancelButton.setVisible(False)
        self.ui.userIDCheck.setVisible(False)
        self.ui.userID.setVisible(False)

        self.ui.caps_error.setText(_('Caps Lock is on!'))

        # User Icons
        self.normalUserIcon = QtGui.QPixmap(":/gui/pics/user_normal.png")
        self.superUserIcon = QtGui.QPixmap(":/gui/pics/user_root.png")

        # KDE AutoLogin
        self.autoLoginUser = ""

        # Set disabled the create Button
        self.ui.createButton.setEnabled(False)

        # Connections
        self.connect(self.ui.pass1, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.pass2, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.realname, SIGNAL("textChanged(const QString &)"),
                     self.slotTextChanged)
        self.connect(self.ui.username, SIGNAL("textEdited(const QString &)"),
                     self.slotUserNameChanged)
        self.connect(self.ui.realname, SIGNAL("textEdited(const QString &)"),
                     self.slotRealNameChanged)
        self.connect(self.ui.userID, SIGNAL("valueChanged(int)"),
                     self.slotTextChanged)
        self.connect(self.ui.createButton, SIGNAL("clicked()"),
                     self.slotCreateUser)
        self.connect(self.ui.cancelButton, SIGNAL("clicked()"),
                     self.resetWidgets)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),
                     self.slotDeleteUser)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),
                     self.slotEditUser)
        self.connect(self.ui.addMoreUsers, SIGNAL("clicked()"),
                     self.slotAdvanced)
        self.connect(self.ui.userList,
                     SIGNAL("itemDoubleClicked(QListWidgetItem*)"),
                     self.slotEditUser)
        self.connect(self.ui.pass2, SIGNAL("returnPressed()"),
                     self.slotReturnPressed)

        ctx.installData.users = []
        ctx.installData.autoLoginUser = None
        self.userNameChanged = False
        self.usedIDs = []

    def shown(self):
        self.ui.cancelButton.hide()
        self.ui.realname.setFocus()
        if len(yali4.users.pending_users) > 0 and self.ui.userList.count(
        ) == 0:
            for u in yali4.users.pending_users:
                pix = self.normalUserIcon
                if "wheel" in u.groups:
                    pix = self.superUserIcon
                UserItem(self.ui.userList, pix, user=u)
                self.ui.autoLogin.addItem(QString(u.username))
        if len(yali4.users.pending_users) == 1:
            self.slotEditUser(self.ui.userList.item(0))
        elif len(yali4.users.pending_users) > 1:
            self.ui.addMoreUsers.setChecked(True)
        self.checkUsers()
        self.checkCapsLock()

    def backCheck(self):
        self.refill()
        self.ui.cancelButton.hide()
        return True

    def refill(self):
        # reset and fill pending_users
        yali4.users.resetPendingUsers()
        for i in range(self.ui.userList.count()):
            u = self.ui.userList.item(i).getUser()
            ctx.installData.users.append(u)
            yali4.users.pending_users.append(u)

    def execute(self):

        if self.checkUsers():
            self.refill()
            ctx.installData.autoLoginUser = str(
                self.ui.autoLogin.currentText())
            if self.ui.createButton.text() == _("Update User"):
                return self.slotCreateUser()
            return True

        if not self.ui.addMoreUsers.isChecked():
            if not self.slotCreateUser():
                ctx.mainScreen.moveInc = 0
                return True

        self.refill()
        ctx.installData.autoLoginUser = str(self.ui.autoLogin.currentText())
        return True

    def checkCapsLock(self):
        if pardus.xorg.capslock.isOn():
            self.ui.caps_error.setVisible(True)
        else:
            self.ui.caps_error.setVisible(False)

    def keyReleaseEvent(self, e):
        self.checkCapsLock()

    def showError(self, message):
        self.ui.pass_error.setText("<center>%s</center>" % message)
        self.ui.pass_error.setVisible(True)
        self.ui.createButton.setEnabled(False)

    def slotAdvanced(self):
        self.checkUsers()

    def slotTextChanged(self):
        p1 = self.ui.pass1.text()
        p2 = self.ui.pass2.text()

        if not p1 == '' and (str(p1).lower() == str(self.ui.username.text()).lower() or \
                str(p1).lower() == str(self.ui.realname.text()).lower()):
            self.showError(
                _('Don\'t use your user name or name as a password.'))
            return
        elif p2 != p1 and p2:
            self.showError(_('Passwords do not match!'))
            return
        elif len(p1) == len(p2) and len(p2) < 4 and not p1 == '':
            self.showError(_('Password is too short!'))
            return
        else:
            self.ui.pass_error.setVisible(False)

        if self.ui.username.text() and p1 and p2:
            self.ui.createButton.setEnabled(True)
            if not self.ui.addMoreUsers.isChecked():
                ctx.mainScreen.enableNext()
                ctx.mainScreen.enableBack()
        else:
            self.ui.createButton.setEnabled(False)
            if not self.ui.addMoreUsers.isChecked():
                ctx.mainScreen.disableNext()

    def currentUsers(self):
        ret = []
        for i in range(self.ui.userList.count()):
            ret.append(self.ui.userList.item(i).getUser().username)
        return ret

    def slotUserNameChanged(self):
        self.userNameChanged = True

    def slotRealNameChanged(self):
        if not self.userNameChanged:
            usedUsers = yali4.users.getUserList()
            usedUsers.extend(self.currentUsers())
            self.ui.username.setText(
                yali4.users.nickGuess(self.ui.realname.text(), usedUsers))

    def slotCreateUser(self):
        u = yali4.users.User()
        u.username = str(self.ui.username.text().toAscii())
        # ignore last character. see bug #887
        u.realname = unicode(self.ui.realname.text())
        u.passwd = unicode(self.ui.pass1.text())
        u.groups = [
            "users", "pnp", "pnpadmin", "removable", "disk", "audio", "video",
            "power", "dialout"
        ]
        pix = self.normalUserIcon
        if self.ui.admin.isChecked():
            u.groups.append("wheel")
            pix = self.superUserIcon
        u.noPass = self.ui.noPass.isChecked()

        existsInList = u.username in self.currentUsers()

        # check user validity
        if u.exists() or (existsInList and self.edititemindex == None):
            self.showError(_('Username exists, choose another one!'))
            return False
        elif not u.usernameIsValid():
            self.showError(_('Username contains invalid characters!'))
            return False
        elif not u.realnameIsValid():
            self.showError(_('Realname contains invalid characters!'))
            return False

        # Dont check in edit mode
        if self.ui.addMoreUsers.isChecked() and self.ui.userIDCheck.isChecked(
        ):
            uid = self.ui.userID.value()
            if self.edititemindex == None:
                if uid in self.usedIDs:
                    self.showError(
                        _('User ID used before, choose another one!'))
                    return False
            self.usedIDs.append(uid)
            u.uid = uid

        self.ui.createButton.setText(_("Create User"))
        self.ui.cancelButton.hide()
        updateItem = None

        try:
            self.ui.userList.takeItem(self.edititemindex)
            self.ui.autoLogin.removeItem(self.edititemindex + 1)
        except:
            updateItem = self.edititemindex
            # nothing wrong. just adding a new user...
            pass

        i = UserItem(self.ui.userList, pix, user=u)

        # add user to auto-login list.
        self.ui.autoLogin.addItem(QString(u.username))

        if updateItem:
            self.ui.autoLogin.setCurrentIndex(self.ui.autoLogin.count())

        # clear form
        self.resetWidgets()

        ctx.debugger.log(
            "slotCreateUser :: user (%s) '%s (%s)' added/updated" %
            (u.uid, u.realname, u.username))
        ctx.debugger.log("slotCreateUser :: user groups are %s" %
                         str(','.join(u.groups)))

        # give focus to realname widget for a new user. #3280
        self.ui.realname.setFocus()
        self.checkUsers()
        self.userNameChanged = False
        return True

    def slotDeleteUser(self):
        if self.ui.userList.currentRow() == self.edititemindex:
            self.resetWidgets()
            self.ui.autoLogin.setCurrentIndex(0)
        _cur = self.ui.userList.currentRow()
        item = self.ui.userList.item(_cur).getUser()
        if item.uid in self.usedIDs:
            self.usedIDs.remove(item.uid)
        self.ui.userList.takeItem(_cur)
        self.ui.autoLogin.removeItem(_cur + 1)
        self.ui.createButton.setText(_("Create User"))
        self.ui.cancelButton.hide()
        self.checkUsers()

    def slotEditUser(self, item=None):
        if not item:
            item = self.ui.userList.currentItem()
        self.ui.userList.setCurrentItem(item)
        u = item.getUser()
        if u.uid > -1:
            self.ui.userIDCheck.setChecked(True)
            self.ui.userID.setValue(u.uid)
        self.ui.username.setText(QString(u.username))
        self.ui.realname.setText(QString(u.realname))
        self.ui.pass1.setText(QString(u.passwd))
        self.ui.pass2.setText(QString(u.passwd))

        if "wheel" in u.groups:
            self.ui.admin.setChecked(True)
        else:
            self.ui.admin.setChecked(False)

        self.ui.noPass.setChecked(u.noPass)

        self.edititemindex = self.ui.userList.currentRow()
        self.ui.createButton.setText(_("Update User"))
        self.ui.cancelButton.setVisible(self.ui.createButton.isVisible())

    def checkUserFields(self):
        if self.ui.realname.text() and self.ui.username.text() and (str(
                self.ui.pass1.text()).lower() == str(
                    self.ui.pass2.text()).lower()):
            return True
        else:
            return False

    def checkUsers(self):
        if self.ui.userList.count() > 0:
            self.ui.userList.setCurrentRow(0)
            self.ui.deleteButton.setEnabled(True)
            self.ui.editButton.setEnabled(True)
            self.ui.autoLogin.setEnabled(True)
            ctx.mainScreen.enableNext()
            ctx.mainScreen.enableBack()
            return True
        else:
            if self.checkUserFields():
                ctx.mainScreen.enableNext()
            else:
                ctx.mainScreen.disableNext()

        # there is no user in list so noting to delete
        self.ui.deleteButton.setEnabled(False)
        self.ui.editButton.setEnabled(False)
        self.ui.autoLogin.setEnabled(False)
        return False

    def resetWidgets(self):
        # clear all
        self.edititemindex = None
        self.ui.username.clear()
        self.ui.realname.clear()
        self.ui.pass1.clear()
        self.ui.pass2.clear()
        self.ui.admin.setChecked(False)
        self.ui.noPass.setChecked(False)
        self.ui.userIDCheck.setChecked(False)
        self.ui.createButton.setEnabled(False)
        if self.ui.cancelButton.isVisible():
            self.ui.cancelButton.setHidden(
                self.sender() == self.ui.cancelButton)
            self.checkUsers()
        self.ui.createButton.setText(_("Create User"))

    def slotReturnPressed(self):
        if self.ui.createButton.isEnabled() and self.ui.addMoreUsers.isChecked(
        ):
            self.slotCreateUser()