diff options
Diffstat (limited to 'textw/userauth_text.py')
-rw-r--r-- | textw/userauth_text.py | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/textw/userauth_text.py b/textw/userauth_text.py new file mode 100644 index 000000000..8da6cbe9e --- /dev/null +++ b/textw/userauth_text.py @@ -0,0 +1,307 @@ +#import gettext_rh +from snack import * +from constants import * +from translate import _ +import iutil + +class RootPasswordWindow: + def __call__ (self, screen, todo): + toplevel = GridForm (screen, _("Root Password"), 1, 3) + + toplevel.add (TextboxReflowed(37, _("Pick a root password. You must " + "type it twice to ensure you know " + "what it is and didn't make a mistake " + "in typing. Remember that the " + "root password is a critical part " + "of system security!")), 0, 0, (0, 0, 0, 1)) + + pw = todo.rootpassword.getPure() + if not pw: pw = "" + + entry1 = Entry (24, hidden = 1, text = pw) + entry2 = Entry (24, hidden = 1, text = pw) + passgrid = Grid (2, 2) + passgrid.setField (Label (_("Password:")), 0, 0, (0, 0, 1, 0), anchorLeft = 1) + passgrid.setField (Label (_("Password (again):")), 0, 1, (0, 0, 1, 0), anchorLeft = 1) + passgrid.setField (entry1, 1, 0) + passgrid.setField (entry2, 1, 1) + toplevel.add (passgrid, 0, 1, (0, 0, 0, 1)) + + bb = ButtonBar (screen, ((_("OK"), "ok"), (_("Back"), "back"))) + toplevel.add (bb, 0, 2, growx = 1) + + while 1: + toplevel.setCurrent (entry1) + result = toplevel.run () + rc = bb.buttonPressed (result) + if rc == "back": + screen.popWindow() + return INSTALL_BACK + if len (entry1.value ()) < 6: + ButtonChoiceWindow(screen, _("Password Length"), + _("The root password must be at least 6 characters " + "long."), + buttons = [ _("OK") ], width = 50) + elif entry1.value () != entry2.value (): + ButtonChoiceWindow(screen, _("Password Mismatch"), + _("The passwords you entered were different. Please " + "try again."), + buttons = [ _("OK") ], width = 50) + else: + break + + entry1.set ("") + entry2.set ("") + + screen.popWindow() + todo.rootpassword.set (entry1.value ()) + return INSTALL_OK + +class UsersWindow: + def editWindow (self, user, text, edit = 0, cancelText = None): + if (not cancelText): + cancelText = _("Cancel") + + userid = Entry (9, user["id"]) + currentid = user["id"] + fullname = Entry (20, user["name"], scroll = 1) + pass1 = Entry (10, user["password"], hidden = 1) + pass2 = Entry (10, user["password"], hidden = 1) + + if edit: + title = _("Edit User") + else: + title = _("Add User") + + while 1: + (rc, ent) = EntryWindow (self.screen, title, text, + [ (_("User ID"), userid), + (_("Full Name"), fullname), + (_("Password"), pass1), + (_("Password (confirm)"), pass2) ], + buttons = [ (_("OK"), "ok"), (cancelText, "cancel") ]) + + if rc == "cancel": + return INSTALL_BACK + if not len(pass1.value()) and not len(pass2.value()) and \ + not len(userid.value()) and not len(fullname.value()): + return INSTALL_OK + + if (not iutil.validUser(userid.value())): + ButtonChoiceWindow(self.screen, _("Bad User ID"), + _("User IDs must be less than 8 " + "characters and contain only characters " + "A-Z, a-z, and 0-9."), + buttons = [ _("OK") ], width = 50) + continue + + if not userid.value (): + ButtonChoiceWindow(self.screen, _("Missing User ID"), + _("You must provide a user ID"), + buttons = [ _("OK") ], width = 50) + continue + if len (pass1.value ()) < 6: + ButtonChoiceWindow(self.screen, _("Password Length"), + _("The password must be at least 6 characters " + "long."), + buttons = [ _("OK") ], width = 50) + pass1.set ("") + pass2.set ("") + continue + elif pass1.value () != pass2.value (): + ButtonChoiceWindow(self.screen, _("Password Mismatch"), + _("The passwords you entered were different. Please " + "try again."), + buttons = [ _("OK") ], width = 50) + pass1.set ("") + pass2.set ("") + continue + + if self.users.has_key (userid.value ()) and \ + userid.value () != currentid: + ButtonChoiceWindow(self.screen, _("User Exists"), + _("This user id already exists. Choose another."), + buttons = [ _("OK") ], width = 50) + continue + + # XXX FIXME - more data validity checks + + user["id"] = userid.value () + user["name"] = fullname.value () + user["password"] = pass1.value () + break + + return INSTALL_OK + + def __call__ (self, screen, todo): + self.users = {} + self.screen = screen + user = { "id" : "", "name" : "", "password" : "" } + + for (account, name, password) in todo.getUserList(): + user['id'] = account + user['name'] = name + user['password'] = password + self.users[account] = user + del user + user = { "id" : "", "name" : "", "password" : "" } + + if not self.users.keys(): + rc = self.editWindow(user, _("You should use a normal user " + "account for most activities on your system. By not using the " + "root account casually, you'll reduce the chance of " + "disrupting your system's configuration."), + cancelText = _("Back")) + if (rc == INSTALL_BACK): + return INSTALL_BACK + if (not user['id']): + return INSTALL_OK + self.users[user["id"]] = user + + g = GridForm (screen, _("User Account Setup"), 1, 4) + + t = TextboxReflowed(60, _("What user account would you like to have " + "on the system? You should have at least one non-root account " + "for normal work, but multi-user systems can have any number " + "of accounts set up.")) + g.add(t, 0, 0, anchorLeft = 1, padding = (0, 0, 0, 1)) + + listformat = "%-15s %-40s" + userformat = "%(id)-15s %(name)-40s" + + subgrid = Grid(1, 2) + header = listformat % (_("User name"), _("Full Name")) + label = Label (header) + subgrid.setField (label, 0, 0, anchorLeft = 1) + listbox = Listbox (5, scroll = 1, returnExit = 1, width = 54) + subgrid.setField (listbox, 0, 1, (0, 0, 0, 1), anchorLeft = 1) + + g.add(subgrid, 0, 1) + + for user in self.users.values (): + listbox.append (userformat % user, user["id"]) + + bb = ButtonBar (screen, ((_("Add"), "add"), (_("Delete"), "delete"), + (_("Edit"), "edit"), (_("OK"), "ok"), (_("Back"), "back"))) + + g.add (bb, 0, 3, growx = 1) + + while 1: + result = g.run () + + rc = bb.buttonPressed (result) + + if rc == "add": + user = { "id" : "", "name" : "", "password" : "" } + if self.editWindow (user, + _("Enter the information for the user."), 0) != INSTALL_BACK: + listbox.append (userformat % user, user["id"]) + listbox.setCurrent (user["id"]) + self.users[user["id"]] = user + elif rc == "delete": + current = listbox.current () + listbox.delete (current) + del self.users [current] + elif rc == "edit" or result == listbox: + current = listbox.current() + user = self.users[current] + if self.editWindow (user, + _("Change the information for this user."), 1) != INSTALL_BACK: + # if the user id changed, we need to delete the old key + # and insert this new one. + if user["id"] != current: + del self.users [current] + listbox.insert (userformat % user, user["id"], current) + listbox.delete (current) + # and if the user id didn't change, just replace the old + # listbox entry. + else: + listbox.replace (userformat % user, user["id"]) + self.users [user["id"]] = user + listbox.setCurrent(user["id"]) + elif rc == "ok" or result == "F12": + dir = INSTALL_OK + break + elif rc == "back": + dir = INSTALL_BACK + break + else: + raise NeverGetHereError, "I shouldn't be here w/ rc %s..." % rc + + screen.popWindow () + + list = [] + for n in self.users.values(): + info = ( n['id'], n['name'], n['password'] ) + list.append(info) + + todo.setUserList(list) + + return dir + +class AuthConfigWindow: + def setsensitive (self): + server = FLAGS_RESET + flag = FLAGS_RESET + if self.broadcast.selected (): + server = FLAGS_SET + if not self.nis.selected (): + flag = FLAGS_SET + server = FLAGS_SET + + self.domain.setFlags (FLAG_DISABLED, flag) + self.broadcast.setFlags (FLAG_DISABLED, flag) + self.server.setFlags (FLAG_DISABLED, server) + + def __call__(self, screen, todo): + bb = ButtonBar (screen, ((_("OK"), "ok"), (_("Back"), "back"))) + + toplevel = GridForm (screen, _("Authentication Configuration"), 1, 5) + self.shadow = Checkbox (_("Use Shadow Passwords"), todo.auth.useShadow) + toplevel.add (self.shadow, 0, 0, (0, 0, 0, 1), anchorLeft = 1) + self.md5 = Checkbox (_("Enable MD5 Passwords"), todo.auth.useMD5) + toplevel.add (self.md5, 0, 1, (0, 0, 0, 1), anchorLeft = 1) + self.nis = Checkbox (_("Enable NIS"), todo.auth.useNIS) + toplevel.add (self.nis, 0, 2, anchorLeft = 1) + + subgrid = Grid (2, 3) + + subgrid.setField (Label (_("NIS Domain:")), + 0, 0, (0, 0, 1, 0), anchorRight = 1) + subgrid.setField (Label (_("NIS Server:")), + 0, 1, (0, 0, 1, 0), anchorRight = 1) + subgrid.setField (Label (_("or use:")), + 0, 2, (0, 0, 1, 0), anchorRight = 1) + + text = _("Request server via broadcast") + self.domain = Entry (len (text) + 4) + self.domain.set (todo.auth.domain) + self.broadcast = Checkbox (text, todo.auth.useBroadcast) + self.server = Entry (len (text) + 4) + self.server.set (todo.auth.server) + subgrid.setField (self.domain, 1, 0, anchorLeft = 1) + subgrid.setField (self.broadcast, 1, 1, anchorLeft = 1) + subgrid.setField (self.server, 1, 2, anchorLeft = 1) + toplevel.add (subgrid, 0, 3, (2, 0, 0, 1)) + toplevel.add (bb, 0, 4, growx = 1) + + self.nis.setCallback (self.setsensitive) + self.broadcast.setCallback (self.setsensitive) + + self.setsensitive () + + result = toplevel.runOnce () + + todo.auth.useMD5 = self.md5.value () + todo.auth.useShadow = self.shadow.value () + todo.auth.useNIS = self.nis.selected () + todo.auth.domain = self.domain.value () + todo.auth.useBroadcast = self.broadcast.selected () + todo.auth.server = self.server.value () + + rc = bb.buttonPressed (result) + + if rc == "back": + return INSTALL_BACK + return INSTALL_OK + |