summaryrefslogtreecommitdiffstats
path: root/ipa-server/ipa-gui/ipagui/subcontrollers/user.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipa-server/ipa-gui/ipagui/subcontrollers/user.py')
-rw-r--r--ipa-server/ipa-gui/ipagui/subcontrollers/user.py854
1 files changed, 0 insertions, 854 deletions
diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/user.py b/ipa-server/ipa-gui/ipagui/subcontrollers/user.py
deleted file mode 100644
index d8fabb6b..00000000
--- a/ipa-server/ipa-gui/ipagui/subcontrollers/user.py
+++ /dev/null
@@ -1,854 +0,0 @@
-# Copyright (C) 2007 Red Hat
-# see file 'COPYING' for use and warranty information
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; version 2 only
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-
-import re
-import random
-from pickle import dumps, loads
-from base64 import b64encode, b64decode
-import logging
-
-import cherrypy
-import turbogears
-from turbogears import controllers, expose, flash
-from turbogears import validators, validate
-from turbogears import widgets, paginate
-from turbogears import error_handler
-from turbogears import identity
-
-from ipacontroller import IPAController
-import ipa.user
-from ipa.entity import utf8_encode_values
-from ipa import ipaerror
-import ipagui.forms.user
-import ipa.config
-from ipagui.helpers import ipahelper
-
-log = logging.getLogger(__name__)
-
-password_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
-
-user_new_form = ipagui.forms.user.UserNewForm()
-user_edit_form = ipagui.forms.user.UserEditForm()
-
-user_fields = ['*', 'nsAccountLock']
-
-class UserController(IPAController):
-
- def __init__(self, *args, **kw):
- super(UserController,self).__init__(*args, **kw)
-# self.load_custom_fields()
-
- def get_email_domain(self):
- client = self.get_ipaclient()
-
- conf = client.get_ipa_config()
- email_domain = conf.ipadefaultemaildomain
-
- return email_domain
-
- def load_custom_fields(self):
-
- client = self.get_ipaclient()
- schema = client.get_custom_fields()
-
- # FIXME: Don't load from LDAP every single time it is called
-
- # FIXME: Is removing the attributes on the fly thread-safe? Do we
- # need to lock here?
- for s in schema:
- required=False
- if (s['required'].lower() == "true"):
- required=True
- field = widgets.TextField(name=s['field'],label=s['label'])
- validator = validators.String(not_empty=required)
-
- # Don't allow dupes on the new form
- try:
- for i in range(len(user_new_form.custom_fields)):
- if user_new_form.custom_fields[i].name == s['field']:
- user_new_form.custom_fields.pop(i)
- except:
- pass
-
- # Don't allow dupes on the edit form
- try:
- for i in range(len(user_edit_form.custom_fields)):
- if user_edit_form.custom_fields[i].name == s['field']:
- user_edit_form.custom_fields.pop(i)
- except:
- pass
-
- # Don't allow dupes in the list of user fields
- try:
- for i in range(len(ipagui.forms.user.UserFields.custom_fields)):
- if ipagui.forms.user.UserFields.custom_fields[i].name == s['field']:
- ipagui.forms.user.UserFields.custom_fields.pop(i)
- except:
- pass
-
- ipagui.forms.user.UserFields.custom_fields.append(field)
- user_new_form.custom_fields.append(field)
- user_edit_form.custom_fields.append(field)
-
- user_new_form.validator.add_field(s['field'], validator)
- user_edit_form.validator.add_field(s['field'], validator)
-
- def initialize_mv_fields(self, user_dict):
- """We use a separate attribute to store multi-values while on
- the edit page. It is important that this be at least []. If
- it is None it will cause an error to be thrown."""
-
- # Load potential multi-valued fields
- if isinstance(user_dict['cn'], basestring):
- user_dict['cn'] = [user_dict['cn']]
- user_dict['cns'] = ipahelper.setup_mv_fields(user_dict['cn'], 'cn')
-
- if isinstance(user_dict.get('telephonenumber',''), basestring):
- user_dict['telephonenumber'] = [user_dict.get('telephonenumber')]
- user_dict['telephonenumbers'] = ipahelper.setup_mv_fields(user_dict.get('telephonenumber'), 'telephonenumber')
-
- if isinstance(user_dict.get('facsimiletelephonenumber',''), basestring):
- user_dict['facsimiletelephonenumber'] = [user_dict.get('facsimiletelephonenumber')]
- user_dict['facsimiletelephonenumbers'] = ipahelper.setup_mv_fields(user_dict.get('facsimiletelephonenumber'), 'facsimiletelephonenumber')
-
- if isinstance(user_dict.get('mobile',''), basestring):
- user_dict['mobile'] = [user_dict.get('mobile')]
- user_dict['mobiles'] = ipahelper.setup_mv_fields(user_dict.get('mobile'), 'mobile')
-
- if isinstance(user_dict.get('pager',''), basestring):
- user_dict['pager'] = [user_dict.get('pager')]
- user_dict['pagers'] = ipahelper.setup_mv_fields(user_dict.get('pager'), 'pager')
-
- if isinstance(user_dict.get('homephone',''), basestring):
- user_dict['homephone'] = [user_dict.get('homephone')]
- user_dict['homephones'] = ipahelper.setup_mv_fields(user_dict.get('homephone'), 'homephone')
-
- return user_dict
-
- @expose()
- def index(self):
- raise turbogears.redirect("/user/list")
-
- @expose("ipagui.templates.usernew")
- @identity.require(identity.in_any_group("admins","editors"))
- def new(self, tg_errors=None):
- """Displays the new user form"""
- self.load_custom_fields()
- if tg_errors:
- turbogears.flash("There were validation errors.<br/>" +
- "Please see the messages below for details.")
-
- return dict(form=user_new_form, user={})
-
- @expose()
- @identity.require(identity.in_any_group("admins","editors"))
- def create(self, **kw):
- """Creates a new user"""
- self.restrict_post()
- client = self.get_ipaclient()
-
- if kw.get('submit') == 'Cancel':
- turbogears.flash("Add user cancelled")
- raise turbogears.redirect('/user/list')
-
- # Fix incoming multi-valued fields we created for the form
- kw = ipahelper.fix_incoming_fields(kw, 'cn', 'cns')
- kw = ipahelper.fix_incoming_fields(kw, 'telephonenumber', 'telephonenumbers')
- kw = ipahelper.fix_incoming_fields(kw, 'facsimiletelephonenumber', 'facsimiletelephonenumbers')
- kw = ipahelper.fix_incoming_fields(kw, 'mobile', 'mobiles')
- kw = ipahelper.fix_incoming_fields(kw, 'pager', 'pagers')
- kw = ipahelper.fix_incoming_fields(kw, 'homephone', 'homephones')
-
- tg_errors, kw = self.usercreatevalidate(**kw)
-
- if tg_errors:
- turbogears.flash("There were validation errors.<br/>" +
- "Please see the messages below for details.")
- return dict(form=user_new_form, user=kw,
- tg_template='ipagui.templates.usernew')
-
- #
- # Create the user itself
- #
- try:
- new_user = ipa.user.User()
- new_user.setValueNotEmpty('title', kw.get('title'))
- new_user.setValueNotEmpty('givenname', kw.get('givenname'))
- new_user.setValueNotEmpty('sn', kw.get('sn'))
- new_user.setValueNotEmpty('cn', kw.get('cn'))
- new_user.setValueNotEmpty('displayname', kw.get('displayname'))
- new_user.setValueNotEmpty('initials', kw.get('initials'))
-
- new_user.setValueNotEmpty('uid', kw.get('uid'))
- new_user.setValueNotEmpty('loginshell', kw.get('loginshell'))
- new_user.setValueNotEmpty('gecos', kw.get('gecos'))
-
- new_user.setValueNotEmpty('mail', kw.get('mail'))
- new_user.setValueNotEmpty('telephonenumber', kw.get('telephonenumber'))
- new_user.setValueNotEmpty('facsimiletelephonenumber',
- kw.get('facsimiletelephonenumber'))
- new_user.setValueNotEmpty('mobile', kw.get('mobile'))
- new_user.setValueNotEmpty('pager', kw.get('pager'))
- new_user.setValueNotEmpty('homephone', kw.get('homephone'))
-
- new_user.setValueNotEmpty('street', kw.get('street'))
- new_user.setValueNotEmpty('l', kw.get('l'))
- new_user.setValueNotEmpty('st', kw.get('st'))
- new_user.setValueNotEmpty('postalcode', kw.get('postalcode'))
-
- new_user.setValueNotEmpty('ou', kw.get('ou'))
- new_user.setValueNotEmpty('businesscategory', kw.get('businesscategory'))
- new_user.setValueNotEmpty('description', kw.get('description'))
- new_user.setValueNotEmpty('employeetype', kw.get('employeetype'))
- if kw.get('manager'):
- new_user.setValueNotEmpty('manager', kw.get('manager'))
- new_user.setValueNotEmpty('roomnumber', kw.get('roomnumber'))
- if kw.get('secretary'):
- new_user.setValueNotEmpty('secretary', kw.get('secretary'))
-
- new_user.setValueNotEmpty('carlicense', kw.get('carlicense'))
- new_user.setValueNotEmpty('labeleduri', kw.get('labeleduri'))
-
- for custom_field in user_new_form.custom_fields:
- new_user.setValueNotEmpty(custom_field.name,
- kw.get(custom_field.name, ''))
-
- rv = client.add_user(new_user)
-
- if kw.get('nsAccountLock'):
- client.mark_user_inactive(kw.get('uid'))
- except ipaerror.exception_for(ipaerror.LDAP_DUPLICATE):
- turbogears.flash("User with login '%s' already exists" %
- kw.get('uid'))
- return dict(form=user_new_form, user=kw,
- tg_template='ipagui.templates.usernew')
- except ipaerror.IPAError, e:
- turbogears.flash("User add failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- return dict(form=user_new_form, user=kw,
- tg_template='ipagui.templates.usernew')
-
- #
- # NOTE: from here on, the user account now exists.
- # on any error, we redirect to the _edit_ user page.
- # this code does data setup, similar to useredit()
- #
- user = client.get_user_by_uid(kw['uid'], user_fields)
- user_dict = user.toDict()
-
- user_groups_dicts = []
- user_groups_data = b64encode(dumps(user_groups_dicts))
-
- # store a copy of the original user for the update later
- user_data = b64encode(dumps(user_dict))
- user_dict['user_orig'] = user_data
- user_dict['user_groups_data'] = user_groups_data
-
- # preserve group add info in case of errors
- user_dict['dnadd'] = kw.get('dnadd')
- user_dict['dn_to_info_json'] = kw.get('dn_to_info_json')
-
- #
- # Set the Password
- #
- if kw.get('krbprincipalkey'):
- try:
- client.modifyPassword(user_dict['krbprincipalname'], "", kw.get('krbprincipalkey'))
- except ipaerror.IPAError, e:
- message = "User successfully created.<br />"
- message += "There was an error setting the password.<br />"
- turbogears.flash(message)
- return dict(form=user_edit_form, user=user_dict,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- #
- # Add groups
- #
- failed_adds = []
- try:
- dnadds = kw.get('dnadd')
- cherrypy.session['uid'] = user_dict.get('uid')
-
- # remove the default group from failed add
- if dnadds != None:
- try:
- conf=client.get_ipa_config()
- default_cn="cn=%s" % conf.getValue('ipadefaultprimarygroup')
-
- if not(isinstance(dnadds,list) or isinstance(dnadds,tuple)):
- dnadds = [dnadds]
-
- for d in dnadds:
- e = d.find(default_cn)
- if e >= 0:
- dnadds.remove(d)
- except:
- pass
-
- if len(dnadds) > 0:
- failed_adds = client.add_groups_to_user(
- utf8_encode_values(dnadds), user.dn)
- kw['dnadd'] = failed_adds
- except ipaerror.IPAError, e:
- failed_adds = dnadds
-
- if len(failed_adds) > 0:
- message = "User successfully created.<br />"
- message += "There was an error adding groups.<br />"
- message += "Failures have been preserved in the add/remove lists."
- turbogears.flash(message)
-
- # Setup any multi-value fields, otherwise you'll get:
- # 'NoneType' object is not iterable
- user_dict = self.initialize_mv_fields(user_dict)
- return dict(form=user_edit_form, user=user_dict,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- turbogears.flash("%s added!" % kw['uid'])
- print "Succeeded "
- raise turbogears.redirect('/user/show', uid=kw['uid'])
-
- @expose("ipagui.templates.dynamiceditsearch")
- @identity.require(identity.not_anonymous())
- def edit_search(self, **kw):
- """Searches for groups and displays list of results in a table.
- This method is used for the ajax search on the user edit page."""
- client = self.get_ipaclient()
-
- groups = []
- groups_counter = 0
- searchlimit = 100
- criteria = kw.get('criteria')
- if criteria != None and len(criteria) > 0:
- try:
- groups = client.find_groups(criteria.encode('utf-8'), None,
- searchlimit)
- groups_counter = groups[0]
- groups = groups[1:]
- except ipaerror.IPAError, e:
- turbogears.flash("search failed: " + str(e))
-
- return dict(users=None, groups=groups, criteria=criteria,
- counter=groups_counter)
-
-
- @expose("ipagui.templates.useredit")
- @identity.require(identity.not_anonymous())
- def edit(self, uid=None, principal=None, tg_errors=None):
- """Displays the edit user form"""
- self.load_custom_fields()
- if tg_errors:
- turbogears.flash("There were validation errors.<br/>" +
- "Please see the messages below for details.")
-
- client = self.get_ipaclient()
-
- try:
- if uid is not None:
- user = client.get_user_by_uid(uid, user_fields)
- elif principal is not None:
- principal = principal + "@" + ipa.config.config.default_realm
- user = client.get_user_by_principal(principal, user_fields)
- else:
- turbogears.flash("User edit failed: No uid or principal provided")
- raise turbogears.redirect('/')
- user_dict = user.toDict()
-
- user_dict = self.initialize_mv_fields(user_dict)
-
- # Edit shouldn't fill in the password field.
- if user_dict.has_key('krbprincipalkey'):
- del(user_dict['krbprincipalkey'])
-
- user_dict['uid_hidden'] = user_dict.get('uid')
-
- user_groups = client.get_groups_by_member(user.dn, ['dn', 'cn'])
- user_groups.sort(self.sort_by_cn)
- user_groups_dicts = map(lambda group: group.toDict(), user_groups)
- user_groups_data = b64encode(dumps(user_groups_dicts))
-
- # store a copy of the original user for the update later
- user_data = b64encode(dumps(user_dict))
- user_dict['user_orig'] = user_data
- user_dict['user_groups_data'] = user_groups_data
-
- # grab manager and secretary names
- if user.manager:
- try:
- user_manager = client.get_entry_by_dn(user.manager,
- ['givenname', 'sn', 'uid'])
- user_dict['manager_cn'] = "%s %s" % (
- user_manager.getValue('givenname', ''),
- user_manager.getValue('sn', ''))
- except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND),
- ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)):
- pass
- if user.secretary:
- try:
- user_secretary = client.get_entry_by_dn(user.secretary,
- ['givenname', 'sn', 'uid'])
- user_dict['secretary_cn'] = "%s %s" % (
- user_secretary.getValue('givenname', ''),
- user_secretary.getValue('sn', ''))
- except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND),
- ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)):
- pass
-
- # Set the uid we're editing in the session. If it doesn't match
- # later the update will not be processed
- cherrypy.session['uid'] = user_dict.get('uid')
-
- # Hack. The admin user doesn't have inetorgperson as an
- # objectclass so don't require the givenName attribute if
- # this objectclass doesn't exist in the record.
- oc = [x.lower() for x in user_dict.get('objectclass')]
- try:
- p = oc.index('inetorgperson')
- except ValueError:
- # This entry doesn't have inetorgperson so don't require gn
- user_edit_form.validator.fields.get('givenname').not_empty=False
-
- return dict(form=user_edit_form, user=user_dict,
- user_groups=user_groups_dicts)
- except ipaerror.IPAError, e:
- if uid is None:
- uid = principal
- turbogears.flash("User edit failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- raise turbogears.redirect('/user/show', uid=uid)
-
- @expose()
- @identity.require(identity.not_anonymous())
- def update(self, **kw):
- """Updates an existing user"""
- self.restrict_post()
- client = self.get_ipaclient()
-
- if not kw.get('uid'):
- kw['uid'] = kw.get('uid_hidden')
-
- if kw.get('submit') == 'Cancel Edit':
- turbogears.flash("Edit user cancelled")
- raise turbogears.redirect('/user/show', uid=kw.get('uid'))
-
- edituid = cherrypy.session.get('uid')
- if edituid and edituid != kw.get('uid') and edituid != kw.get('uid_hidden'):
- turbogears.flash("Something went wrong. You last viewed %s but are trying to update %s" % (kw.get('uid'), edituid))
- raise turbogears.redirect('/user/show', uid=kw.get('uid'))
-
- # Fix incoming multi-valued fields we created for the form
- kw = ipahelper.fix_incoming_fields(kw, 'cn', 'cns')
- kw = ipahelper.fix_incoming_fields(kw, 'telephonenumber', 'telephonenumbers')
- kw = ipahelper.fix_incoming_fields(kw, 'facsimiletelephonenumber', 'facsimiletelephonenumbers')
- kw = ipahelper.fix_incoming_fields(kw, 'mobile', 'mobiles')
- kw = ipahelper.fix_incoming_fields(kw, 'pager', 'pagers')
- kw = ipahelper.fix_incoming_fields(kw, 'homephone', 'homephones')
-
- # admins and editors can update anybody. A user can only update
- # themselves. We need this check because it is very easy to guess
- # the edit URI.
- if ((not 'admins' in turbogears.identity.current.groups and
- not 'editors' in turbogears.identity.current.groups) and
- (kw.get('uid_hidden') != turbogears.identity.current.display_name)):
- turbogears.flash("You do not have permission to update this user.")
- raise turbogears.redirect('/user/show', uid=kw.get('uid'))
-
- if (kw.get('uid_hidden') == turbogears.identity.current.display_name and
- kw.get('uid') != kw.get('uid_hidden')):
- turbogears.flash("You cannot change your own login name.")
- raise turbogears.redirect('/user/show', uid=kw.get('uid_hidden'))
-
- # Decode the group data, in case we need to round trip
- user_groups_dicts = loads(b64decode(kw.get('user_groups_data')))
-
- tg_errors, kw = self.userupdatevalidate(**kw)
- if tg_errors:
- turbogears.flash("There were validation errors.<br/>" +
- "Please see the messages below for details.")
- return dict(form=user_edit_form, user=kw,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- # We don't want to inadvertantly add this to a record
- try:
- del kw['uid_hidden']
- except KeyError:
- pass
-
- password_change = False
- user_modified = False
-
- #
- # Update the user itself
- #
- try:
- orig_user_dict = loads(b64decode(kw.get('user_orig')))
-
- # remove multi-valued fields we created for the form
- del(orig_user_dict['cns'])
- del(orig_user_dict['telephonenumbers'])
- del(orig_user_dict['facsimiletelephonenumbers'])
- del(orig_user_dict['mobiles'])
- del(orig_user_dict['pagers'])
- del(orig_user_dict['homephones'])
-
- new_user = ipa.user.User(orig_user_dict)
- new_user.setValueNotEmpty('title', kw.get('title'))
- new_user.setValueNotEmpty('givenname', kw.get('givenname'))
- new_user.setValueNotEmpty('sn', kw.get('sn'))
- new_user.setValueNotEmpty('cn', kw.get('cn'))
- new_user.setValueNotEmpty('displayname', kw.get('displayname'))
- new_user.setValueNotEmpty('initials', kw.get('initials'))
-
- new_user.setValueNotEmpty('loginshell', kw.get('loginshell'))
- new_user.setValueNotEmpty('gecos', kw.get('gecos'))
-
- new_user.setValueNotEmpty('mail', kw.get('mail'))
- new_user.setValueNotEmpty('telephonenumber', kw.get('telephonenumber'))
- new_user.setValueNotEmpty('facsimiletelephonenumber',
- kw.get('facsimiletelephonenumber'))
- new_user.setValueNotEmpty('mobile', kw.get('mobile'))
- new_user.setValueNotEmpty('pager', kw.get('pager'))
- new_user.setValueNotEmpty('homephone', kw.get('homephone'))
-
- new_user.setValueNotEmpty('street', kw.get('street'))
- new_user.setValueNotEmpty('l', kw.get('l'))
- new_user.setValueNotEmpty('st', kw.get('st'))
- new_user.setValueNotEmpty('postalcode', kw.get('postalcode'))
-
- new_user.setValueNotEmpty('ou', kw.get('ou'))
- new_user.setValueNotEmpty('businesscategory', kw.get('businesscategory'))
- new_user.setValueNotEmpty('description', kw.get('description'))
- new_user.setValueNotEmpty('employeetype', kw.get('employeetype'))
- new_user.setValueNotEmpty('manager', kw.get('manager'))
- new_user.setValueNotEmpty('roomnumber', kw.get('roomnumber'))
- new_user.setValueNotEmpty('secretary', kw.get('secretary'))
-
- new_user.setValueNotEmpty('carlicense', kw.get('carlicense'))
- new_user.setValueNotEmpty('labeleduri', kw.get('labeleduri'))
-
- if kw.get('editprotected') == 'true':
- if kw.get('krbprincipalkey'):
- password_change = True
- new_user.setValueNotEmpty('uidnumber', str(kw.get('uidnumber')))
- new_user.setValueNotEmpty('gidnumber', str(kw.get('gidnumber')))
- new_user.setValueNotEmpty('homedirectory', str(kw.get('homedirectory')))
- new_user.setValueNotEmpty('uid', str(kw.get('uid')))
-
- for custom_field in user_edit_form.custom_fields:
- new_user.setValueNotEmpty(custom_field.name,
- kw.get(custom_field.name, ''))
-
- rv = client.update_user(new_user)
- #
- # If the user update succeeds, but below operations fail, we
- # need to make sure a subsequent submit doesn't try to update
- # the user again.
- #
- user_modified = True
- kw['user_orig'] = b64encode(dumps(new_user.toDict()))
- except ipaerror.exception_for(ipaerror.LDAP_EMPTY_MODLIST), e:
- # could be a password change
- # could be groups change
- # too much work to figure out unless someone really screams
- pass
- except ipaerror.IPAError, e:
- turbogears.flash("User update failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- return dict(form=user_edit_form, user=kw,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- #
- # Password change
- #
- try:
- if password_change:
- rv = client.modifyPassword(orig_user_dict['krbprincipalname'], "", kw.get('krbprincipalkey'))
- except ipaerror.IPAError, e:
- turbogears.flash("User password change failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- return dict(form=user_edit_form, user=kw,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
- except Exception, e:
- turbogears.flash("User password change failed: " + str(e))
- return dict(form=user_edit_form, user=kw,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- #
- # Add groups
- #
- failed_adds = []
- try:
- dnadds = kw.get('dnadd')
- if dnadds != None:
- if not(isinstance(dnadds,list) or isinstance(dnadds,tuple)):
- dnadds = [dnadds]
- failed_adds = client.add_groups_to_user(
- utf8_encode_values(dnadds), new_user.dn)
- kw['dnadd'] = failed_adds
- except ipaerror.IPAError, e:
- failed_adds = dnadds
-
- #
- # Remove groups
- #
- failed_dels = []
- try:
- dndels = kw.get('dndel')
- if dndels != None:
- if not(isinstance(dndels,list) or isinstance(dndels,tuple)):
- dndels = [dndels]
- failed_dels = client.remove_groups_from_user(
- utf8_encode_values(dndels), new_user.dn)
- kw['dndel'] = failed_dels
- except ipaerror.IPAError, e:
- failed_dels = dndels
-
- if (len(failed_adds) > 0) or (len(failed_dels) > 0):
- message = "There was an error updating groups.<br />"
- message += "Failures have been preserved in the add/remove lists."
- if user_modified:
- message = "User Details successfully updated.<br />" + message
- if password_change:
- message = "User password successfully updated.<br />" + message
- turbogears.flash(message)
- return dict(form=user_edit_form, user=kw,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- if kw.get('nsAccountLock') == '':
- kw['nsAccountLock'] = "false"
-
- try:
- if kw.get('nsAccountLock') == "false" and new_user.getValues('nsaccountlock') == "true":
- client.mark_user_active(kw.get('uid'))
- elif kw.get('nsAccountLock') == "true" and new_user.nsaccountlock != "true":
- client.mark_user_inactive(kw.get('uid'))
- except ipaerror.IPAError, e:
- turbogears.flash("User status change failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- return dict(form=user_edit_form, user=kw,
- user_groups=user_groups_dicts,
- tg_template='ipagui.templates.useredit')
-
- turbogears.flash("%s updated!" % kw['uid'])
- raise turbogears.redirect('/user/show', uid=kw['uid'])
-
-
- @expose("ipagui.templates.userlist")
- @identity.require(identity.not_anonymous())
- def list(self, **kw):
- """Searches for users and displays list of results"""
- client = self.get_ipaclient()
-
- users = None
- counter = 0
- uid = kw.get('uid')
- if uid != None and len(uid) > 0:
- try:
- users = client.find_users(uid.encode('utf-8'), user_fields)
- counter = users[0]
- users = users[1:]
- if counter == -1:
- turbogears.flash("These results are truncated.<br />" +
- "Please refine your search and try again.")
- except ipaerror.IPAError, e:
- turbogears.flash("User list failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- raise turbogears.redirect("/user/list")
-
- return dict(users=users, uid=uid, fields=ipagui.forms.user.UserFields())
-
-
- @expose("ipagui.templates.usershow")
- @identity.require(identity.not_anonymous())
- def show(self, uid):
- """Retrieve a single user for display"""
- client = self.get_ipaclient()
- self.load_custom_fields()
-
- try:
- user = client.get_user_by_uid(uid, user_fields)
- user_groups = client.get_groups_by_member(user.dn, ['cn'])
- user_groups.sort(self.sort_by_cn)
- user_reports = client.get_users_by_manager(user.dn,
- ['givenname', 'sn', 'uid'])
- user_reports.sort(self.sort_group_member)
-
- user_manager = None
- user_secretary = None
- try:
- if user.manager:
- user_manager = client.get_entry_by_dn(user.manager,
- ['givenname', 'sn', 'uid'])
- except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND),
- ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)):
- pass
-
- try:
- if user.secretary:
- user_secretary = client.get_entry_by_dn(user.secretary,
- ['givenname', 'sn', 'uid'])
- except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND),
- ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)):
- pass
-
- return dict(user=user.toDict(), fields=ipagui.forms.user.UserFields(),
- user_groups=user_groups, user_reports=user_reports,
- user_manager=user_manager, user_secretary=user_secretary)
- except ipaerror.IPAError, e:
- turbogears.flash("User show failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- raise turbogears.redirect("/")
-
- @expose()
- @identity.require(identity.not_anonymous())
- def delete(self, uid):
- """Delete user."""
- self.restrict_post()
- client = self.get_ipaclient()
-
- try:
- client.delete_user(uid)
-
- turbogears.flash("user deleted")
- raise turbogears.redirect('/user/list')
- except (SyntaxError, ipaerror.IPAError), e:
- turbogears.flash("User deletion failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
- raise turbogears.redirect('/user/list')
-
- @validate(form=user_new_form)
- @identity.require(identity.not_anonymous())
- def usercreatevalidate(self, tg_errors=None, **kw):
- return tg_errors, kw
-
- @validate(form=user_edit_form)
- @identity.require(identity.not_anonymous())
- def userupdatevalidate(self, tg_errors=None, **kw):
- return tg_errors, kw
-
- # @expose()
- def generate_password(self):
- password = ""
- generator = random.SystemRandom()
- for char in range(8):
- password += generator.choice(password_chars)
-
- return password
-
- @expose()
- @identity.require(identity.not_anonymous())
- def suggest_uid(self, givenname, sn):
- # filter illegal uid characters out
- givenname = re.sub(r'[^a-zA-Z_\-0-9]', "", givenname)
- sn = re.sub(r'[^a-zA-Z_\-0-9]', "", sn)
-
- if (len(givenname) == 0) or (len(sn) == 0):
- return ""
-
- client = self.get_ipaclient()
-
- givenname = givenname.lower()
- sn = sn.lower()
-
- uid = givenname[0] + sn[:7]
- try:
- client.get_user_by_uid(uid)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return uid
-
- uid = givenname[:7] + sn[0]
- try:
- client.get_user_by_uid(uid)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return uid
-
- uid = (givenname + sn)[:8]
- try:
- client.get_user_by_uid(uid)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return uid
-
- uid = sn[:8]
- try:
- client.get_user_by_uid(uid)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return uid
-
- suffix = 2
- template = givenname[0] + sn[:7]
- while suffix < 20:
- uid = template[:8 - len(str(suffix))] + str(suffix)
- try:
- client.get_user_by_uid(uid)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return uid
- suffix += 1
-
- return ""
-
- @expose()
- @identity.require(identity.not_anonymous())
- def suggest_email(self, givenname, sn):
- # remove illegal email characters
- givenname = re.sub(r'[^a-zA-Z0-9!#\$%\*/?\|\^\{\}`~&\'\+\-=_]', "", givenname)
- sn = re.sub(r'[^a-zA-Z0-9!#\$%\*/?\|\^\{\}`~&\'\+\-=_]', "", sn)
-
- if (len(givenname) == 0) or (len(sn) == 0):
- return ""
-
- client = self.get_ipaclient()
-
- givenname = givenname.lower()
- sn = sn.lower()
-
- email = "%s.%s@%s" % (givenname, sn, self.get_email_domain())
- try:
- client.get_user_by_email(email)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return email
-
- email = "%s@%s" % (self.suggest_uid(givenname, sn), self.get_email_domain())
- try:
- client.get_user_by_email(email)
- except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
- return email
-
- return ""
-
- @expose("ipagui.templates.userselectsearch")
- @identity.require(identity.not_anonymous())
- def user_select_search(self, **kw):
- """Searches for users and displays list of results in a table.
- This method is used for the ajax search for managers
- and secrectary on the user pages."""
- client = self.get_ipaclient()
-
- users = []
- users_counter = 0
- searchlimit = 100
- criteria = kw.get('criteria')
- if criteria != None and len(criteria) > 0:
- try:
- users = client.find_users(criteria.encode('utf-8'), None,
- searchlimit)
- users_counter = users[0]
- users = users[1:]
- except ipaerror.IPAError, e:
- turbogears.flash("search failed: " + str(e) + "<br/>" + e.detail[0].get('desc','') + ". " + e.detail[0].get('info',''))
-
- return dict(users=users, criteria=criteria,
- which_select=kw.get('which_select'),
- counter=users_counter)