#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "mio/mio.h"
#include "sx/sx.h"
#include "sx/ssl.h"
#include "sx/sasl.h"
#include "util/util.h"
#ifdef HAVE_SIGNAL_H
# include <signal.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
typedef struct c2s_st *c2s_t;
typedef struct sess_st *sess_t;
typedef struct authreg_st *authreg_t;
struct sess_st {
c2s_t c2s;
int fd;
char skey[10];
char *ip;
int port;
sx_t s;
rate_t rate;
int rate_log;
time_t last_activity;
char *realm;
int bound;
int active;
nad_t result;
int sasl_authd;
jid_t jid;
char c2s_id[10], sm_id[41];
char sm_request[41];
char auth_challenge[65];
};
#define AR_MECH_TRAD_PLAIN (1<<0)
#define AR_MECH_TRAD_DIGEST (1<<1)
#define AR_MECH_TRAD_ZEROK (1<<2)
#define AR_MECH_TRAD_CRAMMD5 (1<<3)
struct c2s_st {
char *id;
char *router_ip;
int router_port;
char *router_user;
char *router_pass;
char *router_pemfile;
mio_t mio;
xht sessions;
sx_env_t sx_env;
sx_plugin_t sx_ssl;
sx_plugin_t sx_sasl;
sx_t router;
int fd;
int server_fd;
#ifdef HAVE_SSL
int server_ssl_fd;
#endif
config_t config;
log_t log;
log_type_t log_type;
char *log_facility;
char *log_ident;
int retry_init;
int retry_lost;
int retry_sleep;
int retry_left;
char *local_ip;
int local_port;
char *local_pemfile;
int local_require_starttls;
char *local_cachain;
int local_ssl_port;
int io_max_fds;
int io_check_interval;
int io_check_idle;
int io_check_keepalive;
time_t next_check;
char *ar_module_name;
authreg_t ar;
int ar_register_enable;
char *ar_register_instructions;
int ar_register_password;
int ar_mechanisms;
int conn_rate_total;
int conn_rate_seconds;
int conn_rate_wait;
xht conn_rates;
int byte_rate_total;
int byte_rate_seconds;
int byte_rate_wait;
long max_stanza_bytes;
long max_message_bytes;
prep_cache_t pc;
access_t access;
jqueue_t dead;
int started;
int online;
xht realms;
xht sm_avail;
};
extern sig_atomic_t c2s_lost_router;
int c2s_router_mio_callback(mio_t m, mio_action_t a, int fd, void *data, void *arg);
int c2s_router_sx_callback(sx_t s, sx_event_t e, void *data, void *arg);
void sm_start(sess_t sess);
void sm_end(sess_t sess);
void sm_create(sess_t sess);
void sm_delete(sess_t sess);
void sm_packet(sess_t sess, nad_t nad);
int bind_init(sx_env_t env, sx_plugin_t p, va_list args);
struct authreg_st
{
c2s_t c2s;
void *private;
int (*user_exists)(authreg_t ar, char *username, char *realm);
int (*get_password)(authreg_t ar, char *username, char *realm, char password[257]);
int (*check_password)(authreg_t ar, char *username, char *realm, char password[257]);
int (*set_password)(authreg_t ar, char *username, char *realm, char password[257]);
int (*get_zerok)(authreg_t ar, char *username, char *realm, char hash[41], char token[11], int *sequence);
int (*set_zerok)(authreg_t ar, char *username, char *realm, char hash[41], char token[11], int sequence);
int (*create_user)(authreg_t ar, char *username, char *realm);
int (*delete_user)(authreg_t ar, char *username, char *realm);
int (*create_challenge)(authreg_t ar, char *username, char *challenge, int maxlen);
int (*check_response)(authreg_t ar, char *username, char *realm, char *challenge, char *response);
void (*free)(authreg_t ar);
};
authreg_t authreg_init(c2s_t c2s, char *name);
void authreg_free(authreg_t ar);
typedef int (*ar_module_init_fn)(authreg_t);
int authreg_process(c2s_t c2s, sess_t sess, nad_t nad);
union xhashv
{
void **val;
char **char_val;
sess_t *sess_val;
};