diff options
author | Rob Crittenden <rcritten@redhat.com> | 2008-10-04 05:17:11 -0400 |
---|---|---|
committer | Rob Crittenden <rcritten@redhat.com> | 2008-10-04 05:17:11 -0400 |
commit | cb795fa14bc2798fd8f1c6e2b87d19432e3f84a1 (patch) | |
tree | df904bb60d1842d01ba98bd2234913b5d73070ed | |
parent | 7e4b0a072e69351496010d7b2151c9b434c8fdb0 (diff) | |
download | freeipa.git-cb795fa14bc2798fd8f1c6e2b87d19432e3f84a1.tar.gz freeipa.git-cb795fa14bc2798fd8f1c6e2b87d19432e3f84a1.tar.xz freeipa.git-cb795fa14bc2798fd8f1c6e2b87d19432e3f84a1.zip |
Add group plugin, routine to get cn=ipaconfig
-rw-r--r-- | ipa_server/servercore.py | 23 | ||||
-rw-r--r-- | ipalib/plugins/f_group.py | 117 | ||||
-rw-r--r-- | ipalib/plugins/f_user.py | 41 |
3 files changed, 168 insertions, 13 deletions
diff --git a/ipa_server/servercore.py b/ipa_server/servercore.py index dd23aacb..34008abe 100644 --- a/ipa_server/servercore.py +++ b/ipa_server/servercore.py @@ -32,6 +32,8 @@ realm = krbctx.default_realm basedn = ipautil.realm_to_suffix(realm) DefaultUserContainer = "cn=users,cn=accounts" +DefaultGroupContainer = "cn=groups,cn=accounts" +DefaultServiceContainer = "cn=services,cn=accounts" def convert_entry(ent): entry = dict(ent.data) @@ -97,6 +99,16 @@ def get_list (base, searchfilter, sattrs=None): return map(convert_entry, entries) +# General searches + +def get_entry_by_dn (dn, sattrs=None): + """Get a specific entry. Return as a dict of values. + Multi-valued fields are represented as lists. + """ + searchfilter = "(objectClass=*)" +# logging.info("IPA: get_entry_by_dn '%s'" % dn) + return get_base_entry(dn, searchfilter, sattrs) + def update_entry (oldentry, newentry): """Update an LDAP entry @@ -148,3 +160,14 @@ def get_objectclasses(): result.append(oc[3].replace("'","")) return result + +def get_ipa_config(): + """Retrieve the IPA configuration""" + searchfilter = "cn=ipaconfig" + try: + config = get_sub_entry("cn=etc," + basedn, searchfilter) + except ldap.NO_SUCH_OBJECT, e: + # FIXME + raise e + + return config diff --git a/ipalib/plugins/f_group.py b/ipalib/plugins/f_group.py new file mode 100644 index 00000000..36cecc33 --- /dev/null +++ b/ipalib/plugins/f_group.py @@ -0,0 +1,117 @@ +# Authors: +# Jason Gerard DeRose <jderose@redhat.com> +# +# Copyright (C) 2008 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 + +""" +Frontend plugins for group (Identity). +""" + +from ipalib import frontend +from ipalib import crud +from ipalib.frontend import Param +from ipalib import api +from ipa_server import servercore +from ipa_server import ipaldap +import ldap +from ipa_server.context import context + + +class group(frontend.Object): + """ + Group object. + """ + takes_params = ( + 'description', + Param('cn', + primary_key=True, + normalize=lambda value: value.lower(), + ) + ) +api.register(group) + + +class group_add(crud.Add): + 'Add a new group.' + def execute(self, *args, **kw): + """args[0] = uid of the group to add + kw{container} is the location in the DIT to add the group, not + required + kw otherwise contains all the attributes + """ + # FIXME: ug, really? + if not kw.get('container'): + group_container = servercore.DefaultGroupContainer + else: + group_container = kw['container'] + del kw['container'] + + group = kw + + group['cn'] = args[0] + + # Get our configuration + config = servercore.get_ipa_config() + + dn="cn=%s,%s,%s" % (ldap.dn.escape_dn_chars(group['cn']), + group_container,servercore.basedn) + + entry = ipaldap.Entry(dn) + + # some required objectclasses + entry.setValues('objectClass', (config.get('ipagroupobjectclasses'))) + + # No need to explicitly set gidNumber. The dna_plugin will do this + # for us if the value isn't provided by the user. + + # fill in our new entry with everything sent by the user + for g in group: + entry.setValues(g, group[g]) + + result = context.conn.getConn().addEntry(entry) + return result + + +api.register(group_add) + + +class group_del(crud.Del): + 'Delete an existing group.' +api.register(group_del) + + +class group_mod(crud.Mod): + 'Edit an existing group.' +api.register(group_mod) + + +class group_find(crud.Find): + 'Search the groups.' + def execute(self, *args, **kw): + cn=args[0] + result = servercore.get_sub_entry(servercore.basedn, "cn=%s" % cn, ["*"]) + return result + def forward(self, *args, **kw): + result = super(crud.Find, self).forward(*args, **kw) + for a in result: + print a, ": ", result[a] +api.register(group_find) + + +class group_show(crud.Get): + 'Examine an existing group.' +api.register(group_show) diff --git a/ipalib/plugins/f_user.py b/ipalib/plugins/f_user.py index 320666aa..0e62b833 100644 --- a/ipalib/plugins/f_user.py +++ b/ipalib/plugins/f_user.py @@ -112,19 +112,35 @@ class user_add(crud.Add): entry = ipaldap.Entry(dn) + # Get our configuration + config = servercore.get_ipa_config() + # Let us add in some missing attributes - # FIXME, get config -# if user.get('homedirectory') is None: -# user['homedirectory'] = '%s/%s' % (config.get('ipahomesrootdir'), user.get('uid')) -# user['homedirectory'] = user['homedirectory'].replace('//', '/') -# user['homedirectory'] = user['homedirectory'].rstrip('/') -# if user.get('loginshell') is None: -# user['loginshell'] = config.get('ipadefaultloginshell') + if user.get('homedirectory') is None: + user['homedirectory'] = '%s/%s' % (config.get('ipahomesrootdir'), user.get('uid')) + user['homedirectory'] = user['homedirectory'].replace('//', '/') + user['homedirectory'] = user['homedirectory'].rstrip('/') + if user.get('loginshell') is None: + user['loginshell'] = config.get('ipadefaultloginshell') if user.get('gecos') is None: user['gecos'] = user['uid'] - # FIXME: add to default group - user['gidNumber'] = "500" + # If uidnumber is blank the the FDS dna_plugin will automatically + # assign the next value. So we don't have to do anything with it. + + group_dn="cn=%s,%s,%s" % (config.get('ipadefaultprimarygroup'), servercore.DefaultGroupContainer, servercore.basedn) + try: + default_group = servercore.get_entry_by_dn(group_dn, ['dn','gidNumber']) + if default_group: + user['gidnumber'] = default_group.get('gidnumber') +# except ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR), e: +# raise ipaerror.gen_exception(ipaerror.LDAP_DATABASE_ERROR, message=None, nested_exception=e.detail) +# except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND): +# # Fake an LDAP error so we can return something useful to the user +# raise ipaerror.gen_exception(ipaerror.LDAP_NOT_FOUND, "The default group for new users, '%s', cannot be found." % config.get('ipadefaultprimarygroup')) + except Exception, e: + # FIXME + raise e if user.get('krbprincipalname') is None: user['krbprincipalname'] = "%s@%s" % (user.get('uid'), self.realm) @@ -136,9 +152,8 @@ class user_add(crud.Add): user.get('sn')) # some required objectclasses - # FIXME - # entry.setValues('objectClass', (config.get('ipauserobjectclasses'))) - entry.setValues('objectClass', ['top', 'person', 'organizationalPerson', 'inetOrgPerson', 'inetUser', 'posixAccount', 'krbPrincipalAux']) + entry.setValues('objectClass', (config.get('ipauserobjectclasses'))) + # entry.setValues('objectClass', ['top', 'person', 'organizationalPerson', 'inetOrgPerson', 'inetUser', 'posixAccount', 'krbPrincipalAux']) # fill in our new entry with everything sent by the user for u in user: @@ -169,7 +184,7 @@ class user_find(crud.Find): def forward(self, *args, **kw): result = super(crud.Find, self).forward(*args, **kw) for a in result: - print a, ": ", res[a] + print a, ": ", result[a] api.register(user_find) |