/* This is were the real 'mudlib' starts. This file is cloned by ip.c * and prompts for name and password. It then clones the approperiate * player.c and pass the input to it. Currently, this code is a bit messy, * but it seems to work anyway. */ #define SAVEFILE "/save/players" inherit "/std/object"; #include <ctype.h> #include <arpa/telnet.h> static int my_socket=-1; static object my_connection; static int state,nstate,ystate; static string ymessage,nmessage; /* Player data */ string name; string password,mailadress; int isalphastring(string a) { int e; for(e=0;e<strlen(a);e++) if(!isalpha(a[e])) return 0; return 1; } static void tell_object(string foo) { my_connection->tell_object(my_socket,foo); } static void enter_game(object plobj) { tell_object(read_bytes("/etc/motd")); seteuid(lower_case(name)); plobj->do_disconnect(); plobj->set_name(name); if(!my_connection->do_exec(my_socket,plobj)) { tell_object("TELNET PANIC: 0x7fffcfa8 0x0001d764 0xaaaaaaaa 0x00000000\n"); tell_object("core dumped.\n"); my_connection->disconnect(my_socket); } plobj->catch_input("look"); destruct(); } static void selfdestruct() { if(my_connection) my_connection->disconnect(my_socket); destruct(); } /* Write a finite state machine just for the login sequenece... *sigh*/ static void catch_input(string s) { int e; string a,b,*c; object p; remove_call_out(selfdestruct); call_out(selfdestruct,120); /* write("*"); for(e=0;e<strlen(s);e++) write(s[e]+":"+e+" "); write("\n"); */ switch(state) { case 0: /* Get the name */ s=lower_case(s); if(strlen(s)<3) { tell_object("Too short name.\nGive another name:"); return ; } if(strlen(s)>15) { tell_object("Too long name.\nGive another name:"); return; } if(!isalphastring(s)) { tell_object("Illigal character in name.\nTry again:"); return; } if(lower_case(s)=="guest") { enter_game(clone_object("obj/guest")); break; } if(lower_case(s)=="info") { tell_object(read_bytes("/etc/info")); tell_object("Enter your name: "); break; } name=lower_case(s); if("/obj/d/banishd"->query_banished(name)) { tell_object("That name is occupied.\nTry again:"); return; } s=db_get(SAVEFILE,name); if(stringp(s)) { restore_object(s); state=1; tell_object(LOCAL_ECHO_OFF); tell_object("Enter password: "); break; } tell_object(read_bytes("/etc/new_character")); tell_object("Are you sure you spelled the name right? :"); state=1000; ystate=10; nstate=9; break; case 1: /* Get the password */ tell_object(LOCAL_ECHO_ON); tell_object("\n"); if(crypt(s,password)!=password) { tell_object("Wrong password!\n"); selfdestruct(); return; } if(find_player(name)) { tell_object("You are already playing, throw the other copy out? :"); state=1000; ystate=2; nstate=3; break; } case 2: enter_game(clone_object("/obj/player")); break; case 3: selfdestruct(); break; case 9: tell_object("Ok, try enter name again: "); state=0; break; case 10: /* Get the new password */ tell_object(LOCAL_ECHO_OFF); tell_object("Ok, Enter new password: "); state=11; break; case 11: /* Get the new password (again) */ password=s; tell_object(LOCAL_ECHO_OFF); tell_object("\nOk, Enter new password (again): "); state=111; break; case 111: if(s!=password) { tell_object(LOCAL_ECHO_OFF); tell_object("\nYou didn't write same password, try again.\nEnter password: "); state=11; break; } password=crypt(password,0); tell_object(LOCAL_ECHO_ON+"\nEnter mailadress or 'none': "); state=13; break; case 13: if(s!="none" && (!sscanf(s,"%s@%s",a,b) || !strlen(a) || !strlen(b))) { tell_object("You must enter a mailadress or 'none'\nTry again:"); break; } mailadress=s; if(1!=db_set(SAVEFILE,name,save_object())) { tell_object("Failed to create save entry.\n"); destruct(this_object()); return; } enter_game(clone_object("/obj/player")); break; case 1000: { if(strlen(s)==0 || (s[0]!='y' && s[0]!='n')) { tell_object("Answer yes or no please.\n:"); return; } if(s[0]=='y') state=ystate; else state=nstate; catch_input(""); break; } } } static int take_a_socket(int s,object o) { mixed *tmp; my_connection=o; my_socket=s; state=0; tmp="/secure/access_check"->access_check(socket_address(s)); tell_object(tmp[1]); if(!tmp[0]) { selfdestruct(); return; } tell_object(read_bytes("/etc/welcome")); tell_object("What is your name: "); call_out(selfdestruct,120); return 1; }