Finally committing my LDAP changes.
[samba.git] / source / groupdb / aliasldap.c
index 35d810dabc23cd40b471d3f701313c6e652b8205..1e9a72a9d415401c3a9214ecc265cb2fcf5923a1 100644 (file)
@@ -61,7 +61,7 @@ static LOCAL_GRP *ldapalias_getgrp(LOCAL_GRP *group,
        DEBUG(2,("Retrieving alias [%s]\n", group->name));
 
         if(ldap_get_attribute("rid", temp)) {
-               group->rid = atoi(temp);
+               group->rid = strtol(temp, NULL, 16);
        } else {
                DEBUG(0, ("Missing rid\n"));
                return NULL;
@@ -128,10 +128,7 @@ static void ldapalias_grpmods(LOCAL_GRP *group, LDAPMod ***mods, int operation)
                ldap_make_mod(mods, LDAP_MOD_ADD, "objectClass", "sambaAlias");
                ldap_make_mod(mods, LDAP_MOD_ADD, "cn", group->name);
 
-               slprintf(temp, sizeof(temp)-1, "%d", (gid_t)(-1));
-               ldap_make_mod(mods, LDAP_MOD_ADD, "gidNumber", temp);
-
-               slprintf(temp, sizeof(temp)-1, "%d", group->rid);
+               slprintf(temp, sizeof(temp)-1, "%x", group->rid);
                ldap_make_mod(mods, LDAP_MOD_ADD, "rid", temp);
        }
 
@@ -139,6 +136,30 @@ static void ldapalias_grpmods(LOCAL_GRP *group, LDAPMod ***mods, int operation)
 }
 
 
+/************************************************************************
+  Create a alias member entry
+ ************************************************************************/
+
+static BOOL ldapalias_memmods(DOM_SID *user_sid, LDAPMod ***mods,
+                             int operation)
+{
+       pstring member;
+       pstring sid_str;
+       fstring name;
+       uint8 type;
+
+       if (lookup_sid(user_sid, name, &type))
+               return (False);
+       sid_to_string(sid_str, user_sid);
+
+       slprintf(member, sizeof(member)-1, "%s,%s,%d", name, sid_str, type);
+
+       *mods = NULL;
+       ldap_make_mod(mods, operation, "member", member);
+       return True;
+}
+
+
 /***************************************************************
   Begin/end smbgrp enumeration.
  ****************************************************************/
@@ -148,7 +169,7 @@ static void *ldapalias_enumfirst(BOOL update)
        if (lp_server_role() == ROLE_DOMAIN_NONE)
                return NULL;
 
-       if (!ldap_open_connection(False))
+       if (!ldap_connect())
                return NULL;
 
        ldap_search_for("objectClass=sambaAlias");
@@ -158,7 +179,7 @@ static void *ldapalias_enumfirst(BOOL update)
 
 static void ldapalias_enumclose(void *vp)
 {
-       ldap_close_connection();
+       ldap_disconnect();
 }
 
 
@@ -188,7 +209,7 @@ static LOCAL_GRP *ldapalias_getgrpbynam(const char *name,
        fstring filter;
        LOCAL_GRP *ret;
 
-       if(!ldap_open_connection(False))
+       if(!ldap_connect())
                return (False);
 
        slprintf(filter, sizeof(filter)-1,
@@ -197,7 +218,7 @@ static LOCAL_GRP *ldapalias_getgrpbynam(const char *name,
 
        ret = ldapalias_getgrp(&localgrp, members, num_membs);
 
-       ldap_close_connection();
+       ldap_disconnect();
        return ret;
 }
 
@@ -207,7 +228,7 @@ static LOCAL_GRP *ldapalias_getgrpbygid(gid_t grp_id,
        fstring filter;
        LOCAL_GRP *ret;
 
-       if(!ldap_open_connection(False))
+       if(!ldap_connect())
                return (False);
 
        slprintf(filter, sizeof(filter)-1,
@@ -215,7 +236,7 @@ static LOCAL_GRP *ldapalias_getgrpbygid(gid_t grp_id,
        ldap_search_for(filter);
        ret = ldapalias_getgrp(&localgrp, members, num_membs);
 
-       ldap_close_connection();
+       ldap_disconnect();
        return ret;
 }
 
@@ -225,15 +246,15 @@ static LOCAL_GRP *ldapalias_getgrpbyrid(uint32 grp_rid,
        fstring filter;
        LOCAL_GRP *ret;
 
-       if(!ldap_open_connection(False))
+       if(!ldap_connect())
                return (False);
 
        slprintf(filter, sizeof(filter)-1,
-                "(&(rid=%d)(objectClass=sambaAlias))", grp_rid);
+                "(&(rid=%x)(objectClass=sambaAlias))", grp_rid);
        ldap_search_for(filter);
        ret = ldapalias_getgrp(&localgrp, members, num_membs);
 
-       ldap_close_connection();
+       ldap_disconnect();
        return ret;
 }
 
@@ -243,10 +264,21 @@ static LOCAL_GRP *ldapalias_getcurrentgrp(void *vp,
        return ldapalias_getgrp(&localgrp, members, num_membs);
 }
 
+
+/*************************************************************************
+  Add/modify/delete aliases.
+ *************************************************************************/
+
 static BOOL ldapalias_addgrp(LOCAL_GRP *group)
 {
        LDAPMod **mods;
 
+       if (!ldap_allocaterid(&group->rid))
+       {
+               DEBUG(0,("RID generation failed\n"));
+               return (False);
+       }
+
        ldapalias_grpmods(group, &mods, LDAP_MOD_ADD); 
        return ldap_makemods("cn", group->name, mods, True);
 }
@@ -259,6 +291,74 @@ static BOOL ldapalias_modgrp(LOCAL_GRP *group)
        return ldap_makemods("cn", group->name, mods, False);
 }
 
+static BOOL ldapalias_delgrp(uint32 grp_rid)
+{
+       fstring filter;
+       char *dn;
+       int err;
+
+       if (!ldap_connect())
+               return (False);
+
+       slprintf(filter, sizeof(filter)-1,
+                "(&(rid=%x)(objectClass=sambaAlias))", grp_rid);
+       ldap_search_for(filter);
+
+       if (!ldap_entry || !(dn = ldap_get_dn(ldap_struct, ldap_entry)))
+       {
+               ldap_disconnect();
+               return (False);
+       }
+
+       err = ldap_delete_s(ldap_struct, dn);
+       free(dn);
+       ldap_disconnect();
+
+       if (err != LDAP_SUCCESS)
+       {
+               DEBUG(0, ("delete: %s\n", ldap_err2string(err)));
+               return (False);
+       }
+
+       return True;
+}
+
+
+/*************************************************************************
+  Add users to/remove users from aliases.
+ *************************************************************************/
+
+static BOOL ldapalias_addmem(uint32 grp_rid, DOM_SID *user_sid)
+{
+       LDAPMod **mods;
+        fstring rid_str;
+
+       slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid);
+
+       if(!ldapalias_memmods(user_sid, &mods, LDAP_MOD_ADD))
+               return (False);
+
+       return ldap_makemods("rid", rid_str, mods, False);
+}
+
+static BOOL ldapalias_delmem(uint32 grp_rid, DOM_SID *user_sid)
+{
+       LDAPMod **mods;
+        fstring rid_str;
+
+       slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid);
+
+       if(!ldapalias_memmods(user_sid, &mods, LDAP_MOD_DELETE))
+               return (False);
+
+       return ldap_makemods("rid", rid_str, mods, False);
+}
+
+
+/*************************************************************************
+  Return aliases that a user is in.
+ *************************************************************************/
+
 static BOOL ldapalias_getusergroups(const char *name, LOCAL_GRP **groups,
                                    int *num_grps)
 {
@@ -266,6 +366,9 @@ static BOOL ldapalias_getusergroups(const char *name, LOCAL_GRP **groups,
        fstring filter;
        int i;
 
+       if(!ldap_connect())
+               return (False);
+
        slprintf(filter, sizeof(pstring)-1,
                 "(&(member=%s,*)(objectclass=sambaAlias))", name);
        ldap_search_for(filter);
@@ -274,6 +377,7 @@ static BOOL ldapalias_getusergroups(const char *name, LOCAL_GRP **groups,
 
        if(!i) {
                *groups = NULL;
+               ldap_disconnect();
                return (True);
        }
 
@@ -282,6 +386,7 @@ static BOOL ldapalias_getusergroups(const char *name, LOCAL_GRP **groups,
                i--;
        } while(ldapalias_getgrp(&grouplist[i], NULL, NULL) && (i > 0));
 
+       ldap_disconnect();
        return (True);
 }
 
@@ -300,6 +405,10 @@ static struct aliasdb_ops ldapalias_ops =
 
        ldapalias_addgrp,
        ldapalias_modgrp,
+       ldapalias_delgrp,
+
+       ldapalias_addmem,
+       ldapalias_delmem,
 
        ldapalias_getusergroups
 };