Mercurial > ~darius > hgwebdir.cgi > paradise_client
diff getname.c @ 3:5a977ccbc7a9 default tip
Empty changelog
author | darius |
---|---|
date | Sat, 06 Dec 1997 05:41:29 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/getname.c Sat Dec 06 05:41:29 1997 +0000 @@ -0,0 +1,429 @@ +/* $Id: getname.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */ + +/* + * getname.c + * + * Kevin P. Smith 09/28/88 + * + */ +#include "copyright2.h" + +#include <stdio.h> +#ifdef __STDC__ +#include <stdlib.h> +#include <unistd.h> +#endif +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/file.h> +#include <errno.h> +#include <pwd.h> +#include <string.h> +#include <ctype.h> +#include <time.h> +#ifndef hpux +#include <sys/time.h> +#endif +#include "Wlib.h" +#include "defs.h" +#include "struct.h" +#include "data.h" +#include "proto.h" + +static char tempname[16]; +static char password1[16]; +static char password2[16]; +static int state, autolog; +static char username[32] = "****"; +#define ST_GETNAME 0 +#define ST_GETPASS 1 +#define ST_MAKEPASS1 2 +#define ST_MAKEPASS2 3 +#define ST_DONE 4 + +/* Prototypes */ +static void adjustString P((int ch, char *str, char *defname)); +static void checkpassword P((void)); +static void displayStartup P((char *defname)); +static void loaddude P((void)); +static void makeNewGuy P((void)); +static void loginproced P((int ch, char *defname)); + +void +noautologin() +{ + char *tempstr; + + autolog = 0; + *defpasswd = *password1 = *password2 = '\0'; + tempstr = "Automatic login failed"; + W_WriteText(w, 100, 100, textColor, tempstr, strlen(tempstr), + W_BoldFont); +} + +void +getname(defname, defpasswd) + char *defname, *defpasswd; +/* Let person identify themselves from w */ +{ + W_Event event; + register ch = 0; + int secondsLeft = 99, laststate; + char tempstr[40]; + long lasttime; + register int j; + +#ifdef RECORDER + if (playback) + return; +#endif + autolog = (*defpasswd && *defname) ? 1 : 0; + + { + struct passwd *passwd; + + passwd = getpwuid(getuid()); + if (passwd) /* believe it or not, getpwuid failed on me - + RF */ + strcpy(username, passwd->pw_name); + } + + bzero(mystats, sizeof(struct stats)); + mystats->st_tticks = 1; + mystats->st_flags = + (ST_NOBITMAPS * (!sendmotdbitmaps) + + ST_KEEPPEACE * keeppeace + + 0); + lasttime = time(NULL); + + if (ghoststart) + return; + + tempname[0] = '\0'; + password1[0] = '\0'; + password2[0] = '\0'; + laststate = state = ST_GETNAME; + displayStartup(defname); + for (;;) { + if (isServerDead()) { + printf("Ack! We've been ghostbusted!\n"); +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + EXIT(0); + } + if (lasttime != time(NULL)) { + lasttime++; + secondsLeft--; + if (!autolog) { + sprintf(tempstr, "Seconds to go: %d ", secondsLeft); + W_WriteText(w, 150, 400, textColor, tempstr, strlen(tempstr), + W_BoldFont); + } + if (secondsLeft == 0) { + me->p_status = PFREE; + printf("Auto-Quit\n"); +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + EXIT(0); + } + } + if (state == ST_DONE) { + W_ClearWindow(w); + return; + } + readFromServer(); /* Just in case it wants to say something */ + + if (autolog) { + switch (state) { + case ST_GETNAME: + tempname[0] = '\0'; + ch = 13; + j = 0; + break; + + case ST_GETPASS: + case ST_MAKEPASS1: + case ST_MAKEPASS2: + ch = defpasswd[j++]; + if (ch == '\0') { + j = 0; + ch = 13; + } + break; + + default: + break; + } + + loginproced(ch, defname); + + } + laststate = state; + + if (!W_EventsPending()) + continue; + W_NextEvent(&event); + if (event.Window != w) + continue; + switch ((int) event.type) { + case W_EV_EXPOSE: + displayStartup(defname); + break; + case W_EV_KEY: + ch = event.key; + if (!autolog) + loginproced(ch, defname); + } + } +} + + +static +void +loginproced(ch, defname) + int ch; + char *defname; +{ + if (ch > 255) + ch -= 256; /* was alt key, ignore it */ + if (ch == 10) + ch = 13; + if ((ch == ('d' + 128) || ch == ('D' + 128)) && state == ST_GETNAME && *tempname == '\0') { +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + EXIT(0); + } + if ((ch < 32 || ch > 127) && ch != 21 && ch != 13 && ch != 8) + return; + switch (state) { + case ST_GETNAME: + if (ch == 13) { + if (*tempname == '\0') { + strcpy(tempname, defname); + } + loaddude(); + displayStartup(defname); + } else { + adjustString(ch, tempname, defname); + } + break; + case ST_GETPASS: + if (ch == 13) { + checkpassword(); + displayStartup(defname); + } else { + adjustString(ch, password1, defname); + } + break; + case ST_MAKEPASS1: + if (ch == 13) { + state = ST_MAKEPASS2; + displayStartup(defname); + } else { + adjustString(ch, password1, defname); + } + break; + case ST_MAKEPASS2: + if (ch == 13) { + makeNewGuy(); + displayStartup(defname); + } else { + adjustString(ch, password2, defname); + } + break; + } +} + +static void +loaddude() +/* Query dude. + */ +{ + if (strcmp(tempname, "Guest") == 0 || strcmp(tempname, "guest") == 0) { + loginAccept = -1; + sendLoginReq(tempname, "", username, 0); + state = ST_DONE; + me->p_pos = -1; + me->p_stats.st_tticks = 1; /* prevent overflow */ + strcpy(me->p_name, tempname); + while (loginAccept == -1) { + socketPause(1, 0); + readFromServer(); + if (isServerDead()) { + printf("Server is dead!\n"); +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + + EXIT(0); + } + } + if (loginAccept == 0) { + printf("Hmmm... The SOB server won't let me log in as guest!\n"); +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + + EXIT(0); + } + return; + } + /* Ask about the user */ + loginAccept = -1; + sendLoginReq(tempname, "", username, 1); + while (loginAccept == -1) { + socketPause(1, 0); + readFromServer(); + if (isServerDead()) { + printf("Server is dead!\n"); +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + + EXIT(0); + } + } + *password1 = *password2 = 0; + if (loginAccept == 0) { + state = ST_MAKEPASS1; + } else { + state = ST_GETPASS; + } +} + +static void +checkpassword() +/* Check dude's password. + * If he is ok, move to state ST_DONE. + */ +{ + char *s; + + sendLoginReq(tempname, password1, username, 0); + loginAccept = -1; + while (loginAccept == -1) { + socketPause(1, 0); + readFromServer(); + if (isServerDead()) { + printf("Server is dead!\n"); +#ifdef AUTOKEY + if (autoKey) + W_AutoRepeatOn(); +#endif + + EXIT(0); + } + } + if (loginAccept == 0) { + if (!autolog) { + s = "Bad password!"; + W_WriteText(w, 100, 100, textColor, s, strlen(s), W_BoldFont); + (void) W_EventsPending(); + sleep(3); + W_ClearWindow(w); + } else + noautologin(); + *tempname = 0; + state = ST_GETNAME; + return; + } + strcpy(me->p_name, tempname); + sendmotdbitmaps = !((me->p_stats.st_flags / ST_NOBITMAPS) & 1); + keeppeace = (me->p_stats.st_flags / ST_KEEPPEACE) & 1; + state = ST_DONE; +} + +static void +makeNewGuy() +/* Make the dude with name tempname and password password1. + * Move to state ST_DONE. + */ +{ + char *s; + + if (strcmp(password1, password2) != 0) { + if (!autolog) { + s = "Passwords do not match"; + W_WriteText(w, 100, 120, textColor, s, strlen(s), W_BoldFont); + (void) W_EventsPending(); + sleep(3); + W_ClearWindow(w); + } else + noautologin(); + *tempname = 0; + state = ST_GETNAME; + return; + } + /* same routine! */ + checkpassword(); +} + +static void +adjustString(ch, str, defname) + char ch, *str; + char *defname; +{ + if (ch == 21) { + *str = '\0'; + if (state == ST_GETNAME) + displayStartup(defname); + } else if (ch == 8 || ch == '\177') { + if ((int) strlen(str) > 0) { + str[strlen(str) - 1] = '\0'; + if (state == ST_GETNAME) + displayStartup(defname); + } + } else { + if (strlen(str) == 15) + return; + str[strlen(str) + 1] = '\0'; + str[strlen(str)] = ch; + if (state == ST_GETNAME) + displayStartup(defname); + } +} + +static void +displayStartup(defname) + char *defname; +/* Draws entry screen based upon state. */ +{ + char s[100]; + char *t; + + if (state == ST_DONE || autolog) + return; + t = "Enter your name. Use the name 'guest' to remain anonymous."; + W_WriteText(w, 100, 30, textColor, t, strlen(t), W_BoldFont); + t = "Type ^D (Ctrl - D) to quit."; + W_WriteText(w, 100, 40, textColor, t, strlen(t), W_BoldFont); + sprintf(s, "Your name (default = %s): %s ", defname, tempname); + W_WriteText(w, 100, 50, textColor, s, strlen(s), W_BoldFont); + if (state == ST_GETPASS) { + t = "Enter password: "; + W_WriteText(w, 100, 60, textColor, t, strlen(t), W_BoldFont); + } + if (state > ST_GETPASS) { + t = "You need to make a password."; + W_WriteText(w, 100, 70, textColor, t, strlen(t), W_BoldFont); + t = "So think of a password you can remember, and enter it."; + W_WriteText(w, 100, 80, textColor, t, strlen(t), W_BoldFont); + t = "What is your password? :"; + W_WriteText(w, 100, 90, textColor, t, strlen(t), W_BoldFont); + } + if (state == ST_MAKEPASS2) { + t = "Enter it again to make sure you typed it right."; + W_WriteText(w, 100, 100, textColor, t, strlen(t), W_BoldFont); + t = "Your password? :"; + W_WriteText(w, 100, 110, textColor, t, strlen(t), W_BoldFont); + } +}