Merge commit 'origin/master' into libcli-auth-merge-without-netlogond
authorAndrew Bartlett <abartlet@samba.org>
Mon, 20 Apr 2009 14:53:02 +0000 (16:53 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 20 Apr 2009 14:53:02 +0000 (16:53 +0200)
68 files changed:
docs-xml/manpages-3/net.8.xml
docs-xml/manpages-3/pam_winbind.7.xml
docs-xml/smbdotconf/winbind/winbindnormalizenames.xml
examples/misc/adssearch.pl
lib/replace/libreplace.m4
lib/replace/replace.c
lib/replace/samba.m4
lib/replace/system/filesys.h
lib/replace/system/wait.h
lib/replace/test/os2_delete.c
lib/tsocket/tsocket_bsd.c
lib/util/smb_threads.c
lib/util/smb_threads.h
lib/util/smb_threads_internal.h
lib/util/talloc_stack.c
librpc/gen_ndr/ndr_samr.c
librpc/gen_ndr/samr.h
librpc/idl/IDL_LICENSE.txt [new file with mode: 0644]
librpc/idl/samr.idl
source3/configure.in
source3/include/ntdomain.h
source3/include/proto.h
source3/lib/netapi/group.c
source3/lib/netapi/localgroup.c
source3/lib/netapi/user.c
source3/libnet/libnet_join.c
source3/librpc/gen_ndr/ndr_notify.c
source3/librpc/gen_ndr/ndr_notify.h
source3/librpc/gen_ndr/notify.h
source3/librpc/idl/IDL_LICENSE.txt [new file with mode: 0644]
source3/librpc/idl/notify.idl
source3/libsmb/cliconnect.c
source3/m4/aclocal.m4
source3/printing/nt_printing.c
source3/registry/reg_api.c
source3/rpc_server/srv_lsa_hnd.c
source3/rpc_server/srv_lsa_nt.c
source3/rpc_server/srv_samr_nt.c
source3/rpc_server/srv_spoolss_nt.c
source3/script/installmo.sh [changed mode: 0644->0755]
source3/script/tests/test_posix_s3.sh
source3/script/uninstallmo.sh [changed mode: 0644->0755]
source3/smbd/conn.c
source3/smbd/filename.c
source3/smbd/files.c
source3/smbd/lanman.c
source3/smbd/notify.c
source3/smbd/notify_internal.c
source3/smbd/uid.c
source3/torture/torture.c
source3/utils/net.c
source3/utils/net.h
source3/utils/net_conf.c
source3/utils/net_rpc.c
source3/utils/net_rpc_join.c
source3/utils/net_util.c
source3/utils/smbpasswd.c
source4/libcli/security/tests/bindings.py
source4/librpc/ndr/py_security.c
source4/scripting/python/samba/tests/__init__.py
source4/selftest/skip
source4/torture/rpc/lsa_lookup.c
source4/torture/rpc/rpc.c
source4/torture/rpc/samr.c
source4/torture/rpc/samr_accessmask.c
source4/torture/rpc/spoolss.c
source4/torture/rpc/spoolss_win.c
source4/torture/rpc/svcctl.c

index 77d7bfbb117465a5cce63d0e29c9cffac9d68441..3907f2e53cc13f2f019ac9d0c4c4c272bb3fb227 100644 (file)
@@ -35,6 +35,7 @@
                <arg choice="opt">-P</arg>
                <arg choice="opt">-d debuglevel</arg>
                <arg choice="opt">-V</arg>
+               <arg choice="opt">--request-timeout seconds</arg>
        </cmdsynopsis>
 </refsynopsisdiv>
 
                </para></listitem>
                </varlistentry>
 
+               <varlistentry>
+               <term>--request-timeout 30</term>
+               <listitem><para>
+               Let client requests timeout after 30 seconds the default is 10
+               seconds.
+               </para></listitem>
+               </varlistentry>
+
                &stdarg.server.debug;
        </variablelist>
 </refsect1>
index 80f7dc827363e0c76497789d1f798e713c937851..ff88de8197609fa01afcd2ce41e183de9042d4a0 100644 (file)
                </para></listitem>
                </varlistentry>
 
-               </variablelist>
+               <varlistentry>
+               <term>warn_pwd_expire</term>
+               <listitem><para>
+               Defines number of days before pam_winbind starts to warn about passwords that are
+               going to expire. Defaults to 14 days.
+               </para></listitem>
+               </varlistentry>
 
+               </variablelist>
 
        </para>
 
index 5b68bca9124b9ba4959d0376137d9a50272ab206..ba7168665ff5d6442e838c34981d4886a36d97db 100644 (file)
@@ -16,7 +16,7 @@
         </para>
 
        <para>This feature also enables the name aliasing API which can
-         be used to make domain user and group names to a non-qlaified
+         be used to make domain user and group names to a non-qualified
          version.  Please refer to the manpage for the configured
          idmap and nss_info plugin for the specifics on how to configure
          name aliasing for a specific configuration.  Name aliasing takes
index d17e680ec8e9b0fefe5c83ccd35c33cf738944c8..026853d1524d95bac9656ed0c12d9fca1c98115b 100755 (executable)
@@ -735,7 +735,7 @@ sub get_machine_password {
                        ($line,$password) = split(/"/, $line);
                        last;
                }
-               if ($line =~ /$key/) {
+               if ($line =~ /\"$key\"/) {
                        $found = 1;
                }
        }
index 30d7017d0fcb65acd2df5a2ea8fa3eae19f75bb9..2d90d9c7e859cce0294182eb21c6b549188c953e 100644 (file)
@@ -106,7 +106,7 @@ AC_CHECK_HEADERS(stropts.h)
 
 AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror)
 AC_CHECK_FUNCS(vsyslog setlinebuf mktime ftruncate chsize rename)
-AC_CHECK_FUNCS(waitpid strlcpy strlcat initgroups memmove strdup)
+AC_CHECK_FUNCS(waitpid wait4 strlcpy strlcat initgroups memmove strdup)
 AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2)
 AC_CHECK_FUNCS(isatty chown lchown link readlink symlink realpath)
 AC_HAVE_DECL(setresuid, [#include <unistd.h>])
@@ -279,7 +279,7 @@ m4_include(timegm.m4)
 m4_include(repdir.m4)
 m4_include(crypt.m4)
 
-AC_CHECK_FUNCS([syslog printf memset memcpy],,[AC_MSG_ERROR([Required function not found])])
+AC_CHECK_FUNCS([printf memset memcpy],,[AC_MSG_ERROR([Required function not found])])
 
 echo "LIBREPLACE_BROKEN_CHECKS: END"
 ]) dnl end AC_LIBREPLACE_BROKEN_CHECKS
index 78c688d50c72ef8d621e5b0a1bc36f3f0119fd1e..fc15717349e1d189dcd9494d1bc2dd61e12ca92c 100644 (file)
 #include "system/locale.h"
 #include "system/wait.h"
 
+#ifdef _WIN32
+#define mkdir(d,m) _mkdir(d)
+#endif
+
 void replace_dummy(void);
 void replace_dummy(void) {}
 
@@ -355,7 +359,7 @@ char *rep_strndup(const char *s, size_t n)
 }
 #endif
 
-#ifndef HAVE_WAITPID
+#if !defined(HAVE_WAITPID) && defined(HAVE_WAIT4)
 int rep_waitpid(pid_t pid,int *status,int options)
 {
   return wait4(pid, status, options, NULL);
@@ -368,7 +372,8 @@ int rep_seteuid(uid_t euid)
 #ifdef HAVE_SETRESUID
        return setresuid(-1, euid, -1);
 #else
-#  error "You need a seteuid function"
+       errno = ENOSYS;
+       return -1;
 #endif
 }
 #endif
@@ -379,7 +384,8 @@ int rep_setegid(gid_t egid)
 #ifdef HAVE_SETRESGID
        return setresgid(-1, egid, -1);
 #else
-#  error "You need a setegid function"
+       errno = ENOSYS;
+       return -1;
 #endif
 }
 #endif
index ccb6f2e20dc8a1f84d0396bcd18db6a65aa200d4..4514728d03da2d714bbb13969574fcf48b413e75 100644 (file)
@@ -33,3 +33,5 @@ SMB_SUBSYSTEM(LIBREPLACE_HOSTCC,
        [${LIBREPLACE_HOSTCC_OBJS}],
        [],
        [-Ilib/replace])
+
+AC_CHECK_FUNCS([syslog],,[AC_MSG_ERROR([Required function not found])])
index 4bf1f64865030dfb2b7f3e81a83fe95071c3169e..1cf6f231b7bb58815019d788efbbe61847d6e104 100644 (file)
 #define SEEK_SET 0
 #endif
 
+#ifdef _WIN32
+#define mkdir(d,m) _mkdir(d)
+#endif
+
 #endif
index 5784b1ae924d139855ba25fb973bda72df69c652..79583ad2abcd17d48612ed8f628160c776b62597 100644 (file)
@@ -52,4 +52,8 @@
 typedef int sig_atomic_t;
 #endif
 
+#if !defined(HAVE_WAITPID) && defined(HAVE_WAIT4)
+int rep_waitpid(pid_t pid,int *status,int options)
+#endif
+
 #endif
index 44efeea08a5bdcde791d64bd222aef1a08fa6881..8b52837018d9387323275fb6ef2fd6eff3b39202 100644 (file)
@@ -27,6 +27,10 @@ static int test_readdir_os2_delete_ret;
 #define MIN(a,b) ((a)<(b)?(a):(b))
 #endif
 
+#ifdef _WIN32
+#define mkdir(d,m) _mkdir(d)
+#endif
+
 static void cleanup(void)
 {
        /* I'm a lazy bastard */
index 87586e08e3c672b1a17d3ad6dda24e782c79fa42..29097bd987898a681112493e91df89881d5c0160 100644 (file)
@@ -523,9 +523,11 @@ static char *tsocket_address_bsd_string(const struct tsocket_address *addr,
        case AF_INET:
                prefix = "ipv4";
                break;
+#ifdef HAVE_IPV6
        case AF_INET6:
                prefix = "ipv6";
                break;
+#endif
        default:
                errno = EINVAL;
                return NULL;
index fa2d8da18650088eb3f6079b839583f3db4330eb..783e660b7f701cd69daa5df5c00690611db4716f 100644 (file)
@@ -92,8 +92,26 @@ int smb_thread_set_functions(const struct smb_thread_functions *tf)
 
 SMB_THREADS_DEF_PTHREAD_IMPLEMENTATION(tf);
 
+static smb_thread_once_t ot = SMB_THREAD_ONCE_INIT;
 void *pkey = NULL;
 
+static void init_fn(void)
+{
+       int ret;
+
+       if (!global_tfp) {
+               /* Non-thread safe init case. */
+               if (ot) {
+                       return;
+               }
+               ot = true;
+       }
+
+       if ((ret = SMB_THREAD_CREATE_TLS("test_tls", pkey)) != 0) {
+               printf("Create tls once error: %d\n", ret);
+       }
+}
+
 /* Test function. */
 int test_threads(void)
 {
@@ -101,9 +119,8 @@ int test_threads(void)
        void *plock = NULL;
        smb_thread_set_functions(&tf);
 
-       if ((ret = SMB_THREAD_CREATE_TLS_ONCE("test_tls", pkey)) != 0) {
-               printf("Create tls once error: %d\n", ret);
-       }
+       SMB_THREAD_ONCE(&ot, init_fn);
+
        if ((ret = SMB_THREAD_CREATE_MUTEX("test", plock)) != 0) {
                printf("Create lock error: %d\n", ret);
        }
@@ -114,7 +131,7 @@ int test_threads(void)
                printf("unlock error: %d\n", ret);
        }
        SMB_THREAD_DESTROY_MUTEX(plock);
-       SMB_THREAD_DESTROY_TLS_ONCE(pkey);
+       SMB_THREAD_DESTROY_TLS(pkey);
 
        return 0;
 }
index 945e93803a39ec4ce49ff8eac15af99bff5358b7..3d3d48ecb2ec9077e0c0819d3ce9211a132fd616 100644 (file)
 #ifndef _smb_threads_h_
 #define _smb_threads_h_
 
+/* Data types needed for smb_thread_once call. */
+
+#if defined(HAVE_PTHREAD_H)
+#include <pthread.h>
+#define smb_thread_once_t pthread_once_t
+#define SMB_THREAD_ONCE_INIT PTHREAD_ONCE_INIT
+#define SMB_THREAD_ONCE_IS_INITIALIZED(val) (true)
+#define SMB_THREAD_ONCE_INITIALIZE(val)
+#else
+#define smb_thread_once_t bool
+#define SMB_THREAD_ONCE_INIT false
+#define SMB_THREAD_ONCE_IS_INITIALIZED(val) ((val) == true)
+#define SMB_THREAD_ONCE_INITIALIZE(val) ((val) = true)
+#endif
+
 enum smb_thread_lock_type {
        SMB_THREAD_LOCK = 1,
        SMB_THREAD_UNLOCK
@@ -35,11 +50,14 @@ struct smb_thread_functions {
        int (*lock_mutex)(void *plock, enum smb_thread_lock_type lock_type,
                        const char *location);
 
+       /* Once initialization. */
+       int (*smb_thread_once)(smb_thread_once_t *p_once, void (*init_fn)(void));
+
        /* Thread local storage. */
-       int (*create_tls_once)(const char *keyname,
+       int (*create_tls)(const char *keyname,
                        void **ppkey,
                        const char *location);
-       void (*destroy_tls_once)(void **pkey,
+       void (*destroy_tls)(void **pkey,
                        const char *location);
        int (*set_tls)(void *pkey, const void *pval, const char *location);
        void *(*get_tls)(void *pkey, const char *location);
@@ -77,45 +95,35 @@ static int smb_lock_pthread(void *plock, enum smb_thread_lock_type lock_type, co
        } \
 } \
  \
-static pthread_mutex_t create_tls_mutex = PTHREAD_MUTEX_INITIALIZER; \
+static int smb_thread_once_pthread(smb_thread_once_t *p_once, void (*init_fn)(void)) \
+{ \
+       return pthread_once(p_once, init_fn); \
+} \
  \
-static int smb_create_tls_once_pthread(const char *keyname, void **ppkey, const char *location) \
+static int smb_create_tls_pthread(const char *keyname, void **ppkey, const char *location) \
 { \
        int ret; \
        pthread_key_t *pkey; \
-       ret = pthread_mutex_lock(&create_tls_mutex); \
-       if (ret) { \
-               return ret; \
-       } \
-       if (*ppkey) { \
-               pthread_mutex_unlock(&create_tls_mutex); \
-               return 0; \
-       } \
        pkey = (pthread_key_t *)malloc(sizeof(pthread_key_t)); \
        if (!pkey) { \
-               pthread_mutex_unlock(&create_tls_mutex); \
                return ENOMEM; \
        } \
        ret = pthread_key_create(pkey, NULL); \
        if (ret) { \
                free(pkey); \
-               pthread_mutex_unlock(&create_tls_mutex); \
                return ret; \
        } \
        *ppkey = (void *)pkey; \
-       pthread_mutex_unlock(&create_tls_mutex); \
        return 0; \
 } \
  \
-static void smb_destroy_tls_once_pthread(void **ppkey, const char *location) \
+static void smb_destroy_tls_pthread(void **ppkey, const char *location) \
 { \
-       pthread_mutex_lock(&create_tls_mutex); \
        if (*ppkey) { \
                pthread_key_delete(*(pthread_key_t *)ppkey); \
                free(*ppkey); \
                *ppkey = NULL; \
        } \
-       pthread_mutex_unlock(&create_tls_mutex); \
 } \
  \
 static int smb_set_tls_pthread(void *pkey, const void *pval, const char *location) \
@@ -129,12 +137,13 @@ static void *smb_get_tls_pthread(void *pkey, const char *location) \
 } \
  \
 static const struct smb_thread_functions (tf) = { \
-                        smb_create_mutex_pthread, \
-                        smb_destroy_mutex_pthread, \
-                        smb_lock_pthread, \
-                        smb_create_tls_once_pthread, \
-                        smb_destroy_tls_once_pthread, \
-                        smb_set_tls_pthread, \
-                        smb_get_tls_pthread }
+                       smb_create_mutex_pthread, \
+                       smb_destroy_mutex_pthread, \
+                       smb_lock_pthread, \
+                       smb_thread_once_pthread, \
+                       smb_create_tls_pthread, \
+                       smb_destroy_tls_pthread, \
+                       smb_set_tls_pthread, \
+                       smb_get_tls_pthread }
 
 #endif
index 58c6fe3f99a11e83014804720318998c0e9f8318..b7e862af72d8325e66f161ddea7a0bf47627dc03 100644 (file)
 #define SMB_THREAD_LOCK(plock, type) \
        (global_tfp ? global_tfp->lock_mutex((plock), (type), __location__) : 0)
 
-#define SMB_THREAD_CREATE_TLS_ONCE(keyname, key) \
-       (global_tfp ? global_tfp->create_tls_once((keyname), &(key), __location__) : 0)
+#define SMB_THREAD_ONCE(ponce, init_fn) \
+       (global_tfp ? global_tfp->smb_thread_once((ponce), (init_fn)) : ((init_fn()), 0))
 
-#define SMB_THREAD_DESTROY_TLS_ONCE(key) \
+#define SMB_THREAD_CREATE_TLS(keyname, key) \
+       (global_tfp ? global_tfp->create_tls((keyname), &(key), __location__) : 0)
+
+#define SMB_THREAD_DESTROY_TLS(key) \
        do { \
                if (global_tfp) { \
-                       global_tfp->destroy_tls_once(&(key), __location__); \
+                       global_tfp->destroy_tls(&(key), __location__); \
                }; \
        } while (0)
 
index f572dd6c77c39c72d0201a03a5076e84166250d8..2ed18fa1139ac54984b1a91078f0efc45b4b0399 100644 (file)
@@ -55,7 +55,25 @@ struct talloc_stackframe {
 
 static void *global_ts;
 
-static struct talloc_stackframe *talloc_stackframe_init(void)
+/* Variable to ensure TLS value is only initialized once. */
+static smb_thread_once_t ts_initialized = SMB_THREAD_ONCE_INIT;
+
+static void talloc_stackframe_init(void)
+{
+       if (!global_tfp) {
+               /* Non-thread safe init case. */
+               if (SMB_THREAD_ONCE_IS_INITIALIZED(ts_initialized)) {
+                       return;
+               }
+               SMB_THREAD_ONCE_INITIALIZE(ts_initialized);
+       }
+
+       if (SMB_THREAD_CREATE_TLS("talloc_stackframe", global_ts)) {
+               smb_panic("talloc_stackframe_init create_tls failed");
+       }
+}
+
+static struct talloc_stackframe *talloc_stackframe_create(void)
 {
 #if defined(PARANOID_MALLOC_CHECKER)
 #ifdef malloc
@@ -74,9 +92,7 @@ static struct talloc_stackframe *talloc_stackframe_init(void)
 
        ZERO_STRUCTP(ts);
 
-       if (SMB_THREAD_CREATE_TLS_ONCE("talloc_stackframe", global_ts)) {
-               smb_panic("talloc_stackframe_init create_tls failed");
-       }
+       SMB_THREAD_ONCE(&ts_initialized, talloc_stackframe_init);
 
        if (SMB_THREAD_SET_TLS(global_ts, ts)) {
                smb_panic("talloc_stackframe_init set_tls failed");
@@ -115,7 +131,7 @@ static TALLOC_CTX *talloc_stackframe_internal(size_t poolsize)
                (struct talloc_stackframe *)SMB_THREAD_GET_TLS(global_ts);
 
        if (ts == NULL) {
-               ts = talloc_stackframe_init();
+               ts = talloc_stackframe_create();
        }
 
        if (ts->talloc_stack_arraysize < ts->talloc_stacksize + 1) {
index 33c70ce1ff6413705cd8847017f1319686d7ee6e..d2d345a66a304eef0c5081ff25878f5012e4eced 100644 (file)
@@ -122,7 +122,7 @@ _PUBLIC_ void ndr_print_samr_ConnectAccessMask(struct ndr_print *ndr, const char
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SAMR_ACCESS_INITIALIZE_SERVER", SAMR_ACCESS_INITIALIZE_SERVER, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SAMR_ACCESS_CREATE_DOMAIN", SAMR_ACCESS_CREATE_DOMAIN, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SAMR_ACCESS_ENUM_DOMAINS", SAMR_ACCESS_ENUM_DOMAINS, r);
-       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SAMR_ACCESS_OPEN_DOMAIN", SAMR_ACCESS_OPEN_DOMAIN, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SAMR_ACCESS_LOOKUP_DOMAIN", SAMR_ACCESS_LOOKUP_DOMAIN, r);
        ndr->depth--;
 }
 
index 044756469e961cd118da04cb51afe96726e34d80..16c6605789ea32b9859e76766e2921f80d6e1993 100644 (file)
@@ -14,7 +14,7 @@
 #define GENERIC_RIGHTS_SAM_ALL_ACCESS  ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_ACCESS_ALL_ACCESS) )
 #define GENERIC_RIGHTS_SAM_READ        ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_ACCESS_ENUM_DOMAINS) )
 #define GENERIC_RIGHTS_SAM_WRITE       ( (STANDARD_RIGHTS_WRITE_ACCESS|SAMR_ACCESS_CREATE_DOMAIN|SAMR_ACCESS_INITIALIZE_SERVER|SAMR_ACCESS_SHUTDOWN_SERVER) )
-#define GENERIC_RIGHTS_SAM_EXECUTE     ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_ACCESS_OPEN_DOMAIN|SAMR_ACCESS_CONNECT_TO_SERVER) )
+#define GENERIC_RIGHTS_SAM_EXECUTE     ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_ACCESS_LOOKUP_DOMAIN|SAMR_ACCESS_CONNECT_TO_SERVER) )
 #define SAMR_USER_ACCESS_ALL_ACCESS    ( 0x000007FF )
 #define GENERIC_RIGHTS_USER_ALL_ACCESS ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_USER_ACCESS_ALL_ACCESS) )
 #define GENERIC_RIGHTS_USER_READ       ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP|SAMR_USER_ACCESS_GET_GROUPS|SAMR_USER_ACCESS_GET_ATTRIBUTES|SAMR_USER_ACCESS_GET_LOGONINFO|SAMR_USER_ACCESS_GET_LOCALE) )
@@ -97,7 +97,7 @@ enum samr_RejectReason
 #define SAMR_ACCESS_INITIALIZE_SERVER ( 0x00000004 )
 #define SAMR_ACCESS_CREATE_DOMAIN ( 0x00000008 )
 #define SAMR_ACCESS_ENUM_DOMAINS ( 0x00000010 )
-#define SAMR_ACCESS_OPEN_DOMAIN ( 0x00000020 )
+#define SAMR_ACCESS_LOOKUP_DOMAIN ( 0x00000020 )
 
 /* bitmap samr_UserAccessMask */
 #define SAMR_USER_ACCESS_GET_NAME_ETC ( 0x00000001 )
diff --git a/librpc/idl/IDL_LICENSE.txt b/librpc/idl/IDL_LICENSE.txt
new file mode 100644 (file)
index 0000000..01ae670
--- /dev/null
@@ -0,0 +1,9 @@
+The IDL files in this directory are made available by the Samba Team
+under the following license:
+
+  Permission to use, copy, modify, and distribute these interface
+  definitions for any purpose is hereby granted without fee.
+
+  This work 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.
index 7d5d877bb1f26bbd5fa494827fc01c5f77ac0662..bcd8ca066cda8698782f0227843f117f69f2f60d 100644 (file)
@@ -64,7 +64,7 @@ import "misc.idl", "lsa.idl", "security.idl";
                SAMR_ACCESS_INITIALIZE_SERVER   = 0x00000004,
                SAMR_ACCESS_CREATE_DOMAIN       = 0x00000008,
                SAMR_ACCESS_ENUM_DOMAINS        = 0x00000010,
-               SAMR_ACCESS_OPEN_DOMAIN         = 0x00000020
+               SAMR_ACCESS_LOOKUP_DOMAIN         = 0x00000020
        } samr_ConnectAccessMask;
 
        const int SAMR_ACCESS_ALL_ACCESS = 0x0000003F;
@@ -85,7 +85,7 @@ import "misc.idl", "lsa.idl", "security.idl";
 
        const int GENERIC_RIGHTS_SAM_EXECUTE =
                (STANDARD_RIGHTS_EXECUTE_ACCESS         |
-                SAMR_ACCESS_OPEN_DOMAIN                |
+                SAMR_ACCESS_LOOKUP_DOMAIN              |
                 SAMR_ACCESS_CONNECT_TO_SERVER);
 
        /* User Object specific access rights */
index d0ff14fa2fe785c84f1c07bedfeaa717b8578cd1..663c3a836113f66f2cb209325d8b403e28ecbffd 100644 (file)
@@ -671,6 +671,7 @@ SAVE_CPPFLAGS="${CPPFLAGS}"
 CPPFLAGS="${CPPFLAGS} ${SAMBA_CONFIGURE_CPPFLAGS}"
 
 AC_LIBREPLACE_BROKEN_CHECKS
+AC_CHECK_FUNCS([syslog],[],[AC_MSG_ERROR([Required function not found])])
 AC_LIBREPLACE_NETWORK_CHECKS
 
 CPPFLAGS="${SAVE_CPPFLAGS}"
index c95931b5d03dc36a3be7dc48298dbd7fedb9677b..de53aebb91a21c4b0e06b41862202f1d72bb9d86 100644 (file)
@@ -110,23 +110,7 @@ typedef struct _input_data {
        prs_struct data;
 } input_data;
 
-/*
- * Handle database - stored per pipe.
- */
-
-struct policy {
-       struct policy *next, *prev;
-
-       struct policy_handle pol_hnd;
-
-       void *data_ptr;
-};
-
-struct handle_list {
-       struct policy *Policy;  /* List of policies. */
-       size_t count;                   /* Current number of handles. */
-       size_t pipe_ref_count;  /* Number of pipe handles referring to this list. */
-};
+struct handle_list;
 
 /* Domain controller authentication protocol info */
 struct dcinfo {
index 4cb908b66546a6090e705ff71b869878b7eee6a3..c40d9c680c41479f7dbd09ca752b3ce1d5b0eb79 100644 (file)
@@ -5767,14 +5767,33 @@ NTSTATUS evlog_convert_tdb_to_evt(TALLOC_CTX *mem_ctx,
 
 /* The following definitions come from rpc_server/srv_lsa_hnd.c  */
 
+size_t num_pipe_handles(struct handle_list *list);
 bool init_pipe_handle_list(pipes_struct *p,
                           const struct ndr_syntax_id *syntax);
 bool create_policy_hnd(pipes_struct *p, struct policy_handle *hnd, void *data_ptr);
-bool find_policy_by_hnd(pipes_struct *p, struct policy_handle *hnd, void **data_p);
+bool find_policy_by_hnd(pipes_struct *p, const struct policy_handle *hnd,
+                       void **data_p);
 bool close_policy_hnd(pipes_struct *p, struct policy_handle *hnd);
 void close_policy_by_pipe(pipes_struct *p);
 bool pipe_access_check(pipes_struct *p);
 
+void *_policy_handle_create(struct pipes_struct *p, struct policy_handle *hnd,
+                           uint32_t access_granted, size_t data_size,
+                           const char *type, NTSTATUS *pstatus);
+#define policy_handle_create(_p, _hnd, _access, _type, _pstatus) \
+       (_type *)_policy_handle_create((_p), (_hnd), (_access), sizeof(_type), #_type, \
+                                      (_pstatus))
+
+void *_policy_handle_find(struct pipes_struct *p,
+                         const struct policy_handle *hnd,
+                         uint32_t access_required, uint32_t *paccess_granted,
+                         const char *name, const char *location,
+                         NTSTATUS *pstatus);
+#define policy_handle_find(_p, _hnd, _access_required, _access_granted, _type, _pstatus) \
+       (_type *)_policy_handle_find((_p), (_hnd), (_access_required), \
+                                    (_access_granted), #_type, __location__, (_pstatus))
+
+
 /* The following definitions come from rpc_server/srv_pipe.c  */
 
 bool create_next_pdu(pipes_struct *p);
@@ -6446,6 +6465,11 @@ NTSTATUS notify_add(struct notify_context *notify, struct notify_entry *e0,
                    void (*callback)(void *, const struct notify_event *), 
                    void *private_data);
 NTSTATUS notify_remove(struct notify_context *notify, void *private_data);
+NTSTATUS notify_remove_onelevel(struct notify_context *notify,
+                               const struct file_id *fid,
+                               void *private_data);
+void notify_onelevel(struct notify_context *notify, uint32_t action,
+                    uint32_t filter, struct file_id fid, const char *name);
 void notify_trigger(struct notify_context *notify,
                    uint32_t action, uint32_t filter, const char *path);
 
index c09632a8570b08c925e5e506d0e850ecd3b7b82d..004fd3aff6f08feddf25208a33d472e4bed808f1 100644 (file)
@@ -79,7 +79,7 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_GROUP |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -250,7 +250,7 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -415,7 +415,7 @@ WERROR NetGroupSetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -650,7 +650,7 @@ WERROR NetGroupGetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -766,7 +766,7 @@ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -887,7 +887,7 @@ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -1165,7 +1165,7 @@ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                          SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
@@ -1296,7 +1296,7 @@ WERROR NetGroupGetUsers_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -1448,7 +1448,7 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
index 13405b553e17968faf3bd89d4d45c54fd646e128..d389c1f4a2b44aa6ea5227e2ff6a50a78475e7c7 100644 (file)
@@ -157,7 +157,7 @@ WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -182,7 +182,7 @@ WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -277,7 +277,7 @@ WERROR NetLocalGroupDel_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -302,7 +302,7 @@ WERROR NetLocalGroupDel_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -449,7 +449,7 @@ WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -474,7 +474,7 @@ WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -620,7 +620,7 @@ WERROR NetLocalGroupSetInfo_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -647,7 +647,7 @@ WERROR NetLocalGroupSetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -762,7 +762,7 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
@@ -774,7 +774,7 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
-                                         SAMR_ACCESS_OPEN_DOMAIN |
+                                         SAMR_ACCESS_LOOKUP_DOMAIN |
                                          SAMR_ACCESS_ENUM_DOMAINS,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                          SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
@@ -1068,7 +1068,7 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -1098,7 +1098,7 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -1318,4 +1318,3 @@ WERROR NetLocalGroupSetMembers_l(struct libnetapi_ctx *ctx,
 {
        LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetLocalGroupSetMembers);
 }
-
index 1cbb883169673c8af9858315084b99caea3a9330..849ba9cc924b5fded3c749507851bc209ea7a86d 100644 (file)
@@ -395,7 +395,7 @@ WERROR NetUserAdd_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_1 |
                                          SAMR_DOMAIN_ACCESS_CREATE_USER |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
@@ -517,7 +517,7 @@ WERROR NetUserDel_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -1223,7 +1223,7 @@ WERROR NetUserEnum_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
                                                  SAMR_ACCESS_ENUM_DOMAINS |
-                                                 SAMR_ACCESS_OPEN_DOMAIN,
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT |
                                                  SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
                                                  &connect_handle,
@@ -1234,7 +1234,7 @@ WERROR NetUserEnum_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                          SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
@@ -1522,7 +1522,7 @@ WERROR NetQueryDisplayInformation_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                          SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
@@ -1648,7 +1648,7 @@ WERROR NetUserGetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -1659,7 +1659,7 @@ WERROR NetUserGetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
                                                  SAMR_ACCESS_ENUM_DOMAINS |
-                                                 SAMR_ACCESS_OPEN_DOMAIN,
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT |
                                                  SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
                                                  &connect_handle,
@@ -1800,7 +1800,7 @@ WERROR NetUserSetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_1 |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -1812,7 +1812,7 @@ WERROR NetUserSetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
                                                  SAMR_ACCESS_ENUM_DOMAINS |
-                                                 SAMR_ACCESS_OPEN_DOMAIN,
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT |
                                                  SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
                                                  &connect_handle,
@@ -2220,7 +2220,7 @@ WERROR NetUserModalsGet_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          access_mask,
                                          &connect_handle,
                                          &domain_handle,
@@ -2698,7 +2698,7 @@ WERROR NetUserModalsSet_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          access_mask,
                                          &connect_handle,
                                          &domain_handle,
@@ -2831,7 +2831,7 @@ WERROR NetUserGetGroups_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -2982,7 +2982,7 @@ WERROR NetUserSetGroups_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -3264,7 +3264,7 @@ WERROR NetUserGetLocalGroups_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT |
                                          SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
                                          &connect_handle,
@@ -3276,7 +3276,7 @@ WERROR NetUserGetLocalGroups_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
                                                  SAMR_ACCESS_ENUM_DOMAINS |
-                                                 SAMR_ACCESS_OPEN_DOMAIN,
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT |
                                                  SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
                                                  &connect_handle,
index 8e75d36fe33b9b4b31e1fbb8669474e4c0289111..894f5cba3299fb5d3213a77979229f6a6d6be729 100644 (file)
@@ -786,7 +786,7 @@ static NTSTATUS libnet_join_joindomain_rpc(TALLOC_CTX *mem_ctx,
        status = rpccli_samr_Connect2(pipe_hnd, mem_ctx,
                                      pipe_hnd->desthost,
                                      SAMR_ACCESS_ENUM_DOMAINS
-                                     | SAMR_ACCESS_OPEN_DOMAIN,
+                                     | SAMR_ACCESS_LOOKUP_DOMAIN,
                                      &sam_pol);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
index d4ac42e96146ee7c1ffc4ca56e7bb78afa995a56..844c278cd238743c653ed670b785b5198da09b18 100644 (file)
@@ -68,6 +68,69 @@ _PUBLIC_ void ndr_print_notify_entry(struct ndr_print *ndr, const char *name, co
        ndr->depth--;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_notify_entry_array(struct ndr_push *ndr, int ndr_flags, const struct notify_entry_array *r)
+{
+       uint32_t cntr_entries_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 8));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_entries));
+               for (cntr_entries_0 = 0; cntr_entries_0 < r->num_entries; cntr_entries_0++) {
+                       NDR_CHECK(ndr_push_notify_entry(ndr, NDR_SCALARS, &r->entries[cntr_entries_0]));
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               for (cntr_entries_0 = 0; cntr_entries_0 < r->num_entries; cntr_entries_0++) {
+                       NDR_CHECK(ndr_push_notify_entry(ndr, NDR_BUFFERS, &r->entries[cntr_entries_0]));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_notify_entry_array(struct ndr_pull *ndr, int ndr_flags, struct notify_entry_array *r)
+{
+       uint32_t cntr_entries_0;
+       TALLOC_CTX *_mem_save_entries_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 8));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_entries));
+               NDR_PULL_ALLOC_N(ndr, r->entries, r->num_entries);
+               _mem_save_entries_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->entries, 0);
+               for (cntr_entries_0 = 0; cntr_entries_0 < r->num_entries; cntr_entries_0++) {
+                       NDR_CHECK(ndr_pull_notify_entry(ndr, NDR_SCALARS, &r->entries[cntr_entries_0]));
+               }
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_entries_0, 0);
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               _mem_save_entries_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->entries, 0);
+               for (cntr_entries_0 = 0; cntr_entries_0 < r->num_entries; cntr_entries_0++) {
+                       NDR_CHECK(ndr_pull_notify_entry(ndr, NDR_BUFFERS, &r->entries[cntr_entries_0]));
+               }
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_entries_0, 0);
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_notify_entry_array(struct ndr_print *ndr, const char *name, const struct notify_entry_array *r)
+{
+       uint32_t cntr_entries_0;
+       ndr_print_struct(ndr, name, "notify_entry_array");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "num_entries", r->num_entries);
+       ndr->print(ndr, "%s: ARRAY(%d)", "entries", (int)r->num_entries);
+       ndr->depth++;
+       for (cntr_entries_0=0;cntr_entries_0<r->num_entries;cntr_entries_0++) {
+               char *idx_0=NULL;
+               if (asprintf(&idx_0, "[%d]", cntr_entries_0) != -1) {
+                       ndr_print_notify_entry(ndr, "entries", &r->entries[cntr_entries_0]);
+                       free(idx_0);
+               }
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
 static enum ndr_err_code ndr_push_notify_depth(struct ndr_push *ndr, int ndr_flags, const struct notify_depth *r)
 {
        uint32_t cntr_entries_0;
index 23d3d3fc0aa9b3d19e0c7344bbd8a280674e344b..fa2972dbc618fa83ee56898b2a210f250daa3fdb 100644 (file)
@@ -10,6 +10,9 @@
 enum ndr_err_code ndr_push_notify_entry(struct ndr_push *ndr, int ndr_flags, const struct notify_entry *r);
 enum ndr_err_code ndr_pull_notify_entry(struct ndr_pull *ndr, int ndr_flags, struct notify_entry *r);
 void ndr_print_notify_entry(struct ndr_print *ndr, const char *name, const struct notify_entry *r);
+enum ndr_err_code ndr_push_notify_entry_array(struct ndr_push *ndr, int ndr_flags, const struct notify_entry_array *r);
+enum ndr_err_code ndr_pull_notify_entry_array(struct ndr_pull *ndr, int ndr_flags, struct notify_entry_array *r);
+void ndr_print_notify_entry_array(struct ndr_print *ndr, const char *name, const struct notify_entry_array *r);
 void ndr_print_notify_depth(struct ndr_print *ndr, const char *name, const struct notify_depth *r);
 enum ndr_err_code ndr_push_notify_array(struct ndr_push *ndr, int ndr_flags, const struct notify_array *r);
 enum ndr_err_code ndr_pull_notify_array(struct ndr_pull *ndr, int ndr_flags, struct notify_array *r);
index a5ec4a46e6e7a335bc999249e8d8f6773c1ebcda..a390fa8a0b6f28a3e2c091128bc173b180ec466e 100644 (file)
@@ -2,6 +2,8 @@
 
 #include <stdint.h>
 
+#include "libcli/util/ntstatus.h"
+
 #ifndef _HEADER_notify
 #define _HEADER_notify
 
@@ -16,6 +18,11 @@ struct notify_entry {
        void* private_data;
 }/* [public] */;
 
+struct notify_entry_array {
+       uint32_t num_entries;
+       struct notify_entry *entries;
+}/* [public] */;
+
 struct notify_depth {
        uint32_t max_mask;
        uint32_t max_mask_subdir;
diff --git a/source3/librpc/idl/IDL_LICENSE.txt b/source3/librpc/idl/IDL_LICENSE.txt
new file mode 100644 (file)
index 0000000..01ae670
--- /dev/null
@@ -0,0 +1,9 @@
+The IDL files in this directory are made available by the Samba Team
+under the following license:
+
+  Permission to use, copy, modify, and distribute these interface
+  definitions for any purpose is hereby granted without fee.
+
+  This work 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.
index 550783b5cd3a99b46b8cf6787a8533afb8bab346..0e806790744cc88f5e9b04d6f306a2a250df9c31 100644 (file)
@@ -25,6 +25,11 @@ interface notify
                pointer private_data;
        } notify_entry;
 
+       typedef [public] struct {
+               uint32 num_entries;
+               notify_entry entries[num_entries];
+       } notify_entry_array;
+
        /*
          to allow for efficient search for matching entries, we
          divide them by the directory depth, with a separate array
index 143bdf70197587d2e2653e5f40d1dabdb94e4797..ffe2960967b040436ec336b53b6909419760af90 100644 (file)
@@ -1212,7 +1212,7 @@ bool cli_ulogoff(struct cli_state *cli)
                return False;
        }
 
-        cli->cnum = -1;
+        cli->vuid = -1;
         return True;
 }
 
index 386829d1b0037611237ac80357f817e46c1fd9fa..ae205023a473908050db8c036157fe1a3e39c38c 100644 (file)
@@ -334,7 +334,7 @@ AC_DEFUN([AC_CHECK_FUNC_EXT],
            [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$1])) $3], 
            [$4])dnl
 AS_VAR_POPDEF([ac_var])dnl
-])# AC_CHECK_FUNC
+])# AC_CHECK_FUNC_EXT
 
 # AH_CHECK_FUNC_EXT(FUNCNAME)
 # ---------------------
index f3b938e6ff44a77d813a7d81874eda7a4175adda..d6fead11c2dd7d9ee9f487d9f5b9a03170b969bb 100644 (file)
@@ -745,7 +745,7 @@ int get_builtin_ntforms(nt_forms_struct **list)
        if (!*list) {
                return 0;
        }
-       return sizeof(default_forms) / sizeof(default_forms[0]);
+       return ARRAY_SIZE(default_forms);
 }
 
 /****************************************************************************
@@ -754,18 +754,17 @@ int get_builtin_ntforms(nt_forms_struct **list)
 
 bool get_a_builtin_ntform_by_string(const char *form_name, nt_forms_struct *form)
 {
-       int i,count;
+       int i;
        DEBUGADD(6,("Looking for builtin form %s \n", form_name));
-       count = sizeof(default_forms) / sizeof(default_forms[0]);
-       for (i=0;i<count;i++) {
+       for (i=0; i<ARRAY_SIZE(default_forms); i++) {
                if (strequal(form_name,default_forms[i].name)) {
                        DEBUGADD(6,("Found builtin form %s \n", form_name));
                        memcpy(form,&default_forms[i],sizeof(*form));
-                       break;
+                       return true;
                }
        }
 
-       return (i !=count);
+       return false;
 }
 
 /****************************************************************************
@@ -5736,7 +5735,7 @@ bool print_access_check(struct auth_serversupplied_info *server_info, int snum,
 
        /* Always allow root or SE_PRINT_OPERATROR to do anything */
 
-       if (server_info->utok.uid == 0
+       if (server_info->utok.uid == sec_initial_uid()
            || user_has_privileges(server_info->ptok, &se_printop ) ) {
                return True;
        }
index 67767a2e561ae9b0f58c6f79f2e5d2fd1ca8a042..c1a78c14dc777f8b38d7651c92217789b39119c6 100644 (file)
@@ -459,6 +459,16 @@ WERROR reg_createkey(TALLOC_CTX *ctx, struct registry_key *parent,
        char *path, *end;
        WERROR err;
 
+       /*
+        * We must refuse to handle subkey-paths containing
+        * a '/' character because at a lower level, after
+        * normalization, '/' is treated as a key separator
+        * just like '\\'.
+        */
+       if (strchr(subkeypath, '/') != NULL) {
+               return WERR_INVALID_PARAM;
+       }
+
        if (!(mem_ctx = talloc_new(ctx))) return WERR_NOMEM;
 
        if (!(path = talloc_strdup(mem_ctx, subkeypath))) {
index e853bb204724940b2429d3950df2eb28ed7e1a19..21b297af2dabf462905cbd790eb073851321b876 100644 (file)
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
 
+/*
+ * Handle database - stored per pipe.
+ */
+
+struct policy {
+       struct policy *next, *prev;
+
+       struct policy_handle pol_hnd;
+
+       uint32_t access_granted;
+
+       void *data_ptr;
+};
+
+struct handle_list {
+       struct policy *Policy;  /* List of policies. */
+       size_t count;                   /* Current number of handles. */
+       size_t pipe_ref_count;  /* Number of pipe handles referring to this list. */
+};
+
 /* This is the max handles across all instances of a pipe name. */
 #ifndef MAX_OPEN_POLS
 #define MAX_OPEN_POLS 1024
@@ -40,6 +60,14 @@ static bool is_samr_lsa_pipe(const struct ndr_syntax_id *syntax)
                || ndr_syntax_id_equal(syntax, &ndr_table_lsarpc.syntax_id));
 }
 
+size_t num_pipe_handles(struct handle_list *list)
+{
+       if (list == NULL) {
+               return 0;
+       }
+       return list->count;
+}
+
 /****************************************************************************
  Initialise a policy handle list on a pipe. Handle list is shared between all
  pipes of the same name.
@@ -112,7 +140,9 @@ bool init_pipe_handle_list(pipes_struct *p, const struct ndr_syntax_id *syntax)
   data_ptr is TALLOC_FREE()'ed
 ****************************************************************************/
 
-bool create_policy_hnd(pipes_struct *p, struct policy_handle *hnd, void *data_ptr)
+static struct policy *create_policy_hnd_internal(pipes_struct *p,
+                                                struct policy_handle *hnd,
+                                                void *data_ptr)
 {
        static uint32 pol_hnd_low  = 0;
        static uint32 pol_hnd_high = 0;
@@ -123,13 +153,13 @@ bool create_policy_hnd(pipes_struct *p, struct policy_handle *hnd, void *data_pt
        if (p->pipe_handles->count > MAX_OPEN_POLS) {
                DEBUG(0,("create_policy_hnd: ERROR: too many handles (%d) on this pipe.\n",
                                (int)p->pipe_handles->count));
-               return False;
+               return NULL;
        }
 
        pol = TALLOC_ZERO_P(NULL, struct policy);
        if (!pol) {
                DEBUG(0,("create_policy_hnd: ERROR: out of memory!\n"));
-               return False;
+               return NULL;
        }
 
        if (data_ptr != NULL) {
@@ -160,14 +190,22 @@ bool create_policy_hnd(pipes_struct *p, struct policy_handle *hnd, void *data_pt
        DEBUG(4,("Opened policy hnd[%d] ", (int)p->pipe_handles->count));
        dump_data(4, (uint8 *)hnd, sizeof(*hnd));
 
-       return True;
+       return pol;
+}
+
+bool create_policy_hnd(pipes_struct *p, struct policy_handle *hnd,
+                      void *data_ptr)
+{
+       return create_policy_hnd_internal(p, hnd, data_ptr) != NULL;
 }
 
 /****************************************************************************
   find policy by handle - internal version.
 ****************************************************************************/
 
-static struct policy *find_policy_by_hnd_internal(pipes_struct *p, struct policy_handle *hnd, void **data_p)
+static struct policy *find_policy_by_hnd_internal(pipes_struct *p,
+                                                 const struct policy_handle *hnd,
+                                                 void **data_p)
 {
        struct policy *pol;
        size_t i;
@@ -197,7 +235,8 @@ static struct policy *find_policy_by_hnd_internal(pipes_struct *p, struct policy
   find policy by handle
 ****************************************************************************/
 
-bool find_policy_by_hnd(pipes_struct *p, struct policy_handle *hnd, void **data_p)
+bool find_policy_by_hnd(pipes_struct *p, const struct policy_handle *hnd,
+                       void **data_p)
 {
        return find_policy_by_hnd_internal(p, hnd, data_p) == NULL ? False : True;
 }
@@ -277,3 +316,81 @@ bool pipe_access_check(pipes_struct *p)
 
        return True;
 }
+
+void *_policy_handle_create(struct pipes_struct *p, struct policy_handle *hnd,
+                           uint32_t access_granted, size_t data_size,
+                           const char *type, NTSTATUS *pstatus)
+{
+       struct policy *pol;
+       void *data;
+
+       if (p->pipe_handles->count > MAX_OPEN_POLS) {
+               DEBUG(0, ("policy_handle_create: ERROR: too many handles (%d) "
+                         "on pipe %s.\n", (int)p->pipe_handles->count,
+                         get_pipe_name_from_iface(&p->syntax)));
+               *pstatus = NT_STATUS_INSUFFICIENT_RESOURCES;
+               return NULL;
+       }
+
+       data = talloc_size(talloc_tos(), data_size);
+       if (data == NULL) {
+               *pstatus = NT_STATUS_NO_MEMORY;
+               return NULL;
+       }
+       talloc_set_name(data, "%s", type);
+
+       pol = create_policy_hnd_internal(p, hnd, data);
+       if (pol == NULL) {
+               TALLOC_FREE(data);
+               *pstatus = NT_STATUS_NO_MEMORY;
+               return NULL;
+       }
+       pol->access_granted = access_granted;
+       *pstatus = NT_STATUS_OK;
+       return data;
+}
+
+void *_policy_handle_find(struct pipes_struct *p,
+                         const struct policy_handle *hnd,
+                         uint32_t access_required,
+                         uint32_t *paccess_granted,
+                         const char *name, const char *location,
+                         NTSTATUS *pstatus)
+{
+       struct policy *pol;
+       void *data;
+
+       pol = find_policy_by_hnd_internal(p, hnd, &data);
+       if (pol == NULL) {
+               *pstatus = NT_STATUS_INVALID_HANDLE;
+               return NULL;
+       }
+       if (strcmp(name, talloc_get_name(data)) != 0) {
+               DEBUG(10, ("expected %s, got %s\n", name,
+                          talloc_get_name(data)));
+               *pstatus = NT_STATUS_INVALID_HANDLE;
+               return NULL;
+       }
+       if ((access_required & pol->access_granted) != access_required) {
+               if (geteuid() == sec_initial_uid()) {
+                       DEBUG(4, ("%s: ACCESS should be DENIED (granted: "
+                                 "%#010x; required: %#010x)\n", location,
+                                 pol->access_granted, access_required));
+                       DEBUGADD(4,("but overwritten by euid == 0\n"));
+                       goto okay;
+               }
+               DEBUG(2,("%s: ACCESS DENIED (granted: %#010x; required: "
+                        "%#010x)\n", location, pol->access_granted,
+                        access_required));
+               *pstatus = NT_STATUS_ACCESS_DENIED;
+               return NULL;
+       }
+
+ okay:
+       DEBUG(10, ("found handle of type %s\n", talloc_get_name(data)));
+       if (paccess_granted != NULL) {
+               *paccess_granted = pol->access_granted;
+       }
+       *pstatus = NT_STATUS_OK;
+       return data;
+}
index 0ce2b40f656be019f1a5735482115f29ae6a0119..9481c206f66b4583cbf61ce2ec7dfa4841d666cc 100644 (file)
@@ -827,7 +827,15 @@ NTSTATUS _lsa_LookupSids(pipes_struct *p,
                                           &names,
                                           &mapped_count);
 
-       if (NT_STATUS_IS_ERR(status)) {
+       /* Only return here when there is a real error.
+          NT_STATUS_NONE_MAPPED is a special case as it indicates that none of
+          the requested sids could be resolved. Older versions of XP (pre SP3)
+          rely that we return with the string representations of those SIDs in
+          that case. If we don't, XP crashes - Guenther
+          */
+
+       if (NT_STATUS_IS_ERR(status) &&
+           !NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {
                return status;
        }
 
index 187c721dfb2d12972215a4f5990c2464e53b1668..b54ed717a304be54ef0b4da6b480a6e60eea2173 100644 (file)
 #define MAX_SAM_ENTRIES_W2K 0x400 /* 1024 */
 #define MAX_SAM_ENTRIES_W95 50
 
+struct samr_connect_info {
+       uint8_t dummy;
+};
+
+struct samr_domain_info {
+       struct dom_sid sid;
+       struct disp_info *disp_info;
+};
+
 typedef struct disp_info {
        DOM_SID sid; /* identify which domain this is. */
-       bool builtin_domain; /* Quick flag to check if this is the builtin domain. */
        struct pdb_search *users; /* querydispinfo 1 and 4 */
        struct pdb_search *machines; /* querydispinfo 2 */
        struct pdb_search *groups; /* querydispinfo 3 and 5, enumgroups */
@@ -70,7 +78,6 @@ typedef struct disp_info {
 struct samr_info {
        /* for use by the \PIPE\samr policy */
        DOM_SID sid;
-       bool builtin_domain; /* Quick flag to check if this is the builtin domain. */
        uint32 status; /* some sort of flag.  best to record it.  comes from opnum 0x39 */
        uint32 acc_granted;
        DISP_INFO *disp_info;
@@ -298,7 +305,7 @@ static void map_max_allowed_access(const NT_USER_TOKEN *token,
  Fetch or create a dispinfo struct.
 ********************************************************************/
 
-static DISP_INFO *get_samr_dispinfo_by_sid(DOM_SID *psid)
+static DISP_INFO *get_samr_dispinfo_by_sid(const struct dom_sid *psid)
 {
        /*
         * We do a static cache for DISP_INFO's here. Explanation can be found
@@ -377,26 +384,20 @@ static struct samr_info *get_samr_info_by_sid(TALLOC_CTX *mem_ctx,
                                              DOM_SID *psid)
 {
        struct samr_info *info;
-       fstring sid_str;
 
-       if (psid) {
-               sid_to_fstring(sid_str, psid);
-       } else {
-               fstrcpy(sid_str,"(NULL)");
-       }
-
-       if ((info = TALLOC_ZERO_P(mem_ctx, struct samr_info)) == NULL) {
+       info = talloc_zero(mem_ctx, struct samr_info);
+       if (info == NULL) {
                return NULL;
        }
        talloc_set_destructor(info, samr_info_destructor);
 
-       DEBUG(10,("get_samr_info_by_sid: created new info for sid %s\n", sid_str));
+       DEBUG(10, ("get_samr_info_by_sid: created new info for sid %s\n",
+                  sid_string_dbg(psid)));
+
        if (psid) {
                sid_copy( &info->sid, psid);
-               info->builtin_domain = sid_check_is_builtin(psid);
        } else {
                DEBUG(10,("get_samr_info_by_sid: created new info for NULL sid.\n"));
-               info->builtin_domain = False;
        }
 
        info->disp_info = get_samr_dispinfo_by_sid(psid);
@@ -481,8 +482,10 @@ static void set_disp_info_cache_timeout(DISP_INFO *disp_info, time_t secs_fromno
  We must also remove the timeout handler.
  ********************************************************************/
 
-static void force_flush_samr_cache(DISP_INFO *disp_info)
+static void force_flush_samr_cache(const struct dom_sid *sid)
 {
+       struct disp_info *disp_info = get_samr_dispinfo_by_sid(sid);
+
        if ((disp_info == NULL) || (disp_info->cache_timeout_event == NULL)) {
                return;
        }
@@ -512,7 +515,7 @@ static uint32 count_sam_users(struct disp_info *info, uint32 acct_flags)
 {
        struct samr_displayentry *entry;
 
-       if (info->builtin_domain) {
+       if (sid_check_is_builtin(&info->sid)) {
                /* No users in builtin. */
                return 0;
        }
@@ -536,7 +539,7 @@ static uint32 count_sam_groups(struct disp_info *info)
 {
        struct samr_displayentry *entry;
 
-       if (info->builtin_domain) {
+       if (sid_check_is_builtin(&info->sid)) {
                /* No groups in builtin. */
                return 0;
        }
@@ -597,7 +600,8 @@ NTSTATUS _samr_Close(pipes_struct *p, struct samr_Close *r)
 NTSTATUS _samr_OpenDomain(pipes_struct *p,
                          struct samr_OpenDomain *r)
 {
-       struct    samr_info *info;
+       struct samr_connect_info *cinfo;
+       struct samr_domain_info *dinfo;
        SEC_DESC *psd = NULL;
        uint32    acc_granted;
        uint32    des_access = r->in.access_mask;
@@ -607,15 +611,11 @@ NTSTATUS _samr_OpenDomain(pipes_struct *p,
 
        /* find the connection policy handle. */
 
-       if ( !find_policy_by_hnd(p, r->in.connect_handle, (void**)(void *)&info) )
-               return NT_STATUS_INVALID_HANDLE;
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_ACCESS_OPEN_DOMAIN,
-                                           "_samr_OpenDomain" );
-
-       if ( !NT_STATUS_IS_OK(status) )
+       cinfo = policy_handle_find(p, r->in.connect_handle, 0, NULL,
+                                  struct samr_connect_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
                return status;
+       }
 
        /*check if access can be granted as requested by client. */
        map_max_allowed_access(p->server_info->ptok, &des_access);
@@ -638,14 +638,13 @@ NTSTATUS _samr_OpenDomain(pipes_struct *p,
                return NT_STATUS_NO_SUCH_DOMAIN;
        }
 
-       /* associate the domain SID with the (unique) handle. */
-       if ((info = get_samr_info_by_sid(p->mem_ctx, r->in.sid))==NULL)
-               return NT_STATUS_NO_MEMORY;
-       info->acc_granted = acc_granted;
-
-       /* get a (unique) handle.  open a policy on it. */
-       if (!create_policy_hnd(p, r->out.domain_handle, info))
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+       dinfo = policy_handle_create(p, r->out.domain_handle, acc_granted,
+                                    struct samr_domain_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       dinfo->sid = *r->in.sid;
+       dinfo->disp_info = get_samr_dispinfo_by_sid(r->in.sid);
 
        DEBUG(5,("_samr_OpenDomain: %d\n", __LINE__));
 
@@ -964,7 +963,7 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
                               struct samr_EnumDomainUsers *r)
 {
        NTSTATUS status;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        int num_account;
        uint32 enum_context = *r->in.resume_handle;
        enum remote_arch_types ra_type = get_remote_arch();
@@ -974,20 +973,16 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
        struct samr_SamArray *samr_array = NULL;
        struct samr_SamEntry *samr_entries = NULL;
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
+       DEBUG(5,("_samr_EnumDomainUsers: %d\n", __LINE__));
 
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                           "_samr_EnumDomainUsers");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
 
-       DEBUG(5,("_samr_EnumDomainUsers: %d\n", __LINE__));
-
-       if (info->builtin_domain) {
+       if (sid_check_is_builtin(&dinfo->sid)) {
                /* No users in builtin. */
                *r->out.resume_handle = *r->in.resume_handle;
                DEBUG(5,("_samr_EnumDomainUsers: No users in BUILTIN\n"));
@@ -1004,24 +999,24 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 
        /* AS ROOT !!!! */
 
-       if ((info->disp_info->enum_users != NULL) &&
-           (info->disp_info->enum_acb_mask != r->in.acct_flags)) {
-               TALLOC_FREE(info->disp_info->enum_users);
+       if ((dinfo->disp_info->enum_users != NULL) &&
+           (dinfo->disp_info->enum_acb_mask != r->in.acct_flags)) {
+               TALLOC_FREE(dinfo->disp_info->enum_users);
        }
 
-       if (info->disp_info->enum_users == NULL) {
-               info->disp_info->enum_users = pdb_search_users(
-                       info->disp_info, r->in.acct_flags);
-               info->disp_info->enum_acb_mask = r->in.acct_flags;
+       if (dinfo->disp_info->enum_users == NULL) {
+               dinfo->disp_info->enum_users = pdb_search_users(
+                       dinfo->disp_info, r->in.acct_flags);
+               dinfo->disp_info->enum_acb_mask = r->in.acct_flags;
        }
 
-       if (info->disp_info->enum_users == NULL) {
+       if (dinfo->disp_info->enum_users == NULL) {
                /* END AS ROOT !!!! */
                unbecome_root();
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       num_account = pdb_search_entries(info->disp_info->enum_users,
+       num_account = pdb_search_entries(dinfo->disp_info->enum_users,
                                         enum_context, max_entries,
                                         &entries);
 
@@ -1050,7 +1045,7 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
        }
 
        /* Ensure we cache this enumeration. */
-       set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+       set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
        DEBUG(5, ("_samr_EnumDomainUsers: %d\n", __LINE__));
 
@@ -1107,26 +1102,22 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
                                struct samr_EnumDomainGroups *r)
 {
        NTSTATUS status;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        struct samr_displayentry *groups;
        uint32 num_groups;
        struct samr_SamArray *samr_array = NULL;
        struct samr_SamEntry *samr_entries = NULL;
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                           "_samr_EnumDomainGroups");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
 
        DEBUG(5,("_samr_EnumDomainGroups: %d\n", __LINE__));
 
-       if (info->builtin_domain) {
+       if (sid_check_is_builtin(&dinfo->sid)) {
                /* No groups in builtin. */
                *r->out.resume_handle = *r->in.resume_handle;
                DEBUG(5,("_samr_EnumDomainGroups: No groups in BUILTIN\n"));
@@ -1142,22 +1133,22 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
 
        become_root();
 
-       if (info->disp_info->groups == NULL) {
-               info->disp_info->groups = pdb_search_groups(info->disp_info);
+       if (dinfo->disp_info->groups == NULL) {
+               dinfo->disp_info->groups = pdb_search_groups(dinfo->disp_info);
 
-               if (info->disp_info->groups == NULL) {
+               if (dinfo->disp_info->groups == NULL) {
                        unbecome_root();
                        return NT_STATUS_ACCESS_DENIED;
                }
        }
 
-       num_groups = pdb_search_entries(info->disp_info->groups,
+       num_groups = pdb_search_entries(dinfo->disp_info->groups,
                                        *r->in.resume_handle,
                                        MAX_SAM_ENTRIES, &groups);
        unbecome_root();
 
        /* Ensure we cache this enumeration. */
-       set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+       set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
        make_group_sam_entry_list(p->mem_ctx, &samr_entries,
                                  num_groups, groups);
@@ -1182,26 +1173,22 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
                                 struct samr_EnumDomainAliases *r)
 {
        NTSTATUS status;
-       struct samr_info *info;
+       struct samr_domain_info *dinfo;
        struct samr_displayentry *aliases;
        uint32 num_aliases = 0;
        struct samr_SamArray *samr_array = NULL;
        struct samr_SamEntry *samr_entries = NULL;
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
-       DEBUG(5,("_samr_EnumDomainAliases: sid %s\n",
-                sid_string_dbg(&info->sid)));
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                           "_samr_EnumDomainAliases");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
 
+       DEBUG(5,("_samr_EnumDomainAliases: sid %s\n",
+                sid_string_dbg(&dinfo->sid)));
+
        samr_array = TALLOC_ZERO_P(p->mem_ctx, struct samr_SamArray);
        if (!samr_array) {
                return NT_STATUS_NO_MEMORY;
@@ -1209,22 +1196,22 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
 
        become_root();
 
-       if (info->disp_info->aliases == NULL) {
-               info->disp_info->aliases = pdb_search_aliases(
-                       info->disp_info, &info->sid);
-               if (info->disp_info->aliases == NULL) {
+       if (dinfo->disp_info->aliases == NULL) {
+               dinfo->disp_info->aliases = pdb_search_aliases(
+                       dinfo->disp_info, &dinfo->sid);
+               if (dinfo->disp_info->aliases == NULL) {
                        unbecome_root();
                        return NT_STATUS_ACCESS_DENIED;
                }
        }
 
-       num_aliases = pdb_search_entries(info->disp_info->aliases,
+       num_aliases = pdb_search_entries(dinfo->disp_info->aliases,
                                         *r->in.resume_handle,
                                         MAX_SAM_ENTRIES, &aliases);
        unbecome_root();
 
        /* Ensure we cache this enumeration. */
-       set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+       set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
        make_group_sam_entry_list(p->mem_ctx, &samr_entries,
                                  num_aliases, aliases);
@@ -1447,7 +1434,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
                                struct samr_QueryDisplayInfo *r)
 {
        NTSTATUS status;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        uint32 struct_size=0x20; /* W2K always reply that, client doesn't care */
 
        uint32 max_entries = r->in.max_entries;
@@ -1465,18 +1452,9 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 
        DEBUG(5,("_samr_QueryDisplayInfo: %d\n", __LINE__));
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
-       if (info->builtin_domain) {
-               DEBUG(5,("_samr_QueryDisplayInfo: Nothing in BUILTIN\n"));
-               return NT_STATUS_OK;
-       }
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                           "_samr_QueryDisplayInfo");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -1541,10 +1519,10 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
        switch (r->in.level) {
        case 0x1:
        case 0x4:
-               if (info->disp_info->users == NULL) {
-                       info->disp_info->users = pdb_search_users(
-                               info->disp_info, ACB_NORMAL);
-                       if (info->disp_info->users == NULL) {
+               if (dinfo->disp_info->users == NULL) {
+                       dinfo->disp_info->users = pdb_search_users(
+                               dinfo->disp_info, ACB_NORMAL);
+                       if (dinfo->disp_info->users == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -1555,15 +1533,15 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
                                (unsigned  int)enum_context ));
                }
 
-               num_account = pdb_search_entries(info->disp_info->users,
+               num_account = pdb_search_entries(dinfo->disp_info->users,
                                                 enum_context, max_entries,
                                                 &entries);
                break;
        case 0x2:
-               if (info->disp_info->machines == NULL) {
-                       info->disp_info->machines = pdb_search_users(
-                               info->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
-                       if (info->disp_info->machines == NULL) {
+               if (dinfo->disp_info->machines == NULL) {
+                       dinfo->disp_info->machines = pdb_search_users(
+                               dinfo->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
+                       if (dinfo->disp_info->machines == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -1574,16 +1552,16 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
                                (unsigned  int)enum_context ));
                }
 
-               num_account = pdb_search_entries(info->disp_info->machines,
+               num_account = pdb_search_entries(dinfo->disp_info->machines,
                                                 enum_context, max_entries,
                                                 &entries);
                break;
        case 0x3:
        case 0x5:
-               if (info->disp_info->groups == NULL) {
-                       info->disp_info->groups = pdb_search_groups(
-                               info->disp_info);
-                       if (info->disp_info->groups == NULL) {
+               if (dinfo->disp_info->groups == NULL) {
+                       dinfo->disp_info->groups = pdb_search_groups(
+                               dinfo->disp_info);
+                       if (dinfo->disp_info->groups == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -1594,7 +1572,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
                                (unsigned  int)enum_context ));
                }
 
-               num_account = pdb_search_entries(info->disp_info->groups,
+               num_account = pdb_search_entries(dinfo->disp_info->groups,
                                                 enum_context, max_entries,
                                                 &entries);
                break;
@@ -1651,7 +1629,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
        }
 
        /* Ensure we cache this enumeration. */
-       set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+       set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
        DEBUG(5, ("_samr_QueryDisplayInfo: %d\n", __LINE__));
 
@@ -1776,25 +1754,20 @@ NTSTATUS _samr_QueryAliasInfo(pipes_struct *p,
 NTSTATUS _samr_LookupNames(pipes_struct *p,
                           struct samr_LookupNames *r)
 {
+       struct samr_domain_info *dinfo;
        NTSTATUS status;
        uint32 *rid;
        enum lsa_SidType *type;
        int i;
        int num_rids = r->in.num_names;
-       DOM_SID pol_sid;
-       uint32  acc_granted;
        struct samr_Ids rids, types;
        uint32_t num_mapped = 0;
 
        DEBUG(5,("_samr_LookupNames: %d\n", __LINE__));
 
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &pol_sid, &acc_granted, NULL)) {
-               return NT_STATUS_OBJECT_TYPE_MISMATCH;
-       }
-
-       status = access_check_samr_function(acc_granted,
-                                           0, /* Don't know the acc_bits yet */
-                                           "_samr_LookupNames");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  0 /* Don't know the acc_bits yet */, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -1811,7 +1784,7 @@ NTSTATUS _samr_LookupNames(pipes_struct *p,
        NT_STATUS_HAVE_NO_MEMORY(type);
 
        DEBUG(5,("_samr_LookupNames: looking name on SID %s\n",
-                sid_string_dbg(&pol_sid)));
+                sid_string_dbg(&dinfo->sid)));
 
        for (i = 0; i < num_rids; i++) {
 
@@ -1820,7 +1793,7 @@ NTSTATUS _samr_LookupNames(pipes_struct *p,
 
                rid[i] = 0xffffffff;
 
-               if (sid_check_is_builtin(&pol_sid)) {
+               if (sid_check_is_builtin(&dinfo->sid)) {
                        if (lookup_builtin_name(r->in.names[i].string,
                                                &rid[i]))
                        {
@@ -2037,13 +2010,12 @@ static bool make_samr_lookup_rids(TALLOC_CTX *ctx, uint32 num_names,
 NTSTATUS _samr_LookupRids(pipes_struct *p,
                          struct samr_LookupRids *r)
 {
+       struct samr_domain_info *dinfo;
        NTSTATUS status;
        const char **names;
        enum lsa_SidType *attrs = NULL;
        uint32 *wire_attrs = NULL;
-       DOM_SID pol_sid;
        int num_rids = (int)r->in.num_rids;
-       uint32 acc_granted;
        int i;
        struct lsa_Strings names_array;
        struct samr_Ids types_array;
@@ -2051,13 +2023,9 @@ NTSTATUS _samr_LookupRids(pipes_struct *p,
 
        DEBUG(5,("_samr_LookupRids: %d\n", __LINE__));
 
-       /* find the policy handle.  open a policy on it. */
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &pol_sid, &acc_granted, NULL))
-               return NT_STATUS_INVALID_HANDLE;
-
-       status = access_check_samr_function(acc_granted,
-                                           0, /* Don't know the acc_bits yet */
-                                           "_samr_LookupRids");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  0 /* Don't know the acc_bits yet */, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -2082,7 +2050,7 @@ NTSTATUS _samr_LookupRids(pipes_struct *p,
        }
 
        become_root();  /* lookup_sid can require root privs */
-       status = pdb_lookup_rids(&pol_sid, num_rids, r->in.rids,
+       status = pdb_lookup_rids(&dinfo->sid, num_rids, r->in.rids,
                                 names, attrs);
        unbecome_root();
 
@@ -2123,7 +2091,8 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
 {
        struct samu *sampass=NULL;
        DOM_SID sid;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
+       struct samr_info *info;
        SEC_DESC *psd = NULL;
        uint32    acc_granted;
        uint32    des_access = r->in.access_mask;
@@ -2131,18 +2100,14 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
        bool ret;
        NTSTATUS nt_status;
        SE_PRIV se_rights;
+       NTSTATUS status;
 
-       /* find the domain policy handle and get domain SID / access bits in the domain policy. */
-
-       if ( !get_lsa_policy_samr_sid(p, r->in.domain_handle, &sid, &acc_granted, NULL) )
-               return NT_STATUS_INVALID_HANDLE;
-
-       nt_status = access_check_samr_function(acc_granted,
-                                              SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
-                                              "_samr_OpenUser" );
-
-       if ( !NT_STATUS_IS_OK(nt_status) )
-               return nt_status;
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, NULL,
+                                  struct samr_domain_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
 
        if ( !(sampass = samu_new( p->mem_ctx )) ) {
                return NT_STATUS_NO_MEMORY;
@@ -2150,7 +2115,7 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
 
        /* append the user's RID to it */
 
-       if (!sid_append_rid(&sid, r->in.rid))
+       if (!sid_compose(&sid, &dinfo->sid, r->in.rid))
                return NT_STATUS_NO_SUCH_USER;
 
        /* check if access can be granted as requested by client. */
@@ -2788,7 +2753,7 @@ NTSTATUS _samr_QueryDomainInfo(pipes_struct *p,
                               struct samr_QueryDomainInfo *r)
 {
        NTSTATUS status = NT_STATUS_OK;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        union samr_DomainInfo *dom_info;
        time_t u_expire, u_min_age;
 
@@ -2802,23 +2767,18 @@ NTSTATUS _samr_QueryDomainInfo(pipes_struct *p,
 
        DEBUG(5,("_samr_QueryDomainInfo: %d\n", __LINE__));
 
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_ACCESS_LOOKUP_DOMAIN, NULL,
+                                  struct samr_domain_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
        dom_info = TALLOC_ZERO_P(p->mem_ctx, union samr_DomainInfo);
        if (!dom_info) {
                return NT_STATUS_NO_MEMORY;
        }
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info)) {
-               return NT_STATUS_INVALID_HANDLE;
-       }
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_ACCESS_OPEN_DOMAIN,
-                                           "_samr_QueryDomainInfo" );
-
-       if ( !NT_STATUS_IS_OK(status) )
-               return status;
-
        switch (r->in.level) {
                case 0x01:
 
@@ -2860,9 +2820,12 @@ NTSTATUS _samr_QueryDomainInfo(pipes_struct *p,
 
                        /* AS ROOT !!! */
 
-                       dom_info->general.num_users     = count_sam_users(info->disp_info, ACB_NORMAL);
-                       dom_info->general.num_groups    = count_sam_groups(info->disp_info);
-                       dom_info->general.num_aliases   = count_sam_aliases(info->disp_info);
+                       dom_info->general.num_users     = count_sam_users(
+                               dinfo->disp_info, ACB_NORMAL);
+                       dom_info->general.num_groups    = count_sam_groups(
+                               dinfo->disp_info);
+                       dom_info->general.num_aliases   = count_sam_aliases(
+                               dinfo->disp_info);
 
                        pdb_get_account_policy(AP_TIME_TO_LOGOUT, &u_logout);
 
@@ -3032,7 +2995,8 @@ NTSTATUS _samr_CreateUser2(pipes_struct *p,
        const char *account = NULL;
        DOM_SID sid;
        uint32_t acb_info = r->in.acct_flags;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
+       struct samr_info *info;
        NTSTATUS nt_status;
        uint32 acc_granted;
        SEC_DESC *psd;
@@ -3041,25 +3005,19 @@ NTSTATUS _samr_CreateUser2(pipes_struct *p,
        uint32    des_access = GENERIC_RIGHTS_USER_ALL_ACCESS;
        bool can_add_account = False;
        SE_PRIV se_rights;
-       DISP_INFO *disp_info = NULL;
 
-       /* Get the domain SID stored in the domain policy */
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &sid, &acc_granted,
-                                    &disp_info))
-               return NT_STATUS_INVALID_HANDLE;
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_CREATE_USER, NULL,
+                                  struct samr_domain_info, &nt_status);
+       if (!NT_STATUS_IS_OK(nt_status)) {
+               return nt_status;
+       }
 
-       if (disp_info->builtin_domain) {
+       if (sid_check_is_builtin(&dinfo->sid)) {
                DEBUG(5,("_samr_CreateUser2: Refusing user create in BUILTIN\n"));
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       nt_status = access_check_samr_function(acc_granted,
-                                              SAMR_DOMAIN_ACCESS_CREATE_USER,
-                                              "_samr_CreateUser2");
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               return nt_status;
-       }
-
        if (!(acb_info == ACB_NORMAL || acb_info == ACB_DOMTRUST ||
              acb_info == ACB_WSTRUST || acb_info == ACB_SVRTRUST)) {
                /* Match Win2k, and return NT_STATUS_INVALID_PARAMETER if
@@ -3161,7 +3119,7 @@ NTSTATUS _samr_CreateUser2(pipes_struct *p,
        }
 
        /* After a "set" ensure we have no cached display info. */
-       force_flush_samr_cache(info->disp_info);
+       force_flush_samr_cache(&sid);
 
        *r->out.access_granted = acc_granted;
 
@@ -3195,8 +3153,11 @@ NTSTATUS _samr_CreateUser(pipes_struct *p,
 NTSTATUS _samr_Connect(pipes_struct *p,
                       struct samr_Connect *r)
 {
-       struct samr_info *info = NULL;
+       struct samr_connect_info *info;
+       uint32_t acc_granted;
+       struct policy_handle hnd;
        uint32    des_access = r->in.access_mask;
+       NTSTATUS status;
 
        /* Access check */
 
@@ -3205,12 +3166,6 @@ NTSTATUS _samr_Connect(pipes_struct *p,
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       /* set up the SAMR connect_anon response */
-
-       /* associate the user's SID with the new handle. */
-       if ((info = get_samr_info_by_sid(p->mem_ctx, NULL)) == NULL)
-               return NT_STATUS_NO_MEMORY;
-
        /* don't give away the farm but this is probably ok.  The SAMR_ACCESS_ENUM_DOMAINS
           was observed from a win98 client trying to enumerate users (when configured
           user level access control on shares)   --jerry */
@@ -3218,12 +3173,20 @@ NTSTATUS _samr_Connect(pipes_struct *p,
        map_max_allowed_access(p->server_info->ptok, &des_access);
 
        se_map_generic( &des_access, &sam_generic_mapping );
-       info->acc_granted = des_access & (SAMR_ACCESS_ENUM_DOMAINS|SAMR_ACCESS_OPEN_DOMAIN);
 
-       /* get a (unique) handle.  open a policy on it. */
-       if (!create_policy_hnd(p, r->out.connect_handle, info))
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+       acc_granted = des_access & (SAMR_ACCESS_ENUM_DOMAINS
+                                   |SAMR_ACCESS_LOOKUP_DOMAIN);
+
+       /* set up the SAMR connect_anon response */
+
+       info = policy_handle_create(p, &hnd, acc_granted,
+                                   struct samr_connect_info,
+                                   &status);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
 
+       *r->out.connect_handle = hnd;
        return NT_STATUS_OK;
 }
 
@@ -3234,7 +3197,8 @@ NTSTATUS _samr_Connect(pipes_struct *p,
 NTSTATUS _samr_Connect2(pipes_struct *p,
                        struct samr_Connect2 *r)
 {
-       struct samr_info *info = NULL;
+       struct samr_connect_info *info = NULL;
+       struct policy_handle hnd;
        SEC_DESC *psd = NULL;
        uint32    acc_granted;
        uint32    des_access = r->in.access_mask;
@@ -3277,20 +3241,16 @@ NTSTATUS _samr_Connect2(pipes_struct *p,
        if ( !NT_STATUS_IS_OK(nt_status) )
                return nt_status;
 
-       /* associate the user's SID and access granted with the new handle. */
-       if ((info = get_samr_info_by_sid(p->mem_ctx, NULL)) == NULL)
-               return NT_STATUS_NO_MEMORY;
-
-       info->acc_granted = acc_granted;
-       info->status = r->in.access_mask; /* this looks so wrong... - gd */
-
-       /* get a (unique) handle.  open a policy on it. */
-       if (!create_policy_hnd(p, r->out.connect_handle, info))
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+       info = policy_handle_create(p, &hnd, acc_granted,
+                                   struct samr_connect_info, &nt_status);
+        if (!NT_STATUS_IS_OK(nt_status)) {
+                return nt_status;
+        }
 
        DEBUG(5,("%s: %d\n", fn, __LINE__));
 
-       return nt_status;
+       *r->out.connect_handle = hnd;
+       return NT_STATUS_OK;
 }
 
 /****************************************************************
@@ -3361,20 +3321,18 @@ NTSTATUS _samr_Connect5(pipes_struct *p,
 NTSTATUS _samr_LookupDomain(pipes_struct *p,
                            struct samr_LookupDomain *r)
 {
-       NTSTATUS status = NT_STATUS_OK;
-       struct samr_info *info;
+       NTSTATUS status;
+       struct samr_connect_info *info;
        const char *domain_name;
        DOM_SID *sid = NULL;
 
-       if (!find_policy_by_hnd(p, r->in.connect_handle, (void**)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
        /* win9x user manager likes to use SAMR_ACCESS_ENUM_DOMAINS here.
           Reverted that change so we will work with RAS servers again */
 
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_ACCESS_OPEN_DOMAIN,
-                                           "_samr_LookupDomain");
+       info = policy_handle_find(p, r->in.connect_handle,
+                                 SAMR_ACCESS_LOOKUP_DOMAIN, NULL,
+                                 struct samr_connect_info,
+                                 &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -3413,17 +3371,14 @@ NTSTATUS _samr_EnumDomains(pipes_struct *p,
                           struct samr_EnumDomains *r)
 {
        NTSTATUS status;
-       struct samr_info *info;
+       struct samr_connect_info *info;
        uint32_t num_entries = 2;
        struct samr_SamEntry *entry_array = NULL;
        struct samr_SamArray *sam;
 
-       if (!find_policy_by_hnd(p, r->in.connect_handle, (void**)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_ACCESS_ENUM_DOMAINS,
-                                           "_samr_EnumDomains");
+       info = policy_handle_find(p, r->in.connect_handle,
+                                 SAMR_ACCESS_ENUM_DOMAINS, NULL,
+                                 struct samr_connect_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -3465,6 +3420,7 @@ NTSTATUS _samr_OpenAlias(pipes_struct *p,
        DOM_SID sid;
        uint32 alias_rid = r->in.rid;
        struct    samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        SEC_DESC *psd = NULL;
        uint32    acc_granted;
        uint32    des_access = r->in.access_mask;
@@ -3472,21 +3428,16 @@ NTSTATUS _samr_OpenAlias(pipes_struct *p,
        NTSTATUS  status;
        SE_PRIV se_rights;
 
-       /* find the domain policy and get the SID / access bits stored in the domain policy */
-
-       if ( !get_lsa_policy_samr_sid(p, r->in.domain_handle, &sid, &acc_granted, NULL) )
-               return NT_STATUS_INVALID_HANDLE;
-
-       status = access_check_samr_function(acc_granted,
-                                           SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
-                                           "_samr_OpenAlias");
-
-       if ( !NT_STATUS_IS_OK(status) )
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, NULL,
+                                  struct samr_domain_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
                return status;
+       }
 
        /* append the alias' RID to it */
 
-       if (!sid_append_rid(&sid, alias_rid))
+       if (!sid_compose(&sid, &dinfo->sid, alias_rid))
                return NT_STATUS_NO_SUCH_ALIAS;
 
        /*check if access can be granted as requested by client. */
@@ -4288,7 +4239,7 @@ NTSTATUS _samr_SetUserInfo(pipes_struct *p,
        /* ================ END SeMachineAccountPrivilege BLOCK ================ */
 
        if (NT_STATUS_IS_OK(status)) {
-               force_flush_samr_cache(disp_info);
+               force_flush_samr_cache(&sid);
        }
 
        return status;
@@ -4319,36 +4270,25 @@ NTSTATUS _samr_GetAliasMembership(pipes_struct *p,
 {
        size_t num_alias_rids;
        uint32 *alias_rids;
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        size_t i;
 
-       NTSTATUS ntstatus1;
-       NTSTATUS ntstatus2;
+       NTSTATUS status;
 
        DOM_SID *members;
 
        DEBUG(5,("_samr_GetAliasMembership: %d\n", __LINE__));
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
-       ntstatus1 = access_check_samr_function(info->acc_granted,
-                                              SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
-                                              "_samr_GetAliasMembership");
-       ntstatus2 = access_check_samr_function(info->acc_granted,
-                                              SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
-                                              "_samr_GetAliasMembership");
-
-       if (!NT_STATUS_IS_OK(ntstatus1) || !NT_STATUS_IS_OK(ntstatus2)) {
-               if (!(NT_STATUS_EQUAL(ntstatus1,NT_STATUS_ACCESS_DENIED) && NT_STATUS_IS_OK(ntstatus2)) &&
-                   !(NT_STATUS_EQUAL(ntstatus1,NT_STATUS_ACCESS_DENIED) && NT_STATUS_IS_OK(ntstatus1))) {
-                       return (NT_STATUS_IS_OK(ntstatus1)) ? ntstatus2 : ntstatus1;
-               }
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS
+                                  | SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, NULL,
+                                  struct samr_domain_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
 
-       if (!sid_check_is_domain(&info->sid) &&
-           !sid_check_is_builtin(&info->sid))
+       if (!sid_check_is_domain(&dinfo->sid) &&
+           !sid_check_is_builtin(&dinfo->sid))
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
        if (r->in.sids->num_sids) {
@@ -4367,13 +4307,13 @@ NTSTATUS _samr_GetAliasMembership(pipes_struct *p,
        num_alias_rids = 0;
 
        become_root();
-       ntstatus1 = pdb_enum_alias_memberships(p->mem_ctx, &info->sid, members,
-                                              r->in.sids->num_sids,
-                                              &alias_rids, &num_alias_rids);
+       status = pdb_enum_alias_memberships(p->mem_ctx, &dinfo->sid, members,
+                                           r->in.sids->num_sids,
+                                           &alias_rids, &num_alias_rids);
        unbecome_root();
 
-       if (!NT_STATUS_IS_OK(ntstatus1)) {
-               return ntstatus1;
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
 
        r->out.rids->count = num_alias_rids;
@@ -4560,7 +4500,7 @@ NTSTATUS _samr_AddAliasMember(pipes_struct *p,
        /******** END SeAddUsers BLOCK *********/
 
        if (NT_STATUS_IS_OK(status)) {
-               force_flush_samr_cache(disp_info);
+               force_flush_samr_cache(&alias_sid);
        }
 
        return status;
@@ -4610,7 +4550,7 @@ NTSTATUS _samr_DeleteAliasMember(pipes_struct *p,
        /******** END SeAddUsers BLOCK *********/
 
        if (NT_STATUS_IS_OK(status)) {
-               force_flush_samr_cache(disp_info);
+               force_flush_samr_cache(&alias_sid);
        }
 
        return status;
@@ -4664,7 +4604,7 @@ NTSTATUS _samr_AddGroupMember(pipes_struct *p,
 
        /******** END SeAddUsers BLOCK *********/
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&group_sid);
 
        return status;
 }
@@ -4722,7 +4662,7 @@ NTSTATUS _samr_DeleteGroupMember(pipes_struct *p,
 
        /******** END SeAddUsers BLOCK *********/
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&group_sid);
 
        return status;
 }
@@ -4812,7 +4752,7 @@ NTSTATUS _samr_DeleteUser(pipes_struct *p,
 
        ZERO_STRUCTP(r->out.user_handle);
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&user_sid);
 
        return NT_STATUS_OK;
 }
@@ -4878,7 +4818,7 @@ NTSTATUS _samr_DeleteDomainGroup(pipes_struct *p,
        if (!close_policy_hnd(p, r->in.group_handle))
                return NT_STATUS_OBJECT_NAME_INVALID;
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&group_sid);
 
        return NT_STATUS_OK;
 }
@@ -4949,7 +4889,7 @@ NTSTATUS _samr_DeleteDomAlias(pipes_struct *p,
        if (!close_policy_hnd(p, r->in.alias_handle))
                return NT_STATUS_OBJECT_NAME_INVALID;
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&alias_sid);
 
        return NT_STATUS_OK;
 }
@@ -4963,27 +4903,21 @@ NTSTATUS _samr_CreateDomainGroup(pipes_struct *p,
 
 {
        NTSTATUS status;
-       DOM_SID dom_sid;
        DOM_SID info_sid;
        const char *name;
+       struct samr_domain_info *dinfo;
        struct samr_info *info;
-       uint32 acc_granted;
        SE_PRIV se_rights;
        bool can_add_accounts;
-       DISP_INFO *disp_info = NULL;
-
-       /* Find the policy handle. Open a policy on it. */
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &dom_sid, &acc_granted, &disp_info))
-               return NT_STATUS_INVALID_HANDLE;
 
-       status = access_check_samr_function(acc_granted,
-                                           SAMR_DOMAIN_ACCESS_CREATE_GROUP,
-                                           "_samr_CreateDomainGroup");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_CREATE_GROUP, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
 
-       if (!sid_equal(&dom_sid, get_global_sam_sid()))
+       if (!sid_equal(&dinfo->sid, get_global_sam_sid()))
                return NT_STATUS_ACCESS_DENIED;
 
        name = r->in.name->string;
@@ -5018,7 +4952,7 @@ NTSTATUS _samr_CreateDomainGroup(pipes_struct *p,
        if ( !NT_STATUS_IS_OK(status) )
                return status;
 
-       sid_compose(&info_sid, get_global_sam_sid(), *r->out.rid);
+       sid_compose(&info_sid, &dinfo->sid, *r->out.rid);
 
        if ((info = get_samr_info_by_sid(p->mem_ctx, &info_sid)) == NULL)
                return NT_STATUS_NO_MEMORY;
@@ -5031,7 +4965,7 @@ NTSTATUS _samr_CreateDomainGroup(pipes_struct *p,
        if (!create_policy_hnd(p, r->out.group_handle, info))
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&info_sid);
 
        return NT_STATUS_OK;
 }
@@ -5043,29 +4977,23 @@ NTSTATUS _samr_CreateDomainGroup(pipes_struct *p,
 NTSTATUS _samr_CreateDomAlias(pipes_struct *p,
                              struct samr_CreateDomAlias *r)
 {
-       DOM_SID dom_sid;
        DOM_SID info_sid;
        const char *name = NULL;
+       struct samr_domain_info *dinfo;
        struct samr_info *info;
-       uint32 acc_granted;
        gid_t gid;
        NTSTATUS result;
        SE_PRIV se_rights;
        bool can_add_accounts;
-       DISP_INFO *disp_info = NULL;
-
-       /* Find the policy handle. Open a policy on it. */
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &dom_sid, &acc_granted, &disp_info))
-               return NT_STATUS_INVALID_HANDLE;
 
-       result = access_check_samr_function(acc_granted,
-                                           SAMR_DOMAIN_ACCESS_CREATE_ALIAS,
-                                           "_samr_CreateDomAlias");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_CREATE_ALIAS, NULL,
+                                  struct samr_domain_info, &result);
        if (!NT_STATUS_IS_OK(result)) {
                return result;
        }
 
-       if (!sid_equal(&dom_sid, get_global_sam_sid()))
+       if (!sid_equal(&dinfo->sid, get_global_sam_sid()))
                return NT_STATUS_ACCESS_DENIED;
 
        name = r->in.alias_name->string;
@@ -5097,8 +5025,7 @@ NTSTATUS _samr_CreateDomAlias(pipes_struct *p,
                return result;
        }
 
-       sid_copy(&info_sid, get_global_sam_sid());
-       sid_append_rid(&info_sid, *r->out.rid);
+       sid_compose(&info_sid, &dinfo->sid, *r->out.rid);
 
        if (!sid_to_gid(&info_sid, &gid)) {
                DEBUG(10, ("Could not find alias just created\n"));
@@ -5123,7 +5050,7 @@ NTSTATUS _samr_CreateDomAlias(pipes_struct *p,
        if (!create_policy_hnd(p, r->out.alias_handle, info))
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&info_sid);
 
        return NT_STATUS_OK;
 }
@@ -5293,7 +5220,7 @@ NTSTATUS _samr_SetGroupInfo(pipes_struct *p,
        /******** End SeAddUsers BLOCK *********/
 
        if (NT_STATUS_IS_OK(status)) {
-               force_flush_samr_cache(disp_info);
+               force_flush_samr_cache(&group_sid);
        }
 
        return status;
@@ -5395,7 +5322,7 @@ NTSTATUS _samr_SetAliasInfo(pipes_struct *p,
         /******** End SeAddUsers BLOCK *********/
 
        if (NT_STATUS_IS_OK(status))
-               force_flush_samr_cache(disp_info);
+               force_flush_samr_cache(&group_sid);
 
        return status;
 }
@@ -5444,28 +5371,24 @@ NTSTATUS _samr_OpenGroup(pipes_struct *p,
                         struct samr_OpenGroup *r)
 
 {
-       DOM_SID sid;
        DOM_SID info_sid;
        GROUP_MAP map;
+       struct samr_domain_info *dinfo;
        struct samr_info *info;
        SEC_DESC         *psd = NULL;
        uint32            acc_granted;
        uint32            des_access = r->in.access_mask;
        size_t            sd_size;
        NTSTATUS          status;
-       fstring sid_string;
        bool ret;
        SE_PRIV se_rights;
 
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &sid, &acc_granted, NULL))
-               return NT_STATUS_INVALID_HANDLE;
-
-       status = access_check_samr_function(acc_granted,
-                                           SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
-                                           "_samr_OpenGroup");
-
-       if ( !NT_STATUS_IS_OK(status) )
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, NULL,
+                                  struct samr_domain_info, &status);
+       if (!NT_STATUS_IS_OK(status)) {
                return status;
+       }
 
        /*check if access can be granted as requested by client. */
        map_max_allowed_access(p->server_info->ptok, &des_access);
@@ -5484,19 +5407,18 @@ NTSTATUS _samr_OpenGroup(pipes_struct *p,
 
        /* this should not be hard-coded like this */
 
-       if (!sid_equal(&sid, get_global_sam_sid()))
+       if (!sid_equal(&dinfo->sid, get_global_sam_sid()))
                return NT_STATUS_ACCESS_DENIED;
 
-       sid_copy(&info_sid, get_global_sam_sid());
-       sid_append_rid(&info_sid, r->in.rid);
-       sid_to_fstring(sid_string, &info_sid);
+       sid_compose(&info_sid, &dinfo->sid, r->in.rid);
 
        if ((info = get_samr_info_by_sid(p->mem_ctx, &info_sid)) == NULL)
                return NT_STATUS_NO_MEMORY;
 
        info->acc_granted = acc_granted;
 
-       DEBUG(10, ("_samr_OpenGroup:Opening SID: %s\n", sid_string));
+       DEBUG(10, ("_samr_OpenGroup:Opening SID: %s\n",
+                  sid_string_dbg(&info_sid)));
 
        /* check if that group really exists */
        become_root();
@@ -5519,31 +5441,23 @@ NTSTATUS _samr_OpenGroup(pipes_struct *p,
 NTSTATUS _samr_RemoveMemberFromForeignDomain(pipes_struct *p,
                                             struct samr_RemoveMemberFromForeignDomain *r)
 {
-       DOM_SID                 delete_sid, domain_sid;
-       uint32                  acc_granted;
+       struct samr_domain_info *dinfo;
        NTSTATUS                result;
-       DISP_INFO *disp_info = NULL;
-
-       sid_copy( &delete_sid, r->in.sid );
 
        DEBUG(5,("_samr_RemoveMemberFromForeignDomain: removing SID [%s]\n",
-               sid_string_dbg(&delete_sid)));
+                sid_string_dbg(r->in.sid)));
 
        /* Find the policy handle. Open a policy on it. */
 
-       if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &domain_sid,
-                                    &acc_granted, &disp_info))
-               return NT_STATUS_INVALID_HANDLE;
-
-       result = access_check_samr_function(acc_granted,
-                                           STD_RIGHT_DELETE_ACCESS,
-                                           "_samr_RemoveMemberFromForeignDomain");
-
-       if (!NT_STATUS_IS_OK(result))
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  STD_RIGHT_DELETE_ACCESS, NULL,
+                                  struct samr_domain_info, &result);
+       if (!NT_STATUS_IS_OK(result)) {
                return result;
+       }
 
        DEBUG(8, ("_samr_RemoveMemberFromForeignDomain: sid is %s\n",
-                 sid_string_dbg(&domain_sid)));
+                 sid_string_dbg(&dinfo->sid)));
 
        /* we can only delete a user from a group since we don't have
           nested groups anyways.  So in the latter case, just say OK */
@@ -5559,16 +5473,16 @@ NTSTATUS _samr_RemoveMemberFromForeignDomain(pipes_struct *p,
         * only application of this call. To verify this, let people report
         * other cases. */
 
-       if (!sid_check_is_builtin(&domain_sid)) {
+       if (!sid_check_is_builtin(&dinfo->sid)) {
                DEBUG(1,("_samr_RemoveMemberFromForeignDomain: domain_sid = %s, "
                         "global_sam_sid() = %s\n",
-                        sid_string_dbg(&domain_sid),
+                        sid_string_dbg(&dinfo->sid),
                         sid_string_dbg(get_global_sam_sid())));
                DEBUGADD(1,("please report to samba-technical@samba.org!\n"));
                return NT_STATUS_OK;
        }
 
-       force_flush_samr_cache(disp_info);
+       force_flush_samr_cache(&dinfo->sid);
 
        result = NT_STATUS_OK;
 
@@ -5599,7 +5513,7 @@ NTSTATUS _samr_QueryDomainInfo2(pipes_struct *p,
 NTSTATUS _samr_SetDomainInfo(pipes_struct *p,
                             struct samr_SetDomainInfo *r)
 {
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        time_t u_expire, u_min_age;
        time_t u_logout;
        time_t u_lock_duration, u_reset_time;
@@ -5607,10 +5521,6 @@ NTSTATUS _samr_SetDomainInfo(pipes_struct *p,
 
        DEBUG(5,("_samr_SetDomainInfo: %d\n", __LINE__));
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-               return NT_STATUS_INVALID_HANDLE;
-
        /* We do have different access bits for info
         * levels here, but we're really just looking for
         * GENERIC_RIGHTS_DOMAIN_WRITE access. Unfortunately
@@ -5618,12 +5528,12 @@ NTSTATUS _samr_SetDomainInfo(pipes_struct *p,
         * assume if we have SAMR_DOMAIN_ACCESS_SET_INFO_1
         * set we are ok. */
 
-       result = access_check_samr_function(info->acc_granted,
-                                           SAMR_DOMAIN_ACCESS_SET_INFO_1,
-                                           "_samr_SetDomainInfo");
-
-       if (!NT_STATUS_IS_OK(result))
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_SET_INFO_1, NULL,
+                                  struct samr_domain_info, &result);
+       if (!NT_STATUS_IS_OK(result)) {
                return result;
+       }
 
        DEBUG(5,("_samr_SetDomainInfo: level: %d\n", r->in.level));
 
@@ -5676,7 +5586,7 @@ NTSTATUS _samr_SetDomainInfo(pipes_struct *p,
 NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
                                          struct samr_GetDisplayEnumerationIndex *r)
 {
-       struct samr_info *info = NULL;
+       struct samr_domain_info *dinfo;
        uint32_t max_entries = (uint32_t) -1;
        uint32_t enum_context = 0;
        int i;
@@ -5686,14 +5596,9 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
 
        DEBUG(5,("_samr_GetDisplayEnumerationIndex: %d\n", __LINE__));
 
-       /* find the policy handle.  open a policy on it. */
-       if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info)) {
-               return NT_STATUS_INVALID_HANDLE;
-       }
-
-       status = access_check_samr_function(info->acc_granted,
-                                           SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                           "_samr_GetDisplayEnumerationIndex");
+       dinfo = policy_handle_find(p, r->in.domain_handle,
+                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+                                  struct samr_domain_info, &status);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -5711,10 +5616,10 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
 
        switch (r->in.level) {
        case 1:
-               if (info->disp_info->users == NULL) {
-                       info->disp_info->users = pdb_search_users(
-                               info->disp_info, ACB_NORMAL);
-                       if (info->disp_info->users == NULL) {
+               if (dinfo->disp_info->users == NULL) {
+                       dinfo->disp_info->users = pdb_search_users(
+                               dinfo->disp_info, ACB_NORMAL);
+                       if (dinfo->disp_info->users == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -5726,15 +5631,15 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
                                "using cached user enumeration at index %u\n",
                                (unsigned int)enum_context));
                }
-               num_account = pdb_search_entries(info->disp_info->users,
+               num_account = pdb_search_entries(dinfo->disp_info->users,
                                                 enum_context, max_entries,
                                                 &entries);
                break;
        case 2:
-               if (info->disp_info->machines == NULL) {
-                       info->disp_info->machines = pdb_search_users(
-                               info->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
-                       if (info->disp_info->machines == NULL) {
+               if (dinfo->disp_info->machines == NULL) {
+                       dinfo->disp_info->machines = pdb_search_users(
+                               dinfo->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
+                       if (dinfo->disp_info->machines == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -5746,15 +5651,15 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
                                "using cached machine enumeration at index %u\n",
                                (unsigned int)enum_context));
                }
-               num_account = pdb_search_entries(info->disp_info->machines,
+               num_account = pdb_search_entries(dinfo->disp_info->machines,
                                                 enum_context, max_entries,
                                                 &entries);
                break;
        case 3:
-               if (info->disp_info->groups == NULL) {
-                       info->disp_info->groups = pdb_search_groups(
-                               info->disp_info);
-                       if (info->disp_info->groups == NULL) {
+               if (dinfo->disp_info->groups == NULL) {
+                       dinfo->disp_info->groups = pdb_search_groups(
+                               dinfo->disp_info);
+                       if (dinfo->disp_info->groups == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -5766,7 +5671,7 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
                                "using cached group enumeration at index %u\n",
                                (unsigned int)enum_context));
                }
-               num_account = pdb_search_entries(info->disp_info->groups,
+               num_account = pdb_search_entries(dinfo->disp_info->groups,
                                                 enum_context, max_entries,
                                                 &entries);
                break;
@@ -5779,7 +5684,7 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
        unbecome_root();
 
        /* Ensure we cache this enumeration. */
-       set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+       set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
        DEBUG(10,("_samr_GetDisplayEnumerationIndex: looking for :%s\n",
                r->in.name->string));
index d114152f64acd78706b2a590bbbb926cece0b935..629e41c0033444c1b3da3df170fd8a415b67e9aa 100644 (file)
@@ -591,7 +591,8 @@ static bool open_printer_hnd(pipes_struct *p, struct policy_handle *hnd,
 
        new_printer->access_granted = access_granted;
 
-       DEBUG(5, ("%d printer handles active\n", (int)p->pipe_handles->count ));
+       DEBUG(5, ("%d printer handles active\n",
+                 (int)num_pipe_handles(p->pipe_handles)));
 
        return true;
 }
@@ -4845,6 +4846,121 @@ static WERROR fill_printer_driver_info3(TALLOC_CTX *mem_ctx,
        return WERR_OK;
 }
 
+/********************************************************************
+ * fill a spoolss_DriverInfo4 struct
+ ********************************************************************/
+
+static WERROR fill_printer_driver_info4(TALLOC_CTX *mem_ctx,
+                                       struct spoolss_DriverInfo4 *r,
+                                       const NT_PRINTER_DRIVER_INFO_LEVEL *driver,
+                                       const char *servername)
+{
+       const char *cservername = canon_servername(servername);
+
+       r->version              = driver->info_3->cversion;
+
+       r->driver_name          = talloc_strdup(mem_ctx, driver->info_3->name);
+       W_ERROR_HAVE_NO_MEMORY(r->driver_name);
+       r->architecture         = talloc_strdup(mem_ctx, driver->info_3->environment);
+       W_ERROR_HAVE_NO_MEMORY(r->architecture);
+
+       if (strlen(driver->info_3->driverpath)) {
+               r->driver_path  = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->driverpath);
+       } else {
+               r->driver_path  = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->driver_path);
+
+       if (strlen(driver->info_3->datafile)) {
+               r->data_file    = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->datafile);
+       } else {
+               r->data_file    = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->data_file);
+
+       if (strlen(driver->info_3->configfile)) {
+               r->config_file  = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->configfile);
+       } else {
+               r->config_file  = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->config_file);
+
+       if (strlen(driver->info_3->helpfile)) {
+               r->help_file    = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->helpfile);
+       } else {
+               r->help_file    = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->help_file);
+
+       r->dependent_files = string_array_from_driver_info(mem_ctx,
+                                                          driver->info_3->dependentfiles,
+                                                          cservername);
+
+
+       r->monitor_name         = talloc_strdup(mem_ctx, driver->info_3->monitorname);
+       W_ERROR_HAVE_NO_MEMORY(r->monitor_name);
+       r->default_datatype     = talloc_strdup(mem_ctx, driver->info_3->defaultdatatype);
+       W_ERROR_HAVE_NO_MEMORY(r->default_datatype);
+
+       r->previous_names = string_array_from_driver_info(mem_ctx,
+                                                         NULL,
+                                                         cservername);
+
+       return WERR_OK;
+}
+
+/********************************************************************
+ * fill a spoolss_DriverInfo5 struct
+ ********************************************************************/
+
+static WERROR fill_printer_driver_info5(TALLOC_CTX *mem_ctx,
+                                       struct spoolss_DriverInfo5 *r,
+                                       const NT_PRINTER_DRIVER_INFO_LEVEL *driver,
+                                       const char *servername)
+{
+       const char *cservername = canon_servername(servername);
+
+       r->version              = driver->info_3->cversion;
+
+       r->driver_name          = talloc_strdup(mem_ctx, driver->info_3->name);
+       W_ERROR_HAVE_NO_MEMORY(r->driver_name);
+       r->architecture         = talloc_strdup(mem_ctx, driver->info_3->environment);
+       W_ERROR_HAVE_NO_MEMORY(r->architecture);
+
+       if (strlen(driver->info_3->driverpath)) {
+               r->driver_path  = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->driverpath);
+       } else {
+               r->driver_path  = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->driver_path);
+
+       if (strlen(driver->info_3->datafile)) {
+               r->data_file    = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->datafile);
+       } else {
+               r->data_file    = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->data_file);
+
+       if (strlen(driver->info_3->configfile)) {
+               r->config_file  = talloc_asprintf(mem_ctx, "\\\\%s%s",
+                               cservername, driver->info_3->configfile);
+       } else {
+               r->config_file  = talloc_strdup(mem_ctx, "");
+       }
+       W_ERROR_HAVE_NO_MEMORY(r->config_file);
+
+       r->driver_attributes    = 0;
+       r->config_version       = 0;
+       r->driver_version       = 0;
+
+       return WERR_OK;
+}
 /********************************************************************
  * fill a spoolss_DriverInfo6 struct
  ********************************************************************/
@@ -4893,7 +5009,7 @@ static WERROR fill_printer_driver_info6(TALLOC_CTX *mem_ctx,
        } else {
                r->help_file    = talloc_strdup(mem_ctx, "");
        }
-       W_ERROR_HAVE_NO_MEMORY(r->config_file);
+       W_ERROR_HAVE_NO_MEMORY(r->help_file);
 
        r->monitor_name         = talloc_strdup(mem_ctx, driver->info_3->monitorname);
        W_ERROR_HAVE_NO_MEMORY(r->monitor_name);
@@ -6673,6 +6789,18 @@ static WERROR enumprinterdrivers_level(TALLOC_CTX *mem_ctx,
                                result = fill_printer_driver_info3(info, &info[count+i].info3,
                                                                   &driver, servername);
                                break;
+                       case 4:
+                               result = fill_printer_driver_info4(info, &info[count+i].info4,
+                                                                  &driver, servername);
+                               break;
+                       case 5:
+                               result = fill_printer_driver_info5(info, &info[count+i].info5,
+                                                                  &driver, servername);
+                               break;
+                       case 6:
+                               result = fill_printer_driver_info6(info, &info[count+i].info6,
+                                                                  &driver, servername);
+                               break;
                        default:
                                result = WERR_UNKNOWN_LEVEL;
                                break;
@@ -6745,6 +6873,49 @@ static WERROR enumprinterdrivers_level3(TALLOC_CTX *mem_ctx,
                                        info_p, count);
 }
 
+/****************************************************************************
+ Enumerates all printer drivers at level 4.
+****************************************************************************/
+
+static WERROR enumprinterdrivers_level4(TALLOC_CTX *mem_ctx,
+                                       const char *servername,
+                                       const char *architecture,
+                                       union spoolss_DriverInfo **info_p,
+                                       uint32_t *count)
+{
+       return enumprinterdrivers_level(mem_ctx, servername, architecture, 4,
+                                       info_p, count);
+}
+
+/****************************************************************************
+ Enumerates all printer drivers at level 5.
+****************************************************************************/
+
+static WERROR enumprinterdrivers_level5(TALLOC_CTX *mem_ctx,
+                                       const char *servername,
+                                       const char *architecture,
+                                       union spoolss_DriverInfo **info_p,
+                                       uint32_t *count)
+{
+       return enumprinterdrivers_level(mem_ctx, servername, architecture, 5,
+                                       info_p, count);
+}
+
+/****************************************************************************
+ Enumerates all printer drivers at level 6.
+****************************************************************************/
+
+static WERROR enumprinterdrivers_level6(TALLOC_CTX *mem_ctx,
+                                       const char *servername,
+                                       const char *architecture,
+                                       union spoolss_DriverInfo **info_p,
+                                       uint32_t *count)
+{
+       return enumprinterdrivers_level(mem_ctx, servername, architecture, 6,
+                                       info_p, count);
+}
+
+
 /****************************************************************
  _spoolss_EnumPrinterDrivers
 ****************************************************************/
@@ -6789,6 +6960,21 @@ WERROR _spoolss_EnumPrinterDrivers(pipes_struct *p,
                                                   r->in.environment,
                                                   r->out.info, r->out.count);
                break;
+       case 4:
+               result = enumprinterdrivers_level4(p->mem_ctx, cservername,
+                                                  r->in.environment,
+                                                  r->out.info, r->out.count);
+               break;
+       case 5:
+               result = enumprinterdrivers_level5(p->mem_ctx, cservername,
+                                                  r->in.environment,
+                                                  r->out.info, r->out.count);
+               break;
+       case 6:
+               result = enumprinterdrivers_level6(p->mem_ctx, cservername,
+                                                  r->in.environment,
+                                                  r->out.info, r->out.count);
+               break;
        default:
                return WERR_UNKNOWN_LEVEL;
        }
@@ -8111,7 +8297,7 @@ WERROR _spoolss_AddForm(pipes_struct *p,
        /* if the user is not root, doesn't have SE_PRINT_OPERATOR privilege,
           and not a printer admin, then fail */
 
-       if ((p->server_info->utok.uid != 0) &&
+       if ((p->server_info->utok.uid != sec_initial_uid()) &&
             !user_has_privileges(p->server_info->ptok, &se_printop) &&
             !token_contains_name_in_list(uidtoname(p->server_info->utok.uid),
                                          NULL, NULL,
@@ -8135,7 +8321,9 @@ WERROR _spoolss_AddForm(pipes_struct *p,
                goto done;
        }
 
+       become_root();
        write_ntforms(&list, count);
+       unbecome_root();
 
        /*
         * ChangeID must always be set if this is a printer
@@ -8168,6 +8356,7 @@ WERROR _spoolss_DeleteForm(pipes_struct *p,
        WERROR status = WERR_OK;
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        SE_PRIV se_printop = SE_PRINT_OPERATOR;
+       bool ret = false;
 
        DEBUG(5,("_spoolss_DeleteForm\n"));
 
@@ -8189,7 +8378,7 @@ WERROR _spoolss_DeleteForm(pipes_struct *p,
                        goto done;
        }
 
-       if ((p->server_info->utok.uid != 0) &&
+       if ((p->server_info->utok.uid != sec_initial_uid()) &&
             !user_has_privileges(p->server_info->ptok, &se_printop) &&
             !token_contains_name_in_list(uidtoname(p->server_info->utok.uid),
                                          NULL, NULL,
@@ -8209,8 +8398,12 @@ WERROR _spoolss_DeleteForm(pipes_struct *p,
 
        count = get_ntforms(&list);
 
-       if ( !delete_a_form(&list, form_name, &count, &status ))
+       become_root();
+       ret = delete_a_form(&list, form_name, &count, &status);
+       unbecome_root();
+       if (ret == false) {
                goto done;
+       }
 
        /*
         * ChangeID must always be set if this is a printer
@@ -8268,7 +8461,7 @@ WERROR _spoolss_SetForm(pipes_struct *p,
        /* if the user is not root, doesn't have SE_PRINT_OPERATOR privilege,
           and not a printer admin, then fail */
 
-       if ((p->server_info->utok.uid != 0) &&
+       if ((p->server_info->utok.uid != sec_initial_uid()) &&
             !user_has_privileges(p->server_info->ptok, &se_printop) &&
             !token_contains_name_in_list(uidtoname(p->server_info->utok.uid),
                                          NULL, NULL,
@@ -8286,7 +8479,9 @@ WERROR _spoolss_SetForm(pipes_struct *p,
 
        count = get_ntforms(&list);
        update_a_form(&list, form, count);
+       become_root();
        write_ntforms(&list, count);
+       unbecome_root();
 
        /*
         * ChangeID must always be set if this is a printer
old mode 100644 (file)
new mode 100755 (executable)
index b3a66e1db76b52986ad93857494262a770e4c63c..40421fd85d947c93003e6d67a8d824f50dbc9987 100755 (executable)
@@ -40,7 +40,8 @@ raw="$raw RAW-SAMBA3ROOTDIRFID"
 rpc="RPC-AUTHCONTEXT RPC-BINDSAMBA3 RPC-SAMBA3-SRVSVC RPC-SAMBA3-SHARESEC"
 rpc="$rpc RPC-SAMBA3-SPOOLSS RPC-SAMBA3-WKSSVC"
 rpc="$rpc RPC-NETLOGSAMBA3 RPC-SAMBA3SESSIONKEY RPC-SAMBA3-GETUSERNAME"
-rpc="$rpc RPC-SVCCTL RPC-SPOOLSS-WIN RPC-NTSVCS"
+rpc="$rpc RPC-SVCCTL RPC-SPOOLSS RPC-SPOOLSS-WIN RPC-NTSVCS RPC-LSA-LOOKUPSIDS"
+rpc="$rpc RPC-SAMR-PASSWORDS-PWDLASTSET RPC-JOIN"
 
 # NOTE: to enable the UNIX-WHOAMI test, we need to change the default share
 # config to allow guest access. I'm not sure whether this would break other
old mode 100644 (file)
new mode 100755 (executable)
index 5b4475f..663c6b1
@@ -1 +1,2 @@
-installmo.sh
+#!/bin/sh
+script/installmo.sh
index a52f2d2e96915de7aaf12814f6c307b1bf12ec63..38006437692a8b81a80153ac0eb8a198374dcf38 100644 (file)
@@ -212,7 +212,7 @@ bool conn_idle_all(time_t t)
 
        for (plist = get_first_internal_pipe(); plist;
             plist = get_next_internal_pipe(plist)) {
-               if (plist->pipe_handles && plist->pipe_handles->count) {
+               if (num_pipe_handles(plist->pipe_handles) != 0) {
                        return False;
                }
        }
index 80722a7cd0864a5679dfd6af7911b35b6a336fdc..e35f23ef377a1ab234d0c4fa908a7ec1808bd623 100644 (file)
@@ -33,6 +33,9 @@ static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
                                  const char *streamname,
                                  SMB_STRUCT_STAT *pst,
                                  char **path);
+static int get_real_filename_mangled(connection_struct *conn, const char *path,
+                                    const char *name, TALLOC_CTX *mem_ctx,
+                                    char **found_name);
 
 /****************************************************************************
  Mangle the 2nd name and check if it is then equal to the first name.
@@ -447,7 +450,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
                         */
 
                        if (name_has_wildcard ||
-                           (SMB_VFS_GET_REAL_FILENAME(
+                           (get_real_filename_mangled(
                                     conn, dirpath, start,
                                     talloc_tos(), &found_name) == -1)) {
                                char *unmangled;
@@ -789,15 +792,12 @@ static bool fname_equal(const char *name1, const char *name2,
  If the name looks like a mangled name then try via the mangling functions
 ****************************************************************************/
 
-int get_real_filename(connection_struct *conn, const char *path,
-                     const char *name, TALLOC_CTX *mem_ctx,
-                     char **found_name)
+static int get_real_filename_mangled(connection_struct *conn, const char *path,
+                                    const char *name, TALLOC_CTX *mem_ctx,
+                                    char **found_name)
 {
-       struct smb_Dir *cur_dir;
-       const char *dname;
        bool mangled;
        char *unmangled_name = NULL;
-       long curpos;
 
        mangled = mangle_is_mangled(name, conn->params);
 
@@ -838,8 +838,24 @@ int get_real_filename(connection_struct *conn, const char *path,
                        /* Name is now unmangled. */
                        name = unmangled_name;
                }
+               return get_real_filename(conn, path, name, mem_ctx,
+                                        found_name);
        }
 
+       return SMB_VFS_GET_REAL_FILENAME(conn, path, name, mem_ctx,
+                                        found_name);
+}
+
+int get_real_filename(connection_struct *conn, const char *path,
+                     const char *name, TALLOC_CTX *mem_ctx,
+                     char **found_name)
+{
+       struct smb_Dir *cur_dir;
+       const char *dname;
+       bool mangled;
+       char *unmangled_name = NULL;
+       long curpos;
+
        /* open the directory */
        if (!(cur_dir = OpenDir(talloc_tos(), conn, path, NULL, 0))) {
                DEBUG(3,("scan dir didn't open dir [%s]\n",path));
index 36e80a086ac26cb957c5f408442a2867f3f7c56a..d2ea520146c846a1beedbaee1a264e98aa8da6f6 100644 (file)
@@ -433,6 +433,10 @@ void file_free(struct smb_request *req, files_struct *fsp)
        }
 
        if (fsp->notify) {
+               if (fsp->is_directory) {
+                       notify_remove_onelevel(fsp->conn->notify_ctx,
+                                              &fsp->file_id, fsp);
+               }
                notify_remove(fsp->conn->notify_ctx, fsp);
                TALLOC_FREE(fsp->notify);
        }
index 6f8f8ed5e455834c7dc986dc11b15a2aea73edcf..979e5b57a44d495b8d1d8a83c4ac8550618059c0 100644 (file)
@@ -2073,7 +2073,7 @@ static bool api_RNetGroupEnum(connection_struct *conn,uint16 vuid,
        }
 
        status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
-                                     SAMR_ACCESS_OPEN_DOMAIN, &samr_handle);
+                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
                          nt_errstr(status)));
@@ -2254,7 +2254,7 @@ static bool api_NetUserGetGroups(connection_struct *conn,uint16 vuid,
        }
 
        status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
-                                     SAMR_ACCESS_OPEN_DOMAIN, &samr_handle);
+                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
                          nt_errstr(status)));
@@ -2409,7 +2409,7 @@ static bool api_RNetUserEnum(connection_struct *conn, uint16 vuid,
        }
 
        status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
-                                     SAMR_ACCESS_OPEN_DOMAIN, &samr_handle);
+                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
                          nt_errstr(status)));
index d141fb218077a34945c57b00ddea3f07bdfa2608..12a75cc9f6363d83dadc444e489d2a2336c70492 100644 (file)
@@ -339,6 +339,9 @@ void notify_fname(connection_struct *conn, uint32 action, uint32 filter,
                  const char *path)
 {
        char *fullpath;
+       char *parent;
+       const char *name;
+       SMB_STRUCT_STAT sbuf;
 
        if (path[0] == '.' && path[1] == '/') {
                path += 2;
@@ -348,6 +351,13 @@ void notify_fname(connection_struct *conn, uint32 action, uint32 filter,
                return;
        }
 
+       if (parent_dirname(talloc_tos(), path, &parent, &name)
+           && (SMB_VFS_STAT(conn, parent, &sbuf) != -1)) {
+               notify_onelevel(conn->notify_ctx, action, filter,
+                               SMB_VFS_FILE_ID_CREATE(conn, &sbuf),
+                               name);
+       }
+
        notify_trigger(conn->notify_ctx, action, filter, fullpath);
        SAFE_FREE(fullpath);
 }
index 1e45c54cbbd0ff11f4dbfd88e31c5a053605c33b..a42404db3e6b4acbe99bca99ac6e61f90d6ed5a6 100644 (file)
@@ -27,7 +27,8 @@
 #include "librpc/gen_ndr/ndr_notify.h"
 
 struct notify_context {
-       struct db_context *db;
+       struct db_context *db_recursive;
+       struct db_context *db_onelevel;
        struct server_id server;
        struct messaging_context *messaging_ctx;
        struct notify_list *list;
@@ -91,10 +92,18 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server,
                return NULL;
        }
 
-       notify->db = db_open(notify, lock_path("notify.tdb"),
-                                 0, TDB_SEQNUM|TDB_CLEAR_IF_FIRST,
-                                 O_RDWR|O_CREAT, 0644);
-       if (notify->db == NULL) {
+       notify->db_recursive = db_open(notify, lock_path("notify.tdb"),
+                                      0, TDB_SEQNUM|TDB_CLEAR_IF_FIRST,
+                                      O_RDWR|O_CREAT, 0644);
+       if (notify->db_recursive == NULL) {
+               talloc_free(notify);
+               return NULL;
+       }
+
+       notify->db_onelevel = db_open(notify, lock_path("notify_onelevel.tdb"),
+                                     0, TDB_SEQNUM|TDB_CLEAR_IF_FIRST,
+                                     O_RDWR|O_CREAT, 0644);
+       if (notify->db_onelevel == NULL) {
                talloc_free(notify);
                return NULL;
        }
@@ -103,7 +112,8 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server,
        notify->messaging_ctx = messaging_ctx;
        notify->list = NULL;
        notify->array = NULL;
-       notify->seqnum = notify->db->get_seqnum(notify->db);
+       notify->seqnum = notify->db_recursive->get_seqnum(
+               notify->db_recursive);
        notify->key = string_term_tdb_data(NOTIFY_KEY);
 
        talloc_set_destructor(notify, notify_destructor);
@@ -123,7 +133,8 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server,
 */
 static NTSTATUS notify_fetch_locked(struct notify_context *notify, struct db_record **rec)
 {
-       *rec = notify->db->fetch_locked(notify->db, notify, notify->key);
+       *rec = notify->db_recursive->fetch_locked(notify->db_recursive,
+                                                 notify, notify->key);
        if (*rec == NULL) {
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
@@ -140,7 +151,7 @@ static NTSTATUS notify_load(struct notify_context *notify, struct db_record *rec
        NTSTATUS status;
        int seqnum;
 
-       seqnum = notify->db->get_seqnum(notify->db);
+       seqnum = notify->db_recursive->get_seqnum(notify->db_recursive);
 
        if (seqnum == notify->seqnum && notify->array != NULL) {
                return NT_STATUS_OK;
@@ -153,7 +164,8 @@ static NTSTATUS notify_load(struct notify_context *notify, struct db_record *rec
        NT_STATUS_HAVE_NO_MEMORY(notify->array);
 
        if (!rec) {
-               if (notify->db->fetch(notify->db, notify, notify->key, &dbuf) != 0) {
+               if (notify->db_recursive->fetch(notify->db_recursive, notify,
+                                               notify->key, &dbuf) != 0) {
                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
                }
        } else {
@@ -343,6 +355,96 @@ static NTSTATUS notify_add_array(struct notify_context *notify, struct db_record
        return notify_save(notify, rec);
 }
 
+/*
+  Add a non-recursive watch
+*/
+
+static void notify_add_onelevel(struct notify_context *notify,
+                               struct notify_entry *e, void *private_data)
+{
+       struct notify_entry_array *array;
+       struct db_record *rec;
+       DATA_BLOB blob;
+       TDB_DATA dbuf;
+       enum ndr_err_code ndr_err;
+       NTSTATUS status;
+
+       array = talloc_zero(talloc_tos(), struct notify_entry_array);
+       if (array == NULL) {
+               return;
+       }
+
+       rec = notify->db_onelevel->fetch_locked(
+               notify->db_onelevel, talloc_tos(),
+               make_tdb_data((uint8_t *)&e->dir_id, sizeof(e->dir_id)));
+       if (rec == NULL) {
+               DEBUG(10, ("notify_add_onelevel: fetch_locked for %s failed"
+                          "\n", file_id_string_tos(&e->dir_id)));
+               TALLOC_FREE(array);
+               return;
+       }
+
+       blob.data = (uint8_t *)rec->value.dptr;
+       blob.length = rec->value.dsize;
+
+       if (blob.length > 0) {
+               ndr_err = ndr_pull_struct_blob(
+                       &blob, array, NULL, array,
+                       (ndr_pull_flags_fn_t)ndr_pull_notify_entry_array);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       DEBUG(10, ("ndr_pull_notify_entry_array failed: %s\n",
+                                  ndr_errstr(ndr_err)));
+                       TALLOC_FREE(array);
+                       return;
+               }
+               if (DEBUGLEVEL >= 10) {
+                       DEBUG(10, ("notify_add_onelevel:\n"));
+                       NDR_PRINT_DEBUG(notify_entry_array, array);
+               }
+       }
+
+       array->entries = talloc_realloc(array, array->entries,
+                                       struct notify_entry,
+                                       array->num_entries+1);
+       if (array->entries == NULL) {
+               TALLOC_FREE(array);
+               return;
+       }
+       array->entries[array->num_entries] = *e;
+       array->entries[array->num_entries].private_data = private_data;
+       array->entries[array->num_entries].server = notify->server;
+       array->num_entries += 1;
+
+       ndr_err = ndr_push_struct_blob(
+               &blob, rec, NULL, array,
+               (ndr_push_flags_fn_t)ndr_push_notify_entry_array);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DEBUG(10, ("ndr_push_notify_entry_array failed: %s\n",
+                          ndr_errstr(ndr_err)));
+               TALLOC_FREE(array);
+               return;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               DEBUG(10, ("notify_add_onelevel:\n"));
+               NDR_PRINT_DEBUG(notify_entry_array, array);
+       }
+
+       dbuf.dptr = blob.data;
+       dbuf.dsize = blob.length;
+
+       status = rec->store(rec, dbuf, TDB_REPLACE);
+       TALLOC_FREE(array);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(10, ("notify_add_onelevel: store failed: %s\n",
+                          nt_errstr(status)));
+               return;
+       }
+       e->filter = 0;
+       return;
+}
+
+
 /*
   add a notify watch. This is called when a notify is first setup on a open
   directory handle.
@@ -411,6 +513,11 @@ NTSTATUS notify_add(struct notify_context *notify, struct notify_entry *e0,
                }
        }
 
+       if (e.filter != 0) {
+               notify_add_onelevel(notify, &e, private_data);
+               status = NT_STATUS_OK;
+       }
+
        /* if the system notify handler couldn't handle some of the
           filter bits, or couldn't handle a request for recursion
           then we need to install it in the array used for the
@@ -426,6 +533,102 @@ done:
        return status;
 }
 
+NTSTATUS notify_remove_onelevel(struct notify_context *notify,
+                               const struct file_id *fid,
+                               void *private_data)
+{
+       struct notify_entry_array *array;
+       struct db_record *rec;
+       DATA_BLOB blob;
+       TDB_DATA dbuf;
+       enum ndr_err_code ndr_err;
+       NTSTATUS status;
+       int i;
+
+       array = talloc_zero(talloc_tos(), struct notify_entry_array);
+       if (array == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       rec = notify->db_onelevel->fetch_locked(
+               notify->db_onelevel, talloc_tos(),
+               make_tdb_data((uint8_t *)fid, sizeof(*fid)));
+       if (rec == NULL) {
+               DEBUG(10, ("notify_remove_onelevel: fetch_locked for %s failed"
+                          "\n", file_id_string_tos(fid)));
+               TALLOC_FREE(array);
+               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+       }
+
+       blob.data = (uint8_t *)rec->value.dptr;
+       blob.length = rec->value.dsize;
+
+       if (blob.length > 0) {
+               ndr_err = ndr_pull_struct_blob(
+                       &blob, array, NULL, array,
+                       (ndr_pull_flags_fn_t)ndr_pull_notify_entry_array);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       DEBUG(10, ("ndr_pull_notify_entry_array failed: %s\n",
+                                  ndr_errstr(ndr_err)));
+                       TALLOC_FREE(array);
+                       return ndr_map_error2ntstatus(ndr_err);
+               }
+               if (DEBUGLEVEL >= 10) {
+                       DEBUG(10, ("notify_remove_onelevel:\n"));
+                       NDR_PRINT_DEBUG(notify_entry_array, array);
+               }
+       }
+
+       for (i=0; i<array->num_entries; i++) {
+               if ((private_data == array->entries[i].private_data) &&
+                   cluster_id_equal(&notify->server,
+                                    &array->entries[i].server)) {
+                       break;
+               }
+       }
+
+       if (i == array->num_entries) {
+               TALLOC_FREE(array);
+               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+       }
+
+       array->entries[i] = array->entries[array->num_entries-1];
+       array->num_entries -= 1;
+
+       if (array->num_entries == 0) {
+               rec->delete_rec(rec);
+               TALLOC_FREE(array);
+               return NT_STATUS_OK;
+       }
+
+       ndr_err = ndr_push_struct_blob(
+               &blob, rec, NULL, array,
+               (ndr_push_flags_fn_t)ndr_push_notify_entry_array);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DEBUG(10, ("ndr_push_notify_entry_array failed: %s\n",
+                          ndr_errstr(ndr_err)));
+               TALLOC_FREE(array);
+               return ndr_map_error2ntstatus(ndr_err);
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               DEBUG(10, ("notify_add_onelevel:\n"));
+               NDR_PRINT_DEBUG(notify_entry_array, array);
+       }
+
+       dbuf.dptr = blob.data;
+       dbuf.dsize = blob.length;
+
+       status = rec->store(rec, dbuf, TDB_REPLACE);
+       TALLOC_FREE(array);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(10, ("notify_add_onelevel: store failed: %s\n",
+                          nt_errstr(status)));
+               return status;
+       }
+       return NT_STATUS_OK;
+}
+
 /*
   remove a notify watch. Called when the directory handle is closed
 */
@@ -574,6 +777,92 @@ static NTSTATUS notify_send(struct notify_context *notify, struct notify_entry *
        return status;
 }
 
+void notify_onelevel(struct notify_context *notify, uint32_t action,
+                    uint32_t filter, struct file_id fid, const char *name)
+{
+       struct notify_entry_array *array;
+       TDB_DATA dbuf;
+       DATA_BLOB blob;
+       bool have_dead_entries = false;
+       int i;
+
+       array = talloc_zero(talloc_tos(), struct notify_entry_array);
+       if (array == NULL) {
+               return;
+       }
+
+       if (notify->db_onelevel->fetch(
+                   notify->db_onelevel, array,
+                   make_tdb_data((uint8_t *)&fid, sizeof(fid)),
+                   &dbuf) == -1) {
+               TALLOC_FREE(array);
+               return;
+       }
+
+       blob.data = (uint8 *)dbuf.dptr;
+       blob.length = dbuf.dsize;
+
+       if (blob.length > 0) {
+               enum ndr_err_code ndr_err;
+               ndr_err = ndr_pull_struct_blob(
+                       &blob, array, NULL, array,
+                       (ndr_pull_flags_fn_t)ndr_pull_notify_entry_array);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       DEBUG(10, ("ndr_pull_notify_entry_array failed: %s\n",
+                                  ndr_errstr(ndr_err)));
+                       TALLOC_FREE(array);
+                       return;
+               }
+               if (DEBUGLEVEL >= 10) {
+                       DEBUG(10, ("notify_onelevel:\n"));
+                       NDR_PRINT_DEBUG(notify_entry_array, array);
+               }
+       }
+
+       for (i=0; i<array->num_entries; i++) {
+               struct notify_entry *e = &array->entries[i];
+
+               if ((e->filter & filter) != 0) {
+                       NTSTATUS status;
+
+                       status = notify_send(notify, e, name, action);
+                       if (NT_STATUS_EQUAL(
+                                   status, NT_STATUS_INVALID_HANDLE)) {
+                               /*
+                                * Mark the entry as dead. All entries have a
+                                * path set. The marker used here is setting
+                                * that to NULL.
+                                */
+                               e->path = NULL;
+                               have_dead_entries = true;
+                       }
+               }
+       }
+
+       if (!have_dead_entries) {
+               TALLOC_FREE(array);
+               return;
+       }
+
+       for (i=0; i<array->num_entries; i++) {
+               struct notify_entry *e = &array->entries[i];
+               if (e->path != NULL) {
+                       continue;
+               }
+               DEBUG(10, ("Deleting notify entries for process %s because "
+                          "it's gone\n", procid_str_static(&e->server)));
+               /*
+                * Potential TODO: This might need optimizing,
+                * notify_remove_onelevel() does a fetch_locked() operation at
+                * every call. But this would only matter if a process with
+                * MANY notifies has died without shutting down properly.
+                */
+               notify_remove_onelevel(notify, &e->dir_id, e->private_data);
+       }
+
+       TALLOC_FREE(array);
+       return;
+}
 
 /*
   trigger a notify message for anyone waiting on a matching event
index f8c55b1b8f8fbe4e6b19c2149a1a28ec9f5410ec..b8ed321a4589042ae6e778c235a3e72c61ccc163 100644 (file)
@@ -164,6 +164,10 @@ void conn_clear_vuid_cache(connection_struct *conn, uint16_t vuid)
 
                if (ent->vuid == vuid) {
                        ent->vuid = UID_FIELD_INVALID;
+                       /* Ensure we're not freeing an active pointer. */
+                       if (conn->server_info == ent->server_info) {
+                               conn->server_info = NULL;
+                       }
                        TALLOC_FREE(ent->server_info);
                        ent->read_only = False;
                        ent->admin_user = False;
@@ -216,6 +220,13 @@ bool change_to_user(connection_struct *conn, uint16 vuid)
 
        server_info = vuser ? vuser->server_info : conn->server_info;
 
+       if (!server_info) {
+               /* Invalid vuid sent - even with security = share. */
+               DEBUG(2,("change_to_user: Invalid vuid %d used on "
+                        "share %s.\n",vuid, lp_servicename(snum) ));
+               return false;
+       }
+
        if (!check_user_ok(conn, vuid, server_info, snum)) {
                DEBUG(2,("change_to_user: SMB user %s (unix user %s, vuid %d) "
                         "not permitted access to share %s.\n",
index 804e77251638238937bf4451e95562695a2a64c6..07945fccf1f9b5301c2bfaa588a8cafe150f2da4 100644 (file)
@@ -5105,6 +5105,59 @@ static bool run_chain1(int dummy)
        return True;
 }
 
+static bool run_mangle1(int dummy)
+{
+       struct cli_state *cli;
+       const char *fname = "this_is_a_long_fname_to_be_mangled.txt";
+       int fnum;
+       fstring alt_name;
+       NTSTATUS status;
+       time_t change, access, write;
+       SMB_OFF_T size;
+       uint16_t mode;
+
+       printf("starting chain1 test\n");
+       if (!torture_open_connection(&cli, 0)) {
+               return False;
+       }
+
+       cli_sockopt(cli, sockops);
+
+       fnum = cli_nt_create_full(
+               cli, fname, 0, GENERIC_ALL_ACCESS|DELETE_ACCESS,
+               FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0, 0);
+       if (fnum == -1) {
+               d_printf("open %s failed: %s\n", fname, cli_errstr(cli));
+               return false;
+       }
+       cli_close(cli, fnum);
+
+       status = cli_qpathinfo_alt_name(cli, fname, alt_name);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_qpathinfo_alt_name failed: %s\n",
+                        nt_errstr(status));
+               return false;
+       }
+       d_printf("alt_name: %s\n", alt_name);
+
+       fnum = cli_open(cli, alt_name, O_RDONLY, DENY_NONE);
+       if (fnum == -1) {
+               d_printf("cli_open(%s) failed: %s\n", alt_name,
+                        cli_errstr(cli));
+               return false;
+       }
+       cli_close(cli, fnum);
+
+       if (!cli_qpathinfo(cli, alt_name, &change, &access, &write, &size,
+                          &mode)) {
+               d_printf("cli_qpathinfo(%s) failed: %s\n", alt_name,
+                        cli_errstr(cli));
+               return false;
+       }
+
+       return true;
+}
+
 static size_t null_source(uint8_t *buf, size_t n, void *priv)
 {
        size_t *to_pull = (size_t *)priv;
@@ -5199,6 +5252,50 @@ static bool run_cli_echo(int dummy)
        return NT_STATUS_IS_OK(status);
 }
 
+static bool run_uid_regression_test(int dummy)
+{
+       static struct cli_state *cli;
+       int16_t old_vuid;
+       bool correct = True;
+
+       printf("starting uid regression test\n");
+
+       if (!torture_open_connection(&cli, 0)) {
+               return False;
+       }
+
+       cli_sockopt(cli, sockops);
+
+       /* Ok - now save then logoff our current user. */
+       old_vuid = cli->vuid;
+
+       if (!cli_ulogoff(cli)) {
+               d_printf("(%s) cli_ulogoff failed: %s\n",
+                       __location__, cli_errstr(cli));
+               correct = false;
+               goto out;
+       }
+
+       cli->vuid = old_vuid;
+
+       /* Try an operation. */
+       if (!cli_mkdir(cli, "\\uid_reg_test")) {
+               /* We expect bad uid. */
+               if (!check_error(__LINE__, cli, ERRSRV, ERRbaduid,
+                               NT_STATUS_NO_SUCH_USER)) {
+                       return False;
+               }
+               goto out;
+       }
+
+       cli_rmdir(cli, "\\uid_reg_test");
+
+  out:
+
+       torture_close_connection(cli);
+       return correct;
+}
+
 static bool run_local_substitute(int dummy)
 {
        bool ok = true;
@@ -5778,6 +5875,7 @@ static struct {
        {"RW3",  run_readwritelarge, 0},
        {"OPEN", run_opentest, 0},
        {"POSIX", run_simple_posix_open_test, 0},
+       { "UID-REGRESSION-TEST", run_uid_regression_test, 0},
 #if 1
        {"OPENATTR", run_openattrtest, 0},
 #endif
@@ -5786,6 +5884,7 @@ static struct {
        {"DELETE", run_deletetest, 0},
        {"PROPERTIES", run_properties, 0},
        {"MANGLE", torture_mangle, 0},
+       {"MANGLE1", run_mangle1, 0},
        {"W2K", run_w2ktest, 0},
        {"TRANS2SCAN", torture_trans2_scan, 0},
        {"NTTRANSSCAN", torture_nttrans_scan, 0},
index 7823a982195f232b45b5a7adef804c9f5dfd63e7..bd5107af5309ea7dd8104f32d80ec2e4a0fbbb39 100644 (file)
@@ -651,6 +651,7 @@ static struct functable net_func[] = {
                {"force",       'f', POPT_ARG_NONE,   &c->opt_force},
                {"stdin",       'i', POPT_ARG_NONE,   &c->opt_stdin},
                {"timeout",     't', POPT_ARG_INT,    &c->opt_timeout},
+               {"request-timeout",0,POPT_ARG_INT,    &c->opt_request_timeout},
                {"machine-pass",'P', POPT_ARG_NONE,   &c->opt_machine_pass},
                {"kerberos",    'k', POPT_ARG_NONE,   &c->opt_kerberos},
                {"myworkgroup", 'W', POPT_ARG_STRING, &c->opt_workgroup},
index 2d72756defbda1a593e8a768771e9beb2f9e2ee7..d88f962d41e6d8b1c5e7d6d325695c149e455cd4 100644 (file)
@@ -43,6 +43,7 @@ struct net_context {
        const char *opt_container;
        int opt_flags;
        int opt_timeout;
+       int opt_request_timeout;
        const char *opt_target_workgroup;
        int opt_machine_pass;
        int opt_localgroup;
index 3fa547baf4115a22cfa9228daf298540f0fc30b6..663c5925c78fd5e33933ed4f47f1537667ffca35 100644 (file)
@@ -340,6 +340,14 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx,
                if (!W_ERROR_IS_OK(werr)) {
                        goto cancel;
                }
+
+               werr = smbconf_transaction_start(conf_ctx);
+               if (!W_ERROR_IS_OK(werr)) {
+                       d_printf("error starting transaction: %s\n",
+                                win_errstr(werr));
+                       goto done;
+               }
+
                werr = import_process_service(c, conf_ctx, service);
                if (!W_ERROR_IS_OK(werr)) {
                        goto cancel;
index 2651a8d034e136d2d07227275f37f246b635cc0a..5dd3df9a6908c9bd6da4b7fe4146df6fc5b5f47e 100644 (file)
@@ -121,6 +121,7 @@ int run_rpc_command(struct net_context *c,
        NTSTATUS nt_status;
        DOM_SID *domain_sid;
        const char *domain_name;
+       int ret = -1;
 
        /* make use of cli_state handed over as an argument, if possible */
        if (!cli_arg) {
@@ -142,15 +143,13 @@ int run_rpc_command(struct net_context *c,
 
        if (!(mem_ctx = talloc_init("run_rpc_command"))) {
                DEBUG(0, ("talloc_init() failed\n"));
-               cli_shutdown(cli);
-               return -1;
+               goto fail;
        }
 
        nt_status = net_get_remote_domain_sid(cli, mem_ctx, &domain_sid,
                                              &domain_name);
        if (!NT_STATUS_IS_OK(nt_status)) {
-               cli_shutdown(cli);
-               return -1;
+               goto fail;
        }
 
        if (!(conn_flags & NET_FLAGS_NO_PIPE)) {
@@ -165,8 +164,7 @@ int run_rpc_command(struct net_context *c,
                        if (!NT_STATUS_IS_OK(nt_status)) {
                                DEBUG(0, ("Could not initialise schannel netlogon pipe. Error was %s\n",
                                        nt_errstr(nt_status) ));
-                               cli_shutdown(cli);
-                               return -1;
+                               goto fail;
                        }
                } else {
                        if (conn_flags & NET_FLAGS_SEAL) {
@@ -184,8 +182,7 @@ int run_rpc_command(struct net_context *c,
                                DEBUG(0, ("Could not initialise pipe %s. Error was %s\n",
                                        get_pipe_name_from_iface(interface),
                                        nt_errstr(nt_status) ));
-                               cli_shutdown(cli);
-                               return -1;
+                               goto fail;
                        }
                }
        }
@@ -195,6 +192,7 @@ int run_rpc_command(struct net_context *c,
        if (!NT_STATUS_IS_OK(nt_status)) {
                DEBUG(1, ("rpc command function failed! (%s)\n", nt_errstr(nt_status)));
        } else {
+               ret = 0;
                DEBUG(5, ("rpc command function succedded\n"));
        }
 
@@ -204,13 +202,14 @@ int run_rpc_command(struct net_context *c,
                }
        }
 
+fail:
        /* close the connection only if it was opened here */
        if (!cli_arg) {
                cli_shutdown(cli);
        }
 
        talloc_destroy(mem_ctx);
-       return (!NT_STATUS_IS_OK(nt_status));
+       return ret;
 }
 
 /**
@@ -6105,7 +6104,7 @@ static int rpc_trustdom_list(struct net_context *c, int argc, const char **argv)
        /* SamrConnect2 */
        nt_status = rpccli_samr_Connect2(pipe_hnd, mem_ctx,
                                         pipe_hnd->desthost,
-                                        SAMR_ACCESS_OPEN_DOMAIN,
+                                        SAMR_ACCESS_LOOKUP_DOMAIN,
                                         &connect_hnd);
        if (!NT_STATUS_IS_OK(nt_status)) {
                DEBUG(0, ("Couldn't open SAMR policy handle. Error was %s\n",
index 1587793bdc0f7028d6125e9b5da8c6d43abc5d4d..78bbce3dfc02830ed2184df799d2bf09ccc1e6e7 100644 (file)
@@ -245,7 +245,7 @@ int net_rpc_join_newstyle(struct net_context *c, int argc, const char **argv)
        CHECK_RPC_ERR(rpccli_samr_Connect2(pipe_hnd, mem_ctx,
                                           pipe_hnd->desthost,
                                           SAMR_ACCESS_ENUM_DOMAINS
-                                          | SAMR_ACCESS_OPEN_DOMAIN,
+                                          | SAMR_ACCESS_LOOKUP_DOMAIN,
                                           &sam_pol),
                      "could not connect to SAM database");
 
index c6b6ee9e809d0b35a063f5ab64ec97cdc84832d7..2915ffb809449ce4ca9daf76d4096b5f95f95cb9 100644 (file)
@@ -521,6 +521,8 @@ NTSTATUS net_make_ipc_connection_ex(struct net_context *c ,const char *domain,
                d_fprintf(stderr, "Connection failed: %s\n",
                          nt_errstr(nt_status));
                cli = NULL;
+       } else if (c->opt_request_timeout) {
+               cli_set_timeout(cli, c->opt_request_timeout * 1000);
        }
 
 done:
index 4cd0d55f56a6e10a6c31b31434764ad98b5f5e86..8cca93f5defd0a2a8be3ed18f21f0e1e64b7f705 100644 (file)
@@ -430,14 +430,18 @@ static int process_root(int local_flags)
                }
 
                if((local_flags & LOCAL_SET_PASSWORD) && (new_passwd == NULL)) {
-                       struct passwd *passwd = getpwnam_alloc(NULL, user_name);
+                       struct passwd *passwd;
 
-                       if (!passwd) {
-                               fprintf(stderr, "Cannot locate Unix account for "
-                                         "'%s'!\n", user_name);
-                               exit(1);
+                       if (remote_machine == NULL) {
+                               passwd = getpwnam_alloc(NULL, user_name);
+
+                               if (!passwd) {
+                                       fprintf(stderr, "Cannot locate Unix account for "
+                                               "'%s'!\n", user_name);
+                                       exit(1);
+                               }
+                               TALLOC_FREE(passwd);
                        }
-                       TALLOC_FREE(passwd);
 
                        new_passwd = prompt_for_new_password(stdin_passwd_get);
 
index 24ee01c37fb244d8d360fb0ea3258121d4fab3ee..5c153050be6acbe7c16f11e2039c6e91decaedb4 100644 (file)
@@ -67,6 +67,16 @@ class SecurityDescriptorTests(unittest.TestCase):
         self.assertEquals(desc1.sacl, desc2.sacl)
         self.assertEquals(desc1.type, desc2.type)
 
+    def test_as_sddl_no_domainsid(self):
+        dom = security.dom_sid("S-2-0-0")
+        text = "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)"
+        desc1 = security.descriptor.from_sddl(text, dom)
+        desc2 = security.descriptor.from_sddl(desc1.as_sddl(), dom)
+        self.assertEquals(desc1.group_sid, desc2.group_sid)
+        self.assertEquals(desc1.owner_sid, desc2.owner_sid)
+        self.assertEquals(desc1.sacl, desc2.sacl)
+        self.assertEquals(desc1.type, desc2.type)
+
 
 class DomSidTests(unittest.TestCase):
     def test_parse_sid(self):
index f89263bba340c11a080977e9b14a5d731cf492c4..43c1d50d666ac764db66cbf1b31123fb2f8841fd 100644 (file)
@@ -187,13 +187,22 @@ static PyObject *py_descriptor_from_sddl(PyObject *self, PyObject *args)
        return py_talloc_import((PyTypeObject *)self, secdesc);
 }
 
-static PyObject *py_descriptor_as_sddl(PyObject *self, PyObject *py_sid)
+static PyObject *py_descriptor_as_sddl(PyObject *self, PyObject *args)
 {
-       struct dom_sid *sid = py_talloc_get_ptr(py_sid);
+       struct dom_sid *sid;
+       PyObject *py_sid = Py_None;
        struct security_descriptor *desc = py_talloc_get_ptr(self);
        char *text;
        PyObject *ret;
 
+       if (!PyArg_ParseTuple(args, "|O", &py_sid))
+               return NULL;
+
+       if (py_sid == Py_None)
+               sid = py_talloc_get_ptr(py_sid);
+       else
+               sid = NULL;
+
        text = sddl_encode(NULL, desc, sid);
 
        ret = PyString_FromString(text);
@@ -215,7 +224,7 @@ static PyMethodDef py_descriptor_extra_methods[] = {
                NULL },
        { "from_sddl", (PyCFunction)py_descriptor_from_sddl, METH_VARARGS|METH_CLASS, 
                NULL },
-       { "as_sddl", (PyCFunction)py_descriptor_as_sddl, METH_O,
+       { "as_sddl", (PyCFunction)py_descriptor_as_sddl, METH_VARARGS,
                NULL },
        { NULL }
 };
index 3f8ee8da32ec5c56cdab0c10e7bce72f82881221..ae7a707e35f0e7c0a5ce32fe7cbc801869b9b85e 100644 (file)
@@ -106,10 +106,10 @@ class RpcInterfaceTestCase(unittest.TestCase):
 class ValidNetbiosNameTests(unittest.TestCase):
 
     def test_valid(self):
-        self.assertTrue(valid_netbios_name("FOO"))
+        self.assertTrue(samba.valid_netbios_name("FOO"))
 
     def test_too_long(self):
-        self.assertFalse(valid_netbios_name("FOO"*10))
+        self.assertFalse(samba.valid_netbios_name("FOO"*10))
 
     def test_invalid_characters(self):
-        self.assertFalse(valid_netbios_name("()BLA"))
+        self.assertFalse(samba.valid_netbios_name("*BLA"))
index 291ad8472dc7883b657ebbd6d3280ae15a236a94..364d02a904f2cb119a2d4420a4c55a7ffdeb45ba 100644 (file)
@@ -28,6 +28,7 @@ raw.scan.eamax
 samba4.ntvfs.cifs.raw.qfileinfo.ipc
 smb2.notify
 smb2.scan
+smb2.lease
 ntvfs.cifs.base.charset
 ntvfs.cifs.base.iometer
 ntvfs.cifs.base.casetable
index 0124ce1741ad248753d43b743028f17b8ae571be..0a4c9904d7e6d9671a0565a0e04e5fb8915dd10e 100644 (file)
@@ -88,6 +88,7 @@ static NTSTATUS lookup_sids(TALLOC_CTX *mem_ctx, uint16_t level,
 {
        struct lsa_LookupSids r;
        struct lsa_SidArray sidarray;
+       struct lsa_RefDomainList *domains;
        uint32_t count = 0;
        uint32_t i;
 
@@ -108,6 +109,7 @@ static NTSTATUS lookup_sids(TALLOC_CTX *mem_ctx, uint16_t level,
        r.in.count = &count;
        r.out.names = names;
        r.out.count = &count;
+       r.out.domains = &domains;
 
        return dcerpc_lsa_LookupSids(p, mem_ctx, &r);
 }
@@ -322,3 +324,91 @@ bool torture_rpc_lsa_lookup(struct torture_context *torture)
 
        return ret;
 }
+
+static bool test_LookupSidsReply(struct torture_context *tctx,
+                                struct dcerpc_pipe *p)
+{
+       struct policy_handle *handle;
+
+       struct dom_sid **sids;
+       uint32_t num_sids = 1;
+
+       struct lsa_LookupSids r;
+       struct lsa_SidArray sidarray;
+       struct lsa_RefDomainList *domains = NULL;
+       struct lsa_TransNameArray names;
+       uint32_t count = 0;
+
+       uint32_t i;
+       NTSTATUS status;
+       const char *dom_sid = "S-1-5-21-1111111111-2222222222-3333333333";
+       const char *dom_admin_sid;
+
+       if (!open_policy(tctx, p, &handle)) {
+               return false;
+       }
+
+       dom_admin_sid = talloc_asprintf(tctx, "%s-%d", dom_sid, 512);
+
+       sids = talloc_array(tctx, struct dom_sid *, num_sids);
+
+       sids[0] = dom_sid_parse_talloc(tctx, dom_admin_sid);
+
+       names.count = 0;
+       names.names = NULL;
+
+       sidarray.num_sids = num_sids;
+       sidarray.sids = talloc_array(tctx, struct lsa_SidPtr, num_sids);
+
+       for (i=0; i<num_sids; i++) {
+               sidarray.sids[i].sid = sids[i];
+       }
+
+       r.in.handle     = handle;
+       r.in.sids       = &sidarray;
+       r.in.names      = &names;
+       r.in.level      = LSA_LOOKUP_NAMES_ALL;
+       r.in.count      = &count;
+       r.out.names     = &names;
+       r.out.count     = &count;
+       r.out.domains   = &domains;
+
+       status = dcerpc_lsa_LookupSids(p, tctx, &r);
+
+       torture_assert_ntstatus_equal(tctx, status, NT_STATUS_NONE_MAPPED,
+               "unexpected error code");
+
+       torture_assert_int_equal(tctx, names.count, num_sids,
+               "unexpected names count");
+       torture_assert(tctx, names.names,
+               "unexpected names pointer");
+       torture_assert_str_equal(tctx, names.names[0].name.string, dom_admin_sid,
+               "unexpected names[0].string");
+
+#if 0
+       /* vista sp1 passes, w2k3 sp2 fails */
+       torture_assert_int_equal(tctx, domains->count, num_sids,
+               "unexpected domains count");
+       torture_assert(tctx, domains->domains,
+               "unexpected domains pointer");
+       torture_assert_str_equal(tctx, dom_sid_string(tctx, domains->domains[0].sid), dom_sid,
+               "unexpected domain sid");
+#endif
+
+       return true;
+}
+
+/* check for lookup sids results */
+struct torture_suite *torture_rpc_lsa_lookup_sids(TALLOC_CTX *mem_ctx)
+{
+       struct torture_suite *suite;
+       struct torture_rpc_tcase *tcase;
+
+       suite = torture_suite_create(mem_ctx, "LSA-LOOKUPSIDS");
+       tcase = torture_suite_add_rpc_iface_tcase(suite, "lsa",
+                                                 &ndr_table_lsarpc);
+
+       torture_rpc_tcase_add_test(tcase, "LookupSidsReply", test_LookupSidsReply);
+
+       return suite;
+}
index 069bb51a8920a4b85bf92b8d4aa0c4447e17730a..5624c32b96a3b56515983f0b5e892c95424ff016 100644 (file)
@@ -378,6 +378,7 @@ NTSTATUS torture_rpc_init(void)
        torture_suite_add_simple_test(suite, "LSA", torture_rpc_lsa);
        torture_suite_add_simple_test(suite, "LSALOOKUP", torture_rpc_lsa_lookup);
        torture_suite_add_simple_test(suite, "LSA-GETUSER", torture_rpc_lsa_get_user);
+       torture_suite_add_suite(suite, torture_rpc_lsa_lookup_sids(suite));
        torture_suite_add_suite(suite, torture_rpc_lsa_secrets(suite));
        torture_suite_add_suite(suite, torture_rpc_echo(suite));
        torture_suite_add_simple_test(suite, "DFS", torture_rpc_dfs);
index 7b4e85195bef9342757ed6f957b8ab33438b36b0..9483ae2a9ad8e96da00238b2420b88a36686046f 100644 (file)
@@ -5664,7 +5664,9 @@ static bool test_OpenDomain(struct dcerpc_pipe *p, struct torture_context *tctx,
                }
                break;
        case TORTURE_SAMR_PASSWORDS_PWDLASTSET:
-               ret &= test_CreateUser2(p, tctx, &domain_handle, sid, which_ops, machine_credentials);
+               if (!torture_setting_bool(tctx, "samba3", false)) {
+                       ret &= test_CreateUser2(p, tctx, &domain_handle, sid, which_ops, machine_credentials);
+               }
                ret &= test_CreateUser(p, tctx, &domain_handle, &user_handle, sid, which_ops, machine_credentials);
                if (!ret) {
                        printf("Testing PASSWORDS PWDLASTSET on domain %s failed!\n", dom_sid_string(tctx, sid));
index 9a8e44201940a8eb3c81f5d4553288329304a7b2..fb560befe98e6f4f8079ff9317dcad630e8ff7a7 100644 (file)
@@ -301,7 +301,12 @@ static bool test_samr_connect_user_acl(struct torture_context *tctx,
        /* Try to connect as the test user */
        status = dcerpc_pipe_connect(tctx, 
                             &test_p, binding, &ndr_table_samr,
-                            test_credentials, NULL, tctx->lp_ctx);
+                            test_credentials, tctx->ev, tctx->lp_ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("dcerpc_pipe_connect failed: %s\n", nt_errstr(status));
+               return false;
+       }
+
        /* connect to SAMR as the user */
        status = torture_samr_Connect5(tctx, test_p, SEC_FLAG_MAXIMUM_ALLOWED, &uch);
        if (!NT_STATUS_IS_OK(status)) {
@@ -310,9 +315,6 @@ static bool test_samr_connect_user_acl(struct torture_context *tctx,
        }
        /* disconnec the user */
        talloc_free(test_p);
-       if (!NT_STATUS_IS_OK(status)) {
-               return false;
-       }
 
 
        /* read the sequrity descriptor back. it should not have changed 
@@ -366,7 +368,11 @@ static bool test_samr_connect_user_acl_enforced(struct torture_context *tctx,
 
        status = dcerpc_pipe_connect(tctx, 
                             &test_p, binding, &ndr_table_samr,
-                            test_credentials, NULL, tctx->lp_ctx);
+                            test_credentials, tctx->ev, tctx->lp_ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("dcerpc_pipe_connect failed: %s\n", nt_errstr(status));
+               return false;
+       }
 
        /* connect to SAMR as the user */
        status = torture_samr_Connect5(tctx, test_p, SAMR_ACCESS_SHUTDOWN_SERVER, &uch);
@@ -447,6 +453,7 @@ static bool test_samr_accessmask_LookupDomain(struct torture_context *tctx,
 
                        ld.in.connect_handle = &ch;
                        ld.in.domain_name    = &dn;
+                       ld.out.sid           = &sid;
                        dn.string            = lp_workgroup(tctx->lp_ctx);
 
                        status = dcerpc_samr_LookupDomain(p, tctx, &ld);
@@ -530,7 +537,7 @@ static bool test_samr_accessmask_OpenDomain(struct torture_context *tctx,
 
                        od.in.connect_handle = &ch;
                        od.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
-                       od.in.sid = *ld.out.sid;
+                       od.in.sid = sid;
                        od.out.domain_handle = &dh;
 
                        status = dcerpc_samr_OpenDomain(p, tctx, &od);
@@ -627,6 +634,7 @@ static bool test_samr_connect(struct torture_context *tctx,
                ret = false;
        }
 
+       if (!torture_setting_bool(tctx, "samba3", false)) {
 
        /* test if ACLs can be changed for the policy handle
         * returned by Connect5
@@ -649,7 +657,7 @@ static bool test_samr_connect(struct torture_context *tctx,
                ret = false;
        }
 
-
+       }
 
        /* remove the test user */
        torture_leave_domain(tctx, testuser);
index d17b3c7b609dd3cf7f9d848341c33b5c2b55c5ea..bfe667240cde51935f2d1985109bc9069109c597 100644 (file)
@@ -313,7 +313,11 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
                uint32_t count;
                union spoolss_DriverInfo *info;
 
-               r.in.server             = "";
+               /* FIXME: gd, come back and fix "" as server, and handle
+                * priority of returned error codes in torture test and samba 3
+                * server */
+
+               r.in.server             = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
                r.in.environment        = SPOOLSS_ARCHITECTURE_NT_X86;
                r.in.level              = level;
                r.in.buffer             = NULL;
@@ -331,16 +335,15 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
                        /* TODO: do some more checks here */
                        continue;
                }
-               torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, 
-                       "EnumPrinterDrivers failed");
-
-               blob = data_blob_talloc(ctx, NULL, needed);
-               data_blob_clear(&blob);
-               r.in.buffer = &blob;
-               r.in.offered = needed;
+               if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
+                       blob = data_blob_talloc(ctx, NULL, needed);
+                       data_blob_clear(&blob);
+                       r.in.buffer = &blob;
+                       r.in.offered = needed;
 
-               status = dcerpc_spoolss_EnumPrinterDrivers(p, ctx, &r);
-               torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinterDrivers failed");
+                       status = dcerpc_spoolss_EnumPrinterDrivers(p, ctx, &r);
+                       torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinterDrivers failed");
+               }
 
                torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed");
 
@@ -1061,28 +1064,43 @@ static bool test_GetJob(struct torture_context *tctx,
        NTSTATUS status;
        struct spoolss_GetJob r;
        uint32_t needed;
+       uint32_t levels[] = {1, 2 /* 3, 4 */};
+       uint32_t i;
 
        r.in.handle = handle;
        r.in.job_id = job_id;
-       r.in.level = 1;
+       r.in.level = 0;
        r.in.buffer = NULL;
        r.in.offered = 0;
        r.out.needed = &needed;
 
-       torture_comment(tctx, "Testing GetJob\n");
+       torture_comment(tctx, "Testing GetJob level %d\n", r.in.level);
 
        status = dcerpc_spoolss_GetJob(p, tctx, &r);
-       torture_assert_ntstatus_ok(tctx, status, "GetJob failed");
+       torture_assert_werr_equal(tctx, r.out.result, WERR_UNKNOWN_LEVEL, "Unexpected return code");
 
-       if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-               DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-               data_blob_clear(&blob);
-               r.in.buffer = &blob;
-               r.in.offered = needed;
+       for (i = 0; i < ARRAY_SIZE(levels); i++) {
+
+               torture_comment(tctx, "Testing GetJob level %d\n", r.in.level);
+
+               r.in.level = levels[i];
+               r.in.offered = 0;
 
                status = dcerpc_spoolss_GetJob(p, tctx, &r);
+               torture_assert_ntstatus_ok(tctx, status, "GetJob failed");
 
+               if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
+                       DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
+                       data_blob_clear(&blob);
+                       r.in.buffer = &blob;
+                       r.in.offered = needed;
+
+                       status = dcerpc_spoolss_GetJob(p, tctx, &r);
+                       torture_assert_ntstatus_ok(tctx, status, "GetJob failed");
+
+               }
                torture_assert(tctx, r.out.info, "No job info returned");
+               torture_assert_werr_ok(tctx, r.out.result, "GetJob failed");
        }
 
        return true;
@@ -1209,8 +1227,12 @@ static bool test_EnumJobs(struct torture_context *tctx,
                for (j = 0; j < count; j++) {
 
                        test_GetJob(tctx, p, handle, info[j].info1.job_id);
-                       test_SetJob(tctx, p, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_PAUSE);
-                       test_SetJob(tctx, p, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_RESUME);
+
+                       /* FIXME - gd */
+                       if (!torture_setting_bool(tctx, "samba3", false)) {
+                               test_SetJob(tctx, p, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_PAUSE);
+                               test_SetJob(tctx, p, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_RESUME);
+                       }
                }
 
        } else {
index 42b69295574e5932d2036008d6439b0951dd5223..719d8e26d2a488a44c02b923ba43787d54e40b30 100644 (file)
@@ -290,6 +290,13 @@ static bool test_EnumJobs(struct torture_context *tctx,
 
        status = dcerpc_spoolss_EnumJobs(p, tctx, &ej);
        torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed");
+       if (W_ERROR_EQUAL(ej.out.result, WERR_INSUFFICIENT_BUFFER)) {
+               blob = data_blob_talloc_zero(tctx, needed);
+               ej.in.offered = needed;
+               ej.in.buffer = &blob;
+               status = dcerpc_spoolss_EnumJobs(p, tctx, &ej);
+               torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed");
+       }
        torture_assert_werr_ok(tctx, ej.out.result, "EnumJobs failed");
 
        return true;
index 631e367c3bc7b5fa70c95f14f259aecd69da0f7a..a2e32f221fee5d9a22cd0e7e5dcb1331ad423004 100644 (file)
@@ -26,6 +26,8 @@
 #include "torture/rpc/rpc.h"
 #include "param/param.h"
 
+#define TORTURE_DEFAULT_SERVICE "NetLogon"
+
 static bool test_OpenSCManager(struct dcerpc_pipe *p, struct torture_context *tctx, struct policy_handle *h)
 {
        struct svcctl_OpenSCManagerW r;
@@ -85,7 +87,7 @@ static bool test_QueryServiceStatus(struct torture_context *tctx,
        if (!test_OpenSCManager(p, tctx, &h))
                return false;
 
-       if (!test_OpenService(p, tctx, &h, "Netlogon", &s))
+       if (!test_OpenService(p, tctx, &h, TORTURE_DEFAULT_SERVICE, &s))
                return false;
 
        r.in.handle = &s;
@@ -118,7 +120,7 @@ static bool test_QueryServiceStatusEx(struct torture_context *tctx, struct dcerp
        if (!test_OpenSCManager(p, tctx, &h))
                return false;
 
-       if (!test_OpenService(p, tctx, &h, "Netlogon", &s))
+       if (!test_OpenService(p, tctx, &h, TORTURE_DEFAULT_SERVICE, &s))
                return false;
 
        buffer = talloc(tctx, uint8_t);
@@ -165,7 +167,7 @@ static bool test_QueryServiceConfigW(struct torture_context *tctx,
        if (!test_OpenSCManager(p, tctx, &h))
                return false;
 
-       if (!test_OpenService(p, tctx, &h, "Netlogon", &s))
+       if (!test_OpenService(p, tctx, &h, TORTURE_DEFAULT_SERVICE, &s))
                return false;
 
        r.in.handle = &s;
@@ -207,7 +209,7 @@ static bool test_QueryServiceConfig2W(struct torture_context *tctx, struct dcerp
        if (!test_OpenSCManager(p, tctx, &h))
                return false;
 
-       if (!test_OpenService(p, tctx, &h, "Netlogon", &s))
+       if (!test_OpenService(p, tctx, &h, TORTURE_DEFAULT_SERVICE, &s))
                return false;
 
        buffer = talloc(tctx, uint8_t);
@@ -270,7 +272,7 @@ static bool test_QueryServiceObjectSecurity(struct torture_context *tctx,
        if (!test_OpenSCManager(p, tctx, &h))
                return false;
 
-       if (!test_OpenService(p, tctx, &h, "Netlogon", &s))
+       if (!test_OpenService(p, tctx, &h, TORTURE_DEFAULT_SERVICE, &s))
                return false;
 
        r.in.handle = &s;
@@ -403,7 +405,7 @@ static bool test_EnumDependentServicesW(struct torture_context *tctx,
        if (!test_OpenSCManager(p, tctx, &h))
                return false;
 
-       if (!test_OpenService(p, tctx, &h, "Netlogon", &s))
+       if (!test_OpenService(p, tctx, &h, TORTURE_DEFAULT_SERVICE, &s))
                return false;
 
        r.in.service = &s;