[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