|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.