/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** auth.c -- mud authentication packet handling
**
** 960124, Deathblade: created
*/
void send_to_mud(string type, string mudname, mixed * message);
string canon_mudname(string mudname);
void oob_handle_auth_mud_reply(string mudname, int session_key);
#define AUTH_CLEANUP_TIME (15*60) /* clean up every 15 minutes */
#define AUTH_EXPIRE_TIME (10*60) /* expire after 10 minutes */
/* records information about keys passed to muds */
class auth_data
{
int session_key;
int timestamp;
}
/*
** This maps (remote) mudnames to their authentication data. We do not
** account for the possibility of the daemon being updated between the
** time we issue a session key and the time when a connection attempt is
** made.
*/
nosave private mapping auth_info = ([ ]);
void auth_cleanup();
nosave private function auth_cleanup_func = (: auth_cleanup :);
nosave private int auth_cleanup_running;
//### driver can't remove a func ptr callout. need a string
#define auth_cleanup_func "auth_cleanup"
/* the mudname should be in its canonical form */
protected nomask void do_auth_mud_req(string mudname)
{
send_to_mud("auth-mud-req", canon_mudname(mudname), ({ }));
}
/* the mudname should be in its canonical form */
protected nomask int validate_auth(string mudname, int provided_key)
{
class auth_data data = auth_info[mudname];
int result = data && data->session_key == provided_key;
map_delete(auth_info, mudname);
return result;
}
protected nomask void rcv_auth_mud_req(string orig_mud, string orig_user,
string target_user, mixed * message)
{
class auth_data auth = new(class auth_data);
auth->session_key = random(2000000000);
auth->timestamp = time();
auth_info[orig_mud] = auth;
send_to_mud("auth-mud-reply", orig_mud, ({ auth->session_key }));
if ( !auth_cleanup_running )
{
call_out(auth_cleanup_func, AUTH_CLEANUP_TIME);
auth_cleanup_running = 1;
}
}
protected nomask void rcv_auth_mud_reply(string orig_mud, string orig_user,
string target_user, mixed * message)
{
/* only the OOB system needs this reply */
oob_handle_auth_mud_reply(orig_mud, message[0]);
}
/*
** This function is called periodically to check for authorization tokens
** that have expired and need to be flushed out.
*/
private nomask void auth_cleanup()
{
auth_info = filter(auth_info,
function (string mudname, class auth_data auth)
{
return auth->timestamp + AUTH_EXPIRE_TIME > time();
} );
if ( sizeof(auth_info) )
call_out(auth_cleanup_func, AUTH_CLEANUP_TIME);
else
auth_cleanup_running = 0;
}