diff -burpN swrfuss/src//act_comm.c swrfussdev/src//act_comm.c --- swrfuss/src//act_comm.c 2009-01-02 13:46:40.000000000 -0500 +++ swrfussdev/src//act_comm.c 2009-07-20 04:44:24.000000000 -0400 @@ -33,6 +33,7 @@ void send_obj_page_to_char( CHAR_DATA * void send_room_page_to_char( CHAR_DATA * ch, ROOM_INDEX_DATA * idx, char page ); void send_page_to_char( CHAR_DATA * ch, MOB_INDEX_DATA * idx, char page ); void send_control_page_to_char( CHAR_DATA * ch, char page ); +void account_save( ACCOUNT_DATA *account ); /* * Local functions. @@ -1373,6 +1374,7 @@ void do_quit( CHAR_DATA * ch, const char */ int x, y; int level; + struct tm *tms; if( IS_NPC( ch ) && IS_SET( ch->act, ACT_POLYMORPHED ) ) { @@ -1419,6 +1421,14 @@ void do_quit( CHAR_DATA * ch, const char act( AT_BYE, "$n has left the game.", ch, NULL, NULL, TO_ROOM ); set_char_color( AT_GREY, ch ); + if( ch->desc && ch->desc->account && !IS_IMMORTAL( ch ) ) + { + tms = localtime( ¤t_time ); + tms->tm_min += ACCOUNT_TIMER; + ch->desc->account->timer = mktime( tms ); + account_save( ch->desc->account ); + } + sprintf( log_buf, "%s has quit.", ch->name ); quitting_char = ch; save_char_obj( ch ); @@ -1426,6 +1436,8 @@ void do_quit( CHAR_DATA * ch, const char saving_char = NULL; level = get_trust( ch ); + if( ch->desc ) + ch->desc->connected = CON_ACCOUNT_PENDING; /* * After extract_char the ch is no longer valid! */ diff -burpN swrfuss/src//comm.c swrfussdev/src//comm.c --- swrfuss/src//comm.c 2009-05-14 06:29:41.000000000 -0400 +++ swrfussdev/src//comm.c 2009-07-21 10:42:21.000000000 -0400 @@ -108,6 +108,10 @@ void display_prompt args( ( DESCRIPTOR_D void set_pager_input args( ( DESCRIPTOR_DATA * d, char *argument ) ); bool pager_output args( ( DESCRIPTOR_DATA * d ) ); void mail_count args( ( CHAR_DATA * ch ) ); +void account_dispose args( ( ACCOUNT_DATA *account ) ); +void account_nanny args( ( DESCRIPTOR_DATA *d, char *argument ) ); +void account_save args( ( ACCOUNT_DATA *account ) ); +bool account_add_character args ( ( ACCOUNT_DATA *account, const char *name, bool pending, bool newcharacter ) ); int main( int argc, char **argv ) { @@ -455,8 +459,9 @@ void game_loop( void ) close_socket( d, TRUE ); continue; } - else if( ( !d->character && d->idle > 360 ) /* 2 mins */ - || ( d->connected != CON_PLAYING && d->idle > 1200 ) /* 5 mins */ + else if( ( !d->character && d->connected != CON_ACCOUNT_PENDING && d->idle > 360 ) /* 2 mins */ + || ( d->connected != CON_PLAYING && d->connected != CON_ACCOUNT_PENDING && d->idle > 1200 ) /* 5 mins */ + || ( d->connected == CON_ACCOUNT_PENDING && d->idle > 12000) || d->idle > 28800 ) /* 2 hrs */ { write_to_descriptor( d, "Idle timeout... disconnecting.\r\n", 0 ); @@ -516,6 +521,15 @@ void game_loop( void ) case CON_EDITING: edit_buffer( d->character, cmdline ); break; + case CON_GET_OLD_ACCOUNT_PASSWORD: + case CON_COMFIRM_NEW_ACCOUNT: + case CON_ACCOUNT_ADD_CHARACTER_PASSWORD: + case CON_GET_NEW_ACCOUNT_PASSWORD: + case CON_COMFIRM_ACCOUNT_PASSWORD: + case CON_GET_ACCOUNT: + case CON_ACCOUNT_PENDING: + account_nanny( d, cmdline ); + break; } } } @@ -667,7 +681,7 @@ void new_descriptor( int new_desc ) CREATE( dnew, DESCRIPTOR_DATA, 1 ); dnew->next = NULL; dnew->descriptor = desc; - dnew->connected = CON_GET_NAME; + dnew->connected = CON_GET_ACCOUNT; dnew->outsize = 2000; dnew->idle = 0; dnew->lines = 0; @@ -760,6 +774,11 @@ void new_descriptor( int new_desc ) void free_desc( DESCRIPTOR_DATA * d ) { close( d->descriptor ); + if( d->account ) + { + account_save( d->account ); + account_dispose( d->account ); + } STRFREE( d->host ); DISPOSE( d->outbuf ); if( d->pagebuf ) @@ -1459,6 +1478,13 @@ void nanny( DESCRIPTOR_DATA * d, const c return; } + if( !str_cmp( argument, "account" ) ) + { + write_to_buffer( d, "Enter account name: ", 0 ); + d->connected = CON_GET_ACCOUNT; + return; + } + argument[0] = UPPER( argument[0] ); if( !str_cmp( argument, "MSSP-REQUEST" ) ) @@ -1946,6 +1972,10 @@ void nanny( DESCRIPTOR_DATA * d, const c { */ sprintf( log_buf, "%s@%s new %s.", ch->name, d->host, race_table[ch->race].race_name ); + + account_add_character(d->account, ch->name, FALSE, TRUE); + account_save( d->account ); + log_string_plus( log_buf, LOG_COMM, sysdata.log_level ); to_channel( log_buf, CHANNEL_MONITOR, "Monitor", LEVEL_IMMORTAL ); write_to_buffer( d, "Press [ENTER] ", 0 ); diff -burpN swrfuss/src//handler.c swrfussdev/src//handler.c --- swrfuss/src//handler.c 2008-12-18 17:19:03.000000000 -0500 +++ swrfussdev/src//handler.c 2009-07-20 05:26:22.000000000 -0400 @@ -50,6 +50,7 @@ obj_ret global_objcode; OBJ_DATA *group_object( OBJ_DATA * obj1, OBJ_DATA * obj2 ); void update_room_reset( CHAR_DATA *ch, bool setting ); void delete_reset( RESET_DATA *pReset ); +void account_menu( DESCRIPTOR_DATA * d ); void room_explode_1( OBJ_DATA * obj, CHAR_DATA * xch, ROOM_INDEX_DATA * room, int blast ) { @@ -1716,6 +1717,14 @@ void extract_char( CHAR_DATA * ch, bool if( ch->desc ) { + if( ch->desc->account ) + { + account_menu( ch->desc ); + send_to_desc_color( "\n&WAccount&z:&W", ch->desc ); + ch->desc->character = NULL; + ch->desc = NULL; + return; + } if( ch->desc->character != ch ) bug( "Extract_char: char's descriptor points to another char", 0 ); else diff -burpN swrfuss/src//hotboot.c swrfussdev/src//hotboot.c --- swrfuss/src//hotboot.c 2008-12-18 17:19:03.000000000 -0500 +++ swrfussdev/src//hotboot.c 2009-07-20 05:26:48.000000000 -0400 @@ -70,6 +70,8 @@ void update_room_reset( CHAR_DATA *ch, b extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH]; extern int port; /* Port number to be used */ +void account_save args( ( ACCOUNT_DATA *account ) ); +ACCOUNT_DATA *account_fread( const char *name ); /* * Save the world's ship files @@ -432,6 +434,7 @@ void save_mobile( FILE * fp, CHAR_DATA * void save_world( CHAR_DATA * ch ) { + ACCOUNT_DATA *account; FILE *mobfp; FILE *objfp; FILE *shipfp; @@ -444,6 +447,9 @@ void save_world( CHAR_DATA * ch ) log_string( "Preserving world state...." ); + for( account = first_account; account; account = account->next ) + account_save( account ); + snprintf( filename, 256, "%s%s", SYSTEM_DIR, MOB_FILE ); if( ( mobfp = fopen( filename, "w" ) ) == NULL ) { @@ -1039,7 +1045,7 @@ void do_hotboot( CHAR_DATA * ch, const c { /* For test purposes flush_buffer(d, TRUE);*/ - fprintf( fp, "%d %d %d %d %d %s %s\n", d->can_compress, d->descriptor, och->in_room->vnum, d->port, d->idle, och->name, d->host ); + fprintf( fp, "%d %d %d %d %d %s %s %s\n", d->can_compress, d->descriptor, och->in_room->vnum, d->port, d->idle, och->name, d->account ? d->account->name : "None", d->host ); /* * One of two places this gets changed */ @@ -1105,6 +1111,7 @@ void hotboot_recover( void ) DESCRIPTOR_DATA *d = NULL; FILE *fp; char name[100]; + char account[MAX_STRING_LENGTH]; char host[MAX_STRING_LENGTH]; int desc, room, dport, idle, dcompress, maxp = 0; bool fOld; @@ -1123,7 +1130,7 @@ void hotboot_recover( void ) { d = NULL; - fscanf( fp, "%d %d %d %d %d %s %s\n", &dcompress, &desc, &room, &dport, &idle, name, host ); + fscanf( fp, "%d %d %d %d %d %s %s %s\n", &dcompress, &desc, &room, &dport, &idle, name, account, host ); if( desc == -1 || feof( fp ) ) break; @@ -1147,7 +1154,7 @@ void hotboot_recover( void ) CREATE( d->mccp, MCCP, 1 ); d->next = NULL; d->descriptor = desc; - d->connected = CON_GET_NAME; + d->connected = CON_GET_ACCOUNT; d->outsize = 2000; d->idle = 0; d->lines = 0; @@ -1158,6 +1165,7 @@ void hotboot_recover( void ) CREATE( d->outbuf, char, d->outsize ); d->host = STRALLOC( host ); + d->account = account_fread( account ); d->port = dport; d->idle = idle; LINK( d, first_descriptor, last_descriptor, next, prev ); diff -burpN swrfuss/src//Makefile swrfussdev/src//Makefile --- swrfuss/src//Makefile 2009-05-14 06:29:41.000000000 -0400 +++ swrfussdev/src//Makefile 2009-07-20 05:42:17.000000000 -0400 @@ -22,7 +22,7 @@ L_FLAGS = $(PROF) $(NEED_MATH) -lz $(NEE W_FLAGS = -Wall -Werror -Wshadow -Wformat-security -Winline -Wpointer-arith -Wcast-align -Wredundant-decls -Wwrite-strings -C_FILES = act_comm.c act_info.c act_move.c act_obj.c act_wiz.c boards.c bounty.c \ +C_FILES = account.c act_comm.c act_info.c act_move.c act_obj.c act_wiz.c boards.c bounty.c \ build.c clans.c color.c comm.c comments.c const.c db.c fight.c \ handler.c hashstr.c hotboot.c interp.c magic.c makeobjs.c mccp.c \ misc.c mssp.c mud_comm.c mud_prog.c player.c reset.c save.c sha256.c shops.c \ diff -burpN swrfuss/src//mud.h swrfussdev/src//mud.h --- swrfuss/src//mud.h 2009-05-30 16:48:19.000000000 -0400 +++ swrfussdev/src//mud.h 2009-07-20 05:25:25.000000000 -0400 @@ -116,6 +116,8 @@ typedef struct cmd_type CMDTYPE; typedef struct killed_data KILLED_DATA; typedef struct wizent WIZENT; typedef struct specfun_list SPEC_LIST; +typedef struct account_character_data ACCOUNT_CHARACTER_DATA; +typedef struct account_data ACCOUNT_DATA; /* * Function types. @@ -218,6 +220,7 @@ typedef ch_ret SPELL_FUN( int sn, int le #define LEVEL_AVATAR (MAX_LEVEL - 5) #include "hotboot.h" +#include "account.h" #define LEVEL_LOG LEVEL_LESSER #define LEVEL_HIGOD LEVEL_GOD @@ -373,7 +376,11 @@ typedef enum CON_GET_WANT_RIPANSI, CON_TITLE, CON_PRESS_ENTER, CON_WAIT_1, CON_WAIT_2, CON_WAIT_3, CON_ACCEPTED, CON_GET_PKILL, CON_READ_IMOTD, - CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING + CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING, + CON_COMFIRM_NEW_ACCOUNT, CON_GET_OLD_ACCOUNT_PASSWORD, + CON_ACCOUNT_PENDING, CON_ACCOUNT_ADD_CHARACTER_PASSWORD, + CON_GET_NEW_ACCOUNT_PASSWORD, CON_COMFIRM_ACCOUNT_PASSWORD, + CON_GET_ACCOUNT } connection_types; /* @@ -401,6 +408,7 @@ struct descriptor_data DESCRIPTOR_DATA *snoop_by; CHAR_DATA *character; CHAR_DATA *original; + ACCOUNT_DATA *account; struct mccp_data *mccp; /* Mud Client Compression Protocol */ bool can_compress; const char *host; @@ -3222,6 +3230,8 @@ extern CHAR_DATA *quitting_char; extern CHAR_DATA *loading_char; extern CHAR_DATA *saving_char; extern OBJ_DATA *all_obj; +extern ACCOUNT_DATA *first_account; +extern ACCOUNT_DATA *last_account; extern time_t current_time; extern bool fLogAll; @@ -3835,6 +3845,7 @@ DECLARE_SPELL_FUN( spell_cure_addiction */ #define PLAYER_DIR "../player/" /* Player files */ #define BACKUP_DIR "../backup/" /* Backup Player files */ +#define ACCOUNT_DIR "../accounts/" /* Directory for accounts */ #define GOD_DIR "../gods/" /* God Info Dir */ #define BOARD_DIR "../boards/" /* Board data dir */ #define CLAN_DIR "../clans/" /* Clan data dir */ @@ -4397,7 +4408,7 @@ void check_requests args( ( void ) ); void write_corpses( CHAR_DATA * ch, const char *name ); void save_char_obj args( ( CHAR_DATA * ch ) ); void save_clone args( ( CHAR_DATA * ch ) ); -bool load_char_obj args( ( DESCRIPTOR_DATA * d, char *name, bool preload, bool copyover ) ); +bool load_char_obj args( ( DESCRIPTOR_DATA * d, const char *name, bool preload, bool copyover ) ); void set_alarm args( ( long seconds ) ); void requip_char args( ( CHAR_DATA * ch ) ); void fwrite_obj args( ( CHAR_DATA * ch, OBJ_DATA * obj, FILE * fp, int iNest, short os_type, bool hotboot ) ); diff -burpN swrfuss/src//save.c swrfussdev/src//save.c --- swrfuss/src//save.c 2009-04-12 06:39:25.000000000 -0400 +++ swrfussdev/src//save.c 2009-07-20 05:24:03.000000000 -0400 @@ -694,7 +694,7 @@ void fwrite_obj( CHAR_DATA * ch, OBJ_DAT /* * Load a char and inventory into a new ch structure. */ -bool load_char_obj( DESCRIPTOR_DATA * d, char *name, bool preload, bool copyover ) +bool load_char_obj( DESCRIPTOR_DATA * d, const char *name, bool preload, bool copyover ) { char strsave[MAX_INPUT_LENGTH]; CHAR_DATA *ch; diff -burpN swrfuss/src//startup swrfussdev/src//startup --- swrfuss/src//startup 2008-12-18 17:19:03.000000000 -0500 +++ swrfussdev/src//startup 2009-07-20 04:40:02.000000000 -0400 @@ -1,7 +1,7 @@ #! /bin/csh -f # Set the port number. -set port = 4020 +set port = 5555 if ( "$1" != "" ) set port="$1" # Change to area directory.