[SCM] Samba Shared Repository - branch v3-4-test updated - release-4-0-0alpha7-1028-g7303efa

Günther Deschner gd at samba.org
Mon May 18 21:33:09 GMT 2009


The branch, v3-4-test has been updated
       via  7303efac8438c17290d66ef48ba6321e57b7bdf9 (commit)
       via  0792ff10d5d7379bd5da81a05c642db1e66c6f4b (commit)
       via  53324b397ed17a08eb093c8f98e8d645da68aac5 (commit)
       via  e3be289df092f3b16bdd06904cd543920e3da307 (commit)
       via  0f6e4c62c97e983a99ff2c917b0c7f2db3ca289b (commit)
      from  cb49ceb25d8be05148e3081a73f8db10915963f0 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test


- Log -----------------------------------------------------------------
commit 7303efac8438c17290d66ef48ba6321e57b7bdf9
Author: Günther Deschner <gd at samba.org>
Date:   Mon May 18 21:05:08 2009 +0200

    s3-lsa: let _lsa_GetSystemAccessAccount() call into _lsa_EnumPrivsAccount().
    
    Inspired by lsa server from Samba 4.
    
    Just removing a user in SAMR does not remove a user in LSA. If you use
    usermanager from windows, the "User Rights" management gui gets unaccessable as
    soon as you delete a user that had privileges granted. With this fix, that
    no longer existing user would properly appear as an unknown account in the GUI
    (as it does while using usermanager with windows domains).
    
    This almost makes Samba3 pass the RPC-SAMR-USERS-PRIVILEGES test.
    
    Guenther
    (cherry picked from commit 6ab0c83570b2e60e0cd3bd5f5bfb1923fd359994)

commit 0792ff10d5d7379bd5da81a05c642db1e66c6f4b
Author: Günther Deschner <gd at samba.org>
Date:   Mon May 18 21:00:29 2009 +0200

    s3-lsa: start a very basic implementation of _lsa_DeleteObject().
    
    Certainly not the full story but this gets us closer to pass the
    RPC-SAMR-USERS-PRIVILEGES test.
    
    Guenther
    (cherry picked from commit 4724fef8979c3f0e66cb8e41936af270901093b4)

commit 53324b397ed17a08eb093c8f98e8d645da68aac5
Author: Günther Deschner <gd at samba.org>
Date:   Mon May 18 19:37:13 2009 +0200

    s4-smbtorture: add RPC-SAMR-USERS-PRIVILEGES test.
    
    This test demonstrates the independence of the lsa and samr accounts while
    remove a samr users that still has privileges granted.
    
    Guenther
    (cherry picked from commit 0a9049be872a0eaf56c1449f8b362b6d91dd781b)

commit e3be289df092f3b16bdd06904cd543920e3da307
Author: Günther Deschner <gd at samba.org>
Date:   Sat May 16 01:22:28 2009 +0200

    s3-privileges: add privilege_delete_account().
    
    Guenther
    (cherry picked from commit dccecdf33850ec4d763b8b0e7ba7be7a8eb873de)

commit 0f6e4c62c97e983a99ff2c917b0c7f2db3ca289b
Author: Günther Deschner <gd at samba.org>
Date:   Sat May 16 01:21:08 2009 +0200

    s3-privileges: remove trailing whitespace from privileges codes.
    
    Guenther
    (cherry picked from commit 118f343b05ba86a1f8fd28394433aa6e961e2d6c)

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h         |    1 +
 source3/lib/privileges.c        |  118 +++++++-----
 source3/lib/privileges_basic.c  |  120 ++++++------
 source3/rpc_server/srv_lsa_nt.c |   50 +++++-
 source4/torture/rpc/rpc.c       |    1 +
 source4/torture/rpc/samr.c      |  395 ++++++++++++++++++++++++++++++++++++++-
 6 files changed, 567 insertions(+), 118 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 99cd1aa..5d81c76 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -604,6 +604,7 @@ bool revoke_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask);
 bool revoke_all_privileges( DOM_SID *sid );
 bool revoke_privilege_by_name(DOM_SID *sid, const char *name);
 NTSTATUS privilege_create_account(const DOM_SID *sid );
+NTSTATUS privilege_delete_account(const struct dom_sid *sid);
 NTSTATUS privilege_set_init(PRIVILEGE_SET *priv_set);
 NTSTATUS privilege_set_init_by_ctx(TALLOC_CTX *mem_ctx, PRIVILEGE_SET *priv_set);
 void privilege_set_free(PRIVILEGE_SET *priv_set);
diff --git a/source3/lib/privileges.c b/source3/lib/privileges.c
index c1bb783..c8be360 100644
--- a/source3/lib/privileges.c
+++ b/source3/lib/privileges.c
@@ -5,22 +5,22 @@
    Copyright (C) Simo Sorce			2002-2003
    Copyright (C) Gerald (Jerry) Carter          2005
    Copyright (C) Michael Adam			2007
-   
+
    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
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
- 
+
 #include "includes.h"
 
 #define PRIVPREFIX              "PRIV_"
@@ -44,28 +44,28 @@ static bool get_privileges( const DOM_SID *sid, SE_PRIV *mask )
 	TDB_DATA data;
 
 	/* Fail if the admin has not enable privileges */
-	
+
 	if ( !lp_enable_privileges() ) {
 		return False;
 	}
-	
+
 	if ( db == NULL )
 		return False;
 
 	/* PRIV_<SID> (NULL terminated) as the key */
-	
+
 	fstr_sprintf(keystr, "%s%s", PRIVPREFIX, sid_to_fstring(tmp, sid));
 
 	data = dbwrap_fetch_bystring( db, talloc_tos(), keystr );
-	
+
 	if ( !data.dptr ) {
 		DEBUG(3, ("get_privileges: No privileges assigned to SID "
 			  "[%s]\n", sid_string_dbg(sid)));
 		return False;
 	}
-	
+
 	SMB_ASSERT( data.dsize == sizeof( SE_PRIV ) );
-	
+
 	se_priv_copy( mask, (SE_PRIV*)data.dptr );
 	TALLOC_FREE(data.dptr);
 
@@ -81,7 +81,7 @@ static bool set_privileges( const DOM_SID *sid, SE_PRIV *mask )
 	struct db_context *db = get_account_pol_db();
 	fstring tmp, keystr;
 	TDB_DATA data;
-	
+
 	if ( !lp_enable_privileges() )
 		return False;
 
@@ -94,11 +94,11 @@ static bool set_privileges( const DOM_SID *sid, SE_PRIV *mask )
 	}
 
 	/* PRIV_<SID> (NULL terminated) as the key */
-	
+
 	fstr_sprintf(keystr, "%s%s", PRIVPREFIX, sid_to_fstring(tmp, sid));
-	
+
 	/* no packing.  static size structure, just write it out */
-	
+
 	data.dptr  = (uint8 *)mask;
 	data.dsize = sizeof(SE_PRIV);
 
@@ -117,7 +117,7 @@ bool get_privileges_for_sids(SE_PRIV *privileges, DOM_SID *slist, int scount)
 	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 */
 
@@ -127,7 +127,7 @@ bool get_privileges_for_sids(SE_PRIV *privileges, DOM_SID *slist, int scount)
 		DEBUG(5,("get_privileges_for_sids: sid = %s\nPrivilege "
 			 "set:\n", sid_string_dbg(&slist[i])));
 		dump_se_priv( DBGC_ALL, 5, &mask );
-			
+
 		se_priv_add( privileges, &mask );
 		found = True;
 	}
@@ -146,9 +146,9 @@ static int priv_traverse_fn(struct db_record *rec, void *state)
 	int  prefixlen = strlen(PRIVPREFIX);
 	DOM_SID sid;
 	fstring sid_string;
-	
+
 	/* easy check first */
-	
+
 	if (rec->value.dsize != sizeof(SE_PRIV) )
 		return 0;
 
@@ -156,21 +156,21 @@ static int priv_traverse_fn(struct db_record *rec, void *state)
 
 	if ( strncmp((char *)rec->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*)rec->value.dptr );
-		
-		/* if the SID does not have the specified privilege 
+
+		/* if the SID does not have the specified privilege
 		   then just return */
-		   
+
 		if ( !is_privilege_assigned( &mask, &priv->privilege) )
 			return 0;
 	}
-		
+
 	fstrcpy( sid_string, (char *)&(rec->key.dptr[strlen(PRIVPREFIX)]) );
 
 	/* this is a last ditch safety check to preventing returning
@@ -191,7 +191,7 @@ static int priv_traverse_fn(struct db_record *rec, void *state)
 	{
 		return 0;
 	}
-	
+
 	return 0;
 }
 
@@ -203,7 +203,7 @@ NTSTATUS privilege_enumerate_accounts(DOM_SID **sids, int *num_sids)
 {
 	struct db_context *db = get_account_pol_db();
 	PRIV_SID_LIST priv;
-	
+
 	if (db == NULL) {
 		return NT_STATUS_ACCESS_DENIED;
 	}
@@ -215,7 +215,7 @@ NTSTATUS privilege_enumerate_accounts(DOM_SID **sids, int *num_sids)
 	db->traverse_read(db, priv_traverse_fn, &priv);
 
 	/* give the memory away; caller will free */
-	
+
 	*sids      = priv.sids.list;
 	*num_sids  = priv.sids.count;
 
@@ -258,7 +258,7 @@ NTSTATUS privilege_enum_sids(const SE_PRIV *mask, TALLOC_CTX *mem_ctx,
 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 );
 
@@ -270,13 +270,13 @@ bool grant_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask)
 	se_priv_add( &new_mask, priv_mask );
 
 	DEBUG(10,("grant_privilege: %s\n", sid_string_dbg(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 );
 }
 
@@ -304,22 +304,22 @@ bool grant_privilege_by_name(DOM_SID *sid, const char *name)
 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_dbg(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 );
 }
 
@@ -359,14 +359,42 @@ NTSTATUS privilege_create_account(const DOM_SID *sid )
 	return ( grant_privilege(sid, &se_priv_none) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL);
 }
 
+/***************************************************************************
+ Delete a privileged account
+****************************************************************************/
+
+NTSTATUS privilege_delete_account(const struct dom_sid *sid)
+{
+	struct db_context *db = get_account_pol_db();
+	fstring tmp, keystr;
+
+	if (!lp_enable_privileges()) {
+		return NT_STATUS_OK;
+	}
+
+	if (!db) {
+		return NT_STATUS_INVALID_HANDLE;
+	}
+
+	if (!sid || (sid->num_auths == 0)) {
+		return NT_STATUS_INVALID_SID;
+	}
+
+	/* PRIV_<SID> (NULL terminated) as the key */
+
+	fstr_sprintf(keystr, "%s%s", PRIVPREFIX, sid_to_fstring(tmp, sid));
+
+	return dbwrap_delete_bystring(db, keystr);
+}
+
 /****************************************************************************
- initialise a privilege list and set the talloc context 
+ 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");
@@ -381,13 +409,13 @@ NTSTATUS privilege_set_init(PRIVILEGE_SET *priv_set)
 }
 
 /****************************************************************************
-  initialise a privilege list and with someone else's talloc context 
+  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;
 
@@ -435,7 +463,7 @@ NTSTATUS dup_luid_attr(TALLOC_CTX *mem_ctx, LUID_ATTR **new_la, LUID_ATTR *old_l
 		(*new_la)[i].luid.low = old_la[i].luid.low;
 		(*new_la)[i].attr = old_la[i].attr;
 	}
-	
+
 	return NT_STATUS_OK;
 }
 
@@ -445,7 +473,7 @@ NTSTATUS dup_luid_attr(TALLOC_CTX *mem_ctx, LUID_ATTR **new_la, LUID_ATTR *old_l
 bool is_privileged_sid( const DOM_SID *sid )
 {
 	SE_PRIV mask;
-	
+
 	return get_privileges( sid, &mask );
 }
 
@@ -459,6 +487,6 @@ bool grant_all_privileges( const DOM_SID *sid )
 	if (!se_priv_put_all_privileges(&mask)) {
 		return False;
 	}
-	
+
 	return grant_privilege( sid, &mask );
 }
diff --git a/source3/lib/privileges_basic.c b/source3/lib/privileges_basic.c
index 865c1f6..323983b 100644
--- a/source3/lib/privileges_basic.c
+++ b/source3/lib/privileges_basic.c
@@ -5,23 +5,23 @@
    Copyright (C) Simo Sorce			2002-2003
    Copyright (C) Gerald (Jerry) Carter          2005
    Copyright (C) Michael Adam			2007
-   
+
    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
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 /*
- * Basic privileges functions (mask-operations and conversion 
+ * Basic privileges functions (mask-operations and conversion
  * functions between the different formats (se_priv, privset, luid)
  * moved here * from lib/privileges.c to minimize linker deps.
  *
@@ -29,7 +29,7 @@
  *
  * some extra functions to hide privs array from lib/privileges.c
  */
- 
+
 #include "includes.h"
 
 const SE_PRIV se_priv_all         = SE_ALL_PRIVS;
@@ -49,7 +49,7 @@ const SE_PRIV se_take_ownership  = SE_TAKE_OWNERSHIP;
 
 /********************************************************************
  This is a list of privileges reported by a WIndows 2000 SP4 AD DC
- just for reference purposes (and I know the LUID is not guaranteed 
+ just for reference purposes (and I know the LUID is not guaranteed
  across reboots):
 
             SeCreateTokenPrivilege  Create a token object ( 0x0, 0x2 )
@@ -87,11 +87,11 @@ const SE_PRIV se_take_ownership  = SE_TAKE_OWNERSHIP;
 /* we have to define the LUID here due to a horrible check by printmig.exe
    that requires the SeBackupPrivilege match what is in Windows.  So match
    those that we implement and start Samba privileges at 0x1001 */
-   
+
 PRIVS privs[] = {
-#if 0	/* usrmgr will display these twice if you include them.  We don't 
+#if 0	/* usrmgr will display these twice if you include them.  We don't
 	   use them but we'll keep the bitmasks reserved in privileges.h anyways */
-	   
+
 	{SE_NETWORK_LOGON,	"SeNetworkLogonRight",		"Access this computer from network", 	   { 0x0, 0x0 }},
 	{SE_INTERACTIVE_LOGON,	"SeInteractiveLogonRight",	"Log on locally", 			   { 0x0, 0x0 }},
 	{SE_BATCH_LOGON,	"SeBatchLogonRight",		"Log on as a batch job",		   { 0x0, 0x0 }},
@@ -102,7 +102,7 @@ PRIVS privs[] = {
         {SE_BACKUP,             "SeBackupPrivilege",            "Back up files and directories",	   { 0x0, 0x0011 }},
         {SE_RESTORE,            "SeRestorePrivilege",           "Restore files and directories",	   { 0x0, 0x0012 }},
 	{SE_REMOTE_SHUTDOWN,	"SeRemoteShutdownPrivilege",	"Force shutdown from a remote system",	   { 0x0, 0x0018 }},
-	
+
 	{SE_PRINT_OPERATOR,	"SePrintOperatorPrivilege",	"Manage printers",			   { 0x0, 0x1001 }},
 	{SE_ADD_USERS,		"SeAddUsersPrivilege",		"Add users and groups to the domain",	   { 0x0, 0x1002 }},
 	{SE_DISK_OPERATOR,	"SeDiskOperatorPrivilege",	"Manage disk shares",			   { 0x0, 0x1003 }},
@@ -118,9 +118,9 @@ bool se_priv_copy( SE_PRIV *dst, const SE_PRIV *src )
 {
 	if ( !dst || !src )
 		return False;
-		
+
 	memcpy( dst, src, sizeof(SE_PRIV) );
-	
+
 	return True;
 }
 
@@ -137,7 +137,7 @@ bool se_priv_put_all_privileges(SE_PRIV *mask)
 		return False;
 	}
 	for ( i=0; i<num_privs; i++ ) {
-		se_priv_add(mask, &privs[i].se_priv); 
+		se_priv_add(mask, &privs[i].se_priv);
 	}
 	return True;
 }
@@ -156,12 +156,12 @@ void se_priv_add( SE_PRIV *mask, const SE_PRIV *addpriv )
 }
 
 /***************************************************************************
- remove one SE_PRIV sytucture from another and store the resulting set 
+ remove one SE_PRIV sytucture from another and store the resulting set
  in mew_mask
 ****************************************************************************/
 
 void se_priv_remove( SE_PRIV *mask, const SE_PRIV *removepriv )
-{	
+{
 	int i;
 
 	for ( i=0; i<SE_PRIV_MASKSIZE; i++ ) {
@@ -174,9 +174,9 @@ void se_priv_remove( SE_PRIV *mask, const SE_PRIV *removepriv )
 ****************************************************************************/
 
 static void se_priv_invert( SE_PRIV *new_mask, const SE_PRIV *mask )
-{	
+{
 	SE_PRIV allprivs;
-	
+
 	se_priv_copy( &allprivs, &se_priv_all );
 	se_priv_remove( &allprivs, mask );
 	se_priv_copy( new_mask, &allprivs );
@@ -187,7 +187,7 @@ static void se_priv_invert( SE_PRIV *new_mask, const SE_PRIV *mask )
 ****************************************************************************/
 
 bool se_priv_equal( const SE_PRIV *mask1, const SE_PRIV *mask2 )
-{	
+{
 	return ( memcmp(mask1, mask2, sizeof(SE_PRIV)) == 0 );
 }
 
@@ -199,18 +199,18 @@ static bool se_priv_empty( const SE_PRIV *mask )
 {
 	SE_PRIV p1;
 	int i;
-	
+
 	se_priv_copy( &p1, mask );
 
 	for ( i=0; i<SE_PRIV_MASKSIZE; i++ ) {
 		p1.mask[i] &= se_priv_all.mask[i];
 	}
-	
+
 	return se_priv_equal( &p1, &se_priv_none );
 }
 
 /*********************************************************************
- Lookup the SE_PRIV value for a privilege name 
+ Lookup the SE_PRIV value for a privilege name
 *********************************************************************/
 
 bool se_priv_from_name( const char *name, SE_PRIV *mask )
@@ -234,13 +234,13 @@ bool se_priv_from_name( const char *name, SE_PRIV *mask )
 void dump_se_priv( int dbg_cl, int dbg_lvl, const SE_PRIV *mask )
 {
 	int i;
-	
+
 	DEBUGADDC( dbg_cl, dbg_lvl,("SE_PRIV "));
-	
+
 	for ( i=0; i<SE_PRIV_MASKSIZE; i++ ) {
 		DEBUGADDC( dbg_cl, dbg_lvl,(" 0x%x", mask->mask[i] ));
 	}
-		
+
 	DEBUGADDC( dbg_cl, dbg_lvl, ("\n"));
 }
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list