📄 util_sid.c
字号:
*rid = sid->sub_auths[sid->num_auths]; return True; } return False;}/***************************************************************** Return the last rid from the end of a sid*****************************************************************/ BOOL sid_peek_rid(const DOM_SID *sid, uint32 *rid){ if (!sid || !rid) return False; if (sid->num_auths > 0) { *rid = sid->sub_auths[sid->num_auths - 1]; return True; } return False;}/***************************************************************** Return the last rid from the end of a sid and check the sid against the exp_dom_sid *****************************************************************/ BOOL sid_peek_check_rid(const DOM_SID *exp_dom_sid, const DOM_SID *sid, uint32 *rid){ if (!exp_dom_sid || !sid || !rid) return False; if (sid->num_auths != (exp_dom_sid->num_auths+1)) { return False; } if (sid_compare_domain(exp_dom_sid, sid)!=0){ *rid=(-1); return False; } return sid_peek_rid(sid, rid);}/***************************************************************** Copies a sid*****************************************************************/ void sid_copy(DOM_SID *dst, const DOM_SID *src){ int i; ZERO_STRUCTP(dst); dst->sid_rev_num = src->sid_rev_num; dst->num_auths = src->num_auths; memcpy(&dst->id_auth[0], &src->id_auth[0], sizeof(src->id_auth)); for (i = 0; i < src->num_auths; i++) dst->sub_auths[i] = src->sub_auths[i];}/***************************************************************** Write a sid out into on-the-wire format.*****************************************************************/ BOOL sid_linearize(char *outbuf, size_t len, const DOM_SID *sid){ size_t i; if (len < sid_size(sid)) return False; SCVAL(outbuf,0,sid->sid_rev_num); SCVAL(outbuf,1,sid->num_auths); memcpy(&outbuf[2], sid->id_auth, 6); for(i = 0; i < sid->num_auths; i++) SIVAL(outbuf, 8 + (i*4), sid->sub_auths[i]); return True;}/***************************************************************** Parse a on-the-wire SID to a DOM_SID.*****************************************************************/ BOOL sid_parse(const char *inbuf, size_t len, DOM_SID *sid){ int i; if (len < 8) return False; ZERO_STRUCTP(sid); sid->sid_rev_num = CVAL(inbuf, 0); sid->num_auths = CVAL(inbuf, 1); memcpy(sid->id_auth, inbuf+2, 6); if (len < 8 + sid->num_auths*4) return False; for (i=0;i<sid->num_auths;i++) sid->sub_auths[i] = IVAL(inbuf, 8+i*4); return True;}/***************************************************************** Compare the auth portion of two sids.*****************************************************************/ static int sid_compare_auth(const DOM_SID *sid1, const DOM_SID *sid2){ int i; if (sid1 == sid2) return 0; if (!sid1) return -1; if (!sid2) return 1; if (sid1->sid_rev_num != sid2->sid_rev_num) return sid1->sid_rev_num - sid2->sid_rev_num; for (i = 0; i < 6; i++) if (sid1->id_auth[i] != sid2->id_auth[i]) return sid1->id_auth[i] - sid2->id_auth[i]; return 0;}/***************************************************************** Compare two sids.*****************************************************************/ int sid_compare(const DOM_SID *sid1, const DOM_SID *sid2){ int i; if (sid1 == sid2) return 0; if (!sid1) return -1; if (!sid2) return 1; /* Compare most likely different rids, first: i.e start at end */ if (sid1->num_auths != sid2->num_auths) return sid1->num_auths - sid2->num_auths; for (i = sid1->num_auths-1; i >= 0; --i) if (sid1->sub_auths[i] != sid2->sub_auths[i]) return sid1->sub_auths[i] - sid2->sub_auths[i]; return sid_compare_auth(sid1, sid2);}/***************************************************************** See if 2 SIDs are in the same domain this just compares the leading sub-auths*****************************************************************/ int sid_compare_domain(const DOM_SID *sid1, const DOM_SID *sid2){ int n, i; n = MIN(sid1->num_auths, sid2->num_auths); for (i = n-1; i >= 0; --i) if (sid1->sub_auths[i] != sid2->sub_auths[i]) return sid1->sub_auths[i] - sid2->sub_auths[i]; return sid_compare_auth(sid1, sid2);}/***************************************************************** Compare two sids.*****************************************************************/ BOOL sid_equal(const DOM_SID *sid1, const DOM_SID *sid2){ return sid_compare(sid1, sid2) == 0;}/***************************************************************** Check if the SID is the builtin SID (S-1-5-32).*****************************************************************/ BOOL sid_check_is_builtin(const DOM_SID *sid){ return sid_equal(sid, &global_sid_Builtin);}/***************************************************************** Check if the SID is one of the builtin SIDs (S-1-5-32-a).*****************************************************************/ BOOL sid_check_is_in_builtin(const DOM_SID *sid){ DOM_SID dom_sid; uint32 rid; sid_copy(&dom_sid, sid); sid_split_rid(&dom_sid, &rid); return sid_equal(&dom_sid, &global_sid_Builtin);}/***************************************************************** Calculates size of a sid.*****************************************************************/ size_t sid_size(const DOM_SID *sid){ if (sid == NULL) return 0; return sid->num_auths * sizeof(uint32) + 8;}/***************************************************************** Returns true if SID is internal (and non-mappable).*****************************************************************/BOOL non_mappable_sid(DOM_SID *sid){ DOM_SID dom; uint32 rid; sid_copy(&dom, sid); sid_split_rid(&dom, &rid); if (sid_equal(&dom, &global_sid_Builtin)) return True; if (sid_equal(&dom, &global_sid_NT_Authority)) return True; return False;}/***************************************************************** Return the binary string representation of a DOM_SID. Caller must free.*****************************************************************/char *sid_binstring(const DOM_SID *sid){ char *buf, *s; int len = sid_size(sid); buf = SMB_MALLOC(len); if (!buf) return NULL; sid_linearize(buf, len, sid); s = binary_string(buf, len); free(buf); return s;}/******************************************************************* Tallocs a duplicate SID. ********************************************************************/ DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, const DOM_SID *src){ DOM_SID *dst; if(!src) return NULL; if((dst = TALLOC_ZERO_P(ctx, DOM_SID)) != NULL) { sid_copy( dst, src); } return dst;}/******************************************************************** Add SID to an array SIDs********************************************************************/void add_sid_to_array(TALLOC_CTX *mem_ctx, const DOM_SID *sid, DOM_SID **sids, size_t *num){ if (mem_ctx != NULL) *sids = TALLOC_REALLOC_ARRAY(mem_ctx, *sids, DOM_SID, (*num)+1); else *sids = SMB_REALLOC_ARRAY(*sids, DOM_SID, (*num)+1); if (*sids == NULL) return; sid_copy(&((*sids)[*num]), sid); *num += 1; return;}/******************************************************************** Add SID to an array SIDs ensuring that it is not already there********************************************************************/void add_sid_to_array_unique(TALLOC_CTX *mem_ctx, const DOM_SID *sid, DOM_SID **sids, size_t *num_sids){ size_t i; for (i=0; i<(*num_sids); i++) { if (sid_compare(sid, &(*sids)[i]) == 0) return; } add_sid_to_array(mem_ctx, sid, sids, num_sids);}/******************************************************************** Remove SID from an array********************************************************************/void del_sid_from_array(const DOM_SID *sid, DOM_SID **sids, size_t *num){ DOM_SID *sid_list = *sids; size_t i; for ( i=0; i<*num; i++ ) { /* if we find the SID, then decrement the count and break out of the loop */ if ( sid_equal(sid, &sid_list[i]) ) { *num -= 1; break; } } /* This loop will copy the remainder of the array if i < num of sids ni the array */ for ( ; i<*num; i++ ) sid_copy( &sid_list[i], &sid_list[i+1] ); return;}BOOL is_null_sid(const DOM_SID *sid){ static const DOM_SID null_sid = {0}; return sid_equal(sid, &null_sid);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -