s3:registry: move the reg_api prototypes to their own header.
[kai/samba.git] / source3 / libgpo / gpo_reg.c
index b628748769cb0fcf4a109c30b9d5cdd2ca8acb25..851fddcf20a71233abc18cb66d83b8cfb91c4b5f 100644 (file)
 #include "../libgpo/gpo.h"
 #include "libgpo/gpo_proto.h"
 #include "registry.h"
+#include "registry/reg_api.h"
+#include "registry/reg_backend_db.h"
+#include "registry/reg_api_util.h"
 
 
 /****************************************************************
 ****************************************************************/
 
-struct nt_user_token *registry_create_system_token(TALLOC_CTX *mem_ctx)
+struct security_token *registry_create_system_token(TALLOC_CTX *mem_ctx)
 {
-       struct nt_user_token *token = NULL;
+       struct security_token *token = NULL;
 
-       token = TALLOC_ZERO_P(mem_ctx, struct nt_user_token);
+       token = TALLOC_ZERO_P(mem_ctx, struct security_token);
        if (!token) {
                DEBUG(1,("talloc failed\n"));
                return NULL;
        }
 
-       token->privileges = se_priv_all;
+       token->privilege_mask = SE_ALL_PRIVS;
 
        if (!NT_STATUS_IS_OK(add_sid_to_array(token, &global_sid_System,
-                        &token->user_sids, &token->num_sids))) {
+                        &token->sids, &token->num_sids))) {
                DEBUG(1,("Error adding nt-authority system sid to token\n"));
                return NULL;
        }
@@ -53,7 +56,7 @@ struct nt_user_token *registry_create_system_token(TALLOC_CTX *mem_ctx)
 WERROR gp_init_reg_ctx(TALLOC_CTX *mem_ctx,
                       const char *initial_path,
                       uint32_t desired_access,
-                      const struct nt_user_token *token,
+                      const struct security_token *token,
                       struct gp_registry_context **reg_ctx)
 {
        struct gp_registry_context *tmp_ctx;
@@ -164,15 +167,11 @@ WERROR gp_store_reg_val_sz(TALLOC_CTX *mem_ctx,
                           const char *val)
 {
        struct registry_value reg_val;
-       ZERO_STRUCT(reg_val);
-
-       /* FIXME: hack */
-       val = val ? val : " ";
 
        reg_val.type = REG_SZ;
-       reg_val.v.sz.len = strlen(val);
-       reg_val.v.sz.str = talloc_strdup(mem_ctx, val);
-       W_ERROR_HAVE_NO_MEMORY(reg_val.v.sz.str);
+       if (!push_reg_sz(mem_ctx, &reg_val.data, val)) {
+               return WERR_NOMEM;
+       }
 
        return reg_setvalue(key, val_name, &reg_val);
 }
@@ -186,10 +185,10 @@ static WERROR gp_store_reg_val_dword(TALLOC_CTX *mem_ctx,
                                     uint32_t val)
 {
        struct registry_value reg_val;
-       ZERO_STRUCT(reg_val);
 
        reg_val.type = REG_DWORD;
-       reg_val.v.dword = val;
+       reg_val.data = data_blob_talloc(mem_ctx, NULL, 4);
+       SIVAL(reg_val.data.data, 0, val);
 
        return reg_setvalue(key, val_name, &reg_val);
 }
@@ -212,8 +211,9 @@ WERROR gp_read_reg_val_sz(TALLOC_CTX *mem_ctx,
                return WERR_INVALID_DATATYPE;
        }
 
-       *val = talloc_strdup(mem_ctx, reg_val->v.sz.str);
-       W_ERROR_HAVE_NO_MEMORY(*val);
+       if (!pull_reg_sz(mem_ctx, &reg_val->data, val)) {
+               return WERR_NOMEM;
+       }
 
        return WERR_OK;
 }
@@ -236,7 +236,10 @@ static WERROR gp_read_reg_val_dword(TALLOC_CTX *mem_ctx,
                return WERR_INVALID_DATATYPE;
        }
 
-       *val = reg_val->v.dword;
+       if (reg_val->data.length < 4) {
+               return WERR_INSUFFICIENT_BUFFER;
+       }
+       *val = IVAL(reg_val->data.data, 0);
 
        return WERR_OK;
 }
@@ -297,7 +300,7 @@ static WERROR gp_store_reg_gpovals(TALLOC_CTX *mem_ctx,
 ****************************************************************/
 
 static const char *gp_reg_groupmembership_path(TALLOC_CTX *mem_ctx,
-                                              const DOM_SID *sid,
+                                              const struct dom_sid *sid,
                                               uint32_t flags)
 {
        if (flags & GPO_LIST_FLAG_MACHINE) {
@@ -313,12 +316,12 @@ static const char *gp_reg_groupmembership_path(TALLOC_CTX *mem_ctx,
 
 static WERROR gp_reg_del_groupmembership(TALLOC_CTX *mem_ctx,
                                         struct registry_key *key,
-                                        const struct nt_user_token *token,
+                                        const struct security_token *token,
                                         uint32_t flags)
 {
        const char *path = NULL;
 
-       path = gp_reg_groupmembership_path(mem_ctx, &token->user_sids[0],
+       path = gp_reg_groupmembership_path(mem_ctx, &token->sids[0],
                                           flags);
        W_ERROR_HAVE_NO_MEMORY(path);
 
@@ -331,7 +334,7 @@ static WERROR gp_reg_del_groupmembership(TALLOC_CTX *mem_ctx,
 
 static WERROR gp_reg_store_groupmembership(TALLOC_CTX *mem_ctx,
                                           struct gp_registry_context *reg_ctx,
-                                          const struct nt_user_token *token,
+                                          const struct security_token *token,
                                           uint32_t flags)
 {
        struct registry_key *key = NULL;
@@ -342,7 +345,7 @@ static WERROR gp_reg_store_groupmembership(TALLOC_CTX *mem_ctx,
        const char *val = NULL;
        int count = 0;
 
-       path = gp_reg_groupmembership_path(mem_ctx, &token->user_sids[0],
+       path = gp_reg_groupmembership_path(mem_ctx, &token->sids[0],
                                           flags);
        W_ERROR_HAVE_NO_MEMORY(path);
 
@@ -357,7 +360,7 @@ static WERROR gp_reg_store_groupmembership(TALLOC_CTX *mem_ctx,
                valname = talloc_asprintf(mem_ctx, "Group%d", count++);
                W_ERROR_HAVE_NO_MEMORY(valname);
 
-               val = sid_string_talloc(mem_ctx, &token->user_sids[i]);
+               val = sid_string_talloc(mem_ctx, &token->sids[i]);
                W_ERROR_HAVE_NO_MEMORY(val);
                werr = gp_store_reg_val_sz(mem_ctx, key, valname, val);
                W_ERROR_NOT_OK_RETURN(werr);
@@ -375,8 +378,8 @@ static WERROR gp_reg_store_groupmembership(TALLOC_CTX *mem_ctx,
 /* not used yet */
 static WERROR gp_reg_read_groupmembership(TALLOC_CTX *mem_ctx,
                                          struct gp_registry_context *reg_ctx,
-                                         const DOM_SID *object_sid,
-                                         struct nt_user_token **token,
+                                         const struct dom_sid *object_sid,
+                                         struct security_token **token,
                                          uint32_t flags)
 {
        struct registry_key *key = NULL;
@@ -387,9 +390,9 @@ static WERROR gp_reg_read_groupmembership(TALLOC_CTX *mem_ctx,
        const char *path = NULL;
        uint32_t count = 0;
        int num_token_sids = 0;
-       struct nt_user_token *tmp_token = NULL;
+       struct security_token *tmp_token = NULL;
 
-       tmp_token = TALLOC_ZERO_P(mem_ctx, struct nt_user_token);
+       tmp_token = TALLOC_ZERO_P(mem_ctx, struct security_token);
        W_ERROR_HAVE_NO_MEMORY(tmp_token);
 
        path = gp_reg_groupmembership_path(mem_ctx, object_sid, flags);
@@ -409,7 +412,7 @@ static WERROR gp_reg_read_groupmembership(TALLOC_CTX *mem_ctx,
                werr = gp_read_reg_val_sz(mem_ctx, key, valname, &val);
                W_ERROR_NOT_OK_RETURN(werr);
 
-               if (!string_to_sid(&tmp_token->user_sids[num_token_sids++],
+               if (!string_to_sid(&tmp_token->sids[num_token_sids++],
                                   val)) {
                        return WERR_INSUFFICIENT_BUFFER;
                }
@@ -426,7 +429,7 @@ static WERROR gp_reg_read_groupmembership(TALLOC_CTX *mem_ctx,
 ****************************************************************/
 
 static const char *gp_req_state_path(TALLOC_CTX *mem_ctx,
-                                    const DOM_SID *sid,
+                                    const struct dom_sid *sid,
                                     uint32_t flags)
 {
        if (flags & GPO_LIST_FLAG_MACHINE) {
@@ -452,7 +455,7 @@ static WERROR gp_del_reg_state(TALLOC_CTX *mem_ctx,
 WERROR gp_reg_state_store(TALLOC_CTX *mem_ctx,
                          uint32_t flags,
                          const char *dn,
-                         const struct nt_user_token *token,
+                         const struct security_token *token,
                          struct GROUP_POLICY_OBJECT *gpo_list)
 {
        struct gp_registry_context *reg_ctx = NULL;
@@ -467,7 +470,7 @@ WERROR gp_reg_state_store(TALLOC_CTX *mem_ctx,
        W_ERROR_NOT_OK_RETURN(werr);
 
        werr = gp_secure_key(mem_ctx, flags, reg_ctx->curr_key,
-                            &token->user_sids[0]);
+                            &token->sids[0]);
        if (!W_ERROR_IS_OK(werr)) {
                DEBUG(0,("failed to secure key: %s\n", win_errstr(werr)));
                goto done;
@@ -479,7 +482,7 @@ WERROR gp_reg_state_store(TALLOC_CTX *mem_ctx,
                goto done;
        }
 
-       subkeyname = gp_req_state_path(mem_ctx, &token->user_sids[0], flags);
+       subkeyname = gp_req_state_path(mem_ctx, &token->sids[0], flags);
        if (!subkeyname) {
                werr = WERR_NOMEM;
                goto done;
@@ -612,7 +615,7 @@ static WERROR gp_read_reg_gpo(TALLOC_CTX *mem_ctx,
 
 WERROR gp_reg_state_read(TALLOC_CTX *mem_ctx,
                         uint32_t flags,
-                        const DOM_SID *sid,
+                        const struct dom_sid *sid,
                         struct GROUP_POLICY_OBJECT **gpo_list)
 {
        struct gp_registry_context *reg_ctx = NULL;
@@ -687,7 +690,7 @@ WERROR gp_reg_state_read(TALLOC_CTX *mem_ctx,
 ****************************************************************/
 
 static WERROR gp_reg_generate_sd(TALLOC_CTX *mem_ctx,
-                                const DOM_SID *sid,
+                                const struct dom_sid *sid,
                                 struct security_descriptor **sd,
                                 size_t *sd_size)
 {
@@ -741,7 +744,7 @@ static WERROR gp_reg_generate_sd(TALLOC_CTX *mem_ctx,
        theacl = make_sec_acl(mem_ctx, NT4_ACL_REVISION, 6, ace);
        W_ERROR_HAVE_NO_MEMORY(theacl);
 
-       *sd = make_sec_desc(mem_ctx, SEC_DESC_REVISION,
+       *sd = make_sec_desc(mem_ctx, SD_REVISION,
                            SEC_DESC_SELF_RELATIVE |
                            SEC_DESC_DACL_AUTO_INHERITED | /* really ? */
                            SEC_DESC_DACL_AUTO_INHERIT_REQ, /* really ? */
@@ -758,11 +761,11 @@ static WERROR gp_reg_generate_sd(TALLOC_CTX *mem_ctx,
 WERROR gp_secure_key(TALLOC_CTX *mem_ctx,
                     uint32_t flags,
                     struct registry_key *key,
-                    const DOM_SID *sid)
+                    const struct dom_sid *sid)
 {
        struct security_descriptor *sd = NULL;
        size_t sd_size = 0;
-       const DOM_SID *sd_sid = NULL;
+       const struct dom_sid *sd_sid = NULL;
        WERROR werr;
 
        if (!(flags & GPO_LIST_FLAG_MACHINE)) {
@@ -796,34 +799,56 @@ void dump_reg_val(int lvl, const char *direction,
                direction, key, subkey, type_str));
 
        switch (val->type) {
-               case REG_DWORD:
+               case REG_DWORD: {
+                       uint32_t v;
+                       if (val->data.length < 4) {
+                               break;
+                       }
+                       v = IVAL(val->data.data, 0);
                        DEBUG(lvl,("%d (0x%08x)\n",
-                               (int)val->v.dword, val->v.dword));
+                               (int)v, v));
                        break;
-               case REG_QWORD:
+               }
+               case REG_QWORD: {
+                       uint64_t v;
+                       if (val->data.length < 8) {
+                               break;
+                       }
+                       v = BVAL(val->data.data, 0);
                        DEBUG(lvl,("%d (0x%016llx)\n",
-                               (int)val->v.qword,
-                               (unsigned long long)val->v.qword));
+                               (int)v,
+                               (unsigned long long)v));
                        break;
-               case REG_SZ:
+               }
+               case REG_SZ: {
+                       const char *s;
+                       if (!pull_reg_sz(talloc_tos(), &val->data, &s)) {
+                               break;
+                       }
                        DEBUG(lvl,("%s (length: %d)\n",
-                                  val->v.sz.str,
-                                  (int)val->v.sz.len));
+                                  s, (int)strlen_m(s)));
                        break;
-               case REG_MULTI_SZ:
-                       DEBUG(lvl,("(num_strings: %d)\n",
-                                  val->v.multi_sz.num_strings));
-                       for (i=0; i < val->v.multi_sz.num_strings; i++) {
-                               DEBUGADD(lvl,("\t%s\n",
-                                       val->v.multi_sz.strings[i]));
+               }
+               case REG_MULTI_SZ: {
+                       const char **a;
+                       if (!pull_reg_multi_sz(talloc_tos(), &val->data, &a)) {
+                               break;
+                       }
+                       for (i=0; a[i] != NULL; i++) {
+                               ;;
+                       }
+                       DEBUG(lvl,("(num_strings: %d)\n", i));
+                       for (i=0; a[i] != NULL; i++) {
+                               DEBUGADD(lvl,("\t%s\n", a[i]));
                        }
                        break;
+               }
                case REG_NONE:
                        DEBUG(lvl,("\n"));
                        break;
                case REG_BINARY:
-                       dump_data(lvl, val->v.binary.data,
-                                 val->v.binary.length);
+                       dump_data(lvl, val->data.data,
+                                 val->data.length);
                        break;
                default:
                        DEBUG(lvl,("unsupported type: %d\n", val->type));
@@ -927,7 +952,7 @@ WERROR reg_apply_registry_entry(TALLOC_CTX *mem_ctx,
                                struct registry_key *root_key,
                                struct gp_registry_context *reg_ctx,
                                struct gp_registry_entry *entry,
-                               const struct nt_user_token *token,
+                               const struct security_token *token,
                                uint32_t flags)
 {
        WERROR werr;
@@ -956,7 +981,7 @@ WERROR reg_apply_registry_entry(TALLOC_CTX *mem_ctx,
                case GP_REG_ACTION_SEC_KEY_SET:
                        werr = gp_secure_key(mem_ctx, flags,
                                             key,
-                                            &token->user_sids[0]);
+                                            &token->sids[0]);
                        if (!W_ERROR_IS_OK(werr)) {
                                DEBUG(0,("reg_apply_registry_entry: "
                                        "gp_secure_key failed: %s\n",