s4:security Change struct security_token->sids from struct dom_sid * to struct dom_sid
authorAndrew Bartlett <abartlet@samba.org>
Fri, 20 Aug 2010 02:15:15 +0000 (12:15 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 22 Aug 2010 22:50:55 +0000 (08:50 +1000)
This makes the structure much more like NT_USER_TOKEN in the source3/
code.  (The remaining changes are that privilages still need to be merged)

Andrew Bartlett

17 files changed:
librpc/idl/security.idl
source4/auth/system_session.c
source4/dsdb/samdb/ldb_modules/acl.c
source4/dsdb/samdb/ldb_modules/operational.c
source4/dsdb/samdb/ldb_modules/rootdse.c
source4/dsdb/samdb/samdb.c
source4/dsdb/samdb/samdb_privilege.c
source4/kdc/kpasswdd.c
source4/lib/policy/gp_ldap.c
source4/libcli/security/create_descriptor.c
source4/libcli/security/security_token.c
source4/ntvfs/unixuid/vfs_unixuid.c
source4/rpc_server/drsuapi/getncchanges.c
source4/rpc_server/drsuapi/updaterefs.c
source4/rpc_server/handles.c
source4/rpc_server/lsa/dcesrv_lsa.c
source4/utils/ntlm_auth.c

index 5594542155a6794e616e23fc937fc9963acc2526..b8b35d2c2bf53879362927f74e3bff9e7c9e07d4 100644 (file)
@@ -470,7 +470,7 @@ interface security
 
        typedef [public] struct {
                uint32 num_sids;
-               [size_is(num_sids)] dom_sid *sids[*];
+               [size_is(num_sids)] dom_sid sids[*];
                udlong privilege_mask;
        } security_token;
 
index 4712702e467f33b0c6271ecbb8f2bf83f0f6443f..bec22c16005249664372c459e8b9bf9fc3f23599 100644 (file)
@@ -48,11 +48,11 @@ static NTSTATUS create_token(TALLOC_CTX *mem_ctx,
        ptoken = security_token_initialise(mem_ctx);
        NT_STATUS_HAVE_NO_MEMORY(ptoken);
 
-       ptoken->sids = talloc_array(ptoken, struct dom_sid *, n_groupSIDs + 5);
+       ptoken->sids = talloc_array(ptoken, struct dom_sid, n_groupSIDs + 5);
        NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
-       ptoken->sids[PRIMARY_USER_SID_INDEX] = talloc_reference(ptoken, user_sid);
-       ptoken->sids[PRIMARY_GROUP_SID_INDEX] = talloc_reference(ptoken, group_sid);
+       ptoken->sids[PRIMARY_USER_SID_INDEX] = *user_sid;
+       ptoken->sids[PRIMARY_GROUP_SID_INDEX] = *group_sid;
        ptoken->privilege_mask = 0;
 
        /*
@@ -60,15 +60,19 @@ static NTSTATUS create_token(TALLOC_CTX *mem_ctx,
         * The only difference between guest and "anonymous"
         * is the addition of Authenticated_Users.
         */
-       ptoken->sids[2] = dom_sid_parse_talloc(ptoken->sids, SID_WORLD);
-       NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[2]);
-       ptoken->sids[3] = dom_sid_parse_talloc(ptoken->sids, SID_NT_NETWORK);
-       NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[3]);
+
+       if (!dom_sid_parse(SID_WORLD, &ptoken->sids[2])) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+       if (!dom_sid_parse(SID_NT_NETWORK, &ptoken->sids[3])) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
        ptoken->num_sids = 4;
 
        if (is_authenticated) {
-               ptoken->sids[4] = dom_sid_parse_talloc(ptoken->sids, SID_NT_AUTHENTICATED_USERS);
-               NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[4]);
+               if (!dom_sid_parse(SID_NT_AUTHENTICATED_USERS, &ptoken->sids[4])) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
                ptoken->num_sids++;
        }
 
@@ -77,13 +81,13 @@ static NTSTATUS create_token(TALLOC_CTX *mem_ctx,
                for (check_sid_idx = 1; 
                     check_sid_idx < ptoken->num_sids; 
                     check_sid_idx++) {
-                       if (dom_sid_equal(ptoken->sids[check_sid_idx], groupSIDs[i])) {
+                       if (dom_sid_equal(&ptoken->sids[check_sid_idx], groupSIDs[i])) {
                                break;
                        }
                }
 
                if (check_sid_idx == ptoken->num_sids) {
-                       ptoken->sids[ptoken->num_sids++] = talloc_reference(ptoken->sids, groupSIDs[i]);
+                       ptoken->sids[ptoken->num_sids++] = *groupSIDs[i];
                }
        }
 
index 55d252b1005ddbdfc506d44b49ba615f6aca61fe..826884f8118420ebd5272a3da04620114e22d917 100644 (file)
@@ -710,7 +710,7 @@ static int acl_check_self_membership(TALLOC_CTX *mem_ctx,
        }
        /* if we are adding/deleting ourselves, check for self membership */
        ret = dsdb_find_dn_by_sid(ldb, mem_ctx, 
-                                 acl_user_token(module)->sids[PRIMARY_USER_SID_INDEX], 
+                                 &acl_user_token(module)->sids[PRIMARY_USER_SID_INDEX], 
                                  &user_dn);
        if (ret != LDB_SUCCESS) {
                return ret;
index c1da400b8d0a383acbd0bf14922f492c84a40669..56fb272e2a505f97d534ff756d0c1d118012a56e 100644 (file)
@@ -181,7 +181,7 @@ static int construct_token_groups(struct ldb_module *module,
        for (i = 1; i < session_info->security_token->num_sids; i++) {
                ret = samdb_msg_add_dom_sid(ldb, msg, msg,
                                            "tokenGroups",
-                                           session_info->security_token->sids[i]);
+                                           &session_info->security_token->sids[i]);
                if (ret != LDB_SUCCESS) {
                        talloc_free(tmp_ctx);
                        return ret;
index 3e5a94673f72bda2048766847569190687fcfaae..0949b83b433110006932caebcc38d0c12f567fa7 100644 (file)
@@ -392,7 +392,7 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
                        for (i = 0; i < session_info->security_token->num_sids; i++) {
                                if (samdb_msg_add_dom_sid(ldb, msg, msg,
                                                          "tokenGroups",
-                                                         session_info->security_token->sids[i]) != 0) {
+                                                         &session_info->security_token->sids[i]) != 0) {
                                        goto failed;
                                }
                        }
index 0a2d5c3c7cb1a305362d8dda672804ca9aa44764..ddcd0d2d125e23e139041ce4a2d3b86014296ee1 100644 (file)
@@ -159,17 +159,17 @@ NTSTATUS security_token_create(TALLOC_CTX *mem_ctx,
 
        ptoken->privilege_mask = 0;
 
-       ptoken->sids = talloc_array(ptoken, struct dom_sid *, n_groupSIDs + 6 /* over-allocate */);
+       ptoken->sids = talloc_array(ptoken, struct dom_sid, n_groupSIDs + 6 /* over-allocate */);
        NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
        ptoken->num_sids = 1;
 
-       ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid *, ptoken->num_sids + 1);
+       ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid, ptoken->num_sids + 1);
        NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
-       ptoken->sids[PRIMARY_USER_SID_INDEX] = talloc_reference(ptoken, user_sid);
+       ptoken->sids[PRIMARY_USER_SID_INDEX] = *user_sid;
        if (!dom_sid_equal(user_sid, group_sid)) {
-               ptoken->sids[PRIMARY_GROUP_SID_INDEX] = talloc_reference(ptoken, group_sid);
+               ptoken->sids[PRIMARY_GROUP_SID_INDEX] = *group_sid;
                ptoken->num_sids++;
        }
 
@@ -180,38 +180,37 @@ NTSTATUS security_token_create(TALLOC_CTX *mem_ctx,
         */
 
        if (session_info_flags & AUTH_SESSION_INFO_DEFAULT_GROUPS) {
-               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid *, ptoken->num_sids + 1);
+               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid, ptoken->num_sids + 2);
                NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
-               ptoken->sids[ptoken->num_sids] = dom_sid_parse_talloc(ptoken->sids, SID_WORLD);
-               NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[ptoken->num_sids]);
+               if (!dom_sid_parse(SID_WORLD, &ptoken->sids[ptoken->num_sids])) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
                ptoken->num_sids++;
 
-               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid *, ptoken->num_sids + 1);
-               NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
-
-               ptoken->sids[ptoken->num_sids] = dom_sid_parse_talloc(ptoken->sids, SID_NT_NETWORK);
-               NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[ptoken->num_sids]);
+               if (!dom_sid_parse(SID_NT_NETWORK, &ptoken->sids[ptoken->num_sids])) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
                ptoken->num_sids++;
-
-
        }
 
        if (session_info_flags & AUTH_SESSION_INFO_AUTHENTICATED) {
-               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid *, ptoken->num_sids + 1);
+               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid, ptoken->num_sids + 1);
                NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
-               ptoken->sids[ptoken->num_sids] = dom_sid_parse_talloc(ptoken->sids, SID_NT_AUTHENTICATED_USERS);
-               NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[ptoken->num_sids]);
+               if (!dom_sid_parse(SID_NT_AUTHENTICATED_USERS, &ptoken->sids[ptoken->num_sids])) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
                ptoken->num_sids++;
        }
 
        if (session_info_flags & AUTH_SESSION_INFO_ENTERPRISE_DC) {
-               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid *, ptoken->num_sids + 1);
+               ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid, ptoken->num_sids + 1);
                NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
-               ptoken->sids[ptoken->num_sids] = dom_sid_parse_talloc(ptoken->sids, SID_NT_ENTERPRISE_DCS);
-               NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[ptoken->num_sids]);
+               if (!dom_sid_parse(SID_NT_ENTERPRISE_DCS, &ptoken->sids[ptoken->num_sids])) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
                ptoken->num_sids++;
        }
 
@@ -220,19 +219,17 @@ NTSTATUS security_token_create(TALLOC_CTX *mem_ctx,
                for (check_sid_idx = 1; 
                     check_sid_idx < ptoken->num_sids; 
                     check_sid_idx++) {
-                       if (dom_sid_equal(ptoken->sids[check_sid_idx], groupSIDs[i])) {
+                       if (dom_sid_equal(&ptoken->sids[check_sid_idx], groupSIDs[i])) {
                                break;
                        }
                }
 
                if (check_sid_idx == ptoken->num_sids) {
-                       ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid *, ptoken->num_sids + 1);
+                       ptoken->sids = talloc_realloc(ptoken, ptoken->sids, struct dom_sid, ptoken->num_sids + 1);
                        NT_STATUS_HAVE_NO_MEMORY(ptoken->sids);
 
-                       ptoken->sids[ptoken->num_sids] = talloc_reference(ptoken->sids, groupSIDs[i]);
-                       NT_STATUS_HAVE_NO_MEMORY(ptoken->sids[ptoken->num_sids]);
+                       ptoken->sids[ptoken->num_sids] = *groupSIDs[i];
                        ptoken->num_sids++;
-
                }
        }
 
index 38e5a3383127f27ee5a8f6d931c409b019e44c92..fd74133e2fd4bb37fc2145616beb301db4632de7 100644 (file)
@@ -119,7 +119,7 @@ NTSTATUS samdb_privilege_setup(struct tevent_context *ev_ctx,
        
        for (i=0;i<token->num_sids;i++) {
                status = samdb_privilege_setup_sid(pdb, mem_ctx,
-                                                  token, token->sids[i]);
+                                                  token, &token->sids[i]);
                if (!NT_STATUS_IS_OK(status)) {
                        talloc_free(mem_ctx);
                        return status;
index 36ddb65bb090c4a0c4eeeaeae4a2df4bc1b418b7..7148428e46e645af5616b01e6d19363122919db5 100644 (file)
@@ -224,11 +224,11 @@ static bool kpasswdd_change_password(struct kdc_server *kdc,
        DEBUG(3, ("Changing password of %s\\%s (%s)\n",
                  session_info->server_info->domain_name,
                  session_info->server_info->account_name,
-                 dom_sid_string(mem_ctx, session_info->security_token->sids[PRIMARY_USER_SID_INDEX])));
+                 dom_sid_string(mem_ctx, &session_info->security_token->sids[PRIMARY_USER_SID_INDEX])));
 
        /* Performs the password change */
        status = samdb_set_password_sid(samdb, mem_ctx,
-                                       session_info->security_token->sids[PRIMARY_USER_SID_INDEX],
+                                       &session_info->security_token->sids[PRIMARY_USER_SID_INDEX],
                                        password, NULL, NULL,
                                        oldLmHash, oldNtHash, /* this is a user password change */
                                        &reject_reason,
@@ -382,7 +382,7 @@ static bool kpasswd_process_request(struct kdc_server *kdc,
                DEBUG(3, ("%s\\%s (%s) is changing password of %s\n",
                          session_info->server_info->domain_name,
                          session_info->server_info->account_name,
-                         dom_sid_string(mem_ctx, session_info->security_token->sids[PRIMARY_USER_SID_INDEX]),
+                         dom_sid_string(mem_ctx, &session_info->security_token->sids[PRIMARY_USER_SID_INDEX]),
                          set_password_on_princ));
                ret = ldb_transaction_start(samdb);
                if (ret != LDB_SUCCESS) {
index e566ca4e0fd705da1bafdd59e78b700e71cb9337..87fde9dbd78f4d22c6c129f0308954d44bf5f93e 100644 (file)
@@ -443,7 +443,7 @@ NTSTATUS gp_list_gpos(struct gp_context *gp_ctx, struct security_token *token, c
        mem_ctx = talloc_new(gp_ctx);
        NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
 
-       sid = dom_sid_string(mem_ctx, token->sids[PRIMARY_USER_SID_INDEX]);
+       sid = dom_sid_string(mem_ctx, &token->sids[PRIMARY_USER_SID_INDEX]);
 
        /* Find the user DN and objectclass via the sid from the security token */
        rv = ldb_search(gp_ctx->ldb_ctx,
index cb52d6502e25ca7e2109c0b2eeb53302511a6d95..ad6a599969d25204c94e8c9a01fc6341e2a45839 100644 (file)
@@ -367,7 +367,7 @@ struct security_descriptor *create_security_descriptor(TALLOC_CTX *mem_ctx,
                if ((inherit_flags & SEC_OWNER_FROM_PARENT) && parent_sd) {
                        new_owner = parent_sd->owner_sid;
                } else if (!default_owner) {
-                       new_owner = token->sids[PRIMARY_USER_SID_INDEX];
+                       new_owner = &token->sids[PRIMARY_USER_SID_INDEX];
                } else {
                        new_owner = default_owner;
                        new_sd->type |= SEC_DESC_OWNER_DEFAULTED;
@@ -379,11 +379,11 @@ struct security_descriptor *create_security_descriptor(TALLOC_CTX *mem_ctx,
        if (!creator_sd || !creator_sd->group_sid){
                if ((inherit_flags & SEC_GROUP_FROM_PARENT) && parent_sd) {
                        new_group = parent_sd->group_sid;
-               } else if (!default_group && token->sids[PRIMARY_GROUP_SID_INDEX]) {
-                       new_group = token->sids[PRIMARY_GROUP_SID_INDEX];
+               } else if (!default_group && token->num_sids > PRIMARY_GROUP_SID_INDEX) {
+                       new_group = &token->sids[PRIMARY_GROUP_SID_INDEX];
                } else if (!default_group) {
                        /* This will happen only for anonymous, which has no other groups */
-                       new_group = token->sids[PRIMARY_USER_SID_INDEX];
+                       new_group = &token->sids[PRIMARY_USER_SID_INDEX];
                } else {
                        new_group = default_group;
                        new_sd->type |= SEC_DESC_GROUP_DEFAULTED;
index f9be977a26bb2975a93ec5453ce558c241edf6d3..e5ea598565056147fc0dc685246f5c337c6a8047 100644 (file)
@@ -65,7 +65,7 @@ void security_token_debug(int dbg_lev, const struct security_token *token)
                                       (unsigned long)token->num_sids));
        for (i = 0; i < token->num_sids; i++) {
                DEBUGADD(dbg_lev, ("  SID[%3lu]: %s\n", (unsigned long)i, 
-                          dom_sid_string(mem_ctx, token->sids[i])));
+                          dom_sid_string(mem_ctx, &token->sids[i])));
        }
 
        security_token_debug_privileges(dbg_lev, token);
@@ -77,7 +77,7 @@ void security_token_debug(int dbg_lev, const struct security_token *token)
 
 bool security_token_is_sid(const struct security_token *token, const struct dom_sid *sid)
 {
-       if (token->sids && dom_sid_equal(token->sids[PRIMARY_USER_SID_INDEX], sid)) {
+       if (token->sids && dom_sid_equal(&token->sids[PRIMARY_USER_SID_INDEX], sid)) {
                return true;
        }
        return false;
@@ -109,7 +109,7 @@ bool security_token_has_sid(const struct security_token *token, const struct dom
 {
        int i;
        for (i = 0; i < token->num_sids; i++) {
-               if (dom_sid_equal(token->sids[i], sid)) {
+               if (dom_sid_equal(&token->sids[i], sid)) {
                        return true;
                }
        }
index d36ae157453013cacf42bf22e49d2836c885c61f..c37b46e627cb51a4363e7794e8b82a444687be68 100644 (file)
@@ -190,7 +190,7 @@ static NTSTATUS nt_token_to_unix_security(struct ntvfs_module_context *ntvfs,
 
        for (i=0;i<token->num_sids;i++) {
                ZERO_STRUCT(ids[i].xid);
-               ids[i].sid = token->sids[i];
+               ids[i].sid = &token->sids[i];
                ids[i].status = ID_UNKNOWN;
        }
 
index 8648d5dafad00ea2ba9ce23929c957975c193cf7..7a1ccd90a4c38875a470a1335ea5b57e386e7d0e 100644 (file)
@@ -1019,7 +1019,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
                return werr;
        }
 
-       user_sid = dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
+       user_sid = &dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
 
 
        /* for non-administrator replications, check that they have
index 08d49baf2b87a1df743b1684668b6fd6764810ce..e911838637b216422ecef26af463618972ff4099 100644 (file)
@@ -215,11 +215,11 @@ WERROR dcesrv_drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TA
                /* check that they are using an DSA objectGUID that they own */
                ret = dsdb_validate_dsa_guid(b_state->sam_ctx,
                                             &req->dest_dsa_guid,
-                                            dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX]);
+                                            &dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX]);
                if (ret != LDB_SUCCESS) {
                        DEBUG(0,(__location__ ": Refusing DsReplicaUpdateRefs for sid %s with GUID %s\n",
                                 dom_sid_string(mem_ctx,
-                                               dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX]),
+                                               &dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX]),
                                 GUID_string(mem_ctx, &req->dest_dsa_guid)));
                        return WERR_DS_DRA_ACCESS_DENIED;
                }
index 495d42ab4a86add859d91837184e1488da721046..e70510c87597cda6545984df3cc6892abfc88d5a 100644 (file)
@@ -44,7 +44,7 @@ _PUBLIC_ struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_connection_contex
        struct dcesrv_handle *h;
        struct dom_sid *sid;
 
-       sid = context->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
+       sid = &context->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
 
        h = talloc(context->assoc_group, struct dcesrv_handle);
        if (!h) {
@@ -80,7 +80,7 @@ _PUBLIC_ struct dcesrv_handle *dcesrv_handle_fetch(
        struct dcesrv_handle *h;
        struct dom_sid *sid;
 
-       sid = context->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
+       sid = &context->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
 
        if (policy_handle_empty(p)) {
                /* TODO: we should probably return a NULL handle here */
index 371419fa700dbd4e6978f4fae0808394ebf14499..9c9ad4590bbc4b474414a21e9bb9b69d96cc1259 100644 (file)
@@ -338,7 +338,7 @@ static NTSTATUS dcesrv_lsa_QuerySecurity(struct dcesrv_call_state *dce_call, TAL
 
        DCESRV_PULL_HANDLE(h, r->in.handle, DCESRV_HANDLE_ANY);
 
-       sid = dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
+       sid = &dce_call->conn->auth_state.session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
 
        if (h->wire_handle.handle_type == LSA_HANDLE_POLICY) {
                status = dcesrv_build_lsa_sd(mem_ctx, &sd, sid, 0);
index 7d4349ff5251218c3be6413192d08ae0ae25bb97..0d3e2cfb0dc1fd2186d1e543bc1fe13cacd45343 100644 (file)
@@ -617,7 +617,7 @@ static void manage_gensec_request(enum stdio_helper_mode stdio_helper_mode,
                for (i=0; i<session_info->security_token->num_sids; i++) {
                        struct security_token *token = session_info->security_token; 
                        const char *sidstr = dom_sid_string(session_info, 
-                                                           token->sids[i]);
+                                                           &token->sids[i]);
                        grouplist = talloc_asprintf_append_buffer(grouplist, "%s,", sidstr);
                }