auth4: add auth_context_create_for_netlogon()
[sfrench/samba-autobuild/.git] / source4 / auth / ntlm / auth.c
index 4627c3d03ff9b93164e736ccbc559c1ef160b350..926bf48e19262b1b99b3c64db7f42318453cc382 100644 (file)
@@ -184,36 +184,40 @@ _PUBLIC_ NTSTATUS auth_check_password(struct auth4_context *auth_ctx,
        return status;
 }
 
-_PUBLIC_ NTSTATUS auth_check_password_wrapper(struct auth4_context *auth_ctx,
-                                             TALLOC_CTX *mem_ctx,
-                                             const struct auth_usersupplied_info *user_info, 
-                                             void **server_returned_info,
-                                             DATA_BLOB *user_session_key, DATA_BLOB *lm_session_key)
+static NTSTATUS auth_check_password_wrapper(struct auth4_context *auth_ctx,
+                                           TALLOC_CTX *mem_ctx,
+                                           const struct auth_usersupplied_info *user_info,
+                                           void **server_returned_info,
+                                           DATA_BLOB *user_session_key, DATA_BLOB *lm_session_key)
 {
        struct auth_user_info_dc *user_info_dc;
-       NTSTATUS status = auth_check_password(auth_ctx, mem_ctx, user_info, &user_info_dc);
+       NTSTATUS status;
 
-       if (NT_STATUS_IS_OK(status)) {
-               *server_returned_info = user_info_dc;
+       status = auth_check_password(auth_ctx, mem_ctx, user_info,
+                                    &user_info_dc);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
 
-               if (user_session_key) {
-                       DEBUG(10, ("Got NT session key of length %u\n",
-                                  (unsigned)user_info_dc->user_session_key.length));
-                       *user_session_key = user_info_dc->user_session_key;
-                       talloc_steal(mem_ctx, user_session_key->data);
-                       user_info_dc->user_session_key = data_blob_null;
-               }
+       *server_returned_info = user_info_dc;
 
-               if (lm_session_key) {
-                       DEBUG(10, ("Got LM session key of length %u\n",
-                                  (unsigned)user_info_dc->lm_session_key.length));
-                       *lm_session_key = user_info_dc->lm_session_key;
-                       talloc_steal(mem_ctx, lm_session_key->data);
-                       user_info_dc->lm_session_key = data_blob_null;
-               }
+       if (user_session_key) {
+               DEBUG(10, ("Got NT session key of length %u\n",
+                          (unsigned)user_info_dc->user_session_key.length));
+               *user_session_key = user_info_dc->user_session_key;
+               talloc_steal(mem_ctx, user_session_key->data);
+               user_info_dc->user_session_key = data_blob_null;
        }
 
-       return status;
+       if (lm_session_key) {
+               DEBUG(10, ("Got LM session key of length %u\n",
+                          (unsigned)user_info_dc->lm_session_key.length));
+               *lm_session_key = user_info_dc->lm_session_key;
+               talloc_steal(mem_ctx, lm_session_key->data);
+               user_info_dc->lm_session_key = data_blob_null;
+       }
+
+       return NT_STATUS_OK;
 }
 
 struct auth_check_password_state {
@@ -262,7 +266,6 @@ _PUBLIC_ struct tevent_req *auth_check_password_send(TALLOC_CTX *mem_ctx,
        /* if all the modules say 'not for me' this is reasonable */
        NTSTATUS nt_status;
        uint8_t chal[8];
-       struct auth_usersupplied_info *user_info_tmp;
        struct tevent_immediate *im;
 
        DEBUG(3,("auth_check_password_send: "
@@ -280,8 +283,15 @@ _PUBLIC_ struct tevent_req *auth_check_password_send(TALLOC_CTX *mem_ctx,
        state->user_info        = user_info;
 
        if (!user_info->mapped_state) {
-               nt_status = map_user_info(auth_ctx->sam_ctx, req, lpcfg_workgroup(auth_ctx->lp_ctx),
-                                         user_info, &user_info_tmp);
+               int server_role = lpcfg_server_role(auth_ctx->lp_ctx);
+               struct auth_usersupplied_info *user_info_tmp;
+
+               nt_status = map_user_info(
+                       auth_ctx->sam_ctx, req,
+                       server_role == ROLE_ACTIVE_DIRECTORY_DC,
+                       lpcfg_workgroup(auth_ctx->lp_ctx),
+                       user_info, &user_info_tmp);
+
                if (tevent_req_nterror(req, nt_status)) {
                        return tevent_req_post(req, ev);
                }
@@ -575,7 +585,7 @@ _PUBLIC_ NTSTATUS auth_context_create_methods(TALLOC_CTX *mem_ctx, const char *
                }
                method->auth_ctx        = ctx;
                method->depth           = i;
-               DLIST_ADD_END(ctx->methods, method, struct auth_method_context *);
+               DLIST_ADD_END(ctx->methods, method);
        }
 
        ctx->check_ntlm_password = auth_check_password_wrapper;
@@ -635,6 +645,15 @@ _PUBLIC_ NTSTATUS auth_context_create(TALLOC_CTX *mem_ctx,
        return status;
 }
 
+_PUBLIC_ NTSTATUS auth_context_create_for_netlogon(TALLOC_CTX *mem_ctx,
+                                                  struct tevent_context *ev,
+                                                  struct imessaging_context *msg,
+                                                  struct loadparm_context *lp_ctx,
+                                                  struct auth4_context **auth_ctx)
+{
+       return auth_context_create(mem_ctx, ev, msg, lp_ctx, auth_ctx);
+}
+
 /* the list of currently registered AUTH backends */
 static struct auth_backend {
        const struct auth_operations *ops;