#ifndef _SMBAUTH_H_
#define _SMBAUTH_H_
typedef struct normal_string
{
int len;
char *str;
} AUTH_STR;
typedef struct unicode_string
{
int len;
uchar *unistr;
} AUTH_UNISTR;
typedef struct interactive_password
{
OWF_INFO lm_owf;
OWF_INFO nt_owf;
} auth_interactive_password;
#define AUTH_FLAG_NONE 0x000000
#define AUTH_FLAG_PLAINTEXT 0x000001
#define AUTH_FLAG_LM_RESP 0x000002
#define AUTH_FLAG_NTLM_RESP 0x000004
#define AUTH_FLAG_NTLMv2_RESP 0x000008
typedef struct auth_usersupplied_info
{
DATA_BLOB lm_resp;
DATA_BLOB nt_resp;
auth_interactive_password * interactive_password;
DATA_BLOB plaintext_password;
BOOL encrypted;
uint32 auth_flags;
AUTH_STR client_domain;
AUTH_STR domain;
AUTH_STR internal_username;
AUTH_STR smb_name;
AUTH_STR wksta_name;
} auth_usersupplied_info;
#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)
typedef struct auth_serversupplied_info
{
BOOL guest;
uid_t uid;
gid_t gid;
int n_groups;
gid_t *groups;
NT_USER_TOKEN *ptok;
DATA_BLOB nt_session_key;
DATA_BLOB lm_session_key;
uint32 sam_fill_level;
SAM_ACCOUNT *sam_account;
void *pam_handle;
char *unix_name;
} auth_serversupplied_info;
struct auth_context {
DATA_BLOB challenge;
const char *challenge_set_by;
BOOL challenge_may_be_modified;
struct auth_methods *challenge_set_method;
struct auth_methods *auth_method_list;
TALLOC_CTX *mem_ctx;
const uint8 *(*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);
};
typedef struct auth_methods
{
struct auth_methods *prev, *next;
const char *name;
NTSTATUS (*auth)(const struct auth_context *auth_context,
void *my_private_data,
TALLOC_CTX *mem_ctx,
const struct auth_usersupplied_info *user_info,
auth_serversupplied_info **server_info);
DATA_BLOB (*get_chal)(const struct auth_context *auth_context,
void **my_private_data,
TALLOC_CTX *mem_ctx);
void *private_data;
void (*free_private_data)(void **private_data);
void (*send_keepalive)(void **private_data);
} auth_methods;
typedef NTSTATUS (*auth_init_function)(struct auth_context *, const char *, struct auth_methods **);
struct auth_init_function_entry {
const char *name;
auth_init_function init;
struct auth_init_function_entry *prev, *next;
};
typedef struct auth_ntlmssp_state
{
TALLOC_CTX *mem_ctx;
struct auth_context *auth_context;
struct auth_serversupplied_info *server_info;
struct ntlmssp_state *ntlmssp_state;
} AUTH_NTLMSSP_STATE;
#define AUTH_INTERFACE_VERSION 1
#endif