/*************************************************************************** * Mud20 1.0 by Todd H. Johnson (Kregor) a derivative of the Open Gaming * * License by Wizards of the Coast. All comments referring to D20, OGL, * * and SRD refer to the System Reference Document for the Open Gaming * * system. Any inclusion of these derivatives must include credit to the * * Mud20 system, the full and complete Open Gaming LIcense, and credit to * * the respective authors. See ../doc/srd.txt for more information. * * * * Emud 2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem. * * * * MrMud 1.4 by David Bills, Dug Michael and Martin Gallwey * * * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe. * ***************************************************************************/ /*************************************************************************** * new_auth.c: Control authorization of new player names, and descs * ***************************************************************************/ /* * New name authorization system * Author: Rantic (supfly@geocities.com) * of FrozenMUD (empire.digiunix.net 4000) * * Permission to use and distribute this code is granted provided * this header is retained and unaltered, and the distribution * package contains all the original files unmodified. * If you modify this code and use/distribute modified versions * you must give credit to the original author(s). */ #include <ctype.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <time.h> #include "mud.h" AUTH_LIST *first_auth_name; AUTH_LIST *last_auth_name; void free_auth_entry (AUTH_LIST * auth) { UNLINK (auth, first_auth_name, last_auth_name, next, prev); STRFREE (auth->adjective); STRFREE (auth->descr); STRFREE (auth->authed_by); STRFREE (auth->change_by); STRFREE (auth->name); FREEMEM (auth); } void free_all_auths (void) { AUTH_LIST *auth, *auth_next; for (auth = first_auth_name; auth; auth = auth_next) { auth_next = auth->next; free_auth_entry (auth); } return; } void clean_auth_list (void) { AUTH_LIST *auth, *nauth; for (auth = first_auth_name; auth; auth = nauth) { nauth = auth->next; if (!char_exists (auth->name)) free_auth_entry (auth); else { time_t tdiff = 0; time_t curr_time = time (0); struct stat fst; char file[256], name[MAX_STRING_LENGTH]; strncpy (name, auth->name, MAX_STRING_LENGTH); snprintf (file, 256, "%s/%c/%s", PLAYER_DIR, tolower(auth->name[0]), capitalize_name(auth->name)); if (stat (file, &fst) != -1) tdiff = (curr_time - fst.st_mtime) / 86400; else bug ("File %s does not exist!", file); if (tdiff > MAX_AUTH_WAIT) { if (unlink (file) == -1) perror ("Unlink: do_auth: \"clean\""); else { log_printf ("%s deleted for inactivity: %ld days", file, (long int)tdiff); } } } } } void write_auth_file (FILE * fpout, AUTH_LIST * list) { fprintf (fpout, "Name %s~\n", list->name); fprintf (fpout, "State %d\n", list->state); fprintf (fpout, "Sex %d\n", list->sex); fprintf (fpout, "Race %d\n", list->race); fprintf (fpout, "Pvnum %d\n", list->pvnum); if (list->adjective) fprintf (fpout, "Adject %s~\n", list->adjective); if (list->descr) fprintf (fpout, "Descr %s~\n", fixer(list->descr)); if (list->authed_by) fprintf (fpout, "AuthedBy %s~\n", list->authed_by); if (list->change_by) fprintf (fpout, "Change %s~\n", list->change_by); fprintf (fpout, "%s", "End\n\n"); } AUTH_LIST *fread_auth (FILE * fp) { AUTH_LIST *new_auth; bool fMatch; const char *word; ALLOCMEM (new_auth, AUTH_LIST, 1); new_auth->authed_by = NULL; new_auth->change_by = NULL; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fMatch = TRUE; fread_to_eol (fp); break; case 'A': SKEY ("AuthedBy", new_auth->authed_by, fread_string (fp)); SKEY ("Adject", new_auth->adjective, fread_string (fp)); break; case 'C': SKEY ("Change", new_auth->change_by, fread_string (fp)); break; case 'D': SKEY ("Descr", new_auth->descr, fread_string (fp)); break; case 'E': if (!strcasecmp (word, "End")) { LINK (new_auth, first_auth_name, last_auth_name, next, prev); return new_auth; } break; case 'N': SKEY ("Name", new_auth->name, fread_string (fp)); break; case 'P': NKEY ("Pvnum", new_auth->pvnum, fread_number (fp)); break; case 'R': NKEY ("Race", new_auth->race, fread_number (fp)); break; case 'S': NKEY ("Sex", new_auth->sex, fread_number (fp)); if (!strcasecmp (word, "State")) { new_auth->state = fread_number (fp); /* * Crash proofing. Can't be online when * booting up. Would suck for do_auth */ if (new_auth->state == AUTH_ONLINE || new_auth->state == AUTH_LINK_DEAD) new_auth->state = AUTH_OFFLINE; fMatch = TRUE; break; } break; } if (!fMatch) bug ("%s: no match: %s", __FUNCTION__, word); } } void save_auth_list (void) { FILE *fpout; AUTH_LIST *list; close_reserve(); if ((fpout = my_fopen (AUTH_FILE, "w", FALSE)) == NULL) { bug ("%s", "Cannot open auth.dat for writing."); perror (AUTH_FILE); open_reserve(); return; } for (list = first_auth_name; list; list = list->next) { fprintf (fpout, "%s", "#AUTH\n"); write_auth_file (fpout, list); } fprintf (fpout, "%s", "#END\n"); my_fclose (fpout); fpout = NULL; open_reserve(); } void clear_auth_list (void) { AUTH_LIST *auth, *nauth; for (auth = first_auth_name; auth; auth = nauth) { nauth = auth->next; if (!char_exists (auth->name)) free_auth_entry (auth); } save_auth_list ( ); } void load_auth_list (void) { FILE *fp; int x; first_auth_name = last_auth_name = NULL; close_reserve(); if ((fp = my_fopen (AUTH_FILE, "r", FALSE)) != NULL) { x = 0; for (;;) { char letter; char *word; letter = fread_letter (fp); if (letter == '*') { fread_to_eol (fp); continue; } if (letter != '#') { bug ("%s", "Load_auth_list: # not found."); break; } word = fread_word (fp); if (!strcasecmp (word, "AUTH")) { fread_auth (fp); continue; } else if (!strcasecmp (word, "END")) break; else { bug ("%s", "load_auth_list: bad section."); continue; } } my_fclose (fp); fp = NULL; } else { bug ("%s", "Cannot open auth.dat"); open_reserve(); return; } clear_auth_list ( ); open_reserve(); } int get_auth_state (CHAR_DATA * ch) { AUTH_LIST *namestate; int state; state = AUTH_AUTHED; for (namestate = first_auth_name; namestate; namestate = namestate->next) { if (!strcasecmp (namestate->name, ch->name)) { state = namestate->state; break; } } return state; } AUTH_LIST *get_auth_name (char *name) { AUTH_LIST *mname; if (last_auth_name && last_auth_name->next != NULL) bug ("Last_auth_name->next != NULL: %s", last_auth_name->next->name); for (mname = first_auth_name; mname; mname = mname->next) { if (!strcasecmp (mname->name, name)) /* If the name is already in the list, break */ break; } return mname; } void add_to_auth (CHAR_DATA * ch) { AUTH_LIST *new_name; DESCRIPTOR_DATA *d; char log_buf[MAX_INPUT_LENGTH]; new_name = get_auth_name (ch->name); if (new_name != NULL) return; else { ALLOCMEM (new_name, AUTH_LIST, 1); new_name->name = STRALLOC (ch->name); new_name->sex = ch->sex; new_name->race = ch->race; new_name->pvnum = ch->pcdata->pvnum; if (ch->pcdata->adjective && ch->pcdata->adjective[0] != '\0') new_name->adjective = STRALLOC (ch->pcdata->adjective); if (ch->description && ch->description[0] != '\0') new_name->descr = STRALLOC(ch->description); new_name->state = AUTH_ONLINE; /* Just entered the game */ LINK (new_name, first_auth_name, last_auth_name, next, prev); save_auth_list ( ); sprintf(log_buf, "{200}AUTH: {178}%s {300}is now awaiting authorization.\n\r", ch->name); for (d = mud->f_desc; d; d = d->next) if (d->connected == CON_PLAYING && d->character && IS_IMMORTAL(d->character)) send_to_char_color(log_buf, d->character); } } void remove_from_auth (char *name) { AUTH_LIST *old_name; old_name = get_auth_name (name); if (old_name == NULL) /* Its not old */ return; else { free_auth_entry (old_name); save_auth_list ( ); } } void check_auth_state (CHAR_DATA * ch) { AUTH_LIST *old_auth; char colY[10], colR[10], colW[10], colw[10]; old_auth = get_auth_name (ch->name); if (old_auth == NULL) return; strcpy(colY, ansi_translate("{138}")); strcpy(colR, ansi_translate("{118}")); strcpy(colW, ansi_translate("{178}")); strcpy(colw, ansi_translate("{078}")); if (!ch->pcdata->adjective || ch->pcdata->adjective[0] == '\0') { ch_printf_color (ch, "%s\r\nYou have not yet set your adjective. You cannot be\r\n" "authorized until you set one. See HELP ADJECTIVE.\r\n", colR); } if (!ch->description || ch->description[0] == '\0') { ch_printf_color (ch, "%s\r\nYou have not yet set your description. You cannot be\r\n" "authorized until you write one. See HELP DESC.\r\n", colR); } if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have found your name\r\n" "to be unacceptable. You must set a new one. See HELP NAME.\r\n", colR); } else if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_AUTH_NAME)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have not yet authorized your name\r\n" "It will have to be authorized before you can enter the realms.\r\n", colR); } else if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_UNAUTHED)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have authorised the name %s\r\n", colY, ch->name); } if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have found your adjective\r\n" "to be unacceptable. You must set a new one. See HELP ADJECTIVE.\r\n", colR); } else if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_AUTH_ADJ)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have not yet authorized your adjective\r\n" "It will have to be authorized before you can enter the realms.\r\n", colR); } else if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_UNAUTHED)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have authorised your adjective.\r\n", colY); } if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have found your description to\r\n" "be unacceptable. You must set a new one. See HELP DESC.\r\n", colR); } else if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_AUTH_ADJ)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have not yet authorized your description.\r\n", colR); } else if (IS_SET(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_UNAUTHED)) { ch_printf_color (ch, "%s\r\nThe MUD Administrators have authorised your description.\r\n", colY); } if (old_auth->state == AUTH_OFFLINE /* checking as they enter the game */ || old_auth->state == AUTH_LINK_DEAD) { old_auth->state = AUTH_ONLINE; save_auth_list ( ); } else if (old_auth->state == AUTH_AUTHED) { if (ch->pcdata->authed_by) STRFREE (ch->pcdata->authed_by); if (old_auth->authed_by) { ch->pcdata->authed_by = STRALLOC (old_auth->authed_by); STRFREE (old_auth->authed_by); } else ch->pcdata->authed_by = STRALLOC ("The Code"); ch_printf_color (ch, "\r\n{138}The MUD Administrators have authorized you.\r\n" "You are now free to roam the realms.\r\n"); REMOVE_BIT(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_UNAUTHED); remove_from_auth (ch->name); return; } return; } /* new auth */ void do_authorize (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char colc[10], colw[10], colW[10]; CHAR_DATA *victim = NULL; AUTH_LIST *auth; bool offline, authed, change, pending; int states = 0; strcpy(colc, get_color_string(ch, COLOR_ACCENT, VT102_DIM)); strcpy(colw, get_color_string(ch, COLOR_TEXT, VT102_DIM)); strcpy(colW, get_color_string(ch, COLOR_TEXT, VT102_BOLD)); offline = authed = change = pending = FALSE; auth = NULL; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); argument = one_argument (argument, arg3); if (arg1[0] == '\0') { ch_printf_color (ch, "%sSyntax:\r\n", colc); ch_printf_color (ch, "%s Approve a character fully: auth <name> accept\r\n", colw); ch_printf_color (ch, "%s Deny and delete a character: auth <name> reject\r\n", colw); ch_printf_color (ch, "%s To review a character: auth <name> review\r\n", colw); ch_printf_color (ch, "%s Authorize a character's name: auth <name> name <accept|change>\r\n", colw); ch_printf_color (ch, "%s Authorize a character's adj: auth <name> adj <accept|change>\r\n", colw); ch_printf_color (ch, "%s Authorize a character's desc: auth <name> desc <accept|change>\r\n", colw); ch_printf_color (ch, "%s Verify the list: auth fixlist\r\n", colw); ch_printf_color (ch, "%s Purge inactive entries: auth clean\r\n", colw); ch_printf_color(ch, "\r\n%sCharacters awaiting approval%s\r\n", colc, colw); for (auth = first_auth_name; auth; auth = auth->next) { states = pvnum_index[auth->pvnum]->flags; if (IS_SET(states, PVNUM_CHNG_NAME|PVNUM_CHNG_ADJ|PVNUM_CHNG_DESC)) change = TRUE; else if (auth->state == AUTH_AUTHED) authed = TRUE; if (auth->name != NULL && IS_SET(states, PVNUM_AUTH_NAME|PVNUM_AUTH_ADJ|PVNUM_AUTH_DESC)) pending = TRUE; } if (pending) { for (auth = first_auth_name; auth; auth = auth->next) { states = pvnum_index[auth->pvnum]->flags; if (auth->name != NULL && IS_SET(states, PVNUM_AUTH_NAME|PVNUM_AUTH_ADJ|PVNUM_AUTH_DESC)) { if (!auth->adjective || auth->adjective[0] == '\0') sprintf(buf, " %s%s, %sa %s %s (Adjective not yet set)", colW, auth->name, colw, sex_types[auth->sex], race_table[auth->race].race_name); else sprintf(buf, " %s%s, %sa %s %s %s", colW, auth->name, colw, auth->adjective, sex_types[auth->sex], race_table[auth->race].race_name); str_resize(buf, buf2, -64); switch (auth->state) { default: ch_printf_color (ch, "%-64s %sStatus: %sUnknown?\n\r", buf, colW, colw); break; case AUTH_LINK_DEAD: ch_printf_color (ch, "%-64s %sStatus: %sLink Dead\n\r", buf, colW, colw); break; case AUTH_ONLINE: ch_printf_color (ch, "%-64s %sStatus: %sOnline\n\r", buf, colW, colw); break; case AUTH_OFFLINE: ch_printf_color (ch, "%-64s %sStatus: %sOffline\n\r", buf, colW, colw); break; } } } } else send_to_char (" None\r\n", ch); if (authed) { ch_printf_color (ch, "\r\n%sAuthorized Characters:\r\n", colc); for (auth = first_auth_name; auth; auth = auth->next) { if (auth->state == AUTH_AUTHED) ch_printf_color (ch, " Name: %-15s Approved by: %s\r\n", auth->name, auth->authed_by); } } if (change) { ch_printf_color (ch, "\r\n%sChange:\r\n", colc); for (auth = first_auth_name; auth; auth = auth->next) { states = pvnum_index[auth->pvnum]->flags; if (IS_SET(states, PVNUM_CHNG_NAME|PVNUM_CHNG_ADJ|PVNUM_CHNG_DESC)) ch_printf_color (ch, " Name: %s, a %s %s %s - Change:%s%s%s Requested: %s\r\n", auth->name, auth->adjective, sex_types[auth->sex], race_table[auth->race].race_name, IS_SET(states, PVNUM_CHNG_NAME) ? " N" : "", IS_SET(states, PVNUM_CHNG_DESC) ? " D" : "", IS_SET(states, PVNUM_CHNG_ADJ) ? " A" : "", auth->change_by); } } return; } if (!strcasecmp (arg1, "fixlist")) { send_to_char ("Checking authorization list...\r\n", ch); clear_auth_list ( ); send_to_char ("Done.\r\n", ch); return; } if (!strcasecmp (arg1, "clean")) { send_to_char ("Cleaning authorization list...\r\n", ch); clean_auth_list ( ); send_to_char ("Checking authorization list...\r\n", ch); clear_auth_list ( ); send_to_char ("Done.\r\n", ch); return; } auth = get_auth_name (arg1); if (auth != NULL) { if (!auth->adjective || auth->adjective[0] == '\0') { ch_printf_color (ch, "You cannot authorize %s until they set an adjective.\r\n", auth->name); return; } if (auth->state == AUTH_OFFLINE || auth->state == AUTH_LINK_DEAD) { offline = TRUE; if (arg2[0] == '\0') { do_authorize(ch, ""); } else if (!strcasecmp (arg2, "accept") || !strcasecmp (arg2, "yes")) { if (IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "The name %s has already been rejected.\r\n", auth->name); return; } if (IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "%s's adjective has already been rejected.\r\n", auth->name); return; } if (IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "%s's description has already been rejected.\r\n", auth->name); return; } auth->state = AUTH_AUTHED; STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list ( ); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_UNAUTHED); snprintf (buf, MAX_STRING_LENGTH, "%s: authorized", auth->name); log_printf (buf); ch_printf_color (ch, "You have authorized %s.\r\n", auth->name); } else if (!strcasecmp (arg2, "reject")) { snprintf (buf, MAX_STRING_LENGTH, "%s: denied authorization", auth->name); log_printf (buf); ch_printf_color (ch, "You have denied %s.\r\n", auth->name); // /* // * Addition so that denied names get added to reserved list - Samson 10-18-98 // */ // snprintf (buf, MAX_STRING_LENGTH, "%s add", auth->name); // do_reserve (ch, buf); /* Samson 7-27-98 */ do_destroy (ch, auth->name); } else if (!strcasecmp (arg2, "review")) { if (!auth->adjective || auth->adjective[0] == '\0') sprintf(buf, "%s%s, %sa %s %s (Adjective not yet set)\n\r", colW, auth->name, colw, sex_types[auth->sex], race_table[auth->race].race_name); else sprintf(buf, "%s%s, %sa %s %s %s\n\r", colW, auth->name, colw, auth->adjective, sex_types[auth->sex], race_table[auth->race].race_name); if (!auth->descr || auth->descr[0] == '\0') cat_sprintf(buf, "%s(Description not yet set)\n\r", colw); else cat_sprintf(buf, "%sDescription:\n\r%s%s%s", colc, colw, auth->descr, colw); send_to_char(buf, ch); } else if (!strcasecmp (arg2, "name")) { if (arg3[0] == '\0') { send_to_char("Syntax: auth <name> name <accept|change>\n\r", ch); return; } if (!IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_NAME) && !IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "The name %s has already been accepted.\r\n", auth->name); return; } if (!strcasecmp(arg3, "change")) { STRFREE(auth->change_by) auth->change_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_NAME); SET_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_NAME); snprintf (buf, MAX_STRING_LENGTH, "%s: name denied", auth->name); log_printf (buf); ch_printf_color (ch, "You requested %s to change names.\r\n", auth->name); } else if (!strcasecmp(arg3, "accept")) { if (IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "The name %s has already been rejected.\r\n", auth->name); return; } STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_NAME); snprintf (buf, MAX_STRING_LENGTH, "%s: name accepted", auth->name); log_printf (buf); ch_printf_color (ch, "You authorized the name %s.\r\n", auth->name); } } else if (!strcasecmp (arg2, "adj")) { if (arg3[0] == '\0') { send_to_char("Syntax: auth <name> adj <accept|change>\n\r", ch); return; } if (!IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_ADJ) && !IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "The adjective has already been accepted.\r\n"); return; } if (!strcasecmp(arg3, "change")) { STRFREE(auth->change_by) auth->change_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_ADJ); SET_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_ADJ); snprintf (buf, MAX_STRING_LENGTH, "%s: adjective denied", auth->name); log_printf (buf); ch_printf_color (ch, "You requested %s change their adjective.\r\n", auth->name); } else if (!strcasecmp(arg3, "accept")) { if (IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "%s's adjective has already been rejected.\r\n", auth->name); return; } STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_ADJ); snprintf (buf, MAX_STRING_LENGTH, "%s: adjective accepted", auth->name); log_printf (buf); ch_printf_color (ch, "You authorized %s's adjective.\r\n", auth->name); } } else if (!strcasecmp (arg2, "desc")) { if (arg3[0] == '\0') { send_to_char("Syntax: auth <name> desc <accept|change>\n\r", ch); return; } if (!IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_DESC) && !IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "The description has already been accepted.\r\n"); return; } if (!strcasecmp(arg3, "change")) { STRFREE(auth->change_by) auth->change_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_DESC); SET_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_DESC); snprintf (buf, MAX_STRING_LENGTH, "%s: description denied", auth->name); log_printf (buf); ch_printf_color (ch, "You requested %s change their description.\r\n", auth->name); } else if (!strcasecmp(arg3, "accept")) { if (IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "%s's description has already been rejected.\r\n", auth->name); return; } STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_DESC); snprintf (buf, MAX_STRING_LENGTH, "%s: description accepted", auth->name); log_printf (buf); ch_printf_color (ch, "You authorized %s's description.\r\n", auth->name); } } else { send_to_char ("Invalid argument.\r\n", ch); } if (!IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_UNAUTHED)) { auth->state = AUTH_AUTHED; STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list ( ); } } else { if ((victim = get_char_pvnum(auth->pvnum)) == NULL) { send_to_char ("There is no such character waiting for authorization.\r\n", ch); } if (arg2[0] == '\0') { do_authorize(ch, ""); } else if (!strcasecmp (arg2, "accept") || !strcasecmp (arg2, "yes")) { if (IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "The name %s has already been rejected.\r\n", auth->name); return; } if (IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "%s's adjective has already been rejected.\r\n", auth->name); return; } if (IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "%s's description has already been rejected.\r\n", auth->name); return; } if (victim->pcdata->authed_by) STRFREE (victim->pcdata->authed_by); victim->pcdata->authed_by = STRALLOC (ch->name); snprintf (buf, MAX_STRING_LENGTH, "%s: authorized", victim->name); log_printf (buf); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_UNAUTHED); ch_printf_color (ch, "You have authorized %s.\r\n", victim->name); ch_printf_color (victim, "\r\n{138}The MUD Administrators have authorized you.\r\n" "You are now free to roam the realms.{300}\r\n"); remove_from_auth (victim->name); } else if (!strcasecmp (arg2, "reject")) { send_to_char ("{118}You have been denied access.\r\n", victim); snprintf (buf, MAX_STRING_LENGTH, "%s: denied authorization", auth->name); log_printf (buf); ch_printf_color (ch, "You have denied %s.\r\n", victim->name); remove_from_auth (victim->name); sprintf(buf, "player %s", victim->name); do_destroy (ch, buf); } else if (!strcasecmp (arg2, "review")) { if (!victim->pcdata->adjective || victim->pcdata->adjective[0] == '\0') sprintf(buf, "%s%s, %sa %s %s (Adjective not yet set)\n\r", colW, victim->name, colw, sex_types[victim->sex], race_table[victim->race].race_name); else sprintf(buf, "%s%s, %sa %s %s %s\n\r", colW, victim->name, colw, victim->pcdata->adjective, sex_types[victim->sex], race_table[victim->race].race_name); if (!victim->description || victim->description[0] == '\0') cat_sprintf(buf, "%s(Description not yet set)\n\r", colw); else cat_sprintf(buf, "%sDescription:\n\r%s%s%s", colc, colw, victim->description, colw); send_to_char(buf, ch); } else if (!strcasecmp (arg2, "name")) { if (arg3[0] == '\0') { send_to_char("Syntax: auth <name> name <accept|change>\n\r", ch); return; } if (!IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_NAME) && !IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "The name %s has already been accepted.\r\n", auth->name); return; } if (!strcasecmp(arg3, "change")) { STRFREE(auth->change_by) auth->change_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_NAME); SET_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_NAME); snprintf (buf, MAX_STRING_LENGTH, "%s: name denied", auth->name); log_printf (buf); ch_printf_color (victim, "{118}\r\nThe MUD Administrators have found your adjective to be\r\n" "unacceptable. You must set a new one. See HELP NAME.{300}\r\n"); ch_printf_color (ch, "You requested %s change names.\r\n", victim->name); } else if (!strcasecmp(arg3, "accept")) { if (IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_NAME)) { ch_printf_color (ch, "The name %s has already been rejected.\r\n", auth->name); return; } STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_NAME); snprintf (buf, MAX_STRING_LENGTH, "%s: name accepted", victim->name); log_printf (buf); ch_printf_color (ch, "You authorized the name %s.\r\n", victim->name); } } else if (!strcasecmp (arg2, "adj")) { if (arg3[0] == '\0') { send_to_char("Syntax: auth <name> adj <accept|change>\n\r", ch); return; } if (!IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_ADJ) && !IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "The adjective has already been accepted.\r\n"); return; } if (!strcasecmp(arg3, "change")) { STRFREE(auth->change_by) auth->change_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_ADJ); SET_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_ADJ); snprintf (buf, MAX_STRING_LENGTH, "%s: adjective denied", victim->name); log_printf (buf); ch_printf_color (victim, "{118}\r\nThe MUD Administrators have found your adjective to be\r\n" "unacceptable. You must set a new one. See HELP ADJECTIVE.{300}\r\n"); ch_printf_color (ch, "You requested %s change their adjective.\r\n", victim->name); } else if (!strcasecmp(arg3, "accept")) { if (IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_ADJ)) { ch_printf_color (ch, "%s's adjective has already been rejected.\r\n", victim->name); return; } STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_ADJ); snprintf (buf, MAX_STRING_LENGTH, "%s: adjective accepted", victim->name); log_printf (buf); ch_printf_color (ch, "You authorized %s's adjective.\r\n", victim->name); } } else if (!strcasecmp (arg2, "desc")) { if (arg3[0] == '\0') { send_to_char("Syntax: auth <name> desc <accept|change>\n\r", ch); return; } if (!IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_DESC) && !IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "The description has already been accepted.\r\n"); return; } if (!strcasecmp(arg3, "change")) { STRFREE(auth->change_by) auth->change_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_DESC); SET_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_DESC); snprintf (buf, MAX_STRING_LENGTH, "%s: description denied", victim->name); log_printf (buf); ch_printf_color (victim, "{118}\r\nThe MUD Administrators have found your description to be\r\n" "unacceptable. You must set a new one. See HELP DESC.{300}\r\n"); ch_printf_color (ch, "You requested %s change their description.\r\n", victim->name); } else if (!strcasecmp(arg3, "accept")) { if (IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_CHNG_DESC)) { ch_printf_color (ch, "%s's description has already been rejected.\r\n", victim->name); return; } STRFREE(auth->authed_by); auth->authed_by = STRALLOC (ch->name); save_auth_list(); REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_AUTH_DESC); snprintf (buf, MAX_STRING_LENGTH, "%s: description accepted", victim->name); log_printf (buf); ch_printf_color (ch, "You authorized %s's description.\r\n", victim->name); } } else { send_to_char ("Invalid argument.\r\n", ch); } if (!IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_UNAUTHED)) { if (victim->pcdata->authed_by) STRFREE (victim->pcdata->authed_by); victim->pcdata->authed_by = STRALLOC (ch->name); ch_printf_color (victim, "\r\n{138}The MUD Administrators have authorized you.\r\n" "You are now free to roam the realms.{300}\r\n"); remove_from_auth (victim->name); } } save_players(); } else { send_to_char ("No such player pending authorization.\r\n", ch); return; } } /* changed for new auth */ void auth_update (void) { AUTH_LIST *auth; char buf[MAX_INPUT_LENGTH]; char buf2[MAX_INPUT_LENGTH]; char log_buf[MAX_INPUT_LENGTH]; DESCRIPTOR_DATA *d; CHAR_DATA *victim; int level = LEVEL_IMMORTAL; char colc[10], colw[10], colW[10]; bool found_hit = FALSE; /* was at least one found? */ strcpy(colc, "{200}"); strcpy(colw, "{078}"); strcpy(colW, "{178}"); sprintf(log_buf, "\r\n%sCharacters awaiting approval%s\r\n", colc, colw); for (auth = first_auth_name; auth; auth = auth->next) { if (auth != NULL && IS_SET(pvnum_index[auth->pvnum]->flags, PVNUM_AUTH_NAME|PVNUM_AUTH_ADJ|PVNUM_AUTH_DESC)) { found_hit = TRUE; if (!auth->adjective || auth->adjective[0] == '\0') sprintf(buf, " %s%s, %sa %s %s (Adjective not yet set)", colW, auth->name, colw, race_table[auth->race].race_name, sex_types[auth->sex]); else sprintf(buf, " %s%s, %sa %s %s %s", colW, auth->name, colw, auth->adjective, sex_types[auth->sex], race_table[auth->race].race_name); str_resize(buf, buf2, -64); switch (auth->state) { default: cat_sprintf (log_buf, "%-64s %sStatus: %sUnknown?\n\r", buf, colW, colw); break; case AUTH_LINK_DEAD: cat_sprintf (log_buf, "%-64s %sStatus: %sLink Dead\n\r", buf, colW, colw); break; case AUTH_ONLINE: cat_sprintf (log_buf, "%-64s %sStatus: %sOnline\n\r", buf, colW, colw); break; case AUTH_OFFLINE: cat_sprintf (log_buf, "%-64s %sStatus: %sOffline\n\r", buf, colW, colw); break; } if ((victim = get_char_pvnum(auth->pvnum)) != NULL) { if (!victim->pcdata->adjective || victim->pcdata->adjective[0] == '\0') { ch_printf_color (victim, "{118}\r\nYou have not yet set your adjective. You cannot be\r\n" "authorized until you set one. See HELP ADJECTIVE.{300}\r\n"); } } } } if (found_hit) { for (d = mud->f_desc; d; d = d->next) if (d->connected == CON_PLAYING && d->character && IS_IMMORTAL (d->character) && d->character->level >= level) send_to_char_color(log_buf, d->character); } } // void save_reserved args ( (void)); // void sort_reserved args ( (RESERVE_DATA * pRes)); // // /* Modified to require an "add" or "remove" argument in addition to name - Samson 10-18-98 */ // void do_reserve (CHAR_DATA * ch, char *argument) // { // char arg[MAX_INPUT_LENGTH]; // char arg2[MAX_INPUT_LENGTH]; // RESERVE_DATA *res; // // set_char_color (AT_PLAIN, ch); // // argument = one_argument (argument, arg); // argument = one_argument (argument, arg2); // // if (!*arg) // { // int wid = 0; // // send_to_char ("To add a name: reserve <name> add\r\nTo remove a name: reserve <name> remove\r\n", ch); // send_to_char ("\r\n-- Reserved Names --\r\n", ch); // for (res = first_reserved; res; res = res->next) // { // ch_printf_color (ch, "%c%-17s ", (*res->name == '*' ? '*' : ' '), (*res->name == '*' ? res->name + 1 : res->name)); // if (++wid % 4 == 0) // send_to_char ("\r\n", ch); // } // if (wid % 4 != 0) // send_to_char ("\r\n", ch); // return; // } // // if (!strcasecmp (arg2, "remove")) // { // for (res = first_reserved; res; res = res->next) // if (!strcasecmp (arg, res->name)) // { // UNLINK (res, first_reserved, last_reserved, next, prev); // FREEMEM (res->name); // FREEMEM (res); // save_reserved ( ); // send_to_char ("Name no longer reserved.\r\n", ch); // return; // } // ch_printf_color (ch, "The name %s isn't on the reserved list.\r\n", arg); // return; // // } // // if (!strcasecmp (arg2, "add")) // { // for (res = first_reserved; res; res = res->next) // if (!strcasecmp (arg, res->name)) // { // ch_printf_color (ch, "The name %s has already been reserved.\r\n", arg); // return; // } // // ALLOCMEM (res, RESERVE_DATA, 1); // res->name = str_dup (arg); // sort_reserved (res); // save_reserved ( ); // send_to_char ("Name reserved.\r\n", ch); // return; // } // send_to_char ("Invalid argument.\r\n", ch); // }