s3-pdb: Break SECRETS3 dependency on PDB.
authorSimo Sorce <idra@samba.org>
Thu, 26 Jan 2012 20:27:54 +0000 (15:27 -0500)
committerAndreas Schneider <asn@samba.org>
Fri, 27 Jan 2012 17:11:10 +0000 (18:11 +0100)
This is causing circular depdnendcies that bring libpdb in all code and this is
BAD.

This change 'protects' the sid and guid of the domain by adding a special key
that makes them effectively read only.

Limit this temporarily to the samba 4 build, once it gets some good testing the
samba4 ifdefs can be dropped.

fix pdb dependencies

Signed-off-by: Andreas Schneider <asn@samba.org>
source3/auth/wscript_build
source3/include/secrets.h
source3/passdb/machine_account_secrets.c
source3/wscript_build

index 4f04772b4c66fa2af4de9aa6d2ddad7c371daad7..0dba13f7cb391e49b9f5dde45306739ec40c2b26 100644 (file)
@@ -16,7 +16,7 @@ AUTH_SRC = '''auth.c
 
 bld.SAMBA3_SUBSYSTEM('TOKEN_UTIL',
                     source='token_util.c',
-                    deps='samba-util',
+                    deps='samba-util pdb',
                     vars=locals())
 
 bld.SAMBA3_SUBSYSTEM('USER_UTIL',
index 705a3296dc94350073120c4dfef37af022e0a591..6cb2e0473e978b94304967be4d5f31a163047076 100644 (file)
@@ -39,6 +39,7 @@
    really secret. */
 #define SECRETS_DOMAIN_SID    "SECRETS/SID"
 #define SECRETS_SAM_SID       "SAM/SID"
+#define SECRETS_PROTECT_IDS   "SECRETS/PROTECT/IDS"
 
 /* The domain GUID and server GUID (NOT the same) are also not secret */
 #define SECRETS_DOMAIN_GUID   "SECRETS/DOMGUID"
@@ -88,6 +89,10 @@ void secrets_shutdown(void);
 void *secrets_fetch(const char *key, size_t *size);
 bool secrets_store(const char *key, const void *data, size_t size);
 bool secrets_delete(const char *key);
+
+/* The following definitions come from passdb/machine_account_secrets.c */
+bool secrets_mark_domain_protected(const char *domain);
+bool secrets_clear_domain_protection(const char *domain);
 bool secrets_store_domain_sid(const char *domain, const struct dom_sid  *sid);
 bool secrets_fetch_domain_sid(const char *domain, struct dom_sid  *sid);
 bool secrets_store_domain_guid(const char *domain, struct GUID *guid);
index 565c7c4c2022f20d75a9f12aace4d9c6e2b564d2..a2bd8be493c1e8d7c739b1bf2f42a6c46d9a6797 100644 (file)
@@ -53,18 +53,52 @@ static const char *domain_sid_keystr(const char *domain)
        return keystr;
 }
 
+static const char *protect_ids_keystr(const char *domain)
+{
+       char *keystr;
+
+       keystr = talloc_asprintf_strupper_m(talloc_tos(), "%s/%s",
+                                           SECRETS_PROTECT_IDS, domain);
+       SMB_ASSERT(keystr != NULL);
+       return keystr;
+}
+
+/* N O T E: never use this outside of passdb modules that store the SID on their own */
+bool secrets_mark_domain_protected(const char *domain)
+{
+       bool ret;
+
+       ret = secrets_store(protect_ids_keystr(domain), "TRUE", 5);
+       if (!ret) {
+               DEBUG(0, ("Failed to protect the Domain IDs\n"));
+       }
+       return ret;
+}
+
+bool secrets_clear_domain_protection(const char *domain)
+{
+       bool ret;
+
+       ret = secrets_delete(protect_ids_keystr(domain));
+       if (!ret) {
+               DEBUG(0, ("Failed to remove Domain IDs protection\n"));
+       }
+       return ret;
+}
+
 bool secrets_store_domain_sid(const char *domain, const struct dom_sid  *sid)
 {
+       char *protect_ids;
        bool ret;
 
 #if _SAMBA_BUILD_ == 4
-       if (strequal(domain, get_global_sam_name()) &&
-           (pdb_capabilities() & PDB_CAP_ADS)) {
-               /* If we have a ADS-capable passdb backend, we
-                * must never make up our own SID, it will
-                * already be in the directory */
-               DEBUG(0, ("Refusing to store a Domain SID, this should be read from the directory not stored here\n"));
-               return false;
+       protect_ids = secrets_fetch(protect_ids_keystr(domain), NULL);
+       if (protect_ids) {
+               if (strncmp(protect_ids, "TRUE", 4)) {
+                       DEBUG(0, ("Refusing to store a Domain SID, "
+                                 "it has been marked as protected!\n"));
+                       return false;
+               }
        }
 #endif
 
@@ -81,24 +115,6 @@ bool secrets_fetch_domain_sid(const char *domain, struct dom_sid  *sid)
        struct dom_sid  *dyn_sid;
        size_t size = 0;
 
-#if _SAMBA_BUILD_ == 4
-       if (strequal(domain, get_global_sam_name()) &&
-           (pdb_capabilities() & PDB_CAP_ADS)) {
-               struct pdb_domain_info *domain_info;
-               domain_info = pdb_get_domain_info(talloc_tos());
-               if (!domain_info) {
-                       /* If we have a ADS-capable passdb backend, we
-                        * must never make up our own SID, it will
-                        * already be in the directory */
-                       DEBUG(0, ("Unable to fetch a Domain SID from the directory!\n"));
-                       return false;
-               }
-
-               *sid = domain_info->sid;
-               return true;
-       }
-#endif
-
        dyn_sid = (struct dom_sid  *)secrets_fetch(domain_sid_keystr(domain), &size);
 
        if (dyn_sid == NULL)
@@ -116,16 +132,17 @@ bool secrets_fetch_domain_sid(const char *domain, struct dom_sid  *sid)
 
 bool secrets_store_domain_guid(const char *domain, struct GUID *guid)
 {
+       char *protect_ids;
        fstring key;
 
 #if _SAMBA_BUILD_ == 4
-       if (strequal(domain, get_global_sam_name()) &&
-           (pdb_capabilities() & PDB_CAP_ADS)) {
-               /* If we have a ADS-capable passdb backend, we
-                * must never make up our own GUID, it will
-                * already be in the directory */
-               DEBUG(0, ("Refusing to store a Domain GUID, this should be read from the directory not stored here\n"));
-               return false;
+       protect_ids = secrets_fetch(protect_ids_keystr(domain), NULL);
+       if (protect_ids) {
+               if (strncmp(protect_ids, "TRUE", 4)) {
+                       DEBUG(0, ("Refusing to store a Domain SID, "
+                                 "it has been marked as protected!\n"));
+                       return false;
+               }
        }
 #endif
 
@@ -141,24 +158,6 @@ bool secrets_fetch_domain_guid(const char *domain, struct GUID *guid)
        size_t size = 0;
        struct GUID new_guid;
 
-#if _SAMBA_BUILD_ == 4
-       if (strequal(domain, get_global_sam_name()) &&
-           (pdb_capabilities() & PDB_CAP_ADS)) {
-               struct pdb_domain_info *domain_info;
-               domain_info = pdb_get_domain_info(talloc_tos());
-               if (!domain_info) {
-                       /* If we have a ADS-capable passdb backend, we
-                        * must never make up our own SID, it will
-                        * already be in the directory */
-                       DEBUG(0, ("Unable to fetch a Domain GUID from the directory!\n"));
-                       return false;
-               }
-
-               *guid = domain_info->guid;
-               return true;
-       }
-#endif
-
        slprintf(key, sizeof(key)-1, "%s/%s", SECRETS_DOMAIN_GUID, domain);
        strupper_m(key);
        dyn_guid = (struct GUID *)secrets_fetch(key, &size);
index 6d856a544fbf1879a1871fe834edb9e9fc0a4503..60524709a7c41cbffa130cf00940ddf76e0e6fe0 100755 (executable)
@@ -692,7 +692,7 @@ bld.SAMBA3_LIBRARY('nss_wins',
 
 bld.SAMBA3_LIBRARY('gse',
                    source='librpc/crypto/gse_krb5.c librpc/crypto/gse.c',
-                   deps='KRB5_WRAP gensec param KRBCLIENT SECRETS3',
+                   deps='KRB5_WRAP gensec param KRBCLIENT secrets3',
                    private_library=True)
 
 bld.SAMBA3_LIBRARY('msrpc3',
@@ -725,7 +725,7 @@ bld.SAMBA3_SUBSYSTEM('TLDAP',
 
 bld.SAMBA3_LIBRARY('pdb',
                    source=PASSDB_SRC,
-                   deps='SECRETS3 GROUPDB SERVER_MUTEX wbclient LIBCLI_AUTH flag_mapping',
+                   deps='secrets3 GROUPDB SERVER_MUTEX wbclient LIBCLI_AUTH flag_mapping',
                    private_library=True,
                    public_headers='''
                                include/passdb.h
@@ -800,7 +800,7 @@ bld.SAMBA3_LIBRARY('popt_samba3',
 
 bld.SAMBA3_LIBRARY('util_cmdline',
                    source='lib/util_cmdline.c',
-                   deps='SECRETS3 popt',
+                   deps='secrets3 popt',
                    private_library=True)
 
 bld.SAMBA3_SUBSYSTEM('KRBCLIENT',
@@ -871,9 +871,13 @@ bld.SAMBA3_SUBSYSTEM('CLDAP',
                     deps='cli-ldap-common cli_cldap LIBTSOCKET',
                     vars=locals())
 
-bld.SAMBA3_SUBSYSTEM('SECRETS3',
+# NOTE: The secrets3 library is a low level library used by several subsystems.
+# PLEASE DO NOT make it depend on high level libraries like PDB, if you are
+# doing that your design is wrong and needs changing. -SSS
+bld.SAMBA3_LIBRARY('secrets3',
                    source=SECRETS_SRC,
-                   deps='NDR_SECRETS param samba3util dbwrap pdb',
+                   deps='NDR_SECRETS param samba3util dbwrap',
+                   private_library=True,
                    vars=locals())
 
 bld.SAMBA3_LIBRARY('smbldap',
@@ -1010,7 +1014,7 @@ bld.SAMBA3_SUBSYSTEM('FNAME_UTIL',
 
 bld.SAMBA3_SUBSYSTEM('LIBNET',
                     source=LIBNET_SRC,
-                    deps='NDR_LIBNET_JOIN INIT_SAMR net_keytab',
+                    deps='NDR_LIBNET_JOIN INIT_SAMR net_keytab pdb',
                     vars=locals())
 
 bld.SAMBA3_LIBRARY('net_keytab',
@@ -1074,7 +1078,7 @@ bld.SAMBA3_SUBSYSTEM('DCUTIL',
 
 bld.SAMBA3_LIBRARY('trusts_util',
                    source='libsmb/trusts_util.c',
-                   deps='libcli_netlogon3 msrpc3',
+                   deps='libcli_netlogon3 msrpc3 pdb',
                    vars=locals(),
                    private_library=True)
 
@@ -1148,7 +1152,7 @@ bld.SAMBA3_LIBRARY('libcli_netlogon3',
 
 bld.SAMBA3_LIBRARY('cli_spoolss',
                    source=LIBCLI_SPOOLSS_SRC,
-                   deps='RPC_NDR_SPOOLSS param SECRETS3',
+                   deps='RPC_NDR_SPOOLSS param secrets3',
                    private_library=True)
 
 bld.SAMBA3_SUBSYSTEM('LIBCLI_WINREG',
@@ -1359,7 +1363,7 @@ bld.SAMBA3_BINARY('smbta-util',
                  source=SMBTA_UTIL_SRC,
                  deps='''
                  talloc
-                 SECRETS3
+                 secrets3
                  param''',
                  vars=locals())