⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 privileges.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************* get a list of all privleges for all sids the in list*********************************************************************/BOOL get_privileges_for_sids(SE_PRIV *privileges, DOM_SID *slist, int scount){	SE_PRIV mask;	int i;	BOOL found = False;	se_priv_copy( privileges, &se_priv_none );		for ( i=0; i<scount; i++ ) {		/* don't add unless we actually have a privilege assigned */		if ( !get_privileges( &slist[i], &mask ) )			continue;		DEBUG(5,("get_privileges_for_sids: sid = %s\nPrivilege set:\n", 			sid_string_static(&slist[i])));		dump_se_priv( DBGC_ALL, 5, &mask );					se_priv_add( privileges, &mask );		found = True;	}	return found;}/********************************************************************* travseral functions for privilege_enumerate_accounts*********************************************************************/static int priv_traverse_fn(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void *state){	PRIV_SID_LIST *priv = state;	int  prefixlen = strlen(PRIVPREFIX);	DOM_SID sid;	fstring sid_string;		/* easy check first */		if ( data.dsize != sizeof(SE_PRIV) )		return 0;	/* check we have a PRIV_+SID entry */	if ( strncmp(key.dptr, PRIVPREFIX, prefixlen) != 0)		return 0;			/* check to see if we are looking for a particular privilege */	if ( !se_priv_equal(&priv->privilege, &se_priv_none) ) {		SE_PRIV mask;				se_priv_copy( &mask, (SE_PRIV*)data.dptr );				/* if the SID does not have the specified privilege 		   then just return */		   		if ( !is_privilege_assigned( &mask, &priv->privilege) )			return 0;	}			fstrcpy( sid_string, &key.dptr[strlen(PRIVPREFIX)] );	/* this is a last ditch safety check to preventing returning	   and invalid SID (i've somehow run into this on development branches) */	if ( strcmp( "S-0-0", sid_string ) == 0 )		return 0;	if ( !string_to_sid(&sid, sid_string) ) {		DEBUG(0,("travsersal_fn_enum__acct: Could not convert SID [%s]\n",			sid_string));		return 0;	}	add_sid_to_array( NULL, &sid, &priv->sids.list, &priv->sids.count );		return 0;}/********************************************************************* Retreive list of privileged SIDs (for _lsa_enumerate_accounts()*********************************************************************/NTSTATUS privilege_enumerate_accounts(DOM_SID **sids, int *num_sids){	TDB_CONTEXT *tdb = get_account_pol_tdb();	PRIV_SID_LIST priv;		ZERO_STRUCT(priv);	se_priv_copy( &priv.privilege, &se_priv_none );	tdb_traverse( tdb, priv_traverse_fn, &priv);	/* give the memory away; caller will free */		*sids      = priv.sids.list;	*num_sids  = priv.sids.count;	return NT_STATUS_OK;}/*************************************************************************** Add privilege to sid****************************************************************************/BOOL grant_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask){	SE_PRIV old_mask, new_mask;		ZERO_STRUCT( old_mask );	ZERO_STRUCT( new_mask );	if ( get_privileges( sid, &old_mask ) )		se_priv_copy( &new_mask, &old_mask );	else		se_priv_copy( &new_mask, &se_priv_none );	se_priv_add( &new_mask, priv_mask );	DEBUG(10,("grant_privilege: %s\n", sid_string_static(sid)));		DEBUGADD( 10, ("original privilege mask:\n"));	dump_se_priv( DBGC_ALL, 10, &old_mask );		DEBUGADD( 10, ("new privilege mask:\n"));	dump_se_priv( DBGC_ALL, 10, &new_mask );		return set_privileges( sid, &new_mask );}/********************************************************************* Add a privilege based on its name*********************************************************************/BOOL grant_privilege_by_name(DOM_SID *sid, const char *name){	int i;	for ( i=0; !se_priv_equal(&privs[i].se_priv, &se_priv_end); i++ ) {		if ( strequal(privs[i].name, name) ) {			return grant_privilege( sid, &privs[i].se_priv );                }        }        DEBUG(3, ("grant_privilege_by_name: No Such Privilege Found (%s)\n", name));        return False;}/*************************************************************************** Remove privilege from sid****************************************************************************/BOOL revoke_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask){	SE_PRIV mask;		/* if the user has no privileges, then we can't revoke any */		if ( !get_privileges( sid, &mask ) )		return True;		DEBUG(10,("revoke_privilege: %s\n", sid_string_static(sid)));		DEBUGADD( 10, ("original privilege mask:\n"));	dump_se_priv( DBGC_ALL, 10, &mask );	se_priv_remove( &mask, priv_mask );		DEBUGADD( 10, ("new privilege mask:\n"));	dump_se_priv( DBGC_ALL, 10, &mask );		return set_privileges( sid, &mask );}/********************************************************************* Revoke all privileges*********************************************************************/BOOL revoke_all_privileges( DOM_SID *sid ){	return revoke_privilege( sid, &se_priv_all );}/********************************************************************* Add a privilege based on its name*********************************************************************/BOOL revoke_privilege_by_name(DOM_SID *sid, const char *name){	int i;	for ( i=0; !se_priv_equal(&privs[i].se_priv, &se_priv_end); i++ ) {		if ( strequal(privs[i].name, name) ) {			return revoke_privilege( sid, &privs[i].se_priv );                }        }        DEBUG(3, ("revoke_privilege_by_name: No Such Privilege Found (%s)\n", name));        return False;}/*************************************************************************** Retrieve the SIDs assigned to a given privilege****************************************************************************/NTSTATUS privilege_create_account(const DOM_SID *sid ){	return ( grant_privilege(sid, &se_priv_none) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL);}/**************************************************************************** initialise a privilege list and set the talloc context  ****************************************************************************/ NTSTATUS privilege_set_init(PRIVILEGE_SET *priv_set){	TALLOC_CTX *mem_ctx;		ZERO_STRUCTP( priv_set );	mem_ctx = talloc_init("privilege set");	if ( !mem_ctx ) {		DEBUG(0,("privilege_set_init: failed to initialize talloc ctx!\n"));		return NT_STATUS_NO_MEMORY;	}	priv_set->mem_ctx = mem_ctx;	return NT_STATUS_OK;}/****************************************************************************  initialise a privilege list and with someone else's talloc context ****************************************************************************/NTSTATUS privilege_set_init_by_ctx(TALLOC_CTX *mem_ctx, PRIVILEGE_SET *priv_set){	ZERO_STRUCTP( priv_set );		priv_set->mem_ctx = mem_ctx;	priv_set->ext_ctx = True;	return NT_STATUS_OK;}/**************************************************************************** Free all memory used by a PRIVILEGE_SET****************************************************************************/void privilege_set_free(PRIVILEGE_SET *priv_set){	if ( !priv_set )		return;	if ( !( priv_set->ext_ctx ) )		talloc_destroy( priv_set->mem_ctx );	ZERO_STRUCTP( priv_set );}/**************************************************************************** duplicate alloc luid_attr ****************************************************************************/NTSTATUS dup_luid_attr(TALLOC_CTX *mem_ctx, LUID_ATTR **new_la, LUID_ATTR *old_la, int count){	int i;	if ( !old_la )		return NT_STATUS_OK;	*new_la = TALLOC_ARRAY(mem_ctx, LUID_ATTR, count);	if ( !*new_la ) {		DEBUG(0,("dup_luid_attr: failed to alloc new LUID_ATTR array [%d]\n", count));		return NT_STATUS_NO_MEMORY;	}	for (i=0; i<count; i++) {		(*new_la)[i].luid.high = old_la[i].luid.high;		(*new_la)[i].luid.low = old_la[i].luid.low;		(*new_la)[i].attr = old_la[i].attr;	}		return NT_STATUS_OK;}/**************************************************************************** Does the user have the specified privilege ?  We only deal with one privilege at a time here.*****************************************************************************/BOOL user_has_privileges(NT_USER_TOKEN *token, const SE_PRIV *privilege){	if ( !token )		return False;	return is_privilege_assigned( &token->privileges, privilege );}/**************************************************************************** Does the user have any of the specified privileges ?  We only deal with one privilege at a time here.*****************************************************************************/BOOL user_has_any_privilege(NT_USER_TOKEN *token, const SE_PRIV *privilege){	if ( !token )		return False;	return is_any_privilege_assigned( &token->privileges, privilege );}/**************************************************************************** Convert a LUID to a named string****************************************************************************/char* luid_to_privilege_name(const LUID *set){	static fstring name;	int i;	if (set->high != 0)		return NULL;	for ( i=0; !se_priv_equal(&privs[i].se_priv, &se_priv_end); i++ ) {		if ( set->low == privs[i].luid.low ) {			fstrcpy( name, privs[i].name );			return name;		}	}		return NULL;}/******************************************************************* return the number of elements in the privlege array*******************************************************************/int count_all_privileges( void ){	static int count;		if ( count )		return count;	/* loop over the array and count it */		for ( count=0; !se_priv_equal(&privs[count].se_priv, &se_priv_end); count++ ) ;	return count;}/**************************************************************************************************************************************/BOOL se_priv_to_privilege_set( PRIVILEGE_SET *set, SE_PRIV *mask ){	int i;	uint32 num_privs = count_all_privileges();	LUID_ATTR luid;		luid.attr = 0;	luid.luid.high = 0;		for ( i=0; i<num_privs; i++ ) {		if ( !is_privilege_assigned(mask, &privs[i].se_priv) )			continue;				luid.luid = privs[i].luid;				if ( !privilege_set_add( set, luid ) )			return False;	}	return True;}/**************************************************************************************************************************************/static BOOL luid_to_se_priv( LUID *luid, SE_PRIV *mask ){	int i;	uint32 num_privs = count_all_privileges();		for ( i=0; i<num_privs; i++ ) {		if ( luid->low == privs[i].luid.low ) {			se_priv_copy( mask, &privs[i].se_priv );			return True;		}	}	return False;}/**************************************************************************************************************************************/BOOL privilege_set_to_se_priv( SE_PRIV *mask, PRIVILEGE_SET *privset ){	int i;		ZERO_STRUCTP( mask );		for ( i=0; i<privset->count; i++ ) {		SE_PRIV r;			/* sanity check for invalid privilege.  we really		   only care about the low 32 bits */		   		if ( privset->set[i].luid.high != 0 )			return False;				if ( luid_to_se_priv( &privset->set[i].luid, &r ) )					se_priv_add( mask, &r );	}	return True;}/**************************************************************************************************************************************/BOOL is_privileged_sid( DOM_SID *sid ){	SE_PRIV mask;		return get_privileges( sid, &mask );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -