home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / NEWUSER.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  11.7 KB  |  405 lines

  1. #line 1 "NEWUSER.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6. #include "cmdshell.h"
  7.  
  8. extern char qwklogon;
  9.  
  10. /****************************************************************************/
  11. /* This function is invoked when a user enters "NEW" at the NN: prompt        */
  12. /* Prompts user for personal information and then sends feedback to sysop.  */
  13. /* Called from function waitforcall                                            */
  14. /****************************************************************************/
  15. void newuser()
  16. {
  17.     char    c,str[512],usa;
  18.     int     file;
  19.     uint    i,j;
  20.     long    misc;
  21.     FILE    *stream;
  22.  
  23. if(cur_rate<node_minbps) {
  24.     bprintf(text[MinimumModemSpeed],node_minbps);
  25.     sprintf(str,"%sTOOSLOW.MSG",text_dir);
  26.     if(fexist(str))
  27.         printfile(str,0);
  28.     sprintf(str,"New user modem speed: %lu<%u"
  29.         ,cur_rate,node_minbps);
  30.     logline("N!",str);
  31.     hangup();
  32.     return; }
  33.  
  34. getnodedat(node_num,&thisnode,0);
  35. if(thisnode.misc&NODE_LOCK) {
  36.     bputs(text[NodeLocked]);
  37.     logline("N!","New user locked node logon attempt");
  38.     hangup();
  39.     return; }
  40.  
  41. if(sys_misc&SM_CLOSED) {
  42.     bputs(text[NoNewUsers]);
  43.     hangup();
  44.     return; }
  45. getnodedat(node_num,&thisnode,1);
  46. thisnode.status=NODE_NEWUSER;
  47. if(online==ON_LOCAL)
  48.     thisnode.connection=0;
  49. else
  50.     thisnode.connection=cur_rate;
  51. putnodedat(node_num,thisnode);
  52. memset(&useron,0,sizeof(user_t));      /* Initialize user info to null */
  53. if(new_pass[0] && online==ON_REMOTE) {
  54.     c=0;
  55.     while(++c<4) {
  56.         bputs(text[NewUserPasswordPrompt]);
  57.         getstr(str,40,K_UPPER);
  58.         if(!strcmp(str,new_pass))
  59.             break;
  60.         sprintf(tmp,"NUP Attempted: '%s'",str);
  61.         logline("N!",tmp); }
  62.     if(c==4) {
  63.         sprintf(str,"%sNUPGUESS.MSG",text_dir);
  64.         if(fexist(str))
  65.             printfile(str,P_NOABORT);
  66.         hangup();
  67.         return; } }
  68.  
  69. if(autoterm || yesno(text[AutoTerminalQ])) {
  70.     useron.misc|=AUTOTERM;
  71.     useron.misc|=autoterm; }
  72.  
  73. if(!(useron.misc&AUTOTERM)) {
  74.     if(yesno(text[AnsiTerminalQ]))
  75.         useron.misc|=ANSI; }
  76.  
  77. if(useron.misc&ANSI) {
  78.     useron.rows=0;    /* Auto-rows */
  79.     if(useron.misc&(RIP|WIP) || yesno(text[ColorTerminalQ]))
  80.         useron.misc|=COLOR; }
  81. else
  82.     useron.rows=24;
  83. if(!yesno(text[ExAsciiTerminalQ]))
  84.     useron.misc|=NO_EXASCII;
  85.  
  86. /* Sets defaults per sysop config */
  87. useron.misc|=(new_misc&~(DELETED|INACTIVE|QUIET|NETMAIL));
  88. useron.qwk=(QWK_FILES|QWK_ATTACH|QWK_EMAIL|QWK_DELMAIL);
  89. strcpy(useron.modem,connection);
  90. useron.firston=useron.laston=useron.pwmod=time(NULL);
  91. if(new_expire) {
  92.     now=time(NULL);
  93.     useron.expire=now+((long)new_expire*24L*60L*60L); }
  94. else
  95.     useron.expire=0;
  96. useron.sex=SP;
  97. useron.prot=new_prot;
  98. strcpy(useron.note,cid);        /* Caller ID if supported, NULL otherwise */
  99. strcpy(useron.alias,"New");     /* just for status line */
  100. strcpy(useron.modem,connection);
  101. if(!lastuser()) {    /* Automatic sysop access for first user */
  102.     useron.level=99;
  103.     useron.exempt=useron.flags1=useron.flags2=0xffffffffUL;
  104.     useron.flags3=useron.flags4=0xffffffffUL;
  105.     useron.rest=0L; }
  106. else {
  107.     useron.level=new_level;
  108.     useron.flags1=new_flags1;
  109.     useron.flags2=new_flags2;
  110.     useron.flags3=new_flags3;
  111.     useron.flags4=new_flags4;
  112.     useron.rest=new_rest;
  113.     useron.exempt=new_exempt; }
  114.  
  115. useron.cdt=new_cdt;
  116. useron.min=new_min;
  117. useron.freecdt=level_freecdtperday[useron.level];
  118.  
  119. if(total_fcomps)
  120.     strcpy(useron.tmpext,fcomp[0]->ext);
  121. else
  122.     strcpy(useron.tmpext,"ZIP");
  123. for(i=0;i<total_xedits;i++)
  124.     if(!stricmp(xedit[i]->code,new_xedit) && chk_ar(xedit[i]->ar,useron))
  125.         break;
  126. if(i<total_xedits)
  127.     useron.xedit=i+1;
  128.  
  129.  
  130. useron.shell=new_shell;
  131.  
  132. statline=sys_def_stat;
  133. statusline();
  134. useron.alias[0]=0;
  135. while(online) {
  136.     while(online) {
  137.         if(uq&UQ_ALIASES)
  138.             bputs(text[EnterYourAlias]);
  139.         else
  140.             bputs(text[EnterYourRealName]);
  141.         getstr(useron.alias,LEN_ALIAS
  142.             ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL);
  143.         truncsp(useron.alias);
  144.         if(useron.alias[0]<=SP || !isalpha(useron.alias[0])
  145.             || strchr(useron.alias,0xff)
  146.             || matchuser(useron.alias) || trashcan(useron.alias,"NAME")
  147.             || (!(uq&UQ_ALIASES) && !strchr(useron.alias,SP))) {
  148.             bputs(text[YouCantUseThatName]);
  149.             continue; }
  150.         break; }
  151.     statusline();
  152.     if(!online) return;
  153.     if(uq&UQ_ALIASES && uq&UQ_REALNAME) {
  154.         while(online) {
  155.             bputs(text[EnterYourRealName]);
  156.             if(!getstr(useron.name,LEN_NAME
  157.                 ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)
  158.                 || trashcan(useron.name,"NAME")
  159.                 || strchr(useron.name,0xff)
  160.                 || !strchr(useron.name,SP)
  161.                 || (uq&UQ_DUPREAL
  162.                     && userdatdupe(useron.number,U_NAME,LEN_NAME
  163.                         ,useron.name,0)))
  164.                 bputs(text[YouCantUseThatName]);
  165.             else
  166.                 break; } }
  167.     else if(uq&UQ_COMPANY) {
  168.             bputs(text[EnterYourCompany]);
  169.             getstr(useron.name,LEN_NAME,(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL); }
  170.     if(!useron.name[0])
  171.         strcpy(useron.name,useron.alias);
  172.     if(!online) return;
  173.     if(!useron.handle[0])
  174.         sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias);
  175.     while(uq&UQ_HANDLE && online) {
  176.         bputs(text[EnterYourHandle]);
  177.         if(!getstr(useron.handle,LEN_HANDLE
  178.             ,K_LINE|K_EDIT|K_AUTODEL|(uq&UQ_NOEXASC))
  179.             || strchr(useron.handle,0xff)
  180.             || (uq&UQ_DUPHAND
  181.                 && userdatdupe(0,U_HANDLE,LEN_HANDLE,useron.handle,0))
  182.             || trashcan(useron.handle,"NAME"))
  183.             bputs(text[YouCantUseThatName]);
  184.         else
  185.             break; }
  186.     if(!online) return;
  187.     if(uq&UQ_ADDRESS)
  188.         while(online) {        /* Get address and zip code */
  189.             bputs(text[EnterYourAddress]);
  190.             if(getstr(useron.address,LEN_ADDRESS
  191.                 ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL))
  192.                 break; }
  193.     if(!online) return;
  194.     while(uq&UQ_LOCATION && online) {
  195.         bputs(text[EnterYourCityState]);
  196.         if(getstr(useron.location,LEN_LOCATION
  197.             ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)
  198.             && (uq&UQ_NOCOMMAS || strchr(useron.location,',')))
  199.             break;
  200.         bputs("\r\nYou must include a comma between the city and state.\r\n");
  201.         useron.location[0]=0; }
  202.     if(uq&UQ_ADDRESS)
  203.         while(online) {
  204.             bputs(text[EnterYourZipCode]);
  205.             if(getstr(useron.zipcode,LEN_ZIPCODE
  206.                 ,K_UPPER|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL))
  207.                 break; }
  208.     if(!online) return;
  209.     if(uq&UQ_PHONE) {
  210.         usa=yesno(text[CallingFromNorthAmericaQ]);
  211.         while(online) {
  212.             bputs(text[EnterYourPhoneNumber]);
  213.             if(!usa) {
  214.                 if(getstr(useron.phone,LEN_PHONE
  215.                     ,K_UPPER|K_LINE|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)<5)
  216.                     continue; }
  217.             else {
  218.                 if(gettmplt(useron.phone,sys_phonefmt
  219.                     ,K_LINE|(uq&UQ_NOEXASC)|K_EDIT)<strlen(sys_phonefmt))
  220.                     continue; }
  221.             if(!trashcan(useron.phone,"PHONE"))
  222.                 break; } }
  223.     if(!online) return;
  224.     if(uq&UQ_SEX) {
  225.         bputs(text[EnterYourSex]);
  226.         useron.sex=getkeys("MF",0); }
  227.     while(uq&UQ_BIRTH && online) {
  228.         bputs(text[EnterYourBirthday]);
  229.         if(gettmplt(useron.birth,"nn/nn/nn",K_EDIT)==8 && getage(useron.birth))
  230.             break; }
  231.     if(yesno(text[UserInfoCorrectQ]))
  232.         break; }
  233. sprintf(str,"New user: %s",useron.alias);
  234. logline("N",str);
  235. if(!online) return;
  236. if(uq&UQ_COMP)
  237.     getcomputer(useron.comp);
  238. CLS;
  239. sprintf(str,"%sSBBS.MSG",text_dir);
  240. printfile(str,P_NOABORT);
  241. if(lncntr)
  242.     pause();
  243. CLS;
  244. sprintf(str,"%sSYSTEM.MSG",text_dir);
  245. printfile(str,P_NOABORT);
  246. if(lncntr)
  247.     pause();
  248. CLS;
  249. sprintf(str,"%sNEWUSER.MSG",text_dir);
  250. printfile(str,P_NOABORT);
  251. if(lncntr)
  252.     pause();
  253. CLS;
  254. answertime=time(NULL);        /* could take 10 minutes to get this far */
  255.  
  256. if(total_xedits && uq&UQ_XEDIT && !noyes("Use an external editor")) {
  257.     if(useron.xedit) useron.xedit--;
  258.     for(i=0;i<total_xedits;i++)
  259.         uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar);
  260.     if((int)(i=uselect(0,useron.xedit,0,0,0))>=0)
  261.         useron.xedit=i+1; }
  262.  
  263. if(total_shells>1 && uq&UQ_CMDSHELL) {
  264.     for(i=0;i<total_shells;i++)
  265.         uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar);
  266.     if((int)(i=uselect(0,useron.shell,0,0,0))>=0)
  267.         useron.shell=i; }
  268.  
  269. c=0;
  270. while(c<LEN_PASS) {                 /* Create random password */
  271.     useron.pass[c]=random(43)+48;
  272.     if(isalnum(useron.pass[c]))
  273.         c++; }
  274. useron.pass[c]=0;
  275. bprintf(text[YourPasswordIs],useron.pass);
  276.  
  277. if(sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ]))
  278.     while(online) {
  279.         bputs(text[NewPassword]);
  280.         getstr(str,LEN_PASS,K_UPPER|K_LINE);
  281.         truncsp(str);
  282.         if(chkpass(str,useron)) {
  283.             strcpy(useron.pass,str);
  284.             CRLF;
  285.             bprintf(text[YourPasswordIs],useron.pass);
  286.             break; }
  287.         CRLF; }
  288.  
  289. c=0;
  290. while(online) {
  291.     bprintf(text[NewUserPasswordVerify]);
  292.     console|=CON_R_ECHOX;
  293.     if(!(sys_misc&SM_ECHO_PW))
  294.         console|=CON_L_ECHOX;
  295.     str[0]=0;
  296.     getstr(str,LEN_PASS,K_UPPER);
  297.     console&=~(CON_R_ECHOX|CON_L_ECHOX);
  298.     if(!strcmp(str,useron.pass)) break;
  299.     sprintf(tmp,"Failed PW verification: '%s' instead of '%s'",str
  300.         ,useron.pass);
  301.     logline(nulstr,tmp);
  302.     if(++c==4) {
  303.         logline("N!","Couldn't figure out password.");
  304.         hangup(); }
  305.     bputs(text[IncorrectPassword]);
  306.     bprintf(text[YourPasswordIs],useron.pass); }
  307. if(!online) return;
  308. if(new_magic[0]) {
  309.     bputs(text[MagicWordPrompt]);
  310.     str[0]=0;
  311.     getstr(str,50,K_UPPER);
  312.     if(strcmp(str,new_magic)) {
  313.         bputs(text[FailedMagicWord]);
  314.         sprintf(tmp,"Failed magic word: '%s'",str);
  315.         logline("N!",tmp);
  316.         hangup(); }
  317.     if(!online) return; }
  318.  
  319. i=1;
  320. bputs(text[CheckingSlots]);
  321. sprintf(str,"%s\\USER\\NAME.DAT",data_dir);
  322. if(fexist(str)) {
  323.     if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
  324.         errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
  325.         hangup();
  326.         return; }
  327.     j=filelength(file)/(LEN_ALIAS+2);       /* total users */
  328.     while(i<=j) {
  329.         fread(str,LEN_ALIAS+2,1,stream);
  330.         for(c=0;c<LEN_ALIAS;c++)
  331.             if(str[c]==ETX) break;
  332.         str[c]=0;
  333.         if(!c) {     /* should be a deleted user */
  334.             getuserrec(i,U_MISC,8,str);
  335.             misc=ahtoul(str);
  336.             if(misc&DELETED) {     /* deleted bit set too */
  337.                 getuserrec(i,U_LASTON,8,str);
  338.                 now=ahtoul(str);                /* delete long enough ? */
  339.                 if((time(NULL)-now)/86400>=sys_deldays) break; } }
  340.         i++; }
  341.     fclose(stream); }
  342.  
  343. j=lastuser();        /* Check against data file */
  344. if(i<=j) {            /* Overwriting existing user */
  345.     getuserrec(i,U_MISC,8,str);
  346.     misc=ahtoul(str);
  347.     if(!(misc&DELETED)) /* Not deleted? Set usernumber to end+1 */
  348.         i=j+1; }
  349.  
  350. useron.number=i;
  351. putuserdat(useron);
  352. putusername(useron.number,useron.alias);
  353. logline(nulstr,"Wrote user data");
  354. if(new_sif[0]) {
  355.     sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,useron.number);
  356.     create_sif_dat(new_sif,str); }
  357. if(!(uq&UQ_NODEF))
  358.     maindflts(useron);
  359.  
  360. delallmail(useron.number);
  361.  
  362. if(useron.number!=1 && node_valuser) {
  363.     sprintf(str,"%sFEEDBACK.MSG",text_dir);
  364.     CLS;
  365.     printfile(str,P_NOABORT);
  366.     sprintf(str,text[NewUserFeedbackHdr]
  367.         ,nulstr,getage(useron.birth),useron.sex,useron.birth
  368.         ,useron.name,useron.phone,useron.comp,useron.modem);
  369.     email(node_valuser,str,"New User Validation",WM_EMAIL);
  370.     if(!useron.fbacks && !useron.emails) {
  371.         if(online) {                        /* didn't hang up */
  372.             bprintf(text[NoFeedbackWarning],username(node_valuser,tmp));
  373.             email(node_valuser,str,"New User Validation",WM_EMAIL);
  374.             } /* give 'em a 2nd try */
  375.         if(!useron.fbacks && !useron.emails) {
  376.             bprintf(text[NoFeedbackWarning],username(node_valuser,tmp));
  377.             logline("N!","Aborted feedback");
  378.             hangup();
  379.             putuserrec(useron.number,U_COMMENT,60,"Didn't leave feedback");
  380.             putuserrec(useron.number,U_MISC,8
  381.                 ,ultoa(useron.misc|DELETED,tmp,16));
  382.             putusername(useron.number,nulstr);
  383.             return; } } }
  384.  
  385. sprintf(str,"%sFILE\\%04u.IN",data_dir,useron.number);  /* delete any files */
  386. delfiles(str,"*.*");                                    /* waiting for user */
  387. rmdir(str);
  388. sprintf(tmp,"%04u.*",useron.number);
  389. sprintf(str,"%sFILE",data_dir);
  390. delfiles(str,tmp);
  391.  
  392. answertime=starttime=time(NULL);      /* set answertime to now */
  393. sprintf(str,"%sUSER\\PTRS\\%04u.IXB",data_dir,useron.number); /* msg ptrs */
  394. remove(str);
  395. sprintf(str,"%sMSGS\\%04u.MSG",data_dir,useron.number); /* delete short msg */
  396. remove(str);
  397. sprintf(str,"%sUSER\\%04u.MSG",data_dir,useron.number); /* delete ex-comment */
  398. remove(str);
  399. if(newuser_mod[0])
  400.     exec_bin(newuser_mod,&main_csi);
  401. user_event(EVENT_NEWUSER);
  402. logline("N+","Successful new user logon");
  403. sys_status|=SS_NEWUSER;
  404. }
  405.