The branch, v4-0-test has been updated
       via  efa399037511ced8978f2e7661a71aac7a384883 (commit)
      from  a1e60ebc6d1e794011df5f69f691f4ec8622e991 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v4-0-test


- Log -----------------------------------------------------------------
commit efa399037511ced8978f2e7661a71aac7a384883
Author: Andrew Bartlett <[EMAIL PROTECTED]>
Date:   Mon May 5 15:23:57 2008 +1000

    Move NTLM authentication details into auth/ntlm
    
    This should help clarify the role of the various files around here
    (done on Jelmer's request).
    
    Andrew Bartlett

-----------------------------------------------------------------------

Summary of changes:
 source/auth/auth.c                |  539 -----------------------
 source/auth/auth_anonymous.c      |   78 ----
 source/auth/auth_developer.c      |  207 ---------
 source/auth/auth_sam.c            |  448 --------------------
 source/auth/auth_server.c         |  225 ----------
 source/auth/auth_simple.c         |  103 -----
 source/auth/auth_unix.c           |  844 -------------------------------------
 source/auth/auth_util.c           |  260 ------------
 source/auth/auth_winbind.c        |  282 -------------
 source/auth/config.mk             |   83 +----
 source/auth/ntlm/auth.c           |  539 +++++++++++++++++++++++
 source/auth/ntlm/auth_anonymous.c |   78 ++++
 source/auth/ntlm/auth_developer.c |  207 +++++++++
 source/auth/ntlm/auth_proto.h     |   50 +++
 source/auth/ntlm/auth_sam.c       |  449 ++++++++++++++++++++
 source/auth/ntlm/auth_server.c    |  225 ++++++++++
 source/auth/ntlm/auth_simple.c    |  103 +++++
 source/auth/ntlm/auth_unix.c      |  844 +++++++++++++++++++++++++++++++++++++
 source/auth/ntlm/auth_util.c      |  260 ++++++++++++
 source/auth/ntlm/auth_winbind.c   |  282 +++++++++++++
 source/auth/ntlm/config.mk        |   87 ++++
 source/auth/ntlm/ntlm_check.c     |  603 ++++++++++++++++++++++++++
 source/auth/ntlm/ntlm_check.h     |   75 ++++
 source/auth/ntlm/pam_errors.c     |  125 ++++++
 source/auth/ntlm/pam_errors.h     |   39 ++
 source/auth/ntlm_check.c          |  602 --------------------------
 source/auth/pam_errors.c          |  125 ------
 source/utils/config.mk            |    1 +
 source/utils/ntlm_auth.c          |    1 +
 29 files changed, 3970 insertions(+), 3794 deletions(-)
 delete mode 100644 source/auth/auth.c
 delete mode 100644 source/auth/auth_anonymous.c
 delete mode 100644 source/auth/auth_developer.c
 delete mode 100644 source/auth/auth_sam.c
 delete mode 100644 source/auth/auth_server.c
 delete mode 100644 source/auth/auth_simple.c
 delete mode 100644 source/auth/auth_unix.c
 delete mode 100644 source/auth/auth_util.c
 delete mode 100644 source/auth/auth_winbind.c
 create mode 100644 source/auth/ntlm/auth.c
 create mode 100644 source/auth/ntlm/auth_anonymous.c
 create mode 100644 source/auth/ntlm/auth_developer.c
 create mode 100644 source/auth/ntlm/auth_proto.h
 create mode 100644 source/auth/ntlm/auth_sam.c
 create mode 100644 source/auth/ntlm/auth_server.c
 create mode 100644 source/auth/ntlm/auth_simple.c
 create mode 100644 source/auth/ntlm/auth_unix.c
 create mode 100644 source/auth/ntlm/auth_util.c
 create mode 100644 source/auth/ntlm/auth_winbind.c
 create mode 100644 source/auth/ntlm/config.mk
 create mode 100644 source/auth/ntlm/ntlm_check.c
 create mode 100644 source/auth/ntlm/ntlm_check.h
 create mode 100644 source/auth/ntlm/pam_errors.c
 create mode 100644 source/auth/ntlm/pam_errors.h
 delete mode 100644 source/auth/ntlm_check.c
 delete mode 100644 source/auth/pam_errors.c


Changeset truncated at 500 lines:

diff --git a/source/auth/auth.c b/source/auth/auth.c
deleted file mode 100644
index b74a438..0000000
--- a/source/auth/auth.c
+++ /dev/null
@@ -1,539 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   Password and authentication handling
-   Copyright (C) Andrew Bartlett         2001-2002
-   Copyright (C) Stefan Metzmacher       2005
-   
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-   
-   This program 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.  See the
-   GNU General Public License for more details.
-   
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "lib/util/dlinklist.h"
-#include "auth/auth.h"
-#include "auth/auth_proto.h"
-#include "lib/events/events.h"
-#include "build.h"
-#include "param/param.h"
-
-/***************************************************************************
- Set a fixed challenge
-***************************************************************************/
-_PUBLIC_ NTSTATUS auth_context_set_challenge(struct auth_context *auth_ctx, 
const uint8_t chal[8], const char *set_by) 
-{
-       auth_ctx->challenge.set_by = talloc_strdup(auth_ctx, set_by);
-       NT_STATUS_HAVE_NO_MEMORY(auth_ctx->challenge.set_by);
-
-       auth_ctx->challenge.data = data_blob_talloc(auth_ctx, chal, 8);
-       NT_STATUS_HAVE_NO_MEMORY(auth_ctx->challenge.data.data);
-
-       return NT_STATUS_OK;
-}
-
-/***************************************************************************
- Set a fixed challenge
-***************************************************************************/
-bool auth_challenge_may_be_modified(struct auth_context *auth_ctx) 
-{
-       return auth_ctx->challenge.may_be_modified;
-}
-
-/****************************************************************************
- Try to get a challenge out of the various authentication modules.
- Returns a const char of length 8 bytes.
-****************************************************************************/
-_PUBLIC_ NTSTATUS auth_get_challenge(struct auth_context *auth_ctx, const 
uint8_t **_chal)
-{
-       NTSTATUS nt_status;
-       struct auth_method_context *method;
-
-       if (auth_ctx->challenge.data.length) {
-               DEBUG(5, ("auth_get_challenge: returning previous challenge by 
module %s (normal)\n", 
-                         auth_ctx->challenge.set_by));
-               *_chal = auth_ctx->challenge.data.data;
-               return NT_STATUS_OK;
-       }
-
-       for (method = auth_ctx->methods; method; method = method->next) {
-               DATA_BLOB challenge = data_blob(NULL,0);
-
-               nt_status = method->ops->get_challenge(method, auth_ctx, 
&challenge);
-               if (NT_STATUS_EQUAL(nt_status, NT_STATUS_NOT_IMPLEMENTED)) {
-                       continue;
-               }
-
-               NT_STATUS_NOT_OK_RETURN(nt_status);
-
-               if (challenge.length != 8) {
-                       DEBUG(0, ("auth_get_challenge: invalid challenge 
(length %u) by mothod [%s]\n",
-                               (unsigned)challenge.length, method->ops->name));
-                       return NT_STATUS_INTERNAL_ERROR;
-               }
-
-               auth_ctx->challenge.data        = challenge;
-               auth_ctx->challenge.set_by      = method->ops->name;
-
-               break;
-       }
-
-       if (!auth_ctx->challenge.set_by) {
-               uint8_t chal[8];
-               generate_random_buffer(chal, 8);
-
-               auth_ctx->challenge.data                = 
data_blob_talloc(auth_ctx, chal, 8);
-               NT_STATUS_HAVE_NO_MEMORY(auth_ctx->challenge.data.data);
-               auth_ctx->challenge.set_by              = "random";
-
-               auth_ctx->challenge.may_be_modified     = true;
-       }
-
-       DEBUG(10,("auth_get_challenge: challenge set by %s\n",
-                auth_ctx->challenge.set_by));
-
-       *_chal = auth_ctx->challenge.data.data;
-       return NT_STATUS_OK;
-}
-
-struct auth_check_password_sync_state {
-       bool finished;
-       NTSTATUS status;
-       struct auth_serversupplied_info *server_info;
-};
-
-static void auth_check_password_sync_callback(struct 
auth_check_password_request *req,
-                                             void *private_data)
-{
-       struct auth_check_password_sync_state *s = talloc_get_type(private_data,
-                                                  struct 
auth_check_password_sync_state);
-
-       s->finished = true;
-       s->status = auth_check_password_recv(req, s, &s->server_info);
-}
-
-/**
- * Check a user's Plaintext, LM or NTLM password.
- * (sync version)
- *
- * Check a user's password, as given in the user_info struct and return various
- * interesting details in the server_info struct.
- *
- * The return value takes precedence over the contents of the server_info 
- * struct.  When the return is other than NT_STATUS_OK the contents 
- * of that structure is undefined.
- *
- * @param auth_ctx Supplies the challenges and some other data. 
- *                  Must be created with auth_context_create(), and the 
challenges should be 
- *                  filled in, either at creation or by calling the challenge 
geneation 
- *                  function auth_get_challenge().  
- *
- * @param user_info Contains the user supplied components, including the 
passwords.
- *
- * @param mem_ctx The parent memory context for the server_info structure
- *
- * @param server_info If successful, contains information about the 
authentication, 
- *                    including a SAM_ACCOUNT struct describing the user.
- *
- * @return An NTSTATUS with NT_STATUS_OK or an appropriate error.
- *
- **/
-
-_PUBLIC_ NTSTATUS auth_check_password(struct auth_context *auth_ctx,
-                            TALLOC_CTX *mem_ctx,
-                            const struct auth_usersupplied_info *user_info, 
-                            struct auth_serversupplied_info **server_info)
-{
-       struct auth_check_password_sync_state *sync_state;
-       NTSTATUS status;
-
-       sync_state = talloc_zero(auth_ctx, struct 
auth_check_password_sync_state);
-       NT_STATUS_HAVE_NO_MEMORY(sync_state);
-
-       auth_check_password_send(auth_ctx, user_info, 
auth_check_password_sync_callback, sync_state);
-
-       while (!sync_state->finished) {
-               event_loop_once(auth_ctx->event_ctx);
-       }
-
-       status = sync_state->status;
-
-       if (NT_STATUS_IS_OK(status)) {
-               *server_info = talloc_steal(mem_ctx, sync_state->server_info);
-       }
-
-       talloc_free(sync_state);
-       return status;
-}
-
-struct auth_check_password_request {
-       struct auth_context *auth_ctx;
-       const struct auth_usersupplied_info *user_info;
-       struct auth_serversupplied_info *server_info;
-       struct auth_method_context *method;
-       NTSTATUS status;
-       struct {
-               void (*fn)(struct auth_check_password_request *req, void 
*private_data);
-               void *private_data;
-       } callback;
-};
-
-static void auth_check_password_async_timed_handler(struct event_context *ev, 
struct timed_event *te,
-                                                   struct timeval t, void *ptr)
-{
-       struct auth_check_password_request *req = talloc_get_type(ptr, struct 
auth_check_password_request);
-       req->status = req->method->ops->check_password(req->method, req, 
req->user_info, &req->server_info);
-       req->callback.fn(req, req->callback.private_data);
-}
-
-/**
- * Check a user's Plaintext, LM or NTLM password.
- * async send hook
- *
- * Check a user's password, as given in the user_info struct and return various
- * interesting details in the server_info struct.
- *
- * The return value takes precedence over the contents of the server_info 
- * struct.  When the return is other than NT_STATUS_OK the contents 
- * of that structure is undefined.
- *
- * @param auth_ctx Supplies the challenges and some other data. 
- *                  Must be created with make_auth_context(), and the 
challenges should be 
- *                  filled in, either at creation or by calling the challenge 
geneation 
- *                  function auth_get_challenge().  
- *
- * @param user_info Contains the user supplied components, including the 
passwords.
- *
- * @param callback A callback function which will be called when the operation 
is finished.
- *                 The callback function needs to call 
auth_check_password_recv() to get the return values
- *
- * @param private_data A private pointer which will ba passed to the callback 
function
- *
- **/
-
-_PUBLIC_ void auth_check_password_send(struct auth_context *auth_ctx,
-                             const struct auth_usersupplied_info *user_info,
-                             void (*callback)(struct 
auth_check_password_request *req, void *private_data),
-                             void *private_data)
-{
-       /* if all the modules say 'not for me' this is reasonable */
-       NTSTATUS nt_status;
-       struct auth_method_context *method;
-       const uint8_t *challenge;
-       struct auth_usersupplied_info *user_info_tmp;
-       struct auth_check_password_request *req = NULL;
-
-       DEBUG(3,   ("auth_check_password_send:  Checking password for unmapped 
user [EMAIL PROTECTED]", 
-                   user_info->client.domain_name, 
user_info->client.account_name, user_info->workstation_name));
-
-       req = talloc_zero(auth_ctx, struct auth_check_password_request);
-       if (!req) {
-               callback(NULL, private_data);
-               return;
-       }
-       req->auth_ctx                   = auth_ctx;
-       req->user_info                  = user_info;
-       req->callback.fn                = callback;
-       req->callback.private_data      = private_data;
-
-       if (!user_info->mapped_state) {
-               nt_status = map_user_info(req, lp_workgroup(auth_ctx->lp_ctx), 
user_info, &user_info_tmp);
-               if (!NT_STATUS_IS_OK(nt_status)) goto failed;
-               user_info = user_info_tmp;
-               req->user_info  = user_info_tmp;
-       }
-
-       DEBUGADD(3,("auth_check_password_send:  mapped user is: [EMAIL 
PROTECTED]", 
-                   user_info->mapped.domain_name, 
user_info->mapped.account_name, user_info->workstation_name));
-
-       nt_status = auth_get_challenge(auth_ctx, &challenge);
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               DEBUG(0, ("auth_check_password_send:  Invalid challenge (length 
%u) stored for this auth context set_by %s - cannot continue: %s\n",
-                       (unsigned)auth_ctx->challenge.data.length, 
auth_ctx->challenge.set_by, nt_errstr(nt_status)));
-               goto failed;
-       }
-
-       if (auth_ctx->challenge.set_by) {
-               DEBUG(10, ("auth_check_password_send: auth_context challenge 
created by %s\n",
-                                       auth_ctx->challenge.set_by));
-       }
-
-       DEBUG(10, ("auth_check_password_send: challenge is: \n"));
-       dump_data(5, auth_ctx->challenge.data.data, 
auth_ctx->challenge.data.length);
-
-       nt_status = NT_STATUS_NO_SUCH_USER; /* If all the modules say 'not for 
me', then this is reasonable */
-       for (method = auth_ctx->methods; method; method = method->next) {
-               NTSTATUS result;
-               struct timed_event *te = NULL;
-
-               /* check if the module wants to chek the password */
-               result = method->ops->want_check(method, req, user_info);
-               if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_IMPLEMENTED)) {
-                       DEBUG(11,("auth_check_password_send: %s had nothing to 
say\n", method->ops->name));
-                       continue;
-               }
-
-               nt_status = result;
-               req->method     = method;
-
-               if (!NT_STATUS_IS_OK(nt_status)) break;
-
-               te = event_add_timed(auth_ctx->event_ctx, req,
-                                    timeval_zero(),
-                                    auth_check_password_async_timed_handler, 
req);
-               if (!te) {
-                       nt_status = NT_STATUS_NO_MEMORY;
-                       goto failed;
-               }
-               return;
-       }
-
-failed:
-       req->status = nt_status;
-       req->callback.fn(req, req->callback.private_data);
-}
-
-/**
- * Check a user's Plaintext, LM or NTLM password.
- * async receive function
- *
- * The return value takes precedence over the contents of the server_info 
- * struct.  When the return is other than NT_STATUS_OK the contents 
- * of that structure is undefined.
- *
- *
- * @param req The async auth_check_password state, passes to the callers 
callback function
- *
- * @param mem_ctx The parent memory context for the server_info structure
- *
- * @param server_info If successful, contains information about the 
authentication, 
- *                    including a SAM_ACCOUNT struct describing the user.
- *
- * @return An NTSTATUS with NT_STATUS_OK or an appropriate error.
- *
- **/
-
-_PUBLIC_ NTSTATUS auth_check_password_recv(struct auth_check_password_request 
*req,
-                                 TALLOC_CTX *mem_ctx,
-                                 struct auth_serversupplied_info **server_info)
-{
-       NTSTATUS status;
-
-       NT_STATUS_HAVE_NO_MEMORY(req);
-
-       if (NT_STATUS_IS_OK(req->status)) {
-               DEBUG(5,("auth_check_password_recv: %s authentication for user 
[%s\\%s] succeeded\n",
-                        req->method->ops->name, req->server_info->domain_name, 
req->server_info->account_name));
-
-               *server_info = talloc_steal(mem_ctx, req->server_info);
-       } else {
-               DEBUG(2,("auth_check_password_recv: %s authentication for user 
[%s\\%s] FAILED with error %s\n", 
-                        (req->method ? req->method->ops->name : "NO_METHOD"),
-                        req->user_info->mapped.domain_name,
-                        req->user_info->mapped.account_name, 
-                        nt_errstr(req->status)));
-       }
-
-       status = req->status;
-       talloc_free(req);
-       return status;
-}
-
-/***************************************************************************
- Make a auth_info struct for the auth subsystem
- - Allow the caller to specify the methods to use
-***************************************************************************/
-_PUBLIC_ NTSTATUS auth_context_create_methods(TALLOC_CTX *mem_ctx, const char 
**methods, 
-                                    struct event_context *ev,
-                                    struct messaging_context *msg,
-                                    struct loadparm_context *lp_ctx,
-                                    struct auth_context **auth_ctx)
-{
-       int i;
-       struct auth_context *ctx;
-
-       if (!methods) {
-               DEBUG(0,("auth_context_create: No auth method list!?\n"));
-               return NT_STATUS_INTERNAL_ERROR;
-       }
-
-       if (!ev) {
-               DEBUG(0,("auth_context_create: called with out event 
context\n"));
-               return NT_STATUS_INTERNAL_ERROR;
-       }
-
-       if (!msg) {
-               DEBUG(0,("auth_context_create: called with out messaging 
context\n"));
-               return NT_STATUS_INTERNAL_ERROR;
-       }
-
-       ctx = talloc(mem_ctx, struct auth_context);
-       NT_STATUS_HAVE_NO_MEMORY(ctx);
-       ctx->challenge.set_by           = NULL;
-       ctx->challenge.may_be_modified  = false;
-       ctx->challenge.data             = data_blob(NULL, 0);
-       ctx->methods                    = NULL;
-       ctx->event_ctx                  = ev;
-       ctx->msg_ctx                    = msg;
-       ctx->lp_ctx                     = lp_ctx;
-
-       for (i=0; methods[i] ; i++) {
-               struct auth_method_context *method;
-
-               method = talloc(ctx, struct auth_method_context);
-               NT_STATUS_HAVE_NO_MEMORY(method);
-
-               method->ops = auth_backend_byname(methods[i]);
-               if (!method->ops) {
-                       DEBUG(1,("auth_context_create: failed to find 
method=%s\n",
-                               methods[i]));
-                       return NT_STATUS_INTERNAL_ERROR;
-               }
-               method->auth_ctx        = ctx;
-               method->depth           = i;
-               DLIST_ADD_END(ctx->methods, method, struct auth_method_context 
*);
-       }
-
-       if (!ctx->methods) {
-               return NT_STATUS_INTERNAL_ERROR;
-       }
-
-       *auth_ctx = ctx;
-
-       return NT_STATUS_OK;
-}
-/***************************************************************************
- Make a auth_info struct for the auth subsystem
- - Uses default auth_methods, depending on server role and smb.conf settings
-***************************************************************************/
-_PUBLIC_ NTSTATUS auth_context_create(TALLOC_CTX *mem_ctx, 
-                            struct event_context *ev,
-                            struct messaging_context *msg,
-                            struct loadparm_context *lp_ctx,
-                            struct auth_context **auth_ctx)
-{
-       const char **auth_methods = NULL;
-       switch (lp_server_role(lp_ctx)) {
-       case ROLE_STANDALONE:
-               auth_methods = lp_parm_string_list(mem_ctx, lp_ctx, NULL, "auth 
methods", "standalone", NULL);
-               break;
-       case ROLE_DOMAIN_MEMBER:
-               auth_methods = lp_parm_string_list(mem_ctx, lp_ctx, NULL, "auth 
methods", "member server", NULL);
-               break;
-       case ROLE_DOMAIN_CONTROLLER:
-               auth_methods = lp_parm_string_list(mem_ctx, lp_ctx, NULL, "auth 
methods", "domain controller", NULL);
-               break;
-       }
-       return auth_context_create_methods(mem_ctx, auth_methods, ev, msg, 
lp_ctx, auth_ctx);
-}
-
-
-/* the list of currently registered AUTH backends */
-static struct auth_backend {
-       const struct auth_operations *ops;
-} *backends = NULL;
-static int num_backends;
-
-/*
-  register a AUTH backend. 
-
-  The 'name' can be later used by other backends to find the operations
-  structure for this backend.
-*/
-_PUBLIC_ NTSTATUS auth_register(const struct auth_operations *ops)
-{
-       struct auth_operations *new_ops;
-       
-       if (auth_backend_byname(ops->name) != NULL) {
-               /* its already registered! */
-               DEBUG(0,("AUTH backend '%s' already registered\n", 
-                        ops->name));
-               return NT_STATUS_OBJECT_NAME_COLLISION;
-       }
-
-       backends = talloc_realloc(talloc_autofree_context(), backends, 
-                                 struct auth_backend, num_backends+1);
-       NT_STATUS_HAVE_NO_MEMORY(backends);
-
-       new_ops = talloc_memdup(backends, ops, sizeof(*ops));
-       NT_STATUS_HAVE_NO_MEMORY(new_ops);
-       new_ops->name = talloc_strdup(new_ops, ops->name);
-       NT_STATUS_HAVE_NO_MEMORY(new_ops->name);
-
-       backends[num_backends].ops = new_ops;
-
-       num_backends++;
-
-       DEBUG(3,("AUTH backend '%s' registered\n", 
-                ops->name));
-
-       return NT_STATUS_OK;
-}
-
-/*
-  return the operations structure for a named backend of the specified type
-*/
-const struct auth_operations *auth_backend_byname(const char *name)
-{
-       int i;
-
-       for (i=0;i<num_backends;i++) {
-               if (strcmp(backends[i].ops->name, name) == 0) {
-                       return backends[i].ops;
-               }
-       }
-
-       return NULL;


-- 
Samba Shared Repository

Reply via email to