diff options
Diffstat (limited to 'source/smbd/lanman.c')
-rw-r--r-- | source/smbd/lanman.c | 107 |
1 files changed, 48 insertions, 59 deletions
diff --git a/source/smbd/lanman.c b/source/smbd/lanman.c index 127480f0b3d..d8c5201ce67 100644 --- a/source/smbd/lanman.c +++ b/source/smbd/lanman.c @@ -27,9 +27,6 @@ #include "includes.h" -extern struct current_user current_user; -extern userdom_struct current_user_info; - #ifdef CHECK_TYPES #undef CHECK_TYPES #endif @@ -1655,10 +1652,9 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c char *str1 = param+2; char *str2 = skip_string(str1,1); char *p = skip_string(str2,1); + BOOL ret; - struct pdb_search *search; - struct samr_displayentry *entries; - + GROUP_MAP *group_list; int num_entries; if (strcmp(str1,"WrLeh") != 0) @@ -1676,39 +1672,30 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c /* get list of domain groups SID_DOMAIN_GRP=2 */ become_root(); - search = pdb_search_groups(); + ret = pdb_enum_group_mapping(SID_NAME_DOM_GRP , &group_list, &num_entries, False); unbecome_root(); - - if (search == NULL) { - DEBUG(3,("api_RNetGroupEnum:failed to get group list")); + + if( !ret ) { + DEBUG(3,("api_RNetGroupEnum:failed to get group list")); return False; } resume_context = SVAL(p,0); cli_buf_size=SVAL(p+2,0); - DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: " - "%d\n", resume_context, cli_buf_size)); - - become_root(); - num_entries = pdb_search_entries(search, resume_context, 0xffffffff, - &entries); - unbecome_root(); + DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: %d\n", resume_context, cli_buf_size)); *rdata_len = cli_buf_size; *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len); p = *rdata; - for(i=0; i<num_entries; i++) { - fstring name; - fstrcpy(name, entries[i].account_name); + for(i=resume_context; i<num_entries; i++) { + char* name=group_list[i].nt_name; if( ((PTR_DIFF(p,*rdata)+21) <= *rdata_len) ) { /* truncate the name at 21 chars. */ memcpy(p, name, 21); DEBUG(10,("adding entry %d group %s\n", i, p)); - p += 21; - p += 5; /* Both NT4 and W2k3SP1 do padding here. - No idea why... */ + p += 21; } else { /* set overflow error */ DEBUG(3,("overflow on entry %d group %s\n", i, name)); @@ -1717,8 +1704,6 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c } } - pdb_search_destroy(search); - *rdata_len = PTR_DIFF(p,*rdata); *rparam_len = 8; @@ -1726,8 +1711,8 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c SSVAL(*rparam, 0, errflags); SSVAL(*rparam, 2, 0); /* converter word */ - SSVAL(*rparam, 4, i); /* is this right?? */ - SSVAL(*rparam, 6, resume_context+num_entries); /* is this right?? */ + SSVAL(*rparam, 4, i-resume_context); /* is this right?? */ + SSVAL(*rparam, 6, num_entries); /* is this right?? */ return(True); } @@ -1846,12 +1831,11 @@ static BOOL api_RNetUserEnum(connection_struct *conn,uint16 vuid, char *param,ch char **rdata,char **rparam, int *rdata_len,int *rparam_len) { + SAM_ACCOUNT *pwd=NULL; int count_sent=0; - int num_users=0; + int count_total=0; int errflags=0; - int i, resume_context, cli_buf_size; - struct pdb_search *search; - struct samr_displayentry *users; + int resume_context, cli_buf_size; char *str1 = param+2; char *str2 = skip_string(str1,1); @@ -1883,47 +1867,49 @@ static BOOL api_RNetUserEnum(connection_struct *conn,uint16 vuid, char *param,ch p = *rdata; + /* to get user list enumerations for NetUserEnum in B21 format */ + pdb_init_sam(&pwd); + + /* Open the passgrp file - not for update. */ become_root(); - search = pdb_search_users(ACB_NORMAL); - unbecome_root(); - if (search == NULL) { + if(!pdb_setsampwent(False, 0)) { DEBUG(0, ("api_RNetUserEnum:unable to open sam database.\n")); + unbecome_root(); return False; } - - become_root(); - num_users = pdb_search_entries(search, resume_context, 0xffffffff, - &users); - unbecome_root(); - errflags=NERR_Success; - for (i=0; i<num_users; i++) { - const char *name = users[i].account_name; - - if(((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21)) { - pstrcpy(p,name); - DEBUG(10,("api_RNetUserEnum:adding entry %d username " - "%s\n",count_sent,p)); - p += 21; - count_sent++; - } else { - /* set overflow error */ - DEBUG(10,("api_RNetUserEnum:overflow on entry %d " - "username %s\n",count_sent,name)); - errflags=234; - break; - } - } + while ( pdb_getsampwent(pwd) ) { + const char *name=pdb_get_username(pwd); + if ((name) && (*(name+strlen(name)-1)!='$')) { + count_total++; + if(count_total>=resume_context) { + if( ((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21) ) { + pstrcpy(p,name); + DEBUG(10,("api_RNetUserEnum:adding entry %d username %s\n",count_sent,p)); + p += 21; + count_sent++; + } else { + /* set overflow error */ + DEBUG(10,("api_RNetUserEnum:overflow on entry %d username %s\n",count_sent,name)); + errflags=234; + break; + } + } + } + } ; + + pdb_endsampwent(); + unbecome_root(); - pdb_search_destroy(search); + pdb_free_sam(&pwd); *rdata_len = PTR_DIFF(p,*rdata); SSVAL(*rparam,0,errflags); SSVAL(*rparam,2,0); /* converter word */ SSVAL(*rparam,4,count_sent); /* is this right?? */ - SSVAL(*rparam,6,num_users); /* is this right?? */ + SSVAL(*rparam,6,count_total); /* is this right?? */ return True; } @@ -2130,6 +2116,7 @@ static BOOL api_RDosPrintJobDel(connection_struct *conn,uint16 vuid, char *param int snum; fstring sharename; int errcode; + extern struct current_user current_user; WERROR werr = WERR_OK; if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid)) @@ -2196,6 +2183,7 @@ static BOOL api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid, char *param int errcode = NERR_notsupported; int snum; WERROR werr = WERR_OK; + extern struct current_user current_user; /* check it's a supported varient */ if (!(strcsequal(str1,"z") && strcsequal(str2,""))) @@ -2447,6 +2435,7 @@ static BOOL api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid, char *param char *str2 = skip_string(str1,1); char *p = skip_string(str2,1); char *p2; + extern userdom_struct current_user_info; int level = SVAL(p,0); DEBUG(4,("NetWkstaGetInfo level %d\n",level)); |