summaryrefslogtreecommitdiffstats
path: root/source/smbd/lanman.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/smbd/lanman.c')
-rw-r--r--source/smbd/lanman.c107
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));