mirror of
https://github.com/samba-team/samba.git
synced 2025-01-29 21:47:30 +03:00
loadparm.c :
added "domain other sids" parameter pipenetlog.c : using "domain other sids" parameter in SAM Logon response. using new name_to_rid() function for r_uid and r_gid. pipentlsa.c : minor mods to do with new name_to_rid() function. pipesrvsvc.c : in the "net share enum" response, allocate some more space for the buffer. there can be only 32 share entries in the response anyway. this needs to be dealt with. pipeutil.c : modified name_to_rid() function to use new parameters "domain admin users" and "domain guest users", but will otherwise do unix uid + 1000. moved make_dom_gids() here. proto.h: the usual. smb.h smbparse.c : renamed sid_no to sid_rev_num in DOM_SID, and gid to r_gid in DOM_GID. util.c : moved make_dom_gids() from here. created char *unistrn2(uint16* uni_buffer, int max_len)
This commit is contained in:
parent
8d1993c71a
commit
ec60e48d79
@ -186,7 +186,8 @@ char *lp_socket_address(void);
|
||||
char *lp_nis_home_map_name(void);
|
||||
char *lp_announce_version(void);
|
||||
char *lp_netbios_aliases(void);
|
||||
char *lp_domainsid(void);
|
||||
char *lp_domain_sid(void);
|
||||
char *lp_domain_other_sids(void);
|
||||
char *lp_domain_groups(void);
|
||||
char *lp_domain_admin_users(void);
|
||||
char *lp_domain_guest_users(void);
|
||||
@ -696,9 +697,11 @@ BOOL api_srvsvcTNP(int cnum,int uid, char *param,char *data,
|
||||
|
||||
void initrpcreply(char *inbuf, char *q);
|
||||
void endrpcreply(char *inbuf, char *q, int datalen, int rtnval, int *rlen);
|
||||
uint32 name_to_rid(char *user_name);
|
||||
BOOL name_to_rid(char *user_name, uint32 *u_rid, uint32 *g_rid);
|
||||
char *dom_sid_to_string(DOM_SID *sid);
|
||||
void make_dom_sid(DOM_SID *sid, char *domsid);
|
||||
int make_dom_sids(char *sids_str, DOM_SID *sids, int max_sids);
|
||||
int make_dom_gids(char *gids_str, DOM_GID *gids);
|
||||
void create_rpc_reply(RPC_HDR *hdr, uint32 call_id, int data_len);
|
||||
int make_rpc_reply(char *inbuf, char *q, int data_len);
|
||||
void make_uni_hdr(UNIHDR *hdr, int max_len, int len, uint16 terminate);
|
||||
@ -1139,6 +1142,7 @@ BOOL is_myname(char *s);
|
||||
void set_remote_arch(enum remote_arch_types type);
|
||||
enum remote_arch_types get_remote_arch();
|
||||
char *skip_unicode_string(char *buf,int n);
|
||||
char *unistrn2(uint16 *buf, int len);
|
||||
char *unistr2(uint16 *buf);
|
||||
char *unistr(char *buf);
|
||||
int unistrncpy(char *dst, char *src, int len);
|
||||
@ -1150,4 +1154,3 @@ char *align2(char *q, char *base);
|
||||
char *align_offset(char *q, char *base, int align_offset_len);
|
||||
void dump_data(int level,char *buf1,int len);
|
||||
char *tab_depth(int depth);
|
||||
int make_domain_gids(char *gids_str, DOM_GID *gids);
|
||||
|
@ -341,15 +341,15 @@ typedef struct nttime_info
|
||||
} NTTIME;
|
||||
|
||||
|
||||
#define MAXSUBAUTHS 10 /* max sub authorities in a SID */
|
||||
#define MAXSUBAUTHS 15 /* max sub authorities in a SID */
|
||||
|
||||
/* DOM_SID - security id */
|
||||
typedef struct sid_info
|
||||
{
|
||||
uint8 sid_no; /* SID revision number */
|
||||
uint8 sid_rev_num; /* SID revision number */
|
||||
uint8 num_auths; /* number of sub-authorities */
|
||||
uint8 id_auth[6]; /* Identifier Authority */
|
||||
uint16 sub_auths[MAXSUBAUTHS]; /* pointer to sub-authorities. */
|
||||
uint16 sub_auths[MAXSUBAUTHS]; /* pointer to sub-authorities. */
|
||||
|
||||
} DOM_SID;
|
||||
|
||||
@ -517,7 +517,7 @@ typedef struct sam_info
|
||||
/* DOM_GID - group id + user attributes */
|
||||
typedef struct gid_info
|
||||
{
|
||||
uint32 gid; /* group id */
|
||||
uint32 g_rid; /* a group RID */
|
||||
uint32 attr;
|
||||
|
||||
} DOM_GID;
|
||||
|
@ -4289,6 +4289,26 @@ char *skip_unicode_string(char *buf,int n)
|
||||
return(buf);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Return a ascii version of a unicode string
|
||||
Hack alert: uses fixed buffer(s) and only handles ascii strings
|
||||
********************************************************************/
|
||||
#define MAXUNI 1024
|
||||
char *unistrn2(uint16 *buf, int len)
|
||||
{
|
||||
static char lbufs[8][MAXUNI];
|
||||
static int nexti;
|
||||
char *lbuf = lbufs[nexti];
|
||||
char *p;
|
||||
nexti = (nexti+1)%8;
|
||||
for (p = lbuf; *buf && p-lbuf < MAXUNI-2 && len >= 0; len--, p++, buf++)
|
||||
{
|
||||
*p = *buf;
|
||||
}
|
||||
*p = 0;
|
||||
return lbuf;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Return a ascii version of a unicode string
|
||||
Hack alert: uses fixed buffer(s) and only handles ascii strings
|
||||
@ -4510,66 +4530,3 @@ char *tab_depth(int depth)
|
||||
}
|
||||
|
||||
|
||||
/* array lookup of well-known RID aliases. the purpose of these escapes me.. */
|
||||
static struct
|
||||
{
|
||||
uint32 rid;
|
||||
char *rid_name;
|
||||
|
||||
} rid_lookups[] =
|
||||
{
|
||||
{ DOMAIN_ALIAS_RID_ADMINS , "admins" },
|
||||
{ DOMAIN_ALIAS_RID_USERS , "users" },
|
||||
{ DOMAIN_ALIAS_RID_GUESTS , "guests" },
|
||||
{ DOMAIN_ALIAS_RID_POWER_USERS , "power_users" },
|
||||
|
||||
{ DOMAIN_ALIAS_RID_ACCOUNT_OPS , "account_ops" },
|
||||
{ DOMAIN_ALIAS_RID_SYSTEM_OPS , "system_ops" },
|
||||
{ DOMAIN_ALIAS_RID_PRINT_OPS , "print_ops" },
|
||||
{ DOMAIN_ALIAS_RID_BACKUP_OPS , "backup_ops" },
|
||||
{ DOMAIN_ALIAS_RID_REPLICATOR , "replicator" },
|
||||
{ 0 , NULL }
|
||||
};
|
||||
|
||||
int make_domain_gids(char *gids_str, DOM_GID *gids)
|
||||
{
|
||||
char *ptr;
|
||||
pstring s2;
|
||||
int count;
|
||||
|
||||
DEBUG(4,("make_domain_gids: %s\n", gids_str));
|
||||
|
||||
if (gids_str == NULL || *gids_str == 0) return 0;
|
||||
|
||||
for (count = 0, ptr = gids_str; next_token(&ptr, s2, NULL) && count < LSA_MAX_GROUPS; count++)
|
||||
{
|
||||
/* the entries are of the form GID/ATTR, ATTR being optional.*/
|
||||
char *attr;
|
||||
uint32 rid = 0;
|
||||
int i;
|
||||
|
||||
attr = strchr(s2,'/');
|
||||
if (attr) *attr++ = 0;
|
||||
if (!attr || !*attr) attr = "7"; /* default value for attribute is 7 */
|
||||
|
||||
/* look up the RID string and see if we can turn it into a rid number */
|
||||
for (i = 0; rid_lookups[i].rid_name != NULL; i++)
|
||||
{
|
||||
if (strequal(rid_lookups[i].rid_name, s2))
|
||||
{
|
||||
rid = rid_lookups[i].rid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (rid == 0) rid = atoi(s2);
|
||||
|
||||
gids[count].gid = rid;
|
||||
gids[count].attr = atoi(attr);
|
||||
|
||||
DEBUG(5,("group id: %d attr: %d\n", gids[count].gid, gids[count].attr));
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -145,6 +145,7 @@ typedef struct
|
||||
char *szAnnounceVersion; /* This is initialised in init_globals */
|
||||
char *szNetbiosAliases;
|
||||
char *szDomainSID;
|
||||
char *szDomainOtherSIDs;
|
||||
char *szDomainGroups;
|
||||
int max_log_size;
|
||||
int mangled_stack;
|
||||
@ -447,6 +448,7 @@ struct parm_struct
|
||||
{"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars},
|
||||
{"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL},
|
||||
{"domain sid", P_USTRING, P_GLOBAL, &Globals.szDomainSID, NULL},
|
||||
{"domain other sids", P_USTRING, P_GLOBAL, &Globals.szDomainOtherSIDs, NULL},
|
||||
{"domain groups", P_USTRING, P_GLOBAL, &Globals.szDomainGroups, NULL},
|
||||
{"domain controller",P_STRING, P_GLOBAL, &Globals.szDomainController,NULL},
|
||||
{"domain admin users",P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL},
|
||||
@ -638,7 +640,7 @@ static void init_globals(void)
|
||||
/* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
|
||||
string_set(&Globals.szLogonHome, "\\\\%N\\%U");
|
||||
string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
|
||||
string_set(&Globals.szDomainGroups, "776/7");
|
||||
|
||||
Globals.bLoadPrinters = True;
|
||||
Globals.bUseRhosts = False;
|
||||
Globals.max_packet = 65535;
|
||||
@ -867,7 +869,8 @@ FN_GLOBAL_STRING(lp_nis_home_map_name,&Globals.szNISHomeMapName)
|
||||
FN_GLOBAL_STRING(lp_announce_version,&Globals.szAnnounceVersion)
|
||||
FN_GLOBAL_STRING(lp_netbios_aliases,&Globals.szNetbiosAliases)
|
||||
|
||||
FN_GLOBAL_STRING(lp_domainsid,&Globals.szDomainSID)
|
||||
FN_GLOBAL_STRING(lp_domain_sid,&Globals.szDomainSID)
|
||||
FN_GLOBAL_STRING(lp_domain_other_sids,&Globals.szDomainOtherSIDs)
|
||||
FN_GLOBAL_STRING(lp_domain_groups,&Globals.szDomainGroups)
|
||||
FN_GLOBAL_STRING(lp_domain_admin_users,&Globals.szDomainAdminUsers)
|
||||
FN_GLOBAL_STRING(lp_domain_guest_users,&Globals.szDomainGuestUsers)
|
||||
|
@ -154,7 +154,7 @@ static void make_lsa_user_info(LSA_USER_INFO *usr,
|
||||
/* only cope with one "other" sid, right now. */
|
||||
/* need to count the number of space-delimited sids */
|
||||
int i;
|
||||
int num_other_sids = other_sids != NULL ? 1 : 0;
|
||||
int num_other_sids = 0;
|
||||
|
||||
int len_user_name = strlen(user_name );
|
||||
int len_full_name = strlen(full_name );
|
||||
@ -207,6 +207,8 @@ static void make_lsa_user_info(LSA_USER_INFO *usr,
|
||||
|
||||
bzero(usr->padding, sizeof(usr->padding));
|
||||
|
||||
num_other_sids = make_dom_sids(other_sids, usr->other_sids, LSA_MAX_SIDS);
|
||||
|
||||
usr->num_other_sids = num_other_sids;
|
||||
usr->buffer_other_sids = num_other_sids != 0 ? 1 : 0;
|
||||
|
||||
@ -227,7 +229,7 @@ static void make_lsa_user_info(LSA_USER_INFO *usr,
|
||||
make_unistr2(&(usr->uni_logon_dom), logon_dom, len_logon_dom);
|
||||
|
||||
make_dom_sid(&(usr->dom_sid), dom_sid);
|
||||
make_dom_sid(&(usr->other_sids[0]), other_sids);
|
||||
/* "other" sids are set up above */
|
||||
}
|
||||
|
||||
|
||||
@ -350,7 +352,8 @@ static void api_lsa_req_chal( int cnum, uint16 vuid,
|
||||
/* grab the challenge... */
|
||||
lsa_io_q_req_chal(True, &q_r, data + 0x18, data, 4, 0);
|
||||
|
||||
fstrcpy(mach_acct, unistr2(q_r.uni_logon_clnt.buffer));
|
||||
fstrcpy(mach_acct, unistrn2(q_r.uni_logon_clnt.buffer,
|
||||
q_r.uni_logon_clnt.uni_str_len));
|
||||
|
||||
strcat(mach_acct, "$");
|
||||
|
||||
@ -497,6 +500,8 @@ static void api_lsa_sam_logon( user_struct *vuser,
|
||||
/* checks and updates credentials. creates reply credentials */
|
||||
deal_with_credentials(vuser, &(q_l.sam_id.client.cred), &srv_creds);
|
||||
|
||||
usr_info.ptr_user_info = 0;
|
||||
|
||||
if (vuser != NULL)
|
||||
{
|
||||
DOM_GID gids[LSA_MAX_GROUPS];
|
||||
@ -510,7 +515,10 @@ static void api_lsa_sam_logon( user_struct *vuser,
|
||||
pstring my_workgroup;
|
||||
pstring domain_groups;
|
||||
pstring dom_sid;
|
||||
pstring other_sids;
|
||||
extern pstring myname;
|
||||
uint32 r_uid;
|
||||
uint32 r_gid;
|
||||
|
||||
dummy_time.low = 0xffffffff;
|
||||
dummy_time.high = 0x7fffffff;
|
||||
@ -519,19 +527,20 @@ static void api_lsa_sam_logon( user_struct *vuser,
|
||||
|
||||
pstrcpy(samlogon_user, unistr2(q_l.sam_id.auth.id1.uni_user_name.buffer));
|
||||
|
||||
DEBUG(3,("SAM Logon. Domain:[%s]. User [%s]\n",
|
||||
DEBUG(3,("SAM Logon. Domain:[%s]. User:[%s]\n",
|
||||
lp_workgroup(), samlogon_user));
|
||||
|
||||
/* hack to get standard_sub_basic() to use the sam logon username */
|
||||
sam_logon_in_ssb = True;
|
||||
|
||||
pstrcpy(logon_script, lp_logon_script());
|
||||
pstrcpy(profile_path, lp_logon_path ());
|
||||
pstrcpy(dom_sid , lp_domainsid ());
|
||||
pstrcpy(my_workgroup, lp_workgroup ());
|
||||
pstrcpy(logon_script, lp_logon_script ());
|
||||
pstrcpy(profile_path, lp_logon_path ());
|
||||
pstrcpy(dom_sid , lp_domain_sid ());
|
||||
pstrcpy(other_sids , lp_domain_other_sids());
|
||||
pstrcpy(my_workgroup, lp_workgroup ());
|
||||
|
||||
pstrcpy(home_drive , lp_logon_drive ());
|
||||
pstrcpy(home_dir , lp_logon_home ());
|
||||
pstrcpy(home_drive , lp_logon_drive ());
|
||||
pstrcpy(home_dir , lp_logon_home ());
|
||||
|
||||
/* any additional groups this user is in. e.g power users */
|
||||
pstrcpy(domain_groups, lp_domain_groups());
|
||||
@ -554,14 +563,16 @@ static void api_lsa_sam_logon( user_struct *vuser,
|
||||
strcat(domain_groups, " 513/7 ");
|
||||
}
|
||||
|
||||
num_gids = make_domain_gids(domain_groups, gids);
|
||||
num_gids = make_dom_gids(domain_groups, gids);
|
||||
|
||||
sam_logon_in_ssb = False;
|
||||
|
||||
pstrcpy(my_name , myname );
|
||||
strupper(my_name);
|
||||
|
||||
make_lsa_user_info(&usr_info,
|
||||
if (name_to_rid(samlogon_user, &r_uid, &r_gid))
|
||||
{
|
||||
make_lsa_user_info(&usr_info,
|
||||
|
||||
&dummy_time, /* logon_time */
|
||||
&dummy_time, /* logoff_time */
|
||||
@ -580,23 +591,20 @@ static void api_lsa_sam_logon( user_struct *vuser,
|
||||
0, /* logon_count */
|
||||
0, /* bad_pw_count */
|
||||
|
||||
vuser->uid, /* uint32 user_id */
|
||||
vuser->gid, /* uint32 group_id */
|
||||
r_uid, /* RID user_id */
|
||||
r_gid, /* RID group_id */
|
||||
num_gids, /* uint32 num_groups */
|
||||
gids, /* DOM_GID *gids */
|
||||
0x20, /* uint32 user_flgs */
|
||||
|
||||
NULL, /* char sess_key[16] */
|
||||
|
||||
my_name, /* char *logon_srv */
|
||||
my_name , /* char *logon_srv */
|
||||
my_workgroup, /* char *logon_dom */
|
||||
|
||||
dom_sid, /* char *dom_sid */
|
||||
NULL); /* char *other_sids */
|
||||
}
|
||||
else
|
||||
{
|
||||
usr_info.ptr_user_info = 0;
|
||||
dom_sid, /* char *dom_sid */
|
||||
other_sids); /* char *other_sids */
|
||||
}
|
||||
}
|
||||
|
||||
*rdata_len = lsa_reply_sam_logon(&q_l, *rdata + 0x18, *rdata,
|
||||
|
@ -226,7 +226,7 @@ static void api_lsa_query_info( char *param, char *data,
|
||||
lsa_io_q_query(True, &q_i, data + 0x18, data, 4, 0);
|
||||
|
||||
pstrcpy(dom_name, lp_workgroup());
|
||||
pstrcpy(dom_sid , lp_domainsid());
|
||||
pstrcpy(dom_sid , lp_domain_sid());
|
||||
|
||||
/* construct reply. return status is always 0x0 */
|
||||
*rdata_len = lsa_reply_query_info(&q_i, *rdata + 0x18, *rdata,
|
||||
@ -246,7 +246,7 @@ static void api_lsa_lookup_sids( char *param, char *data,
|
||||
lsa_io_q_lookup_sids(True, &q_l, data + 0x18, data, 4, 0);
|
||||
|
||||
pstrcpy(dom_name, lp_workgroup());
|
||||
pstrcpy(dom_sid , lp_domainsid());
|
||||
pstrcpy(dom_sid , lp_domain_sid());
|
||||
|
||||
/* convert received SIDs to strings, so we can do them. */
|
||||
for (i = 0; i < q_l.num_entries; i++)
|
||||
@ -269,18 +269,23 @@ static void api_lsa_lookup_names( char *param, char *data,
|
||||
pstring dom_name;
|
||||
pstring dom_sid;
|
||||
uint32 dom_rids[MAX_LOOKUP_SIDS];
|
||||
uint32 dummy_g_rid;
|
||||
|
||||
/* grab the info class and policy handle */
|
||||
lsa_io_q_lookup_rids(True, &q_l, data + 0x18, data, 4, 0);
|
||||
|
||||
pstrcpy(dom_name, lp_workgroup());
|
||||
pstrcpy(dom_sid , lp_domainsid());
|
||||
pstrcpy(dom_sid , lp_domain_sid());
|
||||
|
||||
/* convert received RIDs to strings, so we can do them. */
|
||||
for (i = 0; i < q_l.num_entries; i++)
|
||||
{
|
||||
char *user_name = unistr2(q_l.lookup_name[i].str.buffer);
|
||||
dom_rids[i] = name_to_rid(user_name);
|
||||
if (!name_to_rid(user_name, &dom_rids[i], &dummy_g_rid))
|
||||
{
|
||||
/* WHOOPS! we should really do something about this... */
|
||||
dom_rids[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* construct reply. return status is always 0x0 */
|
||||
|
@ -170,6 +170,11 @@ static void api_srv_net_share_info( char *param, char *data,
|
||||
/* grab the net share enum */
|
||||
srv_io_q_net_share_enum(True, &q_n, data + 0x18, data, 4, 0);
|
||||
|
||||
/* XXXX push the reply buffer size up a bit, and hope it's sufficient */
|
||||
/* for the current maximum limit of 32 share entries */
|
||||
*rdata_len = 4096;
|
||||
*rdata = REALLOC(*rdata, *rdata_len);
|
||||
|
||||
/* construct reply. always indicate success */
|
||||
*rdata_len = srv_reply_net_share_enum(&q_n, *rdata + 0x18, *rdata, 0x0);
|
||||
}
|
||||
@ -208,6 +213,7 @@ BOOL api_srvsvcTNP(int cnum,int uid, char *param,char *data,
|
||||
case NETSHAREENUM:
|
||||
{
|
||||
api_srv_net_share_info( param, data, rdata, rdata_len);
|
||||
|
||||
make_rpc_reply(data, *rdata, *rdata_len);
|
||||
break;
|
||||
}
|
||||
|
@ -62,17 +62,41 @@ void endrpcreply(char *inbuf, char *q, int datalen, int rtnval, int *rlen)
|
||||
{ int fd; fd = open("/tmp/rpc", O_RDWR); write(fd, q, datalen + 4); }
|
||||
}
|
||||
|
||||
/* RID username mapping function. just for fun, it maps to the unix uid */
|
||||
uint32 name_to_rid(char *user_name)
|
||||
/* Group and User RID username mapping function */
|
||||
BOOL name_to_rid(char *user_name, uint32 *u_rid, uint32 *g_rid)
|
||||
{
|
||||
struct passwd *pw = Get_Pwnam(user_name, False);
|
||||
|
||||
if (u_rid == NULL || g_rid == NULL || user_name == NULL)
|
||||
{
|
||||
return False;
|
||||
}
|
||||
|
||||
if (!pw)
|
||||
{
|
||||
DEBUG(1,("Username %s is invalid on this system\n", user_name));
|
||||
return (uint32)(-1);
|
||||
return False;
|
||||
}
|
||||
|
||||
return (uint32)(pw->pw_uid);
|
||||
if (user_in_list(user_name, lp_domain_guest_users()))
|
||||
{
|
||||
*u_rid = DOMAIN_USER_RID_GUEST;
|
||||
}
|
||||
else if (user_in_list(user_name, lp_domain_admin_users()))
|
||||
{
|
||||
*u_rid = DOMAIN_USER_RID_ADMIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* turn the unix UID into a Domain RID. this is what the posix
|
||||
sub-system does (adds 1000 to the uid) */
|
||||
*u_rid = (uint32)(pw->pw_uid + 1000);
|
||||
}
|
||||
|
||||
/* absolutely no idea what to do about the unix GID to Domain RID mapping */
|
||||
*g_rid = (uint32)(pw->pw_gid + 1000);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
@ -87,7 +111,7 @@ char *dom_sid_to_string(DOM_SID *sid)
|
||||
(sid->id_auth[2] << 16) +
|
||||
(sid->id_auth[3] << 24);
|
||||
|
||||
sprintf(sidstr, "S-%d-%d", sid->sid_no, ia);
|
||||
sprintf(sidstr, "S-%d-%d", sid->sid_rev_num, ia);
|
||||
|
||||
for (i = 0; i < sid->num_auths; i++)
|
||||
{
|
||||
@ -111,7 +135,7 @@ void make_dom_sid(DOM_SID *sid, char *domsid)
|
||||
if (domsid == NULL)
|
||||
{
|
||||
DEBUG(4,("netlogon domain SID: none\n"));
|
||||
sid->sid_no = 0;
|
||||
sid->sid_rev_num = 0;
|
||||
sid->num_auths = 0;
|
||||
return;
|
||||
}
|
||||
@ -120,13 +144,13 @@ void make_dom_sid(DOM_SID *sid, char *domsid)
|
||||
|
||||
/* assume, but should check, that domsid starts "S-" */
|
||||
p = strtok(domsid+2,"-");
|
||||
sid->sid_no = atoi(p);
|
||||
sid->sid_rev_num = atoi(p);
|
||||
|
||||
/* identauth in decimal should be < 2^32 */
|
||||
/* identauth in hex should be >= 2^32 */
|
||||
identauth = atoi(strtok(0,"-"));
|
||||
|
||||
DEBUG(4,("netlogon rev %d\n", sid->sid_no));
|
||||
DEBUG(4,("netlogon rev %d\n", sid->sid_rev_num));
|
||||
DEBUG(4,("netlogon %s ia %d\n", p, identauth));
|
||||
|
||||
sid->id_auth[0] = 0;
|
||||
@ -144,6 +168,100 @@ void make_dom_sid(DOM_SID *sid, char *domsid)
|
||||
}
|
||||
}
|
||||
|
||||
int make_dom_sids(char *sids_str, DOM_SID *sids, int max_sids)
|
||||
{
|
||||
char *ptr;
|
||||
pstring s2;
|
||||
int count;
|
||||
|
||||
DEBUG(4,("make_dom_sids: %s\n", sids_str));
|
||||
|
||||
if (sids_str == NULL || *sids_str == 0) return 0;
|
||||
|
||||
for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL) && count < max_sids; count++)
|
||||
{
|
||||
make_dom_sid(&sids[count], s2);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* array lookup of well-known RID aliases. the purpose of these escapes me.. */
|
||||
/* XXXX this structure should not have the well-known RID groups added to it,
|
||||
i.e the DOMAIN_GROUP_RID_ADMIN/USER/GUEST. */
|
||||
static struct
|
||||
{
|
||||
uint32 rid;
|
||||
char *rid_name;
|
||||
|
||||
} rid_lookups[] =
|
||||
{
|
||||
{ DOMAIN_ALIAS_RID_ADMINS , "admins" },
|
||||
{ DOMAIN_ALIAS_RID_USERS , "users" },
|
||||
{ DOMAIN_ALIAS_RID_GUESTS , "guests" },
|
||||
{ DOMAIN_ALIAS_RID_POWER_USERS , "power_users" },
|
||||
|
||||
{ DOMAIN_ALIAS_RID_ACCOUNT_OPS , "account_ops" },
|
||||
{ DOMAIN_ALIAS_RID_SYSTEM_OPS , "system_ops" },
|
||||
{ DOMAIN_ALIAS_RID_PRINT_OPS , "print_ops" },
|
||||
{ DOMAIN_ALIAS_RID_BACKUP_OPS , "backup_ops" },
|
||||
{ DOMAIN_ALIAS_RID_REPLICATOR , "replicator" },
|
||||
{ 0 , NULL }
|
||||
};
|
||||
|
||||
int make_dom_gids(char *gids_str, DOM_GID *gids)
|
||||
{
|
||||
char *ptr;
|
||||
pstring s2;
|
||||
int count;
|
||||
|
||||
DEBUG(4,("make_dom_gids: %s\n", gids_str));
|
||||
|
||||
if (gids_str == NULL || *gids_str == 0) return 0;
|
||||
|
||||
for (count = 0, ptr = gids_str; next_token(&ptr, s2, NULL) && count < LSA_MAX_GROUPS; count++)
|
||||
{
|
||||
/* the entries are of the form GID/ATTR, ATTR being optional.*/
|
||||
char *attr;
|
||||
uint32 rid = 0;
|
||||
int i;
|
||||
|
||||
attr = strchr(s2,'/');
|
||||
if (attr) *attr++ = 0;
|
||||
if (!attr || !*attr) attr = "7"; /* default value for attribute is 7 */
|
||||
|
||||
/* look up the RID string and see if we can turn it into a rid number */
|
||||
for (i = 0; rid_lookups[i].rid_name != NULL; i++)
|
||||
{
|
||||
if (strequal(rid_lookups[i].rid_name, s2))
|
||||
{
|
||||
rid = rid_lookups[i].rid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (rid == 0) rid = atoi(s2);
|
||||
|
||||
if (rid == 0)
|
||||
{
|
||||
DEBUG(1,("make_dom_gids: unknown well-known alias RID %s/%s\n",
|
||||
s2, attr));
|
||||
count--;
|
||||
}
|
||||
else
|
||||
{
|
||||
gids[count].g_rid = rid;
|
||||
gids[count].attr = atoi(attr);
|
||||
|
||||
DEBUG(5,("group id: %d attr: %d\n",
|
||||
gids[count].g_rid,
|
||||
gids[count].attr));
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void create_rpc_reply(RPC_HDR *hdr, uint32 call_id, int data_len)
|
||||
{
|
||||
if (hdr == NULL) return;
|
||||
|
@ -73,9 +73,9 @@ char* smb_io_dom_sid(BOOL io, DOM_SID *sid, char *q, char *base, int align, int
|
||||
|
||||
q = align_offset(q, base, align);
|
||||
|
||||
DBG_RW_IVAL("num_auths ", depth, base, io, q, sid->num_auths); q += 4;
|
||||
DBG_RW_CVAL("sid_no ", depth, base, io, q, sid->sid_no); q++;
|
||||
DBG_RW_CVAL("num_auths ", depth, base, io, q, sid->num_auths); q++;
|
||||
DBG_RW_IVAL("num_auths ", depth, base, io, q, sid->num_auths); q += 4;
|
||||
DBG_RW_CVAL("sid_rev_num", depth, base, io, q, sid->sid_rev_num); q++;
|
||||
DBG_RW_CVAL("num_auths ", depth, base, io, q, sid->num_auths); q++;
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
@ -487,8 +487,8 @@ char* smb_io_gid(BOOL io, DOM_GID *gid, char *q, char *base, int align, int dept
|
||||
|
||||
q = align_offset(q, base, align);
|
||||
|
||||
DBG_RW_IVAL("gid ", depth, base, io, q, gid->gid ); q += 4;
|
||||
DBG_RW_IVAL("attr", depth, base, io, q, gid->attr); q += 4;
|
||||
DBG_RW_IVAL("g_rid", depth, base, io, q, gid->g_rid); q += 4;
|
||||
DBG_RW_IVAL("attr ", depth, base, io, q, gid->attr ); q += 4;
|
||||
|
||||
return q;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user