--- sbbs/sbbs3/logon.cpp 2018/04/24 16:39:34 1.1.1.1 +++ sbbs/sbbs3/logon.cpp 2018/04/24 16:40:03 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet user logon routines */ -/* $Id: logon.cpp,v 1.1.1.1 2018/04/24 16:39:34 root Exp $ */ +/* $Id: logon.cpp,v 1.1.1.2 2018/04/24 16:40:03 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -38,7 +38,7 @@ #include "sbbs.h" #include "cmdshell.h" -extern "C" void client_on(SOCKET sock, client_t* client); +extern "C" void client_on(SOCKET sock, client_t* client, BOOL update); /****************************************************************************/ /* Called once upon each user logging on the board */ @@ -50,46 +50,48 @@ bool sbbs_t::logon() char tmp[512]; int file; uint i,j,mailw; + long kmode; ulong totallogons; node_t node; - struct tm* tm_p; struct tm tm; now=time(NULL); - tm_p=localtime(&now); - if(tm_p==NULL) + if(localtime_r(&now,&tm)==NULL) return(false); - tm=*tm_p; if(!useron.number) return(false); client.user=useron.alias; - client_on(client_socket,&client); + client_on(client_socket,&client,TRUE /* update */); + +#ifdef JAVASCRIPT + js_create_user_objects(); +#endif if(useron.rest&FLAG('Q')) qwklogon=1; - if(SYSOP && ((online==ON_REMOTE && !(cfg.sys_misc&SM_R_SYSOP)) - || (online==ON_LOCAL && !(cfg.sys_misc&SM_L_SYSOP)))) + if(SYSOP && !(cfg.sys_misc&SM_R_SYSOP)) return(false); if(cur_ratecode,useron.cursub)) - break; } + break; + } if(jcode,useron.curdir)) @@ -175,12 +187,16 @@ bool sbbs_t::logon() if(jar,&useron)) { useron.shell=cfg.new_shell; @@ -189,11 +205,14 @@ bool sbbs_t::logon() if(chk_ar(cfg.shell[i]->ar,&useron)) break; if(i==cfg.total_shells) - useron.shell=0; } } + useron.shell=0; + } + } logon_ml=useron.level; logontime=time(NULL); starttime=logontime; + useron.logontime=logontime; last_ns_time=ns_time=useron.ns_time; // ns_time-=(useron.tlast*60); /* file newscan time == last logon time */ delfiles(cfg.temp_dir,ALLFILES); @@ -202,9 +221,10 @@ bool sbbs_t::logon() sprintf(str,"%smsgs/n%3.3u.ixb",cfg.data_dir,cfg.node_num); remove(str); /* remove any pending node message indices */ - if(!SYSOP && online==ON_REMOTE) { + if(!SYSOP && online==ON_REMOTE && !qwklogon) { rioctl(IOCM|ABORT); /* users can't abort anything */ - rioctl(IOCS|ABORT); } + rioctl(IOCS|ABORT); + } CLS; if(useron.rows) @@ -216,12 +236,14 @@ bool sbbs_t::logon() bputs(text[HappyBirthday]); pause(); CLS; - user_event(EVENT_BIRTHDAY); } + user_event(EVENT_BIRTHDAY); + } unixtodstr(&cfg,useron.laston,tmp); if(strcmp(str,tmp)) { /* str still equals logon time */ useron.ltoday=1; useron.ttoday=useron.etoday=useron.ptoday=useron.textra=0; - useron.freecdt=cfg.level_freecdtperday[useron.level]; } + useron.freecdt=cfg.level_freecdtperday[useron.level]; + } else useron.ltoday++; @@ -238,7 +260,8 @@ bool sbbs_t::logon() while(ccfg.level_callsperday[useron.level] && !(useron.exempt&FLAG('L'))) { bputs(text[NoMoreLogons]); @@ -278,14 +306,20 @@ bool sbbs_t::logon() ,useron.number,useron.alias); logline("+!",str); hangup(); - return(false); } + return(false); + } if(useron.rest&FLAG('L') && useron.ltoday>1) { bputs(text[R_Logons]); sprintf(str,"(%04u) %-25s Out of logons" ,useron.number,useron.alias); logline("+!",str); hangup(); - return(false); } + return(false); + } + kmode=(cfg.uq&UQ_NOEXASC); + if(!(cfg.uq&UQ_NOUPRLWR)) + kmode|=K_UPRLWR; + if(!(useron.rest&FLAG('G'))) { if(!useron.name[0] && ((cfg.uq&UQ_ALIASES && cfg.uq&UQ_REALNAME) || cfg.uq&UQ_COMPANY)) @@ -294,19 +328,21 @@ bool sbbs_t::logon() bputs(text[EnterYourRealName]); else bputs(text[EnterYourCompany]); - getstr(useron.name,LEN_NAME,K_UPRLWR|(cfg.uq&UQ_NOEXASC)); + getstr(useron.name,LEN_NAME,kmode); if(cfg.uq&UQ_ALIASES && cfg.uq&UQ_REALNAME) { if(trashcan(useron.name,"name") || !useron.name[0] - || !strchr(useron.name,SP) + || !strchr(useron.name,' ') || strchr(useron.name,0xff) || (cfg.uq&UQ_DUPREAL && userdatdupe(useron.number,U_NAME,LEN_NAME ,useron.name,0))) bputs(text[YouCantUseThatName]); else - break; } + break; + } else - break; } + break; + } if(cfg.uq&UQ_HANDLE && !useron.handle[0]) { sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias); while(online) { @@ -320,22 +356,27 @@ bool sbbs_t::logon() || trashcan(useron.handle,"name")) bputs(text[YouCantUseThatName]); else - break; } } + break; + } + } if(cfg.uq&UQ_LOCATION && !useron.location[0]) while(online) { bputs(text[EnterYourCityState]); - if(getstr(useron.location,LEN_LOCATION,K_UPRLWR|(cfg.uq&UQ_NOEXASC))) - break; } + if(getstr(useron.location,LEN_LOCATION,kmode)) + break; + } if(cfg.uq&UQ_ADDRESS && !useron.address[0]) while(online) { bputs(text[EnterYourAddress]); - if(getstr(useron.address,LEN_ADDRESS,K_UPRLWR|(cfg.uq&UQ_NOEXASC))) - break; } + if(getstr(useron.address,LEN_ADDRESS,kmode)) + break; + } if(cfg.uq&UQ_ADDRESS && !useron.zipcode[0]) while(online) { bputs(text[EnterYourZipCode]); if(getstr(useron.zipcode,LEN_ZIPCODE,K_UPPER|(cfg.uq&UQ_NOEXASC))) - break; } + break; + } if(cfg.uq&UQ_PHONE && !useron.phone[0]) { i=yesno(text[CallingFromNorthAmericaQ]); while(online) { @@ -343,21 +384,25 @@ bool sbbs_t::logon() if(i) { if(gettmplt(useron.phone,cfg.sys_phonefmt ,K_LINE|(cfg.uq&UQ_NOEXASC))options&BBS_OPT_SYSOP_AVAILABLE - || (cfg.sys_chat_ar[0] && chk_ar(cfg.sys_chat_ar,&useron))) - strcat(str,text[LiSysopAvailable]); - else - strcat(str,text[LiSysopNotAvailable]); - bprintf("%s\r\n\r\n",str); + + if(!(cfg.sys_misc&SM_NOSYSINFO)) { + bprintf(text[SiSysName],cfg.sys_name); + //bprintf(text[SiNodeNumberName],cfg.node_num,cfg.node_name); + bprintf(text[LiUserNumberName],useron.number,useron.alias); + bprintf(text[LiLogonsToday],useron.ltoday + ,cfg.level_callsperday[useron.level]); + bprintf(text[LiTimeonToday],useron.ttoday + ,cfg.level_timeperday[useron.level]+useron.min); + bprintf(text[LiMailWaiting],mailw); + strcpy(str,text[LiSysopIs]); + if(startup->options&BBS_OPT_SYSOP_AVAILABLE + || (cfg.sys_chat_ar[0] && chk_ar(cfg.sys_chat_ar,&useron))) + strcat(str,text[LiSysopAvailable]); + else + strcat(str,text[LiSysopNotAvailable]); + bprintf("%s\r\n\r\n",str); + } + if(sys_status&SS_EVENT) - bputs(text[ReducedTime]); + bprintf(text[ReducedTime],timestr(&event_time)); getnodedat(cfg.node_num,&thisnode,1); thisnode.misc&=~(NODE_AOFF|NODE_POFF); if(useron.chat&CHAT_NOACT) @@ -441,18 +497,21 @@ bool sbbs_t::logon() if(useron.chat&CHAT_NOPAGE) thisnode.misc|=NODE_POFF; putnodedat(cfg.node_num,&thisnode); + getsmsg(useron.number); /* Moved from further down */ SYNC; c=0; for(i=1;i<=cfg.sys_nodes;i++) if(i!=cfg.node_num) { getnodedat(i,&node,0); - if(node.status==NODE_INUSE - || ((node.status==NODE_QUIET || node.errors) && SYSOP)) { + if(!(cfg.sys_misc&SM_NONODELIST) + && (node.status==NODE_INUSE + || ((node.status==NODE_QUIET || node.errors) && SYSOP))) { if(!c) bputs(text[NodeLstHdr]); printnodedat(i,&node); - c=1; } + c=1; + } if(node.status==NODE_INUSE && i!=cfg.node_num && node.useron==useron.number && !SYSOP && !(useron.exempt&FLAG('G'))) { strcpy(tmp,"On two nodes at the same time"); @@ -462,7 +521,8 @@ bool sbbs_t::logon() errorlog(tmp); bputs(text[UserOnTwoNodes]); hangup(); - return(false); } + return(false); + } if(thisnode.status!=NODE_QUIET && (node.status==NODE_INUSE || node.status==NODE_QUIET) && !(node.misc&NODE_AOFF) && node.useron!=useron.number) { @@ -470,7 +530,9 @@ bool sbbs_t::logon() ,cfg.node_num ,thisnode.misc&NODE_ANON ? text[UNKNOWN_USER] : useron.alias ,connection); - putnmsg(i,str); } } + putnmsg(&cfg,i,str); + } + } if(cfg.sys_exp_warn && useron.expire && useron.expire>now /* Warn user of coming */ && (useron.expire-now)/(1440L*60L)<=cfg.sys_exp_warn) /* expiration */ @@ -478,20 +540,21 @@ bool sbbs_t::logon() if(criterrs && SYSOP) bprintf(text[CriticalErrors],criterrs); - if((i=getuserxfers(0,useron.number,0))!=0) { - bprintf(text[UserXferForYou],i,i>1 ? "s" : nulstr); } - if((i=getuserxfers(useron.number,0,0))!=0) { - bprintf(text[UnreceivedUserXfer],i,i>1 ? "s" : nulstr); } + if((i=getuserxfers(0,useron.number,0))!=0) + bprintf(text[UserXferForYou],i,i>1 ? "s" : nulstr); + if((i=getuserxfers(useron.number,0,0))!=0) + bprintf(text[UnreceivedUserXfer],i,i>1 ? "s" : nulstr); SYNC; sys_status&=~SS_PAUSEON; /* Turn off the pause override flag */ if(online==ON_REMOTE) rioctl(IOSM|ABORT); /* Turn abort ability on */ if(mailw) { if(yesno(text[ReadYourMailNowQ])) - readmail(useron.number,MAIL_YOUR); } - if(useron.misc&ASK_NSCAN && yesno(text[NScanAllGrpsQ])) + readmail(useron.number,MAIL_YOUR); + } + if(usrgrps && useron.misc&ASK_NSCAN && yesno(text[NScanAllGrpsQ])) scanallsubs(SCAN_NEW); - if(useron.misc&ASK_SSCAN && yesno(text[SScanAllGrpsQ])) + if(usrgrps && useron.misc&ASK_SSCAN && yesno(text[SScanAllGrpsQ])) scanallsubs(SCAN_TOYOU); return(true); } @@ -507,29 +570,28 @@ ulong sbbs_t::logonstats() char str[256]; int dsts,csts; uint i; - time_t update_t; + time_t update_t=0; stats_t stats; node_t node; - struct tm * tm, update_tm; + struct tm tm, update_tm; + memset(&stats,0,sizeof(stats)); sprintf(str,"%sdsts.dab",cfg.ctrl_dir); if((dsts=nopen(str,O_RDWR))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return(0L); } + return(0L); + } read(dsts,&update_t,4); /* Last updated */ read(dsts,&stats.logons,4); /* Total number of logons on system */ close(dsts); if(update_t>now+(24L*60L*60L)) /* More than a day in the future? */ errormsg(WHERE,ERR_CHK,"Daily stats time stamp",update_t); - tm = gmtime(&update_t); - if(tm==NULL) + if(localtime_r(&update_t,&update_tm)==NULL) return(0); - update_tm=*tm; - tm = gmtime(&now); - if(tm==NULL) + if(localtime_r(&now,&tm)==NULL) return(0); - if((tm->tm_mday>update_tm.tm_mday && tm->tm_mon==update_tm.tm_mon) - || tm->tm_mon>update_tm.tm_mon || tm->tm_year>update_tm.tm_year) { + if((tm.tm_mday>update_tm.tm_mday && tm.tm_mon==update_tm.tm_mon) + || tm.tm_mon>update_tm.tm_mon || tm.tm_year>update_tm.tm_year) { sprintf(str,"New Day - Prev: %s ",timestr(&update_t)); logentry("!=",str); @@ -538,13 +600,15 @@ ulong sbbs_t::logonstats() sprintf(str,"%slogon.lst",cfg.data_dir); /* Truncate logon list */ if((dsts=nopen(str,O_TRUNC|O_CREAT|O_WRONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_TRUNC|O_CREAT|O_WRONLY); - return(0L); } + return(0L); + } close(dsts); for(i=0;i<=cfg.sys_nodes;i++) { if(i) { /* updating a node */ getnodedat(i,&node,1); node.misc|=NODE_EVENT; - putnodedat(i,&node); } + putnodedat(i,&node); + } sprintf(str,"%sdsts.dab",i ? cfg.node_path[i-1] : cfg.ctrl_dir); if((dsts=nopen(str,O_RDWR))==-1) /* node doesn't have stats yet */ continue; @@ -552,7 +616,8 @@ ulong sbbs_t::logonstats() if((csts=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { close(dsts); errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); - continue; } + continue; + } lseek(dsts,8L,SEEK_SET); /* Skip time and logons */ write(csts,&now,4); read(dsts,&stats.ltoday,4); @@ -591,7 +656,9 @@ ulong sbbs_t::logonstats() write(dsts,&stats.ttoday,4); /* Emails today */ write(dsts,&stats.ttoday,4); /* Feedback today */ write(dsts,&stats.ttoday,2); /* New users Today */ - close(dsts); } } + close(dsts); + } + } if(thisnode.status==NODE_QUIET) /* Quiet users aren't counted */ return(0); @@ -603,7 +670,8 @@ ulong sbbs_t::logonstats() sprintf(str,"%sdsts.dab",i ? cfg.ctrl_dir : cfg.node_dir); if((dsts=nopen(str,O_RDWR))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return(0L); } + return(0L); + } lseek(dsts,4L,SEEK_SET); /* Skip time stamp */ read(dsts,&stats.logons,4); read(dsts,&stats.ltoday,4); @@ -612,7 +680,8 @@ ulong sbbs_t::logonstats() lseek(dsts,4L,SEEK_SET); /* Rewind back and overwrite */ write(dsts,&stats.logons,4); write(dsts,&stats.ltoday,4); - close(dsts); } + close(dsts); + } return(stats.logons); }