home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / WWIV412S.ZIP / NEWUSER.C < prev    next >
C/C++ Source or Header  |  1990-08-05  |  15KB  |  628 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.               Copyright (C) 1988 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vardec.h"
  18. #include "fcns.h"
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <io.h>
  22. #include <fcntl.h>
  23.  
  24. extern userrec thisuser;
  25. extern configrec syscfg;
  26. extern int hangup;
  27. extern char ctypes[NUM_CTYPES][18];
  28. extern unsigned char realsl;
  29. extern statusrec status;
  30. extern int usernum,userfile,incom,echo,screenlinest;
  31. extern char irt[81],curspeed[80];
  32.  
  33.  
  34. int check_name(char *nn)
  35. {
  36.   int ok,f,i;
  37.   char s[161],s1[161],s2[81];
  38.   long p,l;
  39.  
  40.   ok=1;
  41.   if (nn[strlen(nn)-1]==32)
  42.     ok=0;
  43.   if (nn[0]<65)
  44.     ok=0;
  45.   if (finduser(nn)!=0)
  46.     ok=0;
  47.   if (strchr(nn,'@')!=NULL)
  48.     ok=0;
  49.   if (strchr(nn,'#')!=NULL)
  50.     ok=0;
  51.  
  52.   if (!ok)
  53.     return(ok);
  54.  
  55.   sprintf(s,"%sTRASHCAN.TXT",syscfg.gfilesdir);
  56.   f=open(s,O_RDWR | O_BINARY);
  57.  
  58.   if (f<0)
  59.     return(ok);
  60.  
  61.   lseek(f,0L,SEEK_SET);
  62.   l=filelength(f);
  63.   p=0;
  64.   sprintf(s2," %s ",nn);
  65.   while ((p<l) && (ok)) {
  66.     lseek(f,p,SEEK_SET);
  67.     read(f,(void *)s,150);
  68.     i=0;
  69.     while ((i<150) && (s[i])) {
  70.       if (s[i]==13)
  71.     s[i]=0;
  72.       else
  73.     ++i;
  74.     }
  75.     s[150]=0;
  76.     p += (long) (i+2);
  77.     if (s[i-1]==1)
  78.       s[i-1]=0;
  79.     for (i=0; i<strlen(s); i++)
  80.       s[i]=upcase(s[i]);
  81.     sprintf(s1," %s ",s);
  82.     if (strstr(s2,s1)!=NULL)
  83.       ok=0;
  84.   }
  85.   close(f);
  86.   if (!ok)
  87.     hangup=1;
  88.  
  89.   return(ok);
  90. }
  91.  
  92. void input_name()
  93. {
  94.   int ok,count;
  95.  
  96.   count=0;
  97.   do {
  98.     nl();
  99.     if (syscfg.sysconfig & sysconfig_no_alias)
  100.       pl("Enter your full REAL name.");
  101.     else
  102.       pl("Enter your full name, or your alias.");
  103.     outstr(":");
  104.     input(thisuser.name,30);
  105.     ok=check_name(thisuser.name);
  106.     if (!ok) {
  107.       nl();
  108.       pl("I'm sorry, you can't use that name.");
  109.       ++count;
  110.       if (count==3)
  111.         hangup=1;
  112.     }
  113.   } while ((!ok) && (!hangup));
  114. }
  115.  
  116. void input_realname()
  117. {
  118.   do {
  119.     nl();
  120.     if (syscfg.sysconfig& sysconfig_no_alias)
  121.       pl("Enter the city and state you live in.");
  122.     else
  123.       pl("Enter your real name.");
  124.     outstr(":");
  125.     inputl(thisuser.realname,20);
  126.  
  127.     if (thisuser.realname[0]==0) {
  128.       nl();
  129.       if (syscfg.sysconfig & sysconfig_no_alias)
  130.         pl("Sorry, you must enter your city and state.");
  131.       else
  132.         pl("Sorry, you must enter your real name.");
  133.     }
  134.   } while ((thisuser.realname[0]==0) && (!hangup));
  135. }
  136.  
  137. void input_callsign()
  138. {
  139.   nl();
  140.   pl("Enter your amateur radio callsign,");
  141.   pl("or just hit <ENTER> if none.");
  142.   outstr(":");
  143.   input(thisuser.callsign,6);
  144. }
  145.  
  146. void input_phone()
  147. {
  148.   int ok,i;
  149.  
  150.   do {
  151.     nl();
  152.     pl("Enter your VOICE phone no. in the form:");
  153.     pl(" ###-###-####");
  154.     outstr(":");
  155.     inputl(thisuser.phone,12);
  156.  
  157.     ok=1;
  158.     if ((syscfg.sysconfig & sysconfig_free_phone)==0) {
  159.       if (strlen(thisuser.phone)!=12)
  160.         ok=0;
  161.       if ((thisuser.phone[3]!='-') || (thisuser.phone[7]!='-'))
  162.         ok=0;
  163.       if ((thisuser.phone[1]!='0') && (thisuser.phone[1]!='1'))
  164.         ok=0;
  165.       for (i=0; i<12; i++)
  166.         if ((i!=3) && (i!=7))
  167.           if ((thisuser.phone[i]<'0') || (thisuser.phone[i]>'9'))
  168.             ok=0;
  169.     }
  170.  
  171.     if (!ok) {
  172.       nl();
  173.       pl("Please enter a valid phone number");
  174.       pl("in the correct format.");
  175.     }
  176.   } while ((!ok) && (!hangup));
  177. }
  178.  
  179. void input_sex()
  180. {
  181.   nl();
  182.   outstr("Your gender (M,F) :");
  183.   thisuser.sex=onek("MF");
  184. }
  185.  
  186. void input_age(userrec *u)
  187. {
  188.   int a,ok,y,m,d;
  189.   char ag[10];
  190.  
  191.   do {
  192.     nl();
  193.     do {
  194.       nl();
  195.       outstr("Month you were born (1-12) : ");
  196.       input(ag,2);
  197.       m=atoi(ag);
  198.     } while ((!hangup) && ((m>12) || (m<1)));
  199.     do {
  200.       nl();
  201.       outstr("Day of month you were born (1-31) : ");
  202.       input(ag,2);
  203.       d=atoi(ag);
  204.     } while ((!hangup) && ((d>31) || (d<1)));
  205.     do {
  206.       nl();
  207.       outstr("Year you were born (1900-) : ");
  208.       input(ag,4);
  209.       y=atoi(ag);
  210.     } while ((!hangup) && ((y>2000) || (y<1900)));
  211.     ok=1;
  212.     if (((m==2) || (m==9) || (m==4) || (m==6) || (m==11)) && (d==31))
  213.       ok=0;
  214.     if ((m==2) && (y%4!=0) && (d==30))
  215.       ok=0;
  216.     if (!ok) {
  217.       nl();
  218.       pl("There aren't that many days in that month.");
  219.     }
  220.   } while ((!ok) && (!hangup));
  221.   u->month=(unsigned char) m;
  222.   u->day=(unsigned char) d;
  223.   u->year=(unsigned char) (y-1900);
  224.   u->age=years_old(u->month,u->day,u->year);
  225.   nl();
  226. }
  227.  
  228. void input_comptype()
  229. {
  230.   int i,ok,ct;
  231.   char c[5];
  232.  
  233.   do {
  234.    nl();
  235.    pl("Known computer types:");
  236.    nl();
  237.    for (i=0; i<NUM_CTYPES; i++)
  238.      print(itoa(i+1,c,10),". ",ctypes[i],"");
  239.    nl();
  240.    pl("Enter your computer type, or the");
  241.    pl("closest to it (ie, Compaq -> IBM).");
  242.    outstr(":");
  243.    input(c,2);
  244.    ct=atoi(c);
  245.  
  246.    ok=1;
  247.    if ((ct<1) || (ct>NUM_CTYPES))
  248.      ok=0;
  249.  
  250.   } while ((!ok) && (!hangup));
  251.   thisuser.comp_type=ct-1;
  252.   if (checkcomp("Ami"))
  253.     thisuser.colors[0]=4;
  254.   if (hangup)
  255.     thisuser.comp_type=0;
  256. }
  257.  
  258. void input_screensize()
  259. {
  260.   int ok,x,y;
  261.   char s[5];
  262.  
  263.   do {
  264.     nl();
  265.     pl("How wide is your screen (chars, <CR>=80) ?");
  266.     outstr(":");
  267.     input(s,2);
  268.     x=atoi(s);
  269.     if (s[0]==0)
  270.       x=80;
  271.  
  272.     if ((x<32) || (x>80))
  273.       ok=0;
  274.     else
  275.       ok=1;
  276.   } while ((!ok) && (!hangup));
  277.  
  278.   do {
  279.     nl();
  280.     pl("How tall is your screen (lines, <CR>=25) ?");
  281.     outstr(":");
  282.     input(s,2);
  283.     y=atoi(s);
  284.     if (s[0]==0)
  285.       y=25;
  286.  
  287.     if ((y<4) || (y>60))
  288.       ok=0;
  289.     else
  290.       ok=1;
  291.   } while ((!ok) && (!hangup));
  292.  
  293.   thisuser.screenchars=x;
  294.   thisuser.screenlines=y;
  295.   screenlinest=y;
  296. }
  297.  
  298. void input_pw()
  299. {
  300.   int ok;
  301.   char s[81];
  302.  
  303.   do {
  304.     nl();
  305.     pl("Please enter a password, 3-8 chars.");
  306.     outstr(":");
  307.     input(s,8);
  308.  
  309.     ok=1;
  310.     if (strlen(s)<3)
  311.       ok=0;
  312.   } while ((!ok) && (!hangup));
  313.   if (ok)
  314.     strcpy(thisuser.pw,s);
  315.   else
  316.     pl("Password not changed.");
  317. }
  318.  
  319.  
  320. void input_ansistat()
  321. {
  322.   int i,c,c2;
  323.   char ch;
  324.  
  325.   nl();
  326.   outstr("\x1b[0;34;3mTEST\x1b[C");
  327.   outstr("\x1b[0;30;45mTEST\x1b[C");
  328.   outstr("\x1b[0;1;31;44mTEST\x1b[C");
  329.   outstr("\x1b[0;32;7mTEST\x1b[C");
  330.   outstr("\x1b[0;1;5;33;46mTEST\x1b[C");
  331.   pl("\x1b[0;4mTEST\x1b[0m");
  332.   thisuser.sysstatus &= ~(sysstatus_ansi | sysstatus_color);
  333.   pl("Is the above line colored, italicized,");
  334.   outstr("bold, inversed, or blinking? ");
  335.   if (yn())
  336.     {
  337.     thisuser.sysstatus |= sysstatus_ansi;
  338.     nl();
  339.     outstr("Do you want color? ");
  340.     if (yn())
  341.       thisuser.sysstatus |= sysstatus_color;
  342.     else {
  343.       color_list();
  344.       nl();
  345.       outstr("Monochrome base color? ");
  346.       ch=onek("1234567");
  347.       c=ch-'0';
  348.       c2=c << 4;
  349.       for (i=0; i<8; i++) {
  350.        if ((thisuser.bwcolors[i] & 0x70) == 0)
  351.      thisuser.bwcolors[i]=(thisuser.bwcolors[i] & 0x88) | c;
  352.        else
  353.      thisuser.bwcolors[i]=(thisuser.bwcolors[i] & 0x88) | c2;
  354.       }
  355.     }
  356.    }
  357. }
  358.  
  359.  
  360. void newuser()
  361. {
  362.   int i,ok;
  363.   char s[255],s1[81],ch;
  364.   userrec u;
  365.   long l1,l2;
  366.  
  367.   sprintf(s,"*** NEW USER %s   %s    %s",date(),times(),curspeed);
  368.   sl1(0,"");
  369.   sl1(0,s);
  370.   if (status.users>=syscfg.maxusers) {
  371.     nl();
  372.     nl();
  373.     pl("I'm sorry, but the system currently has");
  374.     pl("the maximum number of users it can");
  375.     pl("handle.");
  376.     nl();
  377.     hangup=1;
  378.   }
  379.   if (syscfg.closedsystem) {
  380.     nl();
  381.     nl();
  382.     pl("I'm sorry, but the system is currently");
  383.     pl("closed, and not accepting new users.");
  384.     nl();
  385.     hangup=1;
  386.   }
  387.   if ((syscfg.newuserpw[0]!=0) && (incom)) {
  388.     nl();
  389.     nl();
  390.     ok=0;
  391.     i=0;
  392.     do {
  393.       outstr("New User Password :");
  394.       input(s,20);
  395.       if (strcmp(s,syscfg.newuserpw)==0)
  396.         ok=1;
  397.       else {
  398.         sprintf(s1,"Wrong newuser password: %s",s);
  399.         sl1(0,s1);
  400.       }
  401.     } while ((!ok) && (!hangup) && (i++<4));
  402.     if (!ok)
  403.       hangup=1;
  404.   }
  405.  
  406.   strcpy(thisuser.firston,date());
  407.   strcpy(thisuser.laston,"Never.");
  408.   strcpy(&thisuser.macros[0][0],"This is the Ctrl-D Macro");
  409.   strcpy(&thisuser.macros[1][0],"This is the Ctrl-F Macro");
  410.   strcpy(&thisuser.macros[2][0],"Whatever");
  411.   strcpy(thisuser.note,"");
  412.   strcpy(thisuser.pw,"NONE");
  413.  
  414.   thisuser.screenlines=25;
  415.   screenlinest=25;
  416.  
  417.   thisuser.inact=0;
  418.   thisuser.defprot=0;
  419.   thisuser.defed=0;
  420.   thisuser.sl=syscfg.newusersl;
  421.   thisuser.dsl=syscfg.newuserdsl;
  422.   thisuser.exempt=0;
  423.   for (i=0; i<20; i++)
  424.     thisuser.votes[i]=0;
  425.   for (i=0; i<8; i++)
  426.     thisuser.colors[i]=0x07;
  427.   thisuser.illegal=0;
  428.   thisuser.waiting=0;
  429.   thisuser.sysopsub=255;
  430.   thisuser.ontoday=1;
  431.   thisuser.month=0;
  432.   thisuser.day=0;
  433.   thisuser.year=0;
  434.   thisuser.age=0;
  435.  
  436.   thisuser.homeuser=0;
  437.   thisuser.homesys=0;
  438.   thisuser.forwardusr=0;
  439.   thisuser.forwardsys=0;
  440.   thisuser.msgpost=0;
  441.   thisuser.emailsent=0;
  442.   thisuser.feedbacksent=0;
  443.   thisuser.posttoday=0;
  444.   thisuser.etoday=0;
  445.   thisuser.ar=0;
  446.   thisuser.dar=0;
  447.   thisuser.restrict=syscfg.newuser_restrict;
  448.   thisuser.ass_pts=0;
  449.   thisuser.uploaded=0;
  450.   thisuser.downloaded=0;
  451.   thisuser.lastrate=0;
  452.   thisuser.logons=0;
  453.   thisuser.msgread=0;
  454.   thisuser.uk=0;
  455.   thisuser.dk=0;
  456.   thisuser.qscn=0xFFFFFFFF;
  457.   for (i=0; i<33; i++)
  458.     thisuser.qscnptr[i]=0;
  459.   thisuser.nscn1=0xFFFFFFFF;
  460.   thisuser.nscn2=0xFFFFFFFF;
  461.   thisuser.daten=0;
  462.   thisuser.sysstatus=sysstatus_pause_on_page | sysstatus_nscan_file_system;
  463.  
  464.   thisuser.timeontoday=0.0;
  465.   thisuser.extratime=0.0;
  466.   thisuser.timeon=0.0;
  467.   thisuser.pos_account=0.0;
  468.   thisuser.neg_account=0.0;
  469.   thisuser.gold=syscfg.newusergold;
  470.   thisuser.emailnet=0;
  471.   thisuser.postnet=0;
  472.   thisuser.fsenttoday1=0;
  473.   thisuser.num_extended=0;
  474.   thisuser.optional_val=0;
  475.  
  476.   for (i=0; i<33; i++)
  477.     thisuser.res[i]=0;
  478.  
  479.   thisuser.colors[0]=7;
  480.   thisuser.colors[1]=11;
  481.   thisuser.colors[2]=14;
  482.   thisuser.colors[3]=5;
  483.   thisuser.colors[4]=31;
  484.   thisuser.colors[5]=2;
  485.   thisuser.colors[6]=140;
  486.   thisuser.colors[7]=9;
  487.  
  488.   thisuser.bwcolors[0]=7;
  489.   thisuser.bwcolors[1]=15;
  490.   thisuser.bwcolors[2]=15;
  491.   thisuser.bwcolors[3]=15;
  492.   thisuser.bwcolors[4]=112;
  493.   thisuser.bwcolors[5]=15;
  494.   thisuser.bwcolors[6]=143;
  495.   thisuser.bwcolors[7]=7;
  496.  
  497.   realsl=thisuser.sl;
  498.  
  499.   for (i=0; i<6; i++) {
  500.     ch=rand() % 36;
  501.     if (ch<10)
  502.       ch+='0';
  503.     else
  504.       ch+='A'-10;
  505.     thisuser.pw[i]=ch;
  506.   }
  507.   thisuser.pw[6]=0;
  508.  
  509.   if (!hangup) {
  510.     if (incom) {
  511.       if (printfile("SYSTEM.MSG"))
  512.     sl1(0,"#Aborted SYSTEM.MSG");
  513.       if (printfile("NEWUSER.MSG"))
  514.     sl1(0,"#Aborted NEWUSER.MSG");
  515.     }
  516.     input_name();
  517.     input_realname();
  518.     input_phone();
  519.     input_callsign();
  520.     input_sex();
  521.     input_age(&thisuser);
  522.     input_comptype();
  523.     input_screensize();
  524.     input_ansistat();
  525.     nl();
  526.     print("Random password: ",thisuser.pw,"");
  527.     nl();
  528.     prt(5,"Enter new password (Y/N)? ");
  529.     if (yn())
  530.       input_pw();
  531.   }
  532.  
  533.   if (!hangup)
  534.     do {
  535.       nl();
  536.       nl();
  537.       print("1. Name          : ",thisuser.name,"");
  538.       if (syscfg.sysconfig & sysconfig_no_alias)
  539.         print("2. City, State   : ",thisuser.realname,"");
  540.       else
  541.         print("2. Real Name     : ",thisuser.realname,"");
  542.       print("3. Callsign      : ",thisuser.callsign,"");
  543.       print("4. Phone No.     : ",thisuser.phone,"");
  544.       s[0]=thisuser.sex;
  545.       s[1]=0;
  546.       print("5. Gender        : ",s,"");
  547.       sprintf(s,"%02d/%02d/%02d",(int) thisuser.month,
  548.                   (int) thisuser.day,
  549.                   (int) thisuser.year);
  550.       print("6. Birthdate     : ",s,"");
  551.       print("7. Computer type : ",ctypes[thisuser.comp_type],"");
  552.       print("8. Screen size   : ",itoa(thisuser.screenchars,s,10)," X ",
  553.                                   itoa(thisuser.screenlines,s1,10),"");
  554.       print("9. Password      : ",thisuser.pw,"");
  555.       pl("Q. No changes.");
  556.       nl();
  557.       nl();
  558.       prt(2,"Which (1-9,Q) : ");
  559.       ch=onek("Q123456789");
  560.       ok=0;
  561.       switch(ch) {
  562.         case 'Q': ok=1; break;
  563.         case '1': input_name(); break;
  564.         case '2': input_realname(); break;
  565.         case '3': input_callsign(); break;
  566.         case '4': input_phone(); break;
  567.         case '5': input_sex(); break;
  568.         case '6': input_age(&thisuser); break;
  569.         case '7': input_comptype(); break;
  570.         case '8': input_screensize(); break;
  571.         case '9': input_pw(); break;
  572.       }
  573.     } while ((!ok) && (!hangup));
  574.  
  575.   if (!hangup) {
  576.  
  577.     nl();
  578.     pl("Please wait...");
  579.     nl();
  580.     read_user(0,&u);
  581.     l1=(filelength(userfile)) / ((long) sizeof(userrec))-1;
  582.     if (l1==(long) status.users) {
  583.       usernum=status.users+1;
  584.     } else {
  585.       usernum=1;
  586.       do {
  587.         read_user(usernum,&u);
  588.         if ((u.inact & inact_deleted)==0)
  589.           ++usernum;
  590.       } while (((u.inact & inact_deleted)==0) && ((long)usernum<=l1));
  591.     }
  592.     write_user(usernum,&thisuser);
  593.     close_user();
  594.     isr(usernum,thisuser.name);
  595.     ok=0;
  596.     topscreen();
  597.     do {
  598.       nl();
  599.       nl();
  600.       print("Your user number is ",itoa(usernum,s,10),".","");
  601.       print("Your password is '",thisuser.pw,"'.","");
  602.       nl();
  603.       pl("Please write down this information, and");
  604.       pl("re-enter your password for verification.");
  605.       pl("You will need to know this password in");
  606.       pl("order to change it to something else.");
  607.       nl();
  608.       outstr(":");
  609.       echo=0;
  610.       input(s,8);
  611.       if (strcmp(s,thisuser.pw)==0)
  612.         ok=1;
  613.     } while ((!ok) && (!hangup));
  614.     changedsl();
  615.     if (incom) {
  616.       if (printfile("FEEDBACK.MSG"))
  617.         sl1(0,"#Aborted FEEDBACK.MSG");
  618.       sprintf(irt,"Validation Feedback (%d slots left)",syscfg.maxusers-status.users);
  619.       email(1,0,1,0);
  620.     }
  621.     if (syscfg.newuser_c[0]) {
  622.       stuff_in(s,syscfg.newuser_c,create_chain_file("CHAIN.TXT"),"","","","");
  623.       full_external(s,0,1);
  624.     }
  625.   }
  626. }
  627.  
  628.