svn commit: samba r13657 - branches/SAMBA_3_0/source/include branches/SAMBA_3_0/source/libads branches/SAMBA_3_0/source/nsswitch trunk/source/include trunk/source/libads trunk/source/nsswitch

gd at samba.org gd at samba.org
Thu Feb 23 14:28:42 GMT 2006


Author: gd
Date: 2006-02-23 14:28:41 +0000 (Thu, 23 Feb 2006)
New Revision: 13657

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=13657

Log:
Let winbindd try to obtain the gecos field from the msSFU30Gecos
attribute when "winbind nss info = sfu" is set. Fixes #3539.

Guenther

Modified:
   branches/SAMBA_3_0/source/include/ads.h
   branches/SAMBA_3_0/source/libads/ads_struct.c
   branches/SAMBA_3_0/source/libads/ldap.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c
   trunk/source/include/ads.h
   trunk/source/libads/ads_struct.c
   trunk/source/libads/ldap.c
   trunk/source/nsswitch/winbindd_ads.c


Changeset:
Modified: branches/SAMBA_3_0/source/include/ads.h
===================================================================
--- branches/SAMBA_3_0/source/include/ads.h	2006-02-23 13:08:14 UTC (rev 13656)
+++ branches/SAMBA_3_0/source/include/ads.h	2006-02-23 14:28:41 UTC (rev 13657)
@@ -48,6 +48,7 @@
 		char *sfu_shell_attr;
 		char *sfu_uidnumber_attr;
 		char *sfu_gidnumber_attr;
+		char *sfu_gecos_attr;
 	} schema;
 
 } ADS_STRUCT;
@@ -99,6 +100,7 @@
 #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"

Modified: branches/SAMBA_3_0/source/libads/ads_struct.c
===================================================================
--- branches/SAMBA_3_0/source/libads/ads_struct.c	2006-02-23 13:08:14 UTC (rev 13656)
+++ branches/SAMBA_3_0/source/libads/ads_struct.c	2006-02-23 14:28:41 UTC (rev 13657)
@@ -139,6 +139,7 @@
 		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);
 

Modified: branches/SAMBA_3_0/source/libads/ldap.c
===================================================================
--- branches/SAMBA_3_0/source/libads/ldap.c	2006-02-23 13:08:14 UTC (rev 13656)
+++ branches/SAMBA_3_0/source/libads/ldap.c	2006-02-23 14:28:41 UTC (rev 13657)
@@ -2628,7 +2628,7 @@
 { 
 	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 @@
 		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)

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c	2006-02-23 13:08:14 UTC (rev 13656)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c	2006-02-23 14:28:41 UTC (rev 13657)
@@ -153,7 +153,8 @@
 			       "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 @@
 	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,13 +207,19 @@
 		}
 
 		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",
 				  &(*info)[i].user_sid)) {
@@ -437,7 +444,8 @@
 			       "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,15 +483,20 @@
 	}
 
 	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)) {
 		DEBUG(1,("No primary group for %s !?\n",
 			 sid_string_static(sid)));

Modified: trunk/source/include/ads.h
===================================================================
--- trunk/source/include/ads.h	2006-02-23 13:08:14 UTC (rev 13656)
+++ trunk/source/include/ads.h	2006-02-23 14:28:41 UTC (rev 13657)
@@ -48,6 +48,7 @@
 		char *sfu_shell_attr;
 		char *sfu_uidnumber_attr;
 		char *sfu_gidnumber_attr;
+		char *sfu_gecos_attr;
 	} schema;
 
 } ADS_STRUCT;
@@ -99,6 +100,7 @@
 #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"

Modified: trunk/source/libads/ads_struct.c
===================================================================
--- trunk/source/libads/ads_struct.c	2006-02-23 13:08:14 UTC (rev 13656)
+++ trunk/source/libads/ads_struct.c	2006-02-23 14:28:41 UTC (rev 13657)
@@ -139,6 +139,7 @@
 		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);
 

Modified: trunk/source/libads/ldap.c
===================================================================
--- trunk/source/libads/ldap.c	2006-02-23 13:08:14 UTC (rev 13656)
+++ trunk/source/libads/ldap.c	2006-02-23 14:28:41 UTC (rev 13657)
@@ -2628,7 +2628,7 @@
 { 
 	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 @@
 		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)

Modified: trunk/source/nsswitch/winbindd_ads.c
===================================================================
--- trunk/source/nsswitch/winbindd_ads.c	2006-02-23 13:08:14 UTC (rev 13656)
+++ trunk/source/nsswitch/winbindd_ads.c	2006-02-23 14:28:41 UTC (rev 13657)
@@ -153,7 +153,8 @@
 			       "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 @@
 	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,13 +207,19 @@
 		}
 
 		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",
 				  &(*info)[i].user_sid)) {
@@ -437,7 +444,8 @@
 			       "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,15 +483,20 @@
 	}
 
 	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)) {
 		DEBUG(1,("No primary group for %s !?\n",
 			 sid_string_static(sid)));



More information about the samba-cvs mailing list