s3:winbind: Remove old version of WINBINDD_PING
[ira/wip.git] / source3 / auth / auth_builtin.c
index 6ea6d0bbe0bd8b5eca7f0e9c2f4cbe35493bec9a..3741f29779b361ac9a666f4d535aa12516e537d8 100644 (file)
@@ -1,12 +1,12 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 3.0.
-   Generic authenticaion types
-   Copyright (C) Andrew Bartlett              2001
+   Unix SMB/CIFS implementation.
+   Generic authentication types
+   Copyright (C) Andrew Bartlett         2001-2002
+   Copyright (C) Jelmer Vernooij              2002
    
    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 2 of the License, or
+   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,
    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, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 
-/****************************************************************************
- Check for a guest logon (username = "") and if so create the required 
- structure.
-****************************************************************************/
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_AUTH
+
+/**
+ * Return a guest logon for guest users (username = "")
+ *
+ * Typically used as the first module in the auth chain, this allows
+ * guest logons to be dealt with in one place.  Non-guest logons 'fail'
+ * and pass onto the next module.
+ **/
 
-static NTSTATUS check_guest_security(void *my_private_data, 
-                             const auth_usersupplied_info *user_info, 
-                             const auth_authsupplied_info *auth_info,
-                             auth_serversupplied_info **server_info)
+static NTSTATUS check_guest_security(const struct auth_context *auth_context,
+                                    void *my_private_data, 
+                                    TALLOC_CTX *mem_ctx,
+                                    const auth_usersupplied_info *user_info, 
+                                    auth_serversupplied_info **server_info)
 {
-       NTSTATUS nt_status = NT_STATUS_LOGON_FAILURE;
-
-       if (!(user_info->internal_username.str 
-             && *user_info->internal_username.str)) { 
-               if (make_server_info_guest(server_info)) {
-                       nt_status = NT_STATUS_OK;
-               } else {
-                       nt_status = NT_STATUS_NO_SUCH_USER;
-               }
+       /* mark this as 'not for me' */
+       NTSTATUS nt_status = NT_STATUS_NOT_IMPLEMENTED;
+
+       if (!(user_info->internal_username 
+             && *user_info->internal_username)) {
+               nt_status = make_server_info_guest(NULL, server_info);
        }
 
        return nt_status;
 }
 
-BOOL auth_init_guest(auth_methods **auth_method) 
+/* Guest modules initialisation */
+
+static NTSTATUS auth_init_guest(struct auth_context *auth_context, const char *options, auth_methods **auth_method) 
 {
-       if (!make_auth_methods(auth_method)) {
-               return False;
-       }
+       if (!make_auth_methods(auth_context, auth_method))
+               return NT_STATUS_NO_MEMORY;
 
        (*auth_method)->auth = check_guest_security;
-       return True;
+       (*auth_method)->name = "guest";
+       return NT_STATUS_OK;
 }
 
-/****************************************************************************
- Check against either sam or unix, depending on encryption.
-****************************************************************************/
+#ifdef DEVELOPER
+/** 
+ * Return an error based on username
+ *
+ * This function allows the testing of obsure errors, as well as the generation
+ * of NT_STATUS -> DOS error mapping tables.
+ *
+ * This module is of no value to end-users.
+ *
+ * The password is ignored.
+ *
+ * @return An NTSTATUS value based on the username
+ **/
 
-static NTSTATUS check_local_security(void *my_private_data,
-                             const auth_usersupplied_info *user_info, 
-                             const auth_authsupplied_info *auth_info,
-                             auth_serversupplied_info **server_info)
+static NTSTATUS check_name_to_ntstatus_security(const struct auth_context *auth_context,
+                                               void *my_private_data, 
+                                               TALLOC_CTX *mem_ctx,
+                                               const auth_usersupplied_info *user_info, 
+                                               auth_serversupplied_info **server_info)
 {
-       NTSTATUS nt_status = NT_STATUS_LOGON_FAILURE;
-
-       if (user_info->encrypted) {
-               nt_status = check_sam_security(my_private_data, user_info, auth_info, server_info);
-       } else {
-               nt_status = check_unix_security(my_private_data, user_info, auth_info, server_info);
+       NTSTATUS nt_status;
+       fstring user;
+       long error_num;
+       fstrcpy(user, user_info->smb_name);
+       
+       if (strnequal("NT_STATUS", user, strlen("NT_STATUS"))) {
+               strupper_m(user);
+               return nt_status_string_to_code(user);
        }
+
+       strlower_m(user);
+       error_num = strtoul(user, NULL, 16);
+       
+       DEBUG(5,("check_name_to_ntstatus_security: Error for user %s was %lx\n", user, error_num));
+
+       nt_status = NT_STATUS(error_num);
        
        return nt_status;
 }
 
-BOOL auth_init_local(auth_methods **auth_method) 
+/** Module initialisation function */
+
+static NTSTATUS auth_init_name_to_ntstatus(struct auth_context *auth_context, const char *param, auth_methods **auth_method) 
 {
-       if (!make_auth_methods(auth_method)) {
-               return False;
-       }
+       if (!make_auth_methods(auth_context, auth_method))
+               return NT_STATUS_NO_MEMORY;
 
-       (*auth_method)->auth = check_local_security;
-       return True;
+       (*auth_method)->auth = check_name_to_ntstatus_security;
+       (*auth_method)->name = "name_to_ntstatus";
+       return NT_STATUS_OK;
 }
 
+/** 
+ * Return a 'fixed' challenge instead of a variable one.
+ *
+ * The idea of this function is to make packet snifs consistant
+ * with a fixed challenge, so as to aid debugging.
+ *
+ * This module is of no value to end-users.
+ *
+ * This module does not actually authenticate the user, but
+ * just pretenteds to need a specified challenge.  
+ * This module removes *all* security from the challenge-response system
+ *
+ * @return NT_STATUS_UNSUCCESSFUL
+ **/
+
+static NTSTATUS check_fixed_challenge_security(const struct auth_context *auth_context,
+                                              void *my_private_data, 
+                                              TALLOC_CTX *mem_ctx,
+                                              const auth_usersupplied_info *user_info, 
+                                              auth_serversupplied_info **server_info)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+/****************************************************************************
+ Get the challenge out of a password server.
+****************************************************************************/
+
+static DATA_BLOB auth_get_fixed_challenge(const struct auth_context *auth_context,
+                                         void **my_private_data, 
+                                         TALLOC_CTX *mem_ctx)
+{
+       const char *challenge = "I am a teapot";   
+       return data_blob(challenge, 8);
+}
+
+
+/** Module initailisation function */
+
+static NTSTATUS auth_init_fixed_challenge(struct auth_context *auth_context, const char *param, auth_methods **auth_method) 
+{
+       if (!make_auth_methods(auth_context, auth_method))
+               return NT_STATUS_NO_MEMORY;
+
+       (*auth_method)->auth = check_fixed_challenge_security;
+       (*auth_method)->get_chal = auth_get_fixed_challenge;
+       (*auth_method)->name = "fixed_challenge";
+       return NT_STATUS_OK;
+}
+#endif /* DEVELOPER */
+
+NTSTATUS auth_builtin_init(void)
+{
+       smb_register_auth(AUTH_INTERFACE_VERSION, "guest", auth_init_guest);
+#ifdef DEVELOPER
+       smb_register_auth(AUTH_INTERFACE_VERSION, "fixed_challenge", auth_init_fixed_challenge);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "name_to_ntstatus", auth_init_name_to_ntstatus);
+#endif
+       return NT_STATUS_OK;
+}