1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

Convert other parameters (read list, write list, valid users...) to the P_LIST format.

changed functions to use list instead of strings
addedd lp_list_substitute function
This commit is contained in:
Simo Sorce 0001-01-01 00:00:00 +00:00
parent f4d9abcac7
commit 7257d07563
4 changed files with 184 additions and 85 deletions

View File

@ -93,6 +93,7 @@ BOOL map_username(char *user)
while((s=fgets_slash(buf,sizeof(buf),f))!=NULL) {
char *unixname = s;
char *dosname = strchr_m(unixname,'=');
char **dosuserlist;
BOOL return_if_mapped = False;
if (!dosname)
@ -120,17 +121,26 @@ BOOL map_username(char *user)
}
}
if (strchr_m(dosname,'*') || user_in_list(user,dosname)) {
dosuserlist = lp_list_make(dosname);
if (!dosuserlist) {
DEBUG(0,("Unable to build user list\n"));
return False;
}
if (strchr_m(dosname,'*') || user_in_list(user, dosuserlist)) {
DEBUG(3,("Mapped user %s to %s\n",user,unixname));
mapped_user = True;
fstrcpy(last_from,user);
sscanf(unixname,"%s",user);
fstrcpy(last_to,user);
if(return_if_mapped) {
if(return_if_mapped) {
lp_list_free (&dosuserlist);
fclose(f);
return True;
}
}
lp_list_free (&dosuserlist);
}
fclose(f);
@ -382,18 +392,18 @@ BOOL user_in_group_list(char *user,char *gname)
and netgroup lists.
****************************************************************************/
BOOL user_in_list(char *user,char *list)
BOOL user_in_list(char *user,char **list)
{
pstring tok;
char *p=list;
DEBUG(10,("user_in_list: checking user %s in list %s\n", user, list));
if (!list || !*list) return False;
while (next_token(&p,tok,LIST_SEP, sizeof(tok))) {
DEBUG(10,("user_in_list: checking user %s in list\n", user));
while (*list) {
/*
* Check raw username.
*/
if (strequal(user,tok))
if (strequal(user, *list))
return(True);
/*
@ -401,24 +411,24 @@ BOOL user_in_list(char *user,char *list)
* of UNIX and netgroups has been specified.
*/
if(*tok == '@') {
if(**list == '@') {
/*
* Old behaviour. Check netgroup list
* followed by UNIX list.
*/
if(user_in_netgroup_list(user,&tok[1]))
if(user_in_netgroup_list(user, *list +1))
return True;
if(user_in_group_list(user,&tok[1]))
if(user_in_group_list(user, *list +1))
return True;
} else if (*tok == '+') {
} else if (**list == '+') {
if(tok[1] == '&') {
if((*(*list +1)) == '&') {
/*
* Search UNIX list followed by netgroup.
*/
if(user_in_group_list(user,&tok[2]))
if(user_in_group_list(user, *list +2))
return True;
if(user_in_netgroup_list(user,&tok[2]))
if(user_in_netgroup_list(user, *list +2))
return True;
} else {
@ -427,28 +437,30 @@ BOOL user_in_list(char *user,char *list)
* Just search UNIX list.
*/
if(user_in_group_list(user,&tok[1]))
if(user_in_group_list(user, *list +1))
return True;
}
} else if (*tok == '&') {
} else if (**list == '&') {
if(tok[1] == '+') {
if(*(*list +1) == '+') {
/*
* Search netgroup list followed by UNIX list.
*/
if(user_in_netgroup_list(user,&tok[2]))
if(user_in_netgroup_list(user, *list +2))
return True;
if(user_in_group_list(user,&tok[2]))
if(user_in_group_list(user, *list +2))
return True;
} else {
/*
* Just search netgroup list.
*/
if(user_in_netgroup_list(user,&tok[1]))
if(user_in_netgroup_list(user, *list +1))
return True;
}
}
list++;
}
return(False);
}

View File

@ -5,6 +5,8 @@
Copyright (C) Karl Auer 1993-1998
Largely re-written by Andrew Tridgell, September 1994
Copyright (C) Simo Sorce 2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -110,12 +112,8 @@ typedef struct
char *szPasswordServer;
char *szSocketOptions;
char *szWorkGroup;
char *szDomainAdminGroup;
char *szDomainGuestGroup;
char *szDomainAdminUsers;
char *szDomainGuestUsers;
char *szDomainHostsallow;
char *szDomainHostsdeny;
char **szDomainAdminGroup;
char **szDomainGuestGroup;
char *szUsernameMap;
#ifdef USING_GROUPNAME_MAP
char *szGroupnameMap;
@ -278,9 +276,9 @@ typedef struct
char *szPath;
char *szUsername;
char *szGuestaccount;
char *szInvalidUsers;
char *szValidUsers;
char *szAdminUsers;
char **szInvalidUsers;
char **szValidUsers;
char **szAdminUsers;
char *szCopy;
char *szInclude;
char *szPreExec;
@ -310,9 +308,9 @@ typedef struct
char *comment;
char *force_user;
char *force_group;
char *readlist;
char *writelist;
char *printer_admin;
char **readlist;
char **writelist;
char **printer_admin;
char *volume;
char *fstype;
char *szVfsObjectFile;
@ -682,12 +680,12 @@ static struct parm_struct parm_table[] = {
{"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
{"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
{"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_PRINT},
{"invalid users", P_LIST, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"valid users", P_LIST, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"admin users", P_LIST, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"read list", P_LIST, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"write list", P_LIST, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
{"printer admin", P_LIST, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_PRINT},
{"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
{"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
{"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
@ -860,8 +858,8 @@ static struct parm_struct parm_table[] = {
{"Domain Options", P_SEP, P_SEPARATOR},
{"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
{"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
{"domain admin group", P_LIST, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
{"domain guest group", P_LIST, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
#ifdef USING_GROUPNAME_MAP
{"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
@ -1456,8 +1454,8 @@ FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserToGroupScript)
FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
FN_GLOBAL_LIST(lp_domain_admin_group, &Globals.szDomainAdminGroup)
FN_GLOBAL_LIST(lp_domain_guest_group, &Globals.szDomainGuestGroup)
FN_GLOBAL_STRING(lp_winbind_uid, &Globals.szWinbindUID)
FN_GLOBAL_STRING(lp_winbind_gid, &Globals.szWinbindGID)
FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
@ -1576,9 +1574,9 @@ FN_LOCAL_STRING(lp_pathname, szPath)
FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
FN_LOCAL_STRING(lp_username, szUsername)
FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
FN_LOCAL_STRING(lp_valid_users, szValidUsers)
FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
FN_LOCAL_LIST(lp_valid_users, szValidUsers)
FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
@ -1596,9 +1594,9 @@ FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
FN_LOCAL_STRING(lp_comment, comment)
FN_LOCAL_STRING(lp_force_user, force_user)
FN_LOCAL_STRING(lp_force_group, force_group)
FN_LOCAL_STRING(lp_readlist, readlist)
FN_LOCAL_STRING(lp_writelist, writelist)
FN_LOCAL_STRING(lp_printer_admin, printer_admin)
FN_LOCAL_LIST(lp_readlist, readlist)
FN_LOCAL_LIST(lp_writelist, writelist)
FN_LOCAL_LIST(lp_printer_admin, printer_admin)
FN_LOCAL_STRING(lp_fstype, fstype)
FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
static FN_LOCAL_STRING(lp_volume, volume)
@ -1723,7 +1721,7 @@ static void free_service(service * pservice)
PTR_DIFF(parm_table[i].ptr, &sDefault)));
else if (parm_table[i].type == P_LIST &&
parm_table[i].class == P_LOCAL)
lp_list_free(*(char ***)
lp_list_free((char ***)
(((char *)pservice) +
PTR_DIFF(parm_table[i].ptr, &sDefault)));
}
@ -3558,10 +3556,14 @@ char **lp_list_make(char *string)
if (!string || !*string) return NULL;
s = strdup(string);
if (!s || !*s) return NULL;
if (!s || !*s) {
DEBUG(0,("ERROR: Unable to allocate memory"));
return NULL;
}
list = (char**)malloc(((sizeof(char**)) * P_LIST_ABS));
if (!list) {
DEBUG(0,("ERROR: Unable to allocate memory"));
free (s);
return NULL;
}
@ -3579,7 +3581,8 @@ char **lp_list_make(char *string)
lsize += P_LIST_ABS;
rlist = (char **)realloc(list, ((sizeof(char **)) * lsize));
if (!rlist) {
lp_list_free (list);
DEBUG(0,("ERROR: Unable to allocate memory"));
lp_list_free (&list);
free (s);
return NULL;
}
@ -3589,7 +3592,8 @@ char **lp_list_make(char *string)
list[num] = strdup(tok);
if (!list[num]) {
lp_list_free (list);
DEBUG(0,("ERROR: Unable to allocate memory"));
lp_list_free (&list);
free (s);
return NULL;
}
@ -3610,7 +3614,10 @@ BOOL lp_list_copy(char ***dest, char **src)
if (!src) return False;
list = (char**)malloc(((sizeof(char**)) * P_LIST_ABS));
if (!list) return False;
if (!list) {
DEBUG(0,("ERROR: Unable to allocate memory"));
return False;
}
memset (list, 0, ((sizeof(char**)) * P_LIST_ABS));
lsize = P_LIST_ABS;
@ -3620,7 +3627,8 @@ BOOL lp_list_copy(char ***dest, char **src)
lsize += P_LIST_ABS;
rlist = (char **)realloc(list, ((sizeof(char **)) * lsize));
if (!rlist) {
lp_list_free (list);
DEBUG(0,("ERROR: Unable to allocate memory"));
lp_list_free (&list);
return False;
}
else list = rlist;
@ -3629,7 +3637,8 @@ BOOL lp_list_copy(char ***dest, char **src)
list[num] = strdup(src[num]);
if (!list[num]) {
lp_list_free (list);
DEBUG(0,("ERROR: Unable to allocate memory"));
lp_list_free (&list);
return False;
}
}
@ -3654,11 +3663,75 @@ BOOL lp_list_compare(char **list1, char **list2)
return True;
}
void lp_list_free(char **list)
void lp_list_free(char ***list)
{
char **tlist = list;
char **tlist;
if (!list) return;
if (!list || !*list) return;
tlist = *list;
for(; *tlist; tlist++) free(*tlist);
free (list);
free (*list);
*list = NULL;
}
BOOL lp_list_substitute(char **list, const char *pattern, const char *insert)
{
char *p, *s, *t;
ssize_t ls, lp, li, ld, i, d;
if (!list || !*list) return False;
if (!pattern) return False;
if (!insert) return False;
lp = (ssize_t)strlen(pattern);
li = (ssize_t)strlen(insert);
ld = li -lp;
while (*list)
{
s = *list;
ls = (ssize_t)strlen(s);
while ((p = strstr(s, pattern)))
{
t = *list;
d = p -t;
if (ld)
{
t = (char *) malloc(ls +ld +1);
if (!t) {
DEBUG(0,("ERROR: Unable to allocate memory"));
return False;
}
memcpy(t, *list, d);
memcpy(t +d +li, p +lp, ls -d -lp +1);
free (*list);
*list = t;
ls += ld;
s = t +d +li;
}
for (i = 0; i < li; i++) {
switch (insert[i]) {
case '`':
case '"':
case '\'':
case ';':
case '$':
case '%':
case '\r':
case '\n':
t[d +i] = '_';
break;
default:
t[d +i] = insert[i];
}
}
}
list++;
}
return True;
}

View File

@ -648,25 +648,34 @@ check if a username is valid
****************************************************************************/
BOOL user_ok(char *user,int snum)
{
pstring valid, invalid;
char **valid, **invalid;
BOOL ret;
StrnCpy(valid, lp_valid_users(snum), sizeof(pstring)-1);
StrnCpy(invalid, lp_invalid_users(snum), sizeof(pstring)-1);
valid = invalid = NULL;
ret = True;
pstring_sub(valid,"%S",lp_servicename(snum));
pstring_sub(invalid,"%S",lp_servicename(snum));
ret = !user_in_list(user,invalid);
if (ret && valid && *valid) {
ret = user_in_list(user,valid);
if (lp_invalid_users(snum)) {
lp_list_copy(&invalid, lp_invalid_users(snum));
if (invalid && lp_list_substitute(invalid, "%S", lp_servicename(snum))) {
ret = !user_in_list(user, invalid);
}
}
if (invalid) lp_list_free (&invalid);
if (ret && lp_valid_users(snum)) {
lp_list_copy(&valid, lp_valid_users(snum));
if (valid && lp_list_substitute(valid, "%S", lp_servicename(snum))) {
ret = user_in_list(user,valid);
}
}
if (valid) lp_list_free (&valid);
if (ret && lp_onlyuser(snum)) {
char *user_list = lp_username(snum);
pstring_sub(user_list,"%S",lp_servicename(snum));
ret = user_in_list(user,user_list);
char **user_list = lp_list_make (lp_username(snum));
if (user_list && lp_list_substitute(user_list, "%S", lp_servicename(snum))) {
ret = user_in_list(user, user_list);
}
if (user_list) lp_list_free (&user_list);
}
return(ret);

View File

@ -337,18 +337,23 @@ connection_struct *make_connection(char *service,char *user,char *password, int
{
pstring list;
StrnCpy(list,lp_readlist(snum),sizeof(pstring)-1);
pstring_sub(list,"%S",service);
char **list;
if (user_in_list(user,list))
conn->read_only = True;
StrnCpy(list,lp_writelist(snum),sizeof(pstring)-1);
pstring_sub(list,"%S",service);
if (user_in_list(user,list))
conn->read_only = False;
lp_list_copy(&list, lp_readlist(snum));
if(list && lp_list_substitute(list, "%S", service)) {
if (user_in_list(user, list))
conn->read_only = True;
}
else DEBUG(0, ("read list substitution failed readlist: 0x%x list: 0x%x\n", lp_readlist(snum), list));
if (list) lp_list_free(&list);
lp_list_copy(&list, lp_writelist(snum));
if(list && lp_list_substitute(list, "%S", service)) {
if (user_in_list(user, list))
conn->read_only = False;
}
else DEBUG(0, ("write list substitution failed writelist: 0x%x list: 0x%x\n", lp_writelist(snum), list));
if (list) lp_list_free(&list);
}
/* admin user check */
@ -357,7 +362,7 @@ connection_struct *make_connection(char *service,char *user,char *password, int
marked read_only. Changed as I don't think this is needed,
but old code left in case there is a problem here.
*/
if (user_in_list(user,lp_admin_users(snum))
if (user_in_list(user, lp_admin_users(snum))
#if 0
&& !conn->read_only
#endif