void send_icqpage(UR_OBJECT user, char *inpstr) { char fname[FNAME_LEN], icqnum[ICQ_LEN+1], subj[100], addr[100]; int on; UR_OBJECT ur; FILE *fp; if (word_count<3) { write_usage(user, "%s <user>/<ICQ#> <text>", command_table[ICQPAGE].name); return; } icqnum[0]='\0'; if (is_number(word[1])) strncpy(icqnum, word[1], ICQ_LEN); else { if (!(ur=get_user_name(user, word[1]))) { if (!(ur=create_user())) { vwrite_user(user, "%s: nemozem vytvorit docasny user objekt.\n", syserror); write_syslog(ERRLOG, 1, "Unable to create temp user object in send_icqpage()\n"); return; } strcpy(ur->name, word[1]); if (!load_user_details(ur)) { write_user(user, nosuchuser); destruct_user(ur); destructed=0; return; } on=0; } else on=1; strcpy(icqnum, ur->icq); if (!on) { destruct_user(ur); destructed=0; } } if (icqnum[0]=='\0') { write_user(user, "sprava neposlana, chybne alebo nezistitelne ICQ cislo\n"); return; } sprintf(fname, "%s/%s.icq", TEMPFILES, user->name); if (!(fp=fopen(fname, "w"))) { write_user(user, "nemozem vytvorit docasny subor pre spravu\n"); write_syslog(ERRLOG, 1, "unable to open file in send_icqpage()\n"); return; } fprintf(fp, icq_page_email); fprintf(fp, "%s\n", remove_first(inpstr)); fclose(fp); sprintf(addr, "*****@*****.**", icqnum); sprintf(subj, "ICQ page from %s", user->name); send_email(addr, subj, fname); write_user(user, "sprava bola odoslana\n"); }
void com_nick_grm(UR_OBJECT user) { UR_OBJECT u; int on; set_crash(); if ((word_count<2) || (user->level<GOD)) { u=user; on=1; } else { if (!(u=get_user(word[1]))) { if ((u=create_user())==NULL) { vwrite_user(user,"%s: nemozem vytvorit docasny user objekt.\n",syserror); write_syslog(ERRLOG,1,"Unable to create temporary user object in examine().\n"); return; } strcpy(u->name,word[1]); if (!load_user_details(u)) { write_user(user,nosuchuser); destruct_user(u); destructed=0; return; } on=0; } else on=1; } vwrite_user(user, "2. p - G: %s\n", u->nameg); vwrite_user(user, "3. p - D: %s\n", u->named); vwrite_user(user, "4. p - A: %s\n", u->namea); vwrite_user(user, "6. p - L: %s\n", u->namel); vwrite_user(user, "7. p - I: %s\n", u->namei); vwrite_user(user, "privl. pre muzsky rod : %s\n", u->namex); vwrite_user(user, "privl. pre zensky rod : %s\n", u->namey); vwrite_user(user, "privl. pre stredny rod: %s\n", u->namez); if (!on) { destruct_user(u); destructed=0; } return; }
/*** Get all users from the user directories and add them to the user lists. If verbose mode is on, then attempt to get date string as well ***/ void process_users(void) { char name[USER_NAME_LEN+3]; DIR *dirp; struct dirent *dp; UR_OBJECT u; set_crash(); /* open the directory file up */ dirp=opendir(USERFILES); if (dirp==NULL) { fprintf(stderr,"Lotos: Directory open failure in process_users().\n"); boot_exit(12); } if ((u=create_user())==NULL) { fprintf(stderr,"Lotos: Create user failure in process_users().\n"); (void) closedir(dirp); boot_exit(17); } /* count up how many files in the directory - this include . and .. */ while((dp=readdir(dirp))!=NULL) { if (!strcmp(dp->d_name,".") || !strcmp(dp->d_name,"..")) continue; if (strstr(dp->d_name,".D")) { strcpy(name,dp->d_name); name[strlen(name)-2]='\0'; strcpy(u->name,name); if (load_user_details(u)) { add_user_node(u->name,u->level); if (u->level>=WIZ) add_wiz_node(u->name,u->level); add_user_date_node(u->name,u->date); } /* end if */ else { fprintf(stderr,"Lotos: Could not load userfile for '%s' in process_users().\n",name); (void) closedir(dirp); boot_exit(18); } } /* end if */ reset_user(u); } /* end while */ destruct_user(u); closedir(dirp); }
/* * retrieve_user() and done_retrieve() by Ardant ([email protected]) * basically the above two functions rolled into one easy function * modified to allow for NULL user object */ UR_OBJECT retrieve_user(UR_OBJECT user, const char *name) { UR_OBJECT u; UD_OBJECT entry, last; int found; size_t len; len = strlen(name); last = NULL; found = 0; *text = '\0'; for (entry = first_user_entry; entry; entry = entry->next) { if (!strncasecmp(entry->name, name, len)) { if (strlen(entry->name) == len) { break; } /* FIXME: Bounds checking */ strcat(text, found++ % 8 ? " " : "\n "); strcat(text, entry->name); last = entry; } } if (entry) { found = 1; last = entry; } if (found > 1) { if (user) { vwrite_user(user, "\n~FR~OLName is not unique. \"~FT%s~RS~FR~OL\" also matches:\n", name); vwrite_user(user, " %s\n\n", text); } retrieve_user_type = 0; *text = '\0'; return NULL; } *text = '\0'; if (!found) { if (user) { write_user(user, nosuchuser); } retrieve_user_type = 0; return NULL; } u = get_user(last->name); if (u) { retrieve_user_type = 1; return u; } u = create_user(); if (!u) { sprintf(text, "%s: unable to create temporary user object.\n", syserror); if (user) { write_user(user, text); } write_syslog(SYSLOG, 1, text); *text = '\0'; retrieve_user_type = 0; return NULL; } strcpy(u->name, last->name); if (!load_user_details(u)) { destruct_user(u); destructed = 0; if (user) { write_user(user, nosuchuser); } retrieve_user_type = 0; return NULL; } retrieve_user_type = 2; return u; }
/*** send smail to the email ccount ***/ void forward_email(char *name, char *from, char *message) { FILE *fp; UR_OBJECT u; char fname[FNAME_LEN]; int on=0; set_crash(); if (!amsys->forwarding) return; if ((u=get_user(name))) { on=1; goto SKIP; } /* Have to create temp user if not logged on to check if email verified, etc */ if ((u=create_user())==NULL) { write_syslog(ERRLOG,1,"Unable to create temporary user object in forward_email().\n"); return; } strcpy(u->name,name); if (!load_user_details(u)) { destruct_user(u); destructed=0; return; } on=0; SKIP: if (!u->mail_verified) { if (!on) { destruct_user(u); destructed=0; } return; } if (!u->autofwd){ if (!on) { destruct_user(u); destructed=0; } return; } sprintf(fname,"%s/%s.FWD",MAILSPOOL,u->name); if (!(fp=fopen(fname,"w"))) { write_syslog(SYSLOG,0,"Unable to open forward mail file in set_forward_email()\n"); return; } fprintf(fp,"From: %s\n",reg_sysinfo[TALKERNAME]); fprintf(fp,"To: %s <%s>\n\n",u->name,u->email); from=colour_com_strip(from); fputs(from,fp); fputs("\n",fp); message=colour_com_strip(message); fputs(message,fp); fputs("\n\n",fp); fputs(talker_signature,fp); fclose(fp); send_email(u->email, "Auto-forward of smail", fname); write_syslog(SYSLOG,1,"%s had mail sent to their email address.\n",u->name); if (!on) { destruct_user(u); destructed=0; } return; }
/* * Delete a user */ void delete_user(UR_OBJECT user, int this_user) { char name[USER_NAME_LEN + 1]; UR_OBJECT u; if (this_user) { /* * User structure gets destructed in disconnect_user(), need to keep a * copy of the name */ strcpy(name, user->name); write_user(user, "\n~FR~LI~OLACCOUNT DELETED!\n"); vwrite_room_except(user->room, user, "~OL~LI%s commits suicide!\n", user->name); write_syslog(SYSLOG, 1, "%s SUICIDED.\n", name); disconnect_user(user); clean_files(name); rem_user_node(name); return; } if (word_count < 2) { write_user(user, "Usage: nuke <user>\n"); return; } *word[1] = toupper(*word[1]); if (!strcmp(word[1], user->name)) { write_user(user, "Trying to delete yourself is the eleventh sign of madness.\n"); return; } if (get_user(word[1])) { /* Safety measure just in case. Will have to .kill them first */ write_user(user, "You cannot delete a user who is currently logged on.\n"); return; } u = create_user(); if (!u) { vwrite_user(user, "%s: unable to create temporary user object.\n", syserror); write_syslog(SYSLOG | ERRLOG, 0, "ERROR: Unable to create temporary user object in delete_user().\n"); return; } strcpy(u->name, word[1]); if (!load_user_details(u)) { write_user(user, nosuchuser); destruct_user(u); destructed = 0; return; } if (u->level >= user->level) { write_user(user, "You cannot delete a user of an equal or higher level than yourself.\n"); destruct_user(u); destructed = 0; return; } clean_files(u->name); rem_user_node(u->name); vwrite_user(user, "\07~FR~OL~LIUser %s deleted!\n", u->name); write_syslog(SYSLOG, 1, "%s DELETED %s.\n", user->name, u->name); destruct_user(u); destructed = 0; }
/* * read all the user files to check if a user exists */ void recount_users(UR_OBJECT user, char *inpstr) { char filename[80], *s; DIR *dirp; FILE *fp; struct dirent *dp; UD_OBJECT entry, next; UR_OBJECT u; int incorrect, correct, added, removed; if (!user->misc_op) { user->misc_op = 17; write_user(user, "~OL~FRWARNING:~RS This process may take some time if you have a lot of user accounts.\n"); write_user(user, " This should only be done if there are no, or minimal, users currently\n logged on.\n"); write_user(user, "\nDo you wish to continue (y|n)? "); return; } user->misc_op = 0; if (tolower(*inpstr) != 'y') { return; } write_user(user, "\n+----------------------------------------------------------------------------+\n"); incorrect = correct = added = removed = 0; write_user(user, "~OLRecounting all of the users...\n"); /* First process the files to see if there are any to add to the directory listing */ write_user(user, "Processing users to add..."); u = create_user(); if (!u) { write_user(user, "ERROR: Cannot create user object.\n"); write_syslog(SYSLOG | ERRLOG, 1, "ERROR: Cannot create user object in recount_users().\n"); return; } /* open the directory file up */ dirp = opendir(USERFILES); if (!dirp) { write_user(user, "ERROR: Failed to open userfile directory.\n"); write_syslog(SYSLOG | ERRLOG, 1, "ERROR: Directory open failure in recount_users().\n"); return; } /* count up how many files in the directory - this include . and .. */ for (dp = readdir(dirp); dp; dp = readdir(dirp)) { s = strchr(dp->d_name, '.'); if (!s || strcmp(s, ".D")) { continue; } *u->name = '\0'; strncat(u->name, dp->d_name, (size_t) (s - dp->d_name)); for (entry = first_user_entry; entry; entry = next) { next = entry->next; if (!strcmp(u->name, entry->name)) { break; } } if (!entry) { if (load_user_details(u)) { add_user_node(u->name, u->level); write_syslog(SYSLOG, 0, "Added new user node for existing user \"%s\"\n", u->name); ++added; reset_user(u); } /* FIXME: Probably ought to warn about this case */ } else { ++correct; } } closedir(dirp); destruct_user(u); /* * Now process any nodes to remove the directory listing. This may * not be optimal to do one loop to add and then one to remove, but * it is the best way I can think of doing it right now at 4:27am! */ write_user(user, "\nProcessing users to remove..."); for (entry = first_user_entry; entry; entry = next) { next = entry->next; sprintf(filename, "%s/%s.D", USERFILES, entry->name); fp = fopen(filename, "r"); if (!fp) { ++removed; --correct; write_syslog(SYSLOG, 0, "Removed user node for \"%s\" - user file does not exist.\n", entry->name); rem_user_node(entry->name); } else { fclose(fp); } } write_user(user, "\n+----------------------------------------------------------------------------+\n"); vwrite_user(user, "Checked ~OL%d~RS user%s. ~OL%d~RS node%s %s added, and ~OL%d~RS node%s %s removed.\n", added + removed + correct, PLTEXT_S(added + removed + correct), added, PLTEXT_S(added), PLTEXT_WAS(added), removed, PLTEXT_S(removed), PLTEXT_WAS(removed)); if (incorrect) { write_user(user, "See the system log for further details.\n"); } write_user(user, "+----------------------------------------------------------------------------+\n"); }