Add a few more safety catches to the mkrelease.sh script.
[jelmer/samba4-debian.git] / source / auth / auth.h
index 0c8f71d8596f7734d416bf640437975745f76ed1..ff7132c3ffc3cb6e1d2ec3a701f75224177fcfa1 100644 (file)
@@ -1,11 +1,12 @@
 /* 
    Unix SMB/CIFS implementation.
    Standardised Authentication types
-   Copyright (C) Andrew Bartlett 2001
+   Copyright (C) Andrew Bartlett   2001
+   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 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/>.
 */
 
 #ifndef _SAMBA_AUTH_H
 #define _SAMBA_AUTH_H
 
+extern const char *user_attrs[];
+
+union netr_Validation;
+struct netr_SamBaseInfo;
+struct netr_SamInfo3;
+struct loadparm_context;
+
 /* modules can use the following to determine if the interface has changed
  * please increment the version number after each interface change
  * with a comment and maybe update struct auth_critical_sizes.
 /* version 1 - version from samba 3.0 - metze */
 /* version 2 - initial samba4 version - metze */
 /* version 3 - subsequent samba4 version - abartlet */
-#define AUTH_INTERFACE_VERSION 3
-
-/* AUTH_STR - string */
-typedef struct auth_str
-{
-       int len;
-       char *str;
-} AUTH_STR;
+/* version 4 - subsequent samba4 version - metze */
+/* version 0 - till samba4 is stable - metze */
+#define AUTH_INTERFACE_VERSION 0
+
+#define USER_INFO_CASE_INSENSITIVE_USERNAME 0x01 /* username may be in any case */
+#define USER_INFO_CASE_INSENSITIVE_PASSWORD 0x02 /* password may be in any case */
+#define USER_INFO_DONT_CHECK_UNIX_ACCOUNT   0x04 /* dont check unix account status */
+#define USER_INFO_INTERACTIVE_LOGON         0x08 /* dont check unix account status */
+
+enum auth_password_state {
+       AUTH_PASSWORD_RESPONSE,
+       AUTH_PASSWORD_HASH,
+       AUTH_PASSWORD_PLAIN
+};
 
 struct auth_usersupplied_info
 {
-       
-       DATA_BLOB lm_resp;
-       DATA_BLOB nt_resp;
-       DATA_BLOB lm_interactive_password;
-       DATA_BLOB nt_interactive_password;
-       DATA_BLOB plaintext_password;
-       
-       BOOL encrypted;
-       
-       AUTH_STR           client_domain;          /* domain name string */
-       AUTH_STR           domain;               /* domain name after mapping */
-       AUTH_STR           internal_username;    /* username after mapping */
-       AUTH_STR           smb_name;        /* username before mapping */
-       AUTH_STR           wksta_name;           /* workstation name (netbios calling name) unicode string */
-       
+       const char *workstation_name;
+       struct socket_address *remote_host;
+
+       uint32_t logon_parameters;
+
+       bool mapped_state;
+       /* the values the client gives us */
+       struct {
+               const char *account_name;
+               const char *domain_name;
+       } client, mapped;
+
+       enum auth_password_state password_state;
+
+       union {
+               struct {
+                       DATA_BLOB lanman;
+                       DATA_BLOB nt;
+               } response;
+               struct {
+                       struct samr_Password *lanman;
+                       struct samr_Password *nt;
+               } hash;
+               
+               char *plaintext;
+       } password;
+       uint32_t flags;
 };
 
 struct auth_serversupplied_info 
 {
-       TALLOC_CTX *mem_ctx;
-
-       BOOL guest;
-       
-       struct dom_sid *user_sid;
+       struct dom_sid *account_sid;
        struct dom_sid *primary_group_sid;
 
        size_t n_domain_groups;
        struct dom_sid **domain_groups;
-       
+
        DATA_BLOB user_session_key;
        DATA_BLOB lm_session_key;
 
        const char *account_name;
-       const char *domain;
+       const char *domain_name;
 
        const char *full_name;
        const char *logon_script;
        const char *profile_path;
        const char *home_directory;
        const char *home_drive;
+       const char *logon_server;
        
        NTTIME last_logon;
        NTTIME last_logoff;
@@ -86,94 +108,69 @@ struct auth_serversupplied_info
        NTTIME last_password_change;
        NTTIME allow_password_change;
        NTTIME force_password_change;
-       
-       uint16 logon_count;
-       uint16 bad_password_count;
-       
-       uint32 acct_flags;
-};
 
-struct auth_session_info 
-{
-       TALLOC_CTX *mem_ctx;
+       uint16_t logon_count;
+       uint16_t bad_password_count;
 
-       int refcount;
-       /* NT group information taken from the info3 structure */
-       
-       NT_USER_TOKEN *nt_user_token;
+       uint32_t acct_flags;
 
-       struct auth_serversupplied_info *server_info;
+       bool authenticated;
+};
 
-       DATA_BLOB session_key;
+struct auth_method_context;
+struct auth_check_password_request;
 
-       /* needed to key the schannel credentials */
-       const char *workstation;
-};
+struct auth_operations {
+       const char *name;
 
-struct auth_context {
-       DATA_BLOB challenge; 
+       /* If you are using this interface, then you are probably
+        * getting something wrong.  This interface is only for
+        * security=server, and makes a number of compromises to allow
+        * that.  It is not compatible with being a PDC.  */
 
-       /* Who set this up in the first place? */ 
-       const char *challenge_set_by; 
+       NTSTATUS (*get_challenge)(struct auth_method_context *ctx, TALLOC_CTX *mem_ctx, DATA_BLOB *challenge);
 
-       BOOL challenge_may_be_modified;
+       /* Given the user supplied info, check if this backend want to handle the password checking */
 
-       struct auth_methods *challenge_set_method; 
+       NTSTATUS (*want_check)(struct auth_method_context *ctx, TALLOC_CTX *mem_ctx,
+                              const struct auth_usersupplied_info *user_info);
 
-       /* methods, in the order they should be called */
-       struct auth_methods *auth_method_list;  
-
-       TALLOC_CTX *mem_ctx;
-       const uint8_t *(*get_ntlm_challenge)(struct auth_context *auth_context);
-       NTSTATUS (*check_ntlm_password)(struct auth_context *auth_context,
-                                       const struct auth_usersupplied_info *user_info, 
-                                       struct auth_serversupplied_info **server_info);
-       NTSTATUS (*nt_status_squash)(NTSTATUS nt_status);
+       /* Given the user supplied info, check a password */
+
+       NTSTATUS (*check_password)(struct auth_method_context *ctx, TALLOC_CTX *mem_ctx,
+                                  const struct auth_usersupplied_info *user_info,
+                                  struct auth_serversupplied_info **server_info);
 };
 
-struct auth_methods
-{
-       struct auth_methods *prev, *next;
-       const char *name; /* What name got this module */
-
-       NTSTATUS (*auth)(const struct auth_context *auth_context,
-                        void *my_private_data, 
-                        TALLOC_CTX *mem_ctx,
-                        const struct auth_usersupplied_info *user_info, 
-                        struct auth_serversupplied_info **server_info);
-
-       DATA_BLOB (*get_chal)(const struct auth_context *auth_context,
-                             void **my_private_data, 
-                             TALLOC_CTX *mem_ctx);
-       
-       /* Used to keep tabs on things like the cli for SMB server authentication */
+struct auth_method_context {
+       struct auth_method_context *prev, *next;
+       struct auth_context *auth_ctx;
+       const struct auth_operations *ops;
+       int depth;
        void *private_data;
-       
-       /* Function to clean up the above arbitary structure */
-       void (*free_private_data)(void **private_data);
-
-       /* Function to send a keepalive message on the above structure */
-       void (*send_keepalive)(void **private_data);
-
 };
 
-typedef NTSTATUS (*auth_init_function)(struct auth_context *, const char *, struct auth_methods **);
+struct auth_context {
+       struct {
+               /* Who set this up in the first place? */ 
+               const char *set_by;
 
-struct auth_init_function_entry {
-       const char *name;
-       /* Function to create a member of the authmethods list */
+               bool may_be_modified;
 
-       auth_init_function init;
+               DATA_BLOB data; 
+       } challenge;
 
-       struct auth_init_function_entry *prev, *next;
-};
+       /* methods, in the order they should be called */
+       struct auth_method_context *methods;
 
-struct auth_operations {
-       /* the name of the backend */
-       const char *name;
+       /* the event context to use for calls that can block */
+       struct event_context *event_ctx;
+
+       /* the messaging context which can be used by backends */
+       struct messaging_context *msg_ctx;
 
-       /* Function to create a member of the authmethods list */
-       NTSTATUS (*init)(struct auth_context *, const char *, struct auth_methods **);
+       /* loadparm context */
+       struct loadparm_context *lp_ctx;
 };
 
 /* this structure is used by backends to determine the size of some critical types */
@@ -184,7 +181,15 @@ struct auth_critical_sizes {
        int sizeof_auth_context;
        int sizeof_auth_usersupplied_info;
        int sizeof_auth_serversupplied_info;
-       int sizeof_auth_str;
 };
 
+ NTSTATUS encrypt_user_info(TALLOC_CTX *mem_ctx, struct auth_context *auth_context, 
+                          enum auth_password_state to_state,
+                          const struct auth_usersupplied_info *user_info_in,
+                          const struct auth_usersupplied_info **user_info_encrypted);
+
+#include "auth/session.h"
+#include "auth/system_session_proto.h"
+#include "auth/auth_proto.h"
+
 #endif /* _SMBAUTH_H_ */