r23792: convert Samba4 to GPLv3
[kai/samba-autobuild/.git] / source4 / auth / auth.h
index c8347cad209b506b5cf7ebd58d38ad951c462289..8dce7bbd5b02e353db8f735a2c5ee21d0bb5659a 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
 
+union netr_Validation;
+struct netr_SamBaseInfo;
+struct netr_SamInfo3;
+
 /* 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_pwd;
-       DATA_BLOB nt_interactive_pwd;
-       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;
 };
 
-#define SAM_FILL_NAME  0x01
-#define SAM_FILL_INFO3 0x02
-#define SAM_FILL_SAM   0x04
-#define SAM_FILL_UNIX  0x08
-#define SAM_FILL_ALL (SAM_FILL_NAME | SAM_FILL_INFO3 | SAM_FILL_SAM | SAM_FILL_UNIX)
-
 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;
-       
-};
 
-struct auth_session_info 
-{
-       TALLOC_CTX *mem_ctx;
-       /* NT group information taken from the info3 structure */
+       const char *account_name;
+       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;
        
-       NT_USER_TOKEN *nt_user_token;
+       NTTIME last_logon;
+       NTTIME last_logoff;
+       NTTIME acct_expiry;
+       NTTIME last_password_change;
+       NTTIME allow_password_change;
+       NTTIME force_password_change;
 
-       struct auth_serversupplied_info *server_info;
+       uint16_t logon_count;
+       uint16_t bad_password_count;
+
+       uint32_t acct_flags;
+
+       BOOL authenticated;
+};
 
+struct auth_session_info {
+       struct security_token *security_token;
+       struct auth_serversupplied_info *server_info;
        DATA_BLOB session_key;
+       struct cli_credentials *credentials;
 };
 
-struct auth_context {
-       DATA_BLOB challenge; 
+struct auth_method_context;
+struct auth_check_password_request;
 
-       /* Who set this up in the first place? */ 
-       const char *challenge_set_by; 
+struct auth_operations {
+       const char *name;
 
-       BOOL challenge_may_be_modified;
+       /* 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.  */
 
-       struct auth_methods *challenge_set_method; 
-       /* What order are the various methods in?   Try to stop it changing under us */ 
-       struct auth_methods *auth_method_list;  
+       NTSTATUS (*get_challenge)(struct auth_method_context *ctx, TALLOC_CTX *mem_ctx, DATA_BLOB *challenge);
 
-       TALLOC_CTX *mem_ctx;
-       const uint8_t *(*get_ntlm_challenge)(struct auth_context *auth_context);
-       NTSTATUS (*check_ntlm_password)(const 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);
-       void (*free)(struct auth_context **auth_context);
-};
+       /* Given the user supplied info, check if this backend want to handle the password checking */
 
-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 */
-       void *private_data;
-       
-       /* Function to clean up the above arbitary structure */
-       void (*free_private_data)(void **private_data);
+       NTSTATUS (*want_check)(struct auth_method_context *ctx, TALLOC_CTX *mem_ctx,
+                              const struct auth_usersupplied_info *user_info);
 
-       /* Function to send a keepalive message on the above structure */
-       void (*send_keepalive)(void **private_data);
+       /* 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);
 };
 
-typedef NTSTATUS (*auth_init_function)(struct auth_context *, const char *, struct auth_methods **);
+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;
+};
 
-struct auth_init_function_entry {
-       const char *name;
-       /* Function to create a member of the authmethods list */
+struct auth_context {
+       struct {
+               /* Who set this up in the first place? */ 
+               const char *set_by;
 
-       auth_init_function init;
+               BOOL may_be_modified;
 
-       struct auth_init_function_entry *prev, *next;
-};
+               DATA_BLOB data; 
+       } challenge;
 
-struct auth_ntlmssp_state
-{
-       TALLOC_CTX *mem_ctx;
-       struct auth_context *auth_context;
-       struct auth_serversupplied_info *server_info;
-       struct ntlmssp_state *ntlmssp_state;
-};
+       /* methods, in the order they should be called */
+       struct auth_method_context *methods;
 
-#define auth_ops __XXX_ERROR_BLA
-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;
 
-       /* Function to create a member of the authmethods list */
-       NTSTATUS (*init)(struct auth_context *, const char *, struct auth_methods **);
+       /* the messaging context which can be used by backends */
+       struct messaging_context *msg_ctx;
 };
 
 /* this structure is used by backends to determine the size of some critical types */
@@ -172,11 +180,15 @@ struct auth_critical_sizes {
        int sizeof_auth_operations;
        int sizeof_auth_methods;
        int sizeof_auth_context;
-       int sizeof_auth_ntlmssp_state;
        int sizeof_auth_usersupplied_info;
        int sizeof_auth_serversupplied_info;
-       int sizeof_auth_str;
-       int sizeof_auth_unistr;
 };
 
+ 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/auth_proto.h"
+
 #endif /* _SMBAUTH_H_ */