r4419: move security_token stuff to the libcli/security/
authorStefan Metzmacher <metze@samba.org>
Thu, 30 Dec 2004 20:34:20 +0000 (20:34 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:07:47 +0000 (13:07 -0500)
and debug privileges

metze
(This used to be commit c981808ed4cfa63c7ba7c4f9190b6b14f74bab40)

source4/auth/auth_util.c
source4/dsdb/samdb/samdb_privilege.c
source4/include/smb.h
source4/libcli/security/access_check.c
source4/libcli/security/dom_sid.c
source4/libcli/security/privilege.c
source4/libcli/security/security.h [new file with mode: 0644]
source4/libcli/security/security_descriptor.c
source4/libcli/security/security_token.c
source4/ntvfs/unixuid/vfs_unixuid.c
source4/utils/ntlm_auth.c

index 9af4410a93a63f0927e27d6e428d0d8e142e31f6..04c36143ddcffa80e7f27a5f3e338643ed4a4a5b 100644 (file)
@@ -24,7 +24,7 @@
 #include "includes.h"
 #include "librpc/gen_ndr/ndr_samr.h"
 #include "librpc/gen_ndr/ndr_netlogon.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 #include "auth/auth.h"
 
 #undef DBGC_CLASS
@@ -297,121 +297,7 @@ BOOL make_user_info_guest(TALLOC_CTX *mem_ctx,
        return NT_STATUS_IS_OK(nt_status) ? True : False;
 }
 
-/****************************************************************************
- prints a struct security_token to debug output.
-****************************************************************************/
-void debug_security_token(int dbg_class, int dbg_lev, const struct security_token *token)
-{
-       TALLOC_CTX *mem_ctx;
-
-       size_t     i;
-       
-       if (!token) {
-               DEBUGC(dbg_class, dbg_lev, ("Security token: (NULL)\n"));
-               return;
-       }
-       
-       mem_ctx = talloc_init("debug_security_token()");
-       if (!mem_ctx) {
-               return;
-       }
-
-       DEBUGC(dbg_class, dbg_lev, ("Security token of user %s\n",
-                                   dom_sid_string(mem_ctx, token->user_sid) ));
-       DEBUGADDC(dbg_class, dbg_lev, ("contains %lu SIDs\n", 
-                                      (unsigned long)token->num_sids));
-       for (i = 0; i < token->num_sids; i++) {
-               DEBUGADDC(dbg_class, dbg_lev, 
-                         ("SID[%3lu]: %s\n", (unsigned long)i, 
-                          dom_sid_string(mem_ctx, token->sids[i])));
-       }
-
-       talloc_destroy(mem_ctx);
-}
-
-/****************************************************************************
- prints a struct auth_session_info security token to debug output.
-****************************************************************************/
-void debug_session_info(int dbg_class, int dbg_lev, 
-                       const struct auth_session_info *session_info)
-{
-       if (!session_info) {
-               DEBUGC(dbg_class, dbg_lev, ("Session Info: (NULL)\n"));
-               return; 
-       }
 
-       debug_security_token(dbg_class, dbg_lev, session_info->security_token);
-}
-
-/****************************************************************************
- Create the SID list for this user.
-****************************************************************************/
-NTSTATUS create_security_token(TALLOC_CTX *mem_ctx, 
-                              struct dom_sid *user_sid, struct dom_sid *group_sid, 
-                              int n_groupSIDs, struct dom_sid **groupSIDs, 
-                              BOOL is_guest, struct security_token **token)
-{
-       struct security_token *ptoken;
-       int i;
-       NTSTATUS status;
-
-       ptoken = security_token_initialise(mem_ctx);
-       if (ptoken == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       ptoken->sids = talloc_array_p(ptoken, struct dom_sid *, n_groupSIDs + 5);
-       if (!ptoken->sids) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       ptoken->user_sid = user_sid;
-       ptoken->group_sid = group_sid;
-       ptoken->privilege_mask = 0;
-
-       ptoken->sids[0] = user_sid;
-       ptoken->sids[1] = group_sid;
-
-       /*
-        * Finally add the "standard" SIDs.
-        * The only difference between guest and "anonymous" (which we
-        * don't really support) is the addition of Authenticated_Users.
-        */
-       ptoken->sids[2] = dom_sid_parse_talloc(mem_ctx, SID_WORLD);
-       ptoken->sids[3] = dom_sid_parse_talloc(mem_ctx, SID_NT_NETWORK);
-       ptoken->sids[4] = dom_sid_parse_talloc(mem_ctx, 
-                                              is_guest?SID_BUILTIN_GUESTS:
-                                              SID_NT_AUTHENTICATED_USERS);
-       ptoken->num_sids = 5;
-
-       for (i = 0; i < n_groupSIDs; i++) {
-               size_t check_sid_idx;
-               for (check_sid_idx = 1; 
-                    check_sid_idx < ptoken->num_sids; 
-                    check_sid_idx++) {
-                       if (dom_sid_equal(ptoken->sids[check_sid_idx], groupSIDs[i])) {
-                               break;
-                       }
-               }
-               
-               if (check_sid_idx == ptoken->num_sids) {
-                       ptoken->sids[ptoken->num_sids++] = groupSIDs[i];
-               }
-       }
-
-       /* setup the privilege mask for this token */
-       status = samdb_privilege_setup(ptoken);
-       if (!NT_STATUS_IS_OK(status)) {
-               talloc_free(ptoken);
-               return status;
-       }
-       
-       debug_security_token(DBGC_AUTH, 10, ptoken);
-       
-       *token = ptoken;
-
-       return NT_STATUS_OK;
-}
 
 /***************************************************************************
  Make a user_info struct
@@ -640,7 +526,7 @@ NTSTATUS make_session_info(TALLOC_CTX *mem_ctx,
 
        /* we should search for local groups here */
        
-       nt_status = create_security_token((*session_info), 
+       nt_status = security_token_create((*session_info), 
                                          server_info->user_sid, 
                                          server_info->primary_group_sid, 
                                          server_info->n_domain_groups, 
@@ -662,6 +548,20 @@ void free_session_info(struct auth_session_info **session_info)
        *session_info = NULL;
 }
 
+/****************************************************************************
+ prints a struct auth_session_info security token to debug output.
+****************************************************************************/
+void auth_session_info_debug(int dbg_lev, 
+                            const struct auth_session_info *session_info)
+{
+       if (!session_info) {
+               DEBUGC(dbg_class, dbg_lev, ("Session Info: (NULL)\n"));
+               return; 
+       }
+
+       security_token_debug(dbg_lev, session_info->security_token);
+}
+
 /**
  * Squash an NT_STATUS in line with security requirements.
  * In an attempt to avoid giving the whole game away when users
index 9fb20a84dce1143c3b7d060ec676394e07c26d28..2a57ff0d7425445e72cc878e3f980fcc1a985990 100644 (file)
@@ -21,7 +21,7 @@
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 #include "lib/ldb/include/ldb.h"
 
 /*
index 078e9b39c896a092fbf55bc07d84c11a4b80035b..f2e29f571a9fe38d16dd631743cd7d2dca10e688 100644 (file)
@@ -190,15 +190,6 @@ enum smb_signing_state {SMB_SIGNING_OFF, SMB_SIGNING_SUPPORTED,
    incorrect parameters - what does it mean? maybe created temporary file? */
 #define NTCREATEX_ACTION_UNKNOWN 5
 
-
-struct security_token {
-       struct dom_sid *user_sid;
-       struct dom_sid *group_sid;
-       uint32_t num_sids;
-       struct dom_sid **sids;
-       uint64_t privilege_mask;
-};
-
 /* used to hold an arbitrary blob of data */
 typedef struct data_blob {
        uint8_t *data;
index c8a546682a8c74fd7f18b4aaaa73e896938753d3..55749f085e01b1883be5b5a99def1582056032bb 100644 (file)
@@ -21,7 +21,7 @@
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 
 
 /*
index 108e2f550077c7ec49248651ffc8e25f7fdd0cd6..368278708ac00fde8131f4530cdb240bf4d5b919 100644 (file)
@@ -22,7 +22,7 @@
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 
 /*****************************************************************
  Compare the auth portion of two sids.
index aa01dc2c65712a49b68a7913c1dbeb035b12547a..ed98e9ce325ffc6eb48db0f38ac0c999994435d1 100644 (file)
@@ -21,7 +21,7 @@
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 
 
 static const struct {
diff --git a/source4/libcli/security/security.h b/source4/libcli/security/security.h
new file mode 100644 (file)
index 0000000..b11d10f
--- /dev/null
@@ -0,0 +1,36 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   security utility functions
+
+   Copyright (C) Andrew Tridgell               2004
+      
+   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 2 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, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _SAMBA_SECURITY_H
+#define _SAMBA_SECURITY_H
+
+#include "librpc/gen_ndr/ndr_security.h"
+
+struct security_token {
+       struct dom_sid *user_sid;
+       struct dom_sid *group_sid;
+       uint32_t num_sids;
+       struct dom_sid **sids;
+       uint64_t privilege_mask;
+};
+
+#endif /* _SAMBA_SECURITY_H */
index ab81a2e5b95f329ee089d6f04e4b8285e9556b3e..509ec1f343db5ab7df5b0a399fb28bfc30041266 100644 (file)
@@ -21,7 +21,7 @@
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 
 /*
   return a blank security descriptor (no owners, dacl or sacl)
index a8ce989de7cd6dbfff6711c8257e88b677452caf..7bd533dbee1ec76b0da88867de02d7135e6892b9 100644 (file)
@@ -21,7 +21,7 @@
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_security.h"
+#include "libcli/security/security.h"
 
 /*
   return a blank security token
@@ -43,3 +43,120 @@ struct security_token *security_token_initialise(TALLOC_CTX *mem_ctx)
 
        return st;
 }
+
+/****************************************************************************
+ Create the SID list for this user.
+****************************************************************************/
+NTSTATUS security_token_create(TALLOC_CTX *mem_ctx, 
+                              struct dom_sid *user_sid, struct dom_sid *group_sid, 
+                              int n_groupSIDs, struct dom_sid **groupSIDs, 
+                              BOOL is_guest, struct security_token **token)
+{
+       struct security_token *ptoken;
+       int i;
+       NTSTATUS status;
+
+       ptoken = security_token_initialise(mem_ctx);
+       if (ptoken == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ptoken->sids = talloc_array_p(ptoken, struct dom_sid *, n_groupSIDs + 5);
+       if (!ptoken->sids) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ptoken->user_sid = user_sid;
+       ptoken->group_sid = group_sid;
+       ptoken->privilege_mask = 0;
+
+       ptoken->sids[0] = user_sid;
+       ptoken->sids[1] = group_sid;
+
+       /*
+        * Finally add the "standard" SIDs.
+        * The only difference between guest and "anonymous" (which we
+        * don't really support) is the addition of Authenticated_Users.
+        */
+       ptoken->sids[2] = dom_sid_parse_talloc(mem_ctx, SID_WORLD);
+       ptoken->sids[3] = dom_sid_parse_talloc(mem_ctx, SID_NT_NETWORK);
+       ptoken->sids[4] = dom_sid_parse_talloc(mem_ctx, 
+                                              is_guest?SID_BUILTIN_GUESTS:
+                                              SID_NT_AUTHENTICATED_USERS);
+       ptoken->num_sids = 5;
+
+       for (i = 0; i < n_groupSIDs; i++) {
+               size_t check_sid_idx;
+               for (check_sid_idx = 1; 
+                    check_sid_idx < ptoken->num_sids; 
+                    check_sid_idx++) {
+                       if (dom_sid_equal(ptoken->sids[check_sid_idx], groupSIDs[i])) {
+                               break;
+                       }
+               }
+               
+               if (check_sid_idx == ptoken->num_sids) {
+                       ptoken->sids[ptoken->num_sids++] = groupSIDs[i];
+               }
+       }
+
+       /* setup the privilege mask for this token */
+       status = samdb_privilege_setup(ptoken);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(ptoken);
+               return status;
+       }
+
+       security_token_debug(10, ptoken);
+
+       *token = ptoken;
+
+       return NT_STATUS_OK;
+}
+
+/****************************************************************************
+ prints a struct security_token to debug output.
+****************************************************************************/
+void security_token_debug(int dbg_lev, const struct security_token *token)
+{
+       TALLOC_CTX *mem_ctx;
+       int i;
+       uint_t privilege;
+
+       if (!token) {
+               DEBUG(dbg_lev, ("Security token: (NULL)\n"));
+               return;
+       }
+
+       mem_ctx = talloc_init("security_token_debug()");
+       if (!mem_ctx) {
+               return;
+       }
+
+       DEBUG(dbg_lev, ("Security token of user %s\n",
+                                   dom_sid_string(mem_ctx, token->user_sid) ));
+       DEBUGADD(dbg_lev, (" SIDs (%lu):\n", 
+                                      (unsigned long)token->num_sids));
+       for (i = 0; i < token->num_sids; i++) {
+               DEBUGADD(dbg_lev, ("  SID[%3lu]: %s\n", (unsigned long)i, 
+                          dom_sid_string(mem_ctx, token->sids[i])));
+       }
+
+       DEBUGADD(dbg_lev, (" Privileges (0x%08X%08X):\n",
+                           (uint32_t)((token->privilege_mask & 0xFFFFFFFF00000000LL) >> 32),
+                           (uint32_t)(token->privilege_mask & 0x00000000FFFFFFFFLL)));
+
+       if (token->privilege_mask) {
+               i = 0;
+               for (privilege = 0; privilege < 64; privilege++) {
+                       uint64_t mask = sec_privilege_mask(privilege);
+
+                       if (token->privilege_mask & mask) {
+                               DEBUGADD(dbg_lev, ("  Privilege[%3lu]: %s\n", (unsigned long)i++, 
+                                       sec_privilege_name(privilege)));
+                       }
+               }
+       }
+
+       talloc_destroy(mem_ctx);
+}
index 1c4572969f2712b1a7087f6a4bfb00aa8ca0f962..f29ed51a498dae66e9323aea5d75da4e4cd08165 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "includes.h"
 #include "auth/auth.h"
+#include "libcli/security/security.h"
 #include "smb_server/smb_server.h"
 
 struct unixuid_private {
index f741999ac9fa65885f06269c4ce3e5a19d74dd6e..569e1e7cb8eacd99e0a1eb8ffd994ebbba82e145 100644 (file)
@@ -27,6 +27,7 @@
 #include "system/passwd.h"
 #include "lib/cmdline/popt_common.h"
 #include "auth/auth.h"
+#include "libcli/security/security.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND