r13657: Let winbindd try to obtain the gecos field from the msSFU30Gecos
authorGünther Deschner <gd@samba.org>
Thu, 23 Feb 2006 14:28:41 +0000 (14:28 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:10:21 +0000 (11:10 -0500)
attribute when "winbind nss info = sfu" is set. Fixes #3539.

Guenther

source/include/ads.h
source/libads/ads_struct.c
source/libads/ldap.c
source/nsswitch/winbindd_ads.c

index ce643666ad9655a5d49b26af95399a2af0b2d192..a90724903650c49f682198ad703f96b33ec6dc82 100644 (file)
@@ -48,6 +48,7 @@ typedef struct {
                char *sfu_shell_attr;
                char *sfu_uidnumber_attr;
                char *sfu_gidnumber_attr;
+               char *sfu_gecos_attr;
        } schema;
 
 } ADS_STRUCT;
@@ -99,6 +100,7 @@ typedef void **ADS_MODLIST;
 #define ADS_ATTR_SFU_GIDNUMBER_OID     "1.2.840.113556.1.6.18.1.311"
 #define ADS_ATTR_SFU_HOMEDIR_OID       "1.2.840.113556.1.6.18.1.344"
 #define ADS_ATTR_SFU_SHELL_OID                 "1.2.840.113556.1.6.18.1.312"
+#define ADS_ATTR_SFU_GECOS_OID                 "1.2.840.113556.1.6.18.1.337"
 
 /* ldap bitwise searches */
 #define ADS_LDAP_MATCHING_RULE_BIT_AND "1.2.840.113556.1.4.803"
index d8676d050dd18b761e114369e434759e32d30a6b..9b2179ad3167023ff769d48f8471a9f2a14a1ba8 100644 (file)
@@ -139,6 +139,7 @@ void ads_destroy(ADS_STRUCT **ads)
                SAFE_FREE((*ads)->schema.sfu_gidnumber_attr);
                SAFE_FREE((*ads)->schema.sfu_shell_attr);
                SAFE_FREE((*ads)->schema.sfu_homedir_attr);
+               SAFE_FREE((*ads)->schema.sfu_gecos_attr);
                
                ZERO_STRUCTP(*ads);
 
index 6d2155fae08f9b9bab58590376a45c88f03dd0ba..cb7dbc575bc95367b5b89be917fee3a25a35d821 100644 (file)
@@ -2628,7 +2628,7 @@ BOOL ads_check_sfu_mapping(ADS_STRUCT *ads)
 { 
        BOOL ret = False; 
        TALLOC_CTX *ctx = NULL; 
-       const char *gidnumber, *uidnumber, *homedir, *shell;
+       const char *gidnumber, *uidnumber, *homedir, *shell, *gecos;
 
        ctx = talloc_init("ads_check_sfu_mapping");
        if (ctx == NULL)
@@ -2654,6 +2654,11 @@ BOOL ads_check_sfu_mapping(ADS_STRUCT *ads)
                goto done;
        ads->schema.sfu_shell_attr = SMB_STRDUP(shell);
 
+       gecos = ads_get_attrname_by_oid(ads, ctx, ADS_ATTR_SFU_GECOS_OID);
+       if (gecos == NULL)
+               goto done;
+       ads->schema.sfu_gecos_attr = SMB_STRDUP(gecos);
+
        ret = True;
 done:
        if (ctx)
index a86636504237048489c45d89bbe0390a16815411..179659f86f1c03a492459e76edf3b53f2f80e539 100644 (file)
@@ -153,7 +153,8 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain,
                               "name", "objectSid", "primaryGroupID", 
                               "sAMAccountType", 
                               ADS_ATTR_SFU_HOMEDIR_OID, 
-                              ADS_ATTR_SFU_SHELL_OID, 
+                              ADS_ATTR_SFU_SHELL_OID,
+                              ADS_ATTR_SFU_GECOS_OID,
                               NULL};
        int i, count;
        ADS_STATUS rc;
@@ -193,7 +194,7 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain,
        i = 0;
 
        for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) {
-               char *name, *gecos;
+               char *name, *gecos = NULL;
                char *homedir = NULL;
                char *shell = NULL;
                uint32 group;
@@ -206,12 +207,18 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain,
                }
 
                name = ads_pull_username(ads, mem_ctx, msg);
-               gecos = ads_pull_string(ads, mem_ctx, msg, "name");
+
                if (use_nss_info("sfu")) {
                        homedir = ads_pull_string(ads, mem_ctx, msg, 
                                                  ads->schema.sfu_homedir_attr);
-                       shell = ads_pull_string(ads, mem_ctx, msg, 
-                                               ads->schema.sfu_shell_attr);
+                       shell   = ads_pull_string(ads, mem_ctx, msg, 
+                                                 ads->schema.sfu_shell_attr);
+                       gecos   = ads_pull_string(ads, mem_ctx, msg, 
+                                                 ads->schema.sfu_gecos_attr);
+               }
+
+               if (gecos == NULL) {
+                       gecos = ads_pull_string(ads, mem_ctx, msg, "name");
                }
        
                if (!ads_pull_sid(ads, msg, "objectSid",
@@ -437,7 +444,8 @@ static NTSTATUS query_user(struct winbindd_domain *domain,
                               "name", 
                               "primaryGroupID", 
                               ADS_ATTR_SFU_HOMEDIR_OID, 
-                              ADS_ATTR_SFU_SHELL_OID, 
+                              ADS_ATTR_SFU_SHELL_OID,
+                              ADS_ATTR_SFU_GECOS_OID,
                               NULL};
        ADS_STATUS rc;
        int count;
@@ -475,13 +483,18 @@ static NTSTATUS query_user(struct winbindd_domain *domain,
        }
 
        info->acct_name = ads_pull_username(ads, mem_ctx, msg);
-       info->full_name = ads_pull_string(ads, mem_ctx, msg, "name");
 
        if (use_nss_info("sfu")) {
-               info->homedir = ads_pull_string(ads, mem_ctx, msg, 
-                                               ads->schema.sfu_homedir_attr);
-               info->shell = ads_pull_string(ads, mem_ctx, msg, 
-                                             ads->schema.sfu_shell_attr);
+               info->homedir   = ads_pull_string(ads, mem_ctx, msg, 
+                                                 ads->schema.sfu_homedir_attr);
+               info->shell     = ads_pull_string(ads, mem_ctx, msg, 
+                                                 ads->schema.sfu_shell_attr);
+               info->full_name = ads_pull_string(ads, mem_ctx, msg,
+                                                 ads->schema.sfu_gecos_attr);
+       }
+
+       if (info->full_name == NULL) {
+               info->full_name = ads_pull_string(ads, mem_ctx, msg, "name");
        }
 
        if (!ads_pull_uint32(ads, msg, "primaryGroupID", &group_rid)) {