#include #include typedef struct reg_client { int fd; /* socket */ int clientid; /* client id */ unsigned char *buf; /* buffer for data read */ int nread, nmax; /* # of bytes cur/max in buffer */ time_t lastmod; /* last time we sent/received */ int encrypted; /* set if sched is valid */ des_key_schedule sched; /* DES key schedule */ long uid; /* uid of user. set by RIFO */ char *id; /* stored MIT ID if "six words" are needed. NULL otherwise. Set by RIFO, cleared by SWRD */ char *suggestions; /* suggested usernames */ char *username; /* desired username. set by LOGN */ int reserved_username; /* if username wasn't picked by user */ unsigned short *random; /* random state */ int user_status; /* Status of account */ } reg_client; void RIFO(reg_client *rc, int argc, char **argv); void SWRD(reg_client *rc, int argc, char **argv); void SPIN(reg_client *rc, int argc, char **argv); void CLGN(reg_client *rc, int argc, char **argv); void LOGN(reg_client *rc, int argc, char **argv); void PSWD(reg_client *rc, int argc, char **argv); void QUIT(reg_client *rc, int argc, char **argv); #define REG_SVR_PRINCIPAL "sms" #define REG_SVR_INSTANCE "" #define REG_SVR_RSA_KEY "/moira/reg_svr/rsa_key" #define REG_SVR_HMAC_KEY "/moira/reg_svr/hmac_key" #define REG_SVR_ERROR_MESSAGES "/moira/reg_svr/errors" enum { NO_MESSAGE, INTERNAL_ERROR, PROTOCOL_ERROR, DATABASE_CLOSED, ENCRYPT_KEY, NOT_FOUND_IN_DATABASE, ALREADY_REGISTERED, ACCOUNT_DELETED, NOT_ELIGIBLE, FOUND, FORCED_USERNAME, BAD_SIX_WORDS, BAD_USERNAME, USERNAME_UNAVAILABLE, RESERVED_USERNAME_UNAVAILABLE, USERNAME_OK, PASSWORD_SHORT, PASSWORD_SIMPLE, PASSWORD_SAMPLE, KADM_ERROR, DONE, BAD_PIN, USERNAME_AVAILABLE, NUM_REG_ERRORS }; #define TIMEOUT 300 /* 5 minutes */ #define REG_RSA_ENCRYPTED_KEY 0x43 #define REG_ENCRYPTED 0x45 #define REG_UNENCRYPTED 0x50 /* Prototypes from kerberos.c */ long init_kerberos(void); long check_kerberos(char *username); long register_kerberos(char *username, char *password); /* Prototypes from procotol.c */ int read_rsa_key(void); int read_errors(void); void reply(reg_client *rc, int msg, char *state, char *clean, char *data, ...); void parse_packet(reg_client *rc, int type, long len, char *buf, int sleeping); /* prototypes from reg_svr.pc */ void *xmalloc(size_t); void *xrealloc(void *, size_t); char *xstrdup(char *); /* Prototypes from words.c */ int read_hmac_key(void); unsigned short *init_rand(void *); void getwordlist(char *input, char *words[]);