diff options
-rw-r--r-- | source3/groupdb/groupunix.c | 7 | ||||
-rw-r--r-- | source3/include/proto.h | 12 | ||||
-rw-r--r-- | source3/include/smb.h | 12 | ||||
-rw-r--r-- | source3/passdb/passdb.c | 13 | ||||
-rw-r--r-- | source3/passdb/smbpass.c | 2 | ||||
-rw-r--r-- | source3/rpc_server/srv_netlog.c | 22 | ||||
-rw-r--r-- | source3/rpc_server/srv_sid.c | 6 | ||||
-rw-r--r-- | source3/smbd/groupname.c | 87 |
8 files changed, 94 insertions, 67 deletions
diff --git a/source3/groupdb/groupunix.c b/source3/groupdb/groupunix.c index 89406fe139..56d9584155 100644 --- a/source3/groupdb/groupunix.c +++ b/source3/groupdb/groupunix.c @@ -203,11 +203,16 @@ static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_m if (map_group_gid(unix_grp->gr_gid, &sid, gp_buf.name, NULL)) { + fstring sid_str; /* * find the NT name represented by this UNIX gid. * then, only accept NT groups that are in our domain */ + sid_to_string(sid_str, &sid); + DEBUG(10,("getgrpunixpwent: entry %s mapped to name %s, SID %s\n", + unix_grp->gr_name, gp_buf.name, sid_str)); + sid_split_rid(&sid, &gp_buf.rid); if (sid_equal(&sid, &global_sam_sid)) { @@ -219,7 +224,7 @@ static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_m gp_buf.name)); } } - else + else if (!is_alias) { /* * assume that the UNIX group is an NT group with diff --git a/source3/include/proto.h b/source3/include/proto.h index 100fdb7c94..a70c51f167 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1277,21 +1277,21 @@ BOOL pass_check(char *user,char *password, int pwlen, struct passwd *pwd, BOOL initialise_password_db(void); struct smb_passwd *iterate_getsmbpwrid(uint32 user_rid); struct smb_passwd *iterate_getsmbpwuid(uid_t smb_userid); -struct smb_passwd *iterate_getsmbpwnam(char *name); +struct smb_passwd *iterate_getsmbpwnam(const char *name); void *startsmbpwent(BOOL update); void endsmbpwent(void *vp); struct smb_passwd *getsmbpwent(void *vp); BOOL add_smbpwd_entry(struct smb_passwd *newpwd); BOOL mod_smbpwd_entry(struct smb_passwd* pwd, BOOL override); -struct smb_passwd *getsmbpwnam(char *name); +struct smb_passwd *getsmbpwnam(const char *name); struct smb_passwd *getsmbpwrid(uint32 user_rid); struct smb_passwd *getsmbpwuid(uid_t smb_userid); -struct sam_passwd *iterate_getsam21pwnam(char *name); +struct sam_passwd *iterate_getsam21pwnam(const char *name); struct sam_passwd *iterate_getsam21pwrid(uint32 rid); struct sam_passwd *iterate_getsam21pwuid(uid_t uid); struct sam_disp_info *getsamdisprid(uint32 rid); struct sam_passwd *getsam21pwent(void *vp); -struct sam_passwd *getsam21pwnam(char *name); +struct sam_passwd *getsam21pwnam(const char *name); struct sam_passwd *getsam21pwrid(uint32 rid); void pwdb_init_smb(struct smb_passwd *user); void pwdb_init_sam(struct sam_passwd *user); @@ -1307,8 +1307,8 @@ void pwdb_set_kickoff_time(char *p, int max_len, time_t t); void pwdb_set_can_change_time(char *p, int max_len, time_t t); void pwdb_set_must_change_time(char *p, int max_len, time_t t); void pwdb_set_last_set_time(char *p, int max_len, time_t t); -void pwdb_sethexpwd(char *p, char *pwd, uint16 acct_ctrl); -BOOL pwdb_gethexpwd(char *p, char *pwd); +void pwdb_sethexpwd(char *p, const char *pwd, uint16 acct_ctrl); +BOOL pwdb_gethexpwd(const char *p, char *pwd); uid_t pwdb_user_rid_to_uid(uint32 user_rid); uint32 pwdb_uid_to_user_rid(uid_t uid); uint32 pwdb_gid_to_group_rid(gid_t gid); diff --git a/source3/include/smb.h b/source3/include/smb.h index 8ffd55d10a..50d8c080a3 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -756,7 +756,7 @@ struct passdb_ops { /* * smb password database query functions. */ - struct smb_passwd *(*getsmbpwnam)(char *); + struct smb_passwd *(*getsmbpwnam)(const char *); struct smb_passwd *(*getsmbpwuid)(uid_t); struct smb_passwd *(*getsmbpwrid)(uint32); struct smb_passwd *(*getsmbpwent)(void *); @@ -775,7 +775,7 @@ struct passdb_ops { /* * sam password database query functions. */ - struct sam_passwd *(*getsam21pwnam)(char *); + struct sam_passwd *(*getsam21pwnam)(const char *); struct sam_passwd *(*getsam21pwuid)(uid_t); struct sam_passwd *(*getsam21pwrid)(uint32); @@ -788,7 +788,7 @@ struct passdb_ops { /* * sam query display info functions. */ - struct sam_disp_info *(*getsamdispnam)(char *); + struct sam_disp_info *(*getsamdispnam)(const char *); struct sam_disp_info *(*getsamdisprid)(uint32); struct sam_disp_info *(*getsamdispent)(void *); @@ -796,9 +796,9 @@ struct passdb_ops { /* * password checking functions */ - struct smb_passwd *(*smb_password_chal )(char *username, char lm_pass[24], char nt_pass[24], char chal[8]); - struct smb_passwd *(*smb_password_check )(char *username, char lm_hash[16], char nt_hash[16]); - struct passwd *(*unix_password_check)(char *username, char *pass, int pass_len); + struct smb_passwd *(*smb_password_chal )(const char *username, const char lm_pass[24], const char nt_pass[24], char chal[8]); + struct smb_passwd *(*smb_password_check )(const char *username, const char lm_hash[16], const char nt_hash[16]); + struct passwd *(*unix_password_check)(const char *username, const char *pass, int pass_len); #endif }; diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index ca5dd8b585..70c7f1fc9c 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -128,7 +128,7 @@ struct smb_passwd *iterate_getsmbpwuid(uid_t smb_userid) does not have search facilities. *************************************************************************/ -struct smb_passwd *iterate_getsmbpwnam(char *name) +struct smb_passwd *iterate_getsmbpwnam(const char *name) { struct smb_passwd *pwd = NULL; void *fp = NULL; @@ -146,6 +146,7 @@ struct smb_passwd *iterate_getsmbpwnam(char *name) while ((pwd = getsmbpwent(fp)) != NULL && !strequal(pwd->smb_name, name)) { + DEBUG(10, ("iterate: %s 0x%x\n", pwd->smb_name, pwd->smb_userid)); } if (pwd != NULL) @@ -224,7 +225,7 @@ BOOL mod_smbpwd_entry(struct smb_passwd* pwd, BOOL override) Routine to search smb passwd by name. *************************************************************************/ -struct smb_passwd *getsmbpwnam(char *name) +struct smb_passwd *getsmbpwnam(const char *name) { return pwdb_ops->getsmbpwnam(name); } @@ -256,7 +257,7 @@ struct smb_passwd *getsmbpwuid(uid_t smb_userid) does not have search facilities. *************************************************************************/ -struct sam_passwd *iterate_getsam21pwnam(char *name) +struct sam_passwd *iterate_getsam21pwnam(const char *name) { struct sam_passwd *pwd = NULL; void *fp = NULL; @@ -385,7 +386,7 @@ struct sam_passwd *getsam21pwent(void *vp) Routine to search sam passwd by name. *************************************************************************/ -struct sam_passwd *getsam21pwnam(char *name) +struct sam_passwd *getsam21pwnam(const char *name) { return pwdb_ops->getsam21pwnam(name); } @@ -694,7 +695,7 @@ void pwdb_set_last_set_time(char *p, int max_len, time_t t) /************************************************************* Routine to set 32 hex password characters from a 16 byte array. **************************************************************/ -void pwdb_sethexpwd(char *p, char *pwd, uint16 acct_ctrl) +void pwdb_sethexpwd(char *p, const char *pwd, uint16 acct_ctrl) { if (pwd != NULL) { @@ -721,7 +722,7 @@ void pwdb_sethexpwd(char *p, char *pwd, uint16 acct_ctrl) Routine to get the 32 hex characters and turn them into a 16 byte array. **************************************************************/ -BOOL pwdb_gethexpwd(char *p, char *pwd) +BOOL pwdb_gethexpwd(const char *p, char *pwd) { return strhex_to_str(pwd, 32, p) == 16; } diff --git a/source3/passdb/smbpass.c b/source3/passdb/smbpass.c index 62fdabe7fe..e15a9b1dd7 100644 --- a/source3/passdb/smbpass.c +++ b/source3/passdb/smbpass.c @@ -898,7 +898,7 @@ static BOOL add_smbfile21pwd_entry(struct sam_passwd *newpwd) return add_smbfilepwd_entry(pwdb_sam_to_smb(newpwd)); } -static struct sam_disp_info *getsmbfiledispnam(char *name) +static struct sam_disp_info *getsmbfiledispnam(const char *name) { return pwdb_sam_to_dispinfo(getsam21pwnam(name)); } diff --git a/source3/rpc_server/srv_netlog.c b/source3/rpc_server/srv_netlog.c index 9fa3ed79cc..7fbd43c38e 100644 --- a/source3/rpc_server/srv_netlog.c +++ b/source3/rpc_server/srv_netlog.c @@ -600,6 +600,7 @@ static void api_net_sam_logon( uint16 vuid, DOM_CRED srv_cred; struct smb_passwd *smb_pass = NULL; UNISTR2 *uni_samlogon_user = NULL; + fstring nt_username; user_struct *vuser = NULL; @@ -654,23 +655,23 @@ static void api_net_sam_logon( uint16 vuid, if (status == 0) { - pstrcpy(samlogon_user, unistrn2(uni_samlogon_user->buffer, - uni_samlogon_user->uni_str_len)); + pstrcpy(nt_username, unistrn2(uni_samlogon_user->buffer, + uni_samlogon_user->uni_str_len)); - DEBUG(3,("User:[%s]\n", samlogon_user)); + DEBUG(3,("User:[%s]\n", nt_username)); /* * Convert to a UNIX username. */ - map_username(samlogon_user); + map_username(nt_username); /* * Do any case conversions. */ - (void)Get_Pwnam(samlogon_user, True); + (void)Get_Pwnam(nt_username, True); become_root(True); - smb_pass = getsmbpwnam(samlogon_user); + smb_pass = getsmbpwnam(nt_username); unbecome_root(True); if (smb_pass == NULL) @@ -736,6 +737,7 @@ static void api_net_sam_logon( uint16 vuid, /* XXXX hack to get standard_sub_basic() to use sam logon username */ /* possibly a better way would be to do a become_user() call */ sam_logon_in_ssb = True; + pstrcpy(samlogon_user, nt_username); pstrcpy(logon_script, lp_logon_script()); pstrcpy(profile_path, lp_logon_path()); @@ -747,8 +749,10 @@ static void api_net_sam_logon( uint16 vuid, pstrcpy(my_name, global_myname); strupper(my_name); - status = lookup_user_rids(samlogon_user, &r_uid, &r_gid); - status = getusergroupsnam(samlogon_user, &grp_mem, &num_gids) ? 0 : 0xC0000000 | NT_STATUS_INVALID_PRIMARY_GROUP; + status = lookup_user_rids(nt_username, &r_uid, &r_gid); + status = getusergroupsnam(nt_username, &grp_mem, &num_gids) ? 0 : 0xC0000000 | NT_STATUS_INVALID_PRIMARY_GROUP; + + sam_logon_in_ssb = False; if (status == 0x0) { @@ -763,7 +767,7 @@ static void api_net_sam_logon( uint16 vuid, &dummy_time, /* pass_can_change_time */ &dummy_time, /* pass_must_change_time */ - samlogon_user , /* user_name */ + nt_username , /* user_name */ vuser->real_name, /* full_name */ logon_script , /* logon_script */ profile_path , /* profile_path */ diff --git a/source3/rpc_server/srv_sid.c b/source3/rpc_server/srv_sid.c index f112b8a9ce..a428a7f068 100644 --- a/source3/rpc_server/srv_sid.c +++ b/source3/rpc_server/srv_sid.c @@ -443,7 +443,7 @@ BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain) DEBUG(5,("map_domain_name_to_sid: overriding NULL name to %s\n", global_sam_name)); (*nt_domain) = strdup(global_sam_name); - *sid = global_sam_sid; + sid_copy(sid, &global_sam_sid); return True; } @@ -453,13 +453,13 @@ BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain) global_sam_name)); free(*nt_domain); (*nt_domain) = strdup(global_sam_name); - *sid = global_sam_sid; + sid_copy(sid, &global_sam_sid); return True; } if (strequal((*nt_domain), global_sam_name)) { - *sid = global_sam_sid; + sid_copy(sid, &global_sam_sid); return True; } diff --git a/source3/smbd/groupname.c b/source3/smbd/groupname.c index 95992cc84b..a81114169c 100644 --- a/source3/smbd/groupname.c +++ b/source3/smbd/groupname.c @@ -138,13 +138,15 @@ static BOOL make_mydomain_sid(GROUP_NAME_INFO *grp, GROUP_TYPE type) } if (strequal(grp->nt_domain, global_sam_name) && - lookup_wk_group_name(grp->nt_name, &sid, &tmp_type)) + lookup_builtin_grp_name(grp->nt_name, &sid, &tmp_type) == 0x0) { sid_copy(&grp->sid, &sid); return True; } else { + BOOL ret; + fstring sid_str; if (type == GROUP_DOMAIN) { tmp_rid = pwdb_gid_to_group_rid(grp->unix_gid); @@ -153,7 +155,11 @@ static BOOL make_mydomain_sid(GROUP_NAME_INFO *grp, GROUP_TYPE type) { tmp_rid = pwdb_gid_to_alias_rid(grp->unix_gid); } - return sid_append_rid(&(grp->sid), tmp_rid); + ret = sid_append_rid(&(grp->sid), tmp_rid); + sid_to_string(sid_str, &grp->sid); + DEBUG(10,("nt name %s gid %d mapped to %s\n", + grp->nt_name, grp->unix_gid, sid_str)); + return ret; } } @@ -259,7 +265,7 @@ static BOOL make_name_entry(name_map_entry **new_ep, /************************************************************************** Load a name map file. Sets last accessed timestamp. ***************************************************************************/ -static void load_name_map(GROUP_TYPE type) +static ubi_slList *load_name_map(GROUP_TYPE type) { static time_t groupmap_file_last_modified = (time_t)0; static time_t aliasmap_file_last_modified = (time_t)0; @@ -296,20 +302,21 @@ static void load_name_map(GROUP_TYPE type) if (!(*initialised)) { + DEBUG(10,("initialising group map %s\n", map_file)); ubi_slInitList(map_list); (*initialised) = True; } if (!*map_file) { - return; + return map_list; } if (sys_stat(map_file, &st) != 0) { DEBUG(0, ("load_name_map: Unable to stat file %s. Error was %s\n", map_file, strerror(errno) )); - return; + return map_list; } /* @@ -317,7 +324,7 @@ static void load_name_map(GROUP_TYPE type) */ if (st.st_mtime <= (*file_last_modified)) { - return; + return map_list; } (*file_last_modified) = st.st_mtime; @@ -331,7 +338,7 @@ static void load_name_map(GROUP_TYPE type) { DEBUG(0,("load_name_map: can't open name map %s. Error was %s\n", map_file, strerror(errno))); - return; + return map_list; } /* @@ -391,28 +398,31 @@ static void load_name_map(GROUP_TYPE type) if (make_name_entry(&new_ep, nt_domain, nt_name, unixname, type)) { - ubi_slAddHead(map_list, (ubi_slNode *)new_ep); + ubi_slAddTail(map_list, (ubi_slNode *)new_ep); } } DEBUG(10,("load_name_map: Added %ld entries to name map.\n", - ubi_slCount(map_list))); + ubi_slCount(map_list))); fclose(fp); + + return map_list; } /*********************************************************** Lookup by SID ************************************************************/ -static BOOL map_sid(GROUP_TYPE type, ubi_slList *map_list, +static BOOL map_sid(GROUP_TYPE type, DOM_SID *psid, gid_t *gid, char *ntname, char *ntdomain) { name_map_entry *gmep; + ubi_slList *map_list; /* - * Initialize and load if not already loaded. + * Initialise and load if not already loaded. */ - load_name_map(type); + map_list = load_name_map(type); for (gmep = (name_map_entry *)ubi_slFirst(map_list); gmep != NULL; @@ -444,18 +454,19 @@ static BOOL map_sid(GROUP_TYPE type, ubi_slList *map_list, /*********************************************************** Lookup nt name. ************************************************************/ -static BOOL map_ntname(GROUP_TYPE type, ubi_slList *map_list, +static BOOL map_ntname(GROUP_TYPE type, char *ntname, char *ntdomain, DOM_SID *psid, char *unixname, gid_t *gid) { name_map_entry *gmep; + ubi_slList *map_list; /* - * Initialize and load if not already loaded. + * Initialise and load if not already loaded. */ - load_name_map(type); + map_list = load_name_map(type); - for (gmep = (name_map_entry *)ubi_slFirst(&map_list); + for (gmep = (name_map_entry *)ubi_slFirst(map_list); gmep != NULL; gmep = (name_map_entry *)ubi_slNext(gmep )) { @@ -464,7 +475,7 @@ static BOOL map_ntname(GROUP_TYPE type, ubi_slList *map_list, { if (psid != NULL) { - *psid = gmep->grp.sid; + sid_copy(psid, &gmep->grp.sid); } if (gid != NULL) { @@ -486,17 +497,18 @@ static BOOL map_ntname(GROUP_TYPE type, ubi_slList *map_list, /*********************************************************** Lookup unix name. ************************************************************/ -static BOOL map_unixname(GROUP_TYPE type, ubi_slList *map_list, +static BOOL map_unixname(GROUP_TYPE type, char *unixname, DOM_SID *psid, char *ntname, char *ntdomain) { name_map_entry *gmep; + ubi_slList *map_list; /* - * Initialize and load if not already loaded. + * Initialise and load if not already loaded. */ - load_name_map(type); + map_list = load_name_map(type); - for (gmep = (name_map_entry *)ubi_slFirst(&map_list); + for (gmep = (name_map_entry *)ubi_slFirst(map_list); gmep != NULL; gmep = (name_map_entry *)ubi_slNext(gmep )) { @@ -504,7 +516,7 @@ static BOOL map_unixname(GROUP_TYPE type, ubi_slList *map_list, { if (psid != NULL) { - *psid = gmep->grp.sid; + sid_copy(psid, &gmep->grp.sid); } if (ntname != NULL) { @@ -526,25 +538,30 @@ static BOOL map_unixname(GROUP_TYPE type, ubi_slList *map_list, /*********************************************************** Lookup by gid_t. ************************************************************/ -static BOOL map_gid(GROUP_TYPE type, ubi_slList *map_list, +static BOOL map_gid(GROUP_TYPE type, gid_t gid, DOM_SID *psid, char *ntname, char *ntdomain) { name_map_entry *gmep; + ubi_slList *map_list; /* - * Initialize and load if not already loaded. + * Initialise and load if not already loaded. */ - load_name_map(type); + map_list = load_name_map(type); - for (gmep = (name_map_entry *)ubi_slFirst(&map_list); + for (gmep = (name_map_entry *)ubi_slFirst(map_list); gmep != NULL; gmep = (name_map_entry *)ubi_slNext(gmep )) { + fstring sid_str; + sid_to_string(sid_str, &gmep->grp.sid); + DEBUG(10,("map_gid: enum entry unix group %s %d nt %s %s\n", + gmep->grp.unix_name, gmep->grp.unix_gid, gmep->grp.nt_name, sid_str)); if (gmep->grp.unix_gid == gid) { if (psid != NULL) { - *psid = gmep->grp.sid; + sid_copy(psid, &gmep->grp.sid); } if (ntname != NULL) { @@ -581,7 +598,7 @@ static BOOL map_gid(GROUP_TYPE type, ubi_slList *map_list, ************************************************************/ BOOL map_group_sid(DOM_SID *psid, gid_t *gid, char *group_name, char *nt_domain) { - return map_sid(GROUP_DOMAIN, &groupname_map_list, psid, gid, group_name, nt_domain); + return map_sid(GROUP_DOMAIN, psid, gid, group_name, nt_domain); } /*********************************************************** @@ -589,7 +606,7 @@ BOOL map_group_sid(DOM_SID *psid, gid_t *gid, char *group_name, char *nt_domain) ************************************************************/ BOOL map_alias_sid(DOM_SID *psid, gid_t *gid, char *alias_name, char *nt_domain) { - return map_sid(GROUP_LOCAL, &aliasname_map_list, psid, gid, alias_name, nt_domain); + return map_sid(GROUP_LOCAL, psid, gid, alias_name, nt_domain); } /*********************************************************** @@ -597,7 +614,7 @@ BOOL map_alias_sid(DOM_SID *psid, gid_t *gid, char *alias_name, char *nt_domain) ************************************************************/ BOOL map_unix_group_name(char *group_name, DOM_SID *psid, char *ntgroup_name, char *nt_domain) { - return map_unixname(GROUP_DOMAIN, &groupname_map_list, group_name, psid, ntgroup_name, nt_domain); + return map_unixname(GROUP_DOMAIN, group_name, psid, ntgroup_name, nt_domain); } /*********************************************************** @@ -605,7 +622,7 @@ BOOL map_unix_group_name(char *group_name, DOM_SID *psid, char *ntgroup_name, ch ************************************************************/ BOOL map_unix_alias_name(char *alias_name, DOM_SID *psid, char *ntalias_name, char *nt_domain) { - return map_unixname(GROUP_LOCAL, &aliasname_map_list, alias_name, psid, ntalias_name, nt_domain); + return map_unixname(GROUP_LOCAL, alias_name, psid, ntalias_name, nt_domain); } /*********************************************************** @@ -613,7 +630,7 @@ BOOL map_unix_alias_name(char *alias_name, DOM_SID *psid, char *ntalias_name, ch ************************************************************/ BOOL map_nt_group_name(char *ntgroup_name, char *nt_domain, DOM_SID *psid, char *group_name, gid_t *gid) { - return map_ntname(GROUP_DOMAIN, &groupname_map_list, ntgroup_name, nt_domain, psid, group_name, gid); + return map_ntname(GROUP_DOMAIN, ntgroup_name, nt_domain, psid, group_name, gid); } /*********************************************************** @@ -621,7 +638,7 @@ BOOL map_nt_group_name(char *ntgroup_name, char *nt_domain, DOM_SID *psid, char ************************************************************/ BOOL map_nt_alias_name(char *ntalias_name, char *nt_domain, DOM_SID *psid, char *alias_name, gid_t *gid) { - return map_ntname(GROUP_LOCAL, &aliasname_map_list, ntalias_name, nt_domain, psid, alias_name, gid); + return map_ntname(GROUP_LOCAL, ntalias_name, nt_domain, psid, alias_name, gid); } /*********************************************************** @@ -629,7 +646,7 @@ BOOL map_nt_alias_name(char *ntalias_name, char *nt_domain, DOM_SID *psid, char ************************************************************/ BOOL map_alias_gid(gid_t gid, DOM_SID *psid, char *nt_als_name, char *nt_domain) { - return map_gid(GROUP_LOCAL, &aliasname_map_list, gid, psid, nt_als_name, nt_domain); + return map_gid(GROUP_LOCAL, gid, psid, nt_als_name, nt_domain); } /*********************************************************** @@ -637,6 +654,6 @@ BOOL map_alias_gid(gid_t gid, DOM_SID *psid, char *nt_als_name, char *nt_domain) ************************************************************/ BOOL map_group_gid( gid_t gid, DOM_SID *psid, char *nt_grp_name, char *nt_domain) { - return map_gid(GROUP_DOMAIN, &groupname_map_list, gid, psid, nt_grp_name, nt_domain); + return map_gid(GROUP_DOMAIN, gid, psid, nt_grp_name, nt_domain); } |