Annotation of sbbs/src/sbbs3/logon.cpp, revision 1.1.1.1

1.1       root        1: /* logon.cpp */
                      2: 
                      3: /* Synchronet user logon routines */
                      4: 
                      5: /* $Id: logon.cpp,v 1.42 2006/10/28 18:39:40 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: #include "cmdshell.h"
                     40: 
                     41: extern "C" void client_on(SOCKET sock, client_t* client, BOOL update);
                     42: 
                     43: /****************************************************************************/
                     44: /* Called once upon each user logging on the board                                                     */
                     45: /* Returns 1 if user passed logon, 0 if user failed.                                           */
                     46: /****************************************************************************/
                     47: bool sbbs_t::logon()
                     48: {
                     49:        char    str[256],c;
                     50:        char    tmp[512];
                     51:        int     file;
                     52:        uint    i,j,mailw;
                     53:        long    kmode;
                     54:        ulong   totallogons;
                     55:        node_t  node;
                     56:        struct  tm      tm;
                     57: 
                     58:        now=time(NULL);
                     59:        if(localtime_r(&now,&tm)==NULL)
                     60:                return(false);
                     61: 
                     62:        if(!useron.number)
                     63:                return(false);
                     64: 
                     65:        client.user=useron.alias;
                     66:        client_on(client_socket,&client,TRUE /* update */);
                     67: 
                     68: #ifdef JAVASCRIPT
                     69:        js_create_user_objects();
                     70: #endif
                     71: 
                     72:        if(useron.rest&FLAG('Q'))
                     73:                qwklogon=1;
                     74:        if(SYSOP && !(cfg.sys_misc&SM_R_SYSOP))
                     75:                return(false);
                     76: 
                     77: #if 0
                     78:        if(cur_rate<cfg.node_minbps && !(useron.exempt&FLAG('M'))) {
                     79:                bprintf(text[MinimumModemSpeed],cfg.node_minbps);
                     80:                sprintf(str,"%stooslow.msg",cfg.text_dir);
                     81:                if(fexist(str))
                     82:                        printfile(str,0);
                     83:                sprintf(str,"(%04u)  %-25s  Modem speed: %lu<%u"
                     84:                        ,useron.number,useron.alias,cur_rate,cfg.node_minbps);
                     85:                logline("+!",str);
                     86:                return(false); 
                     87:        }
                     88: #endif
                     89: 
                     90:        if(useron.rest&FLAG('G')) {     /* Guest account */
                     91:                useron.misc=(cfg.new_misc&(~ASK_NSCAN));
                     92:                useron.rows=0;
                     93:                useron.misc&=~(ANSI|RIP|WIP|NO_EXASCII|COLOR|HTML);
                     94:                useron.misc|=autoterm;
                     95:                if(!(useron.misc&ANSI) && yesno(text[AnsiTerminalQ]))
                     96:                        useron.misc|=ANSI;
                     97:                if(useron.misc&(RIP|WIP|HTML)
                     98:                        || (useron.misc&ANSI && yesno(text[ColorTerminalQ])))
                     99:                        useron.misc|=COLOR;
                    100:                if(!yesno(text[ExAsciiTerminalQ]))
                    101:                        useron.misc|=NO_EXASCII;
                    102:                for(i=0;i<cfg.total_xedits;i++)
                    103:                        if(!stricmp(cfg.xedit[i]->code,cfg.new_xedit)
                    104:                                && chk_ar(cfg.xedit[i]->ar,&useron))
                    105:                                break;
                    106:                if(i<cfg.total_xedits)
                    107:                        useron.xedit=i+1;
                    108:                else
                    109:                        useron.xedit=0;
                    110:                useron.prot=cfg.new_prot;
                    111:                useron.shell=cfg.new_shell; 
                    112:        }
                    113: 
                    114: #if 0
                    115:        if(cfg.node_dollars_per_call) {
                    116:                adjustuserrec(&cfg,useron.number,U_CDT,10
                    117:                        ,cfg.cdt_per_dollar*cfg.node_dollars_per_call);
                    118:                bprintf(text[CreditedAccount]
                    119:                        ,cfg.cdt_per_dollar*cfg.node_dollars_per_call);
                    120:                sprintf(str,"%s #%u was billed $%d T: %lu seconds"
                    121:                        ,useron.alias,useron.number
                    122:                        ,cfg.node_dollars_per_call,(ulong)(now-answertime));
                    123:                logline("$+",str);
                    124:                hangup();
                    125:                return(false); 
                    126:        }
                    127: #endif
                    128: 
                    129:        if(!chk_ar(cfg.node_ar,&useron)) {
                    130:                bputs(text[NoNodeAccess]);
                    131:                sprintf(str,"(%04u)  %-25s  Insufficient node access"
                    132:                        ,useron.number,useron.alias);
                    133:                logline("+!",str);
                    134:                return(false); 
                    135:        }
                    136: 
                    137:        getnodedat(cfg.node_num,&thisnode,1);
                    138:        if(thisnode.misc&NODE_LOCK) {
                    139:                putnodedat(cfg.node_num,&thisnode);     /* must unlock! */
                    140:                if(!SYSOP && !(useron.exempt&FLAG('N'))) {
                    141:                        bputs(text[NodeLocked]);
                    142:                        sprintf(str,"(%04u)  %-25s  Locked node logon attempt"
                    143:                                ,useron.number,useron.alias);
                    144:                        logline("+!",str);
                    145:                        return(false); 
                    146:                }
                    147:                if(yesno(text[RemoveNodeLockQ])) {
                    148:                        getnodedat(cfg.node_num,&thisnode,1);
                    149:                        logline("S-","Removed Node Lock");
                    150:                        thisnode.misc&=~NODE_LOCK; 
                    151:                }
                    152:                else
                    153:                        getnodedat(cfg.node_num,&thisnode,1); 
                    154:        }
                    155: 
                    156:        if(useron.exempt&FLAG('H'))
                    157:                console|=CON_NO_INACT;
                    158: 
                    159:        if((useron.exempt&FLAG('Q') && useron.misc&QUIET))
                    160:                thisnode.status=NODE_QUIET;
                    161:        else
                    162:                thisnode.status=NODE_INUSE;
                    163:        action=thisnode.action=NODE_LOGN;
                    164:        thisnode.connection=0xffff;
                    165:        thisnode.misc&=~(NODE_ANON|NODE_INTR|NODE_MSGW|NODE_POFF|NODE_AOFF);
                    166:        if(useron.chat&CHAT_NOACT)
                    167:                thisnode.misc|=NODE_AOFF;
                    168:        if(useron.chat&CHAT_NOPAGE)
                    169:                thisnode.misc|=NODE_POFF;
                    170:        thisnode.useron=useron.number;
                    171:        putnodedat(cfg.node_num,&thisnode);
                    172: 
                    173:        getusrsubs();
                    174:        getusrdirs();
                    175: 
                    176:        if(useron.misc&CURSUB && !(useron.rest&FLAG('G'))) {
                    177:                for(i=0;i<usrgrps;i++) {
                    178:                        for(j=0;j<usrsubs[i];j++) {
                    179:                                if(!strcmp(cfg.sub[usrsub[i][j]]->code,useron.cursub))
                    180:                                        break; 
                    181:                        }
                    182:                        if(j<usrsubs[i]) {
                    183:                                curgrp=i;
                    184:                                cursub[i]=j;
                    185:                                break; 
                    186:                        } 
                    187:                }
                    188:                for(i=0;i<usrlibs;i++) {
                    189:                        for(j=0;j<usrdirs[i];j++)
                    190:                                if(!strcmp(cfg.dir[usrdir[i][j]]->code,useron.curdir))
                    191:                                        break;
                    192:                        if(j<usrdirs[i]) {
                    193:                                curlib=i;
                    194:                                curdir[i]=j;
                    195:                                break; 
                    196:                        } 
                    197:                } 
                    198:        }
                    199: 
                    200: 
                    201:        if(useron.misc&AUTOTERM) {
                    202:                useron.misc&=~(ANSI|RIP|WIP|HTML);
                    203:                useron.misc|=autoterm; 
                    204:        }
                    205: 
                    206:        if(!chk_ar(cfg.shell[useron.shell]->ar,&useron)) {
                    207:                useron.shell=cfg.new_shell;
                    208:                if(!chk_ar(cfg.shell[useron.shell]->ar,&useron)) {
                    209:                        for(i=0;i<cfg.total_shells;i++)
                    210:                                if(chk_ar(cfg.shell[i]->ar,&useron))
                    211:                                        break;
                    212:                        if(i==cfg.total_shells)
                    213:                                useron.shell=0; 
                    214:                } 
                    215:        }
                    216: 
                    217:        logon_ml=useron.level;
                    218:        logontime=time(NULL);
                    219:        starttime=logontime;
                    220:        useron.logontime=logontime;
                    221:        last_ns_time=ns_time=useron.ns_time;
                    222:        // ns_time-=(useron.tlast*60); /* file newscan time == last logon time */
                    223:        delfiles(cfg.temp_dir,ALLFILES);
                    224:        sprintf(str,"%smsgs/n%3.3u.msg",cfg.data_dir,cfg.node_num);
                    225:        remove(str);            /* remove any pending node messages */
                    226:        sprintf(str,"%smsgs/n%3.3u.ixb",cfg.data_dir,cfg.node_num);
                    227:        remove(str);                    /* remove any pending node message indices */
                    228: 
                    229:        if(!SYSOP && online==ON_REMOTE && !qwklogon) {
                    230:                rioctl(IOCM|ABORT);     /* users can't abort anything */
                    231:                rioctl(IOCS|ABORT); 
                    232:        }
                    233: 
                    234:        CLS;
                    235:        if(useron.rows)
                    236:                rows=useron.rows;
                    237: #if 0  /* no such thing as local logon */
                    238:        else if(online==ON_LOCAL)
                    239:                rows=cfg.node_scrnlen-1;
                    240: #endif
                    241:        unixtodstr(&cfg,logontime,str);
                    242:        if(!strncmp(str,useron.birth,5) && !(useron.rest&FLAG('Q'))) {
                    243:                bputs(text[HappyBirthday]);
                    244:                pause();
                    245:                CLS;
                    246:                user_event(EVENT_BIRTHDAY); 
                    247:        }
                    248:        unixtodstr(&cfg,useron.laston,tmp);
                    249:        if(strcmp(str,tmp)) {                   /* str still equals logon time */
                    250:                useron.ltoday=1;
                    251:                useron.ttoday=useron.etoday=useron.ptoday=useron.textra=0;
                    252:                useron.freecdt=cfg.level_freecdtperday[useron.level]; 
                    253:        }
                    254:        else
                    255:                useron.ltoday++;
                    256: 
                    257:        gettimeleft();
                    258:        sprintf(str,"%sfile/%04u.dwn",cfg.data_dir,useron.number);
                    259:        batch_add_list(str);
                    260:        if(!qwklogon) {          /* QWK Nodes don't go through this */
                    261: 
                    262:                if(cfg.sys_pwdays
                    263:                        && (ulong)logontime>(useron.pwmod+((ulong)cfg.sys_pwdays*24UL*60UL*60UL))) {
                    264:                        bprintf(text[TimeToChangePw],cfg.sys_pwdays);
                    265: 
                    266:                        c=0;
                    267:                        while(c<LEN_PASS) {                             /* Create random password */
                    268:                                str[c]=sbbs_random(43)+'0';
                    269:                                if(isalnum(str[c]))
                    270:                                        c++; 
                    271:                        }
                    272:                        str[c]=0;
                    273:                        bprintf(text[YourPasswordIs],str);
                    274: 
                    275:                        if(cfg.sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ]))
                    276:                                while(online) {
                    277:                                        bputs(text[NewPassword]);
                    278:                                        getstr(str,LEN_PASS,K_UPPER|K_LINE);
                    279:                                        truncsp(str);
                    280:                                        if(chkpass(str,&useron,true))
                    281:                                                break;
                    282:                                        CRLF; 
                    283:                                }
                    284: 
                    285:                        while(online) {
                    286:                                if(cfg.sys_misc&SM_PWEDIT) {
                    287:                                        CRLF;
                    288:                                        bputs(text[VerifyPassword]); 
                    289:                                }
                    290:                                else
                    291:                                        bputs(text[NewUserPasswordVerify]);
                    292:                                console|=CON_R_ECHOX;
                    293:                                getstr(tmp,LEN_PASS*2,K_UPPER);
                    294:                                console&=~(CON_R_ECHOX|CON_L_ECHOX);
                    295:                                if(strcmp(str,tmp)) {
                    296:                                        bputs(text[Wrong]);
                    297:                                        continue; 
                    298:                                }
                    299:                                break; 
                    300:                        }
                    301:                        strcpy(useron.pass,str);
                    302:                        useron.pwmod=time(NULL);
                    303:                        putuserrec(&cfg,useron.number,U_PWMOD,8,ultoa(useron.pwmod,str,16));
                    304:                        bputs(text[PasswordChanged]);
                    305:                        pause(); 
                    306:                }
                    307:                if(useron.ltoday>cfg.level_callsperday[useron.level]
                    308:                        && !(useron.exempt&FLAG('L'))) {
                    309:                        bputs(text[NoMoreLogons]);
                    310:                        sprintf(str,"(%04u)  %-25s  Out of logons"
                    311:                                ,useron.number,useron.alias);
                    312:                        logline("+!",str);
                    313:                        hangup();
                    314:                        return(false); 
                    315:                }
                    316:                if(useron.rest&FLAG('L') && useron.ltoday>1) {
                    317:                        bputs(text[R_Logons]);
                    318:                        sprintf(str,"(%04u)  %-25s  Out of logons"
                    319:                                ,useron.number,useron.alias);
                    320:                        logline("+!",str);
                    321:                        hangup();
                    322:                        return(false); 
                    323:                }
                    324:                kmode=(cfg.uq&UQ_NOEXASC);
                    325:                if(!(cfg.uq&UQ_NOUPRLWR))
                    326:                        kmode|=K_UPRLWR;
                    327: 
                    328:                if(!(useron.rest&FLAG('G'))) {
                    329:                        if(!useron.name[0] && ((cfg.uq&UQ_ALIASES && cfg.uq&UQ_REALNAME)
                    330:                                || cfg.uq&UQ_COMPANY))
                    331:                                while(online) {
                    332:                                        if(cfg.uq&UQ_ALIASES && cfg.uq&UQ_REALNAME)
                    333:                                                bputs(text[EnterYourRealName]);
                    334:                                        else
                    335:                                                bputs(text[EnterYourCompany]);
                    336:                                        getstr(useron.name,LEN_NAME,kmode);
                    337:                                        if(cfg.uq&UQ_ALIASES && cfg.uq&UQ_REALNAME) {
                    338:                                                if(trashcan(useron.name,"name") || !useron.name[0]
                    339:                                                        || !strchr(useron.name,' ')
                    340:                                                        || strchr(useron.name,0xff)
                    341:                                                        || (cfg.uq&UQ_DUPREAL
                    342:                                                                && userdatdupe(useron.number,U_NAME,LEN_NAME
                    343:                                                                ,useron.name,0)))
                    344:                                                        bputs(text[YouCantUseThatName]);
                    345:                                                else
                    346:                                                        break; 
                    347:                                        }
                    348:                                        else
                    349:                                                break; 
                    350:                                }
                    351:                        if(cfg.uq&UQ_HANDLE && !useron.handle[0]) {
                    352:                                sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias);
                    353:                                while(online) {
                    354:                                        bputs(text[EnterYourHandle]);
                    355:                                        if(!getstr(useron.handle,LEN_HANDLE
                    356:                                                ,K_LINE|K_EDIT|K_AUTODEL|(cfg.uq&UQ_NOEXASC))
                    357:                                                || strchr(useron.handle,0xff)
                    358:                                                || (cfg.uq&UQ_DUPHAND
                    359:                                                        && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE
                    360:                                                        ,useron.handle,0))
                    361:                                                || trashcan(useron.handle,"name"))
                    362:                                                bputs(text[YouCantUseThatName]);
                    363:                                        else
                    364:                                                break; 
                    365:                                } 
                    366:                        }
                    367:                        if(cfg.uq&UQ_LOCATION && !useron.location[0])
                    368:                                while(online) {
                    369:                                        bputs(text[EnterYourCityState]);
                    370:                                        if(getstr(useron.location,LEN_LOCATION,kmode))
                    371:                                                break; 
                    372:                                }
                    373:                        if(cfg.uq&UQ_ADDRESS && !useron.address[0])
                    374:                                while(online) {
                    375:                                        bputs(text[EnterYourAddress]);
                    376:                                        if(getstr(useron.address,LEN_ADDRESS,kmode))
                    377:                                                break; 
                    378:                                }
                    379:                        if(cfg.uq&UQ_ADDRESS && !useron.zipcode[0])
                    380:                                while(online) {
                    381:                                        bputs(text[EnterYourZipCode]);
                    382:                                        if(getstr(useron.zipcode,LEN_ZIPCODE,K_UPPER|(cfg.uq&UQ_NOEXASC)))
                    383:                                                break; 
                    384:                                }
                    385:                        if(cfg.uq&UQ_PHONE && !useron.phone[0]) {
                    386:                                i=yesno(text[CallingFromNorthAmericaQ]);
                    387:                                while(online) {
                    388:                                        bputs(text[EnterYourPhoneNumber]);
                    389:                                        if(i) {
                    390:                                                if(gettmplt(useron.phone,cfg.sys_phonefmt
                    391:                                                        ,K_LINE|(cfg.uq&UQ_NOEXASC))<strlen(cfg.sys_phonefmt))
                    392:                                                         continue; 
                    393:                                        } else {
                    394:                                                if(getstr(useron.phone,LEN_PHONE
                    395:                                                        ,K_UPPER|(cfg.uq&UQ_NOEXASC))<5)
                    396:                                                        continue; 
                    397:                                        }
                    398:                                        if(!trashcan(useron.phone,"phone"))
                    399:                                                break; 
                    400:                                } 
                    401:                        }
                    402:                        if(!(sys_status&SS_RLOGIN) 
                    403:                                && !(cfg.uq&UQ_NONETMAIL) && !useron.netmail[0]) {
                    404:                                while(online) {
                    405:                                        bputs(text[EnterNetMailAddress]);
                    406:                                        if(getstr(useron.netmail,LEN_NETMAIL,K_EDIT|K_AUTODEL|K_LINE)
                    407:                                                && !trashcan(useron.netmail,"email"))
                    408:                                                break;
                    409:                                }
                    410:                                if(useron.netmail[0] && cfg.sys_misc&SM_FWDTONET && !noyes(text[ForwardMailQ]))
                    411:                                        useron.misc|=NETMAIL;
                    412:                                else 
                    413:                                        useron.misc&=~NETMAIL;
                    414:                        }
                    415:                        if(cfg.new_sif[0]) {
                    416:                                sprintf(str,"%suser/%4.4u.dat",cfg.data_dir,useron.number);
                    417:                                if(flength(str)<1L)
                    418:                                        create_sif_dat(cfg.new_sif,str); 
                    419:                        } 
                    420:                }
                    421:        }       
                    422:        if(!online) {
                    423:                sprintf(str,"(%04u)  %-25s  Unsuccessful logon"
                    424:                        ,useron.number,useron.alias);
                    425:                logline("+!",str);
                    426:                return(false); 
                    427:        }
                    428:        strcpy(useron.modem,connection);
                    429:        useron.logons++;
                    430:        putuserdat(&cfg,&useron);
                    431:        getmsgptrs();
                    432:        sys_status|=SS_USERON;          /* moved from further down */
                    433: 
                    434:        if(useron.rest&FLAG('Q')) {
                    435:                sprintf(str,"(%04u)  %-25s  QWK Network Connection"
                    436:                        ,useron.number,useron.alias);
                    437:                logline("++",str);
                    438:                return(true); 
                    439:        }
                    440: 
                    441:        /********************/
                    442:        /* SUCCESSFUL LOGON */
                    443:        /********************/
                    444:        totallogons=logonstats();
                    445:        sprintf(str,"(%04u)  %-25s  Logon %lu - %u"
                    446:                ,useron.number,useron.alias,totallogons,useron.ltoday);
                    447:        logline("++",str);
                    448: 
                    449:        if(!qwklogon && cfg.logon_mod[0])
                    450:                exec_bin(cfg.logon_mod,&main_csi);
                    451: 
                    452:        if(thisnode.status!=NODE_QUIET && (!REALSYSOP || cfg.sys_misc&SM_SYSSTAT)) {
                    453:                sprintf(str,"%slogon.lst",cfg.data_dir);
                    454:                if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
                    455:                        errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT|O_APPEND);
                    456:                        return(false); 
                    457:                }
                    458:                getuserrec(&cfg,useron.number,U_NOTE,LEN_NOTE,useron.note);
                    459:                getuserrec(&cfg,useron.number,U_LOCATION,LEN_LOCATION,useron.location);
                    460:                sprintf(str,text[LastFewCallersFmt],cfg.node_num
                    461:                        ,totallogons,useron.alias
                    462:                        ,cfg.sys_misc&SM_LISTLOC ? useron.location : useron.note
                    463:                        ,tm.tm_hour,tm.tm_min
                    464:                        ,connection,useron.ltoday);
                    465:                write(file,str,strlen(str));
                    466:                close(file); 
                    467:        }
                    468: 
                    469:        if(cfg.sys_logon[0])                            /* execute system logon event */
                    470:                external(cmdstr(cfg.sys_logon,nulstr,nulstr,NULL),EX_OUTR|EX_OUTL); /* EX_SH */
                    471: 
                    472:        if(qwklogon)
                    473:                return(true);
                    474: 
                    475:        sys_status|=SS_PAUSEON; /* always force pause on during this section */
                    476:        mailw=getmail(&cfg,useron.number,0);
                    477: 
                    478:        if(!(cfg.sys_misc&SM_NOSYSINFO)) {
                    479:                bprintf(text[SiSysName],cfg.sys_name);
                    480:                //bprintf(text[SiNodeNumberName],cfg.node_num,cfg.node_name);
                    481:                bprintf(text[LiUserNumberName],useron.number,useron.alias);
                    482:                bprintf(text[LiLogonsToday],useron.ltoday
                    483:                        ,cfg.level_callsperday[useron.level]);
                    484:                bprintf(text[LiTimeonToday],useron.ttoday
                    485:                        ,cfg.level_timeperday[useron.level]+useron.min);
                    486:                bprintf(text[LiMailWaiting],mailw);
                    487:                strcpy(str,text[LiSysopIs]);
                    488:                if(startup->options&BBS_OPT_SYSOP_AVAILABLE 
                    489:                        || (cfg.sys_chat_ar[0] && chk_ar(cfg.sys_chat_ar,&useron)))
                    490:                        strcat(str,text[LiSysopAvailable]);
                    491:                else
                    492:                        strcat(str,text[LiSysopNotAvailable]);
                    493:                bprintf("%s\r\n\r\n",str);
                    494:        }
                    495: 
                    496:        if(sys_status&SS_EVENT)
                    497:                bprintf(text[ReducedTime],timestr(&event_time));
                    498:        getnodedat(cfg.node_num,&thisnode,1);
                    499:        thisnode.misc&=~(NODE_AOFF|NODE_POFF);
                    500:        if(useron.chat&CHAT_NOACT)
                    501:                thisnode.misc|=NODE_AOFF;
                    502:        if(useron.chat&CHAT_NOPAGE)
                    503:                thisnode.misc|=NODE_POFF;
                    504:        putnodedat(cfg.node_num,&thisnode);
                    505: 
                    506:        getsmsg(useron.number);                 /* Moved from further down */
                    507:        SYNC;
                    508:        c=0;
                    509:        for(i=1;i<=cfg.sys_nodes;i++)
                    510:                if(i!=cfg.node_num) {
                    511:                        getnodedat(i,&node,0);
                    512:                        if(!(cfg.sys_misc&SM_NONODELIST)
                    513:                                && (node.status==NODE_INUSE
                    514:                                        || ((node.status==NODE_QUIET || node.errors) && SYSOP))) {
                    515:                                if(!c)
                    516:                                        bputs(text[NodeLstHdr]);
                    517:                                printnodedat(i,&node);
                    518:                                c=1; 
                    519:                        }
                    520:                        if(node.status==NODE_INUSE && i!=cfg.node_num && node.useron==useron.number
                    521:                                && !SYSOP && !(useron.exempt&FLAG('G'))) {
                    522:                                strcpy(tmp,"On two nodes at the same time");
                    523:                                sprintf(str,"(%04u)  %-25s  %s"
                    524:                                        ,useron.number,useron.alias,tmp);
                    525:                                logline("+!",str);
                    526:                                errorlog(tmp);
                    527:                                bputs(text[UserOnTwoNodes]);
                    528:                                hangup();
                    529:                                return(false); 
                    530:                        }
                    531:                        if(thisnode.status!=NODE_QUIET
                    532:                                && (node.status==NODE_INUSE || node.status==NODE_QUIET)
                    533:                                && !(node.misc&NODE_AOFF) && node.useron!=useron.number) {
                    534:                                sprintf(str,text[NodeLoggedOnAtNbps]
                    535:                                        ,cfg.node_num
                    536:                                        ,thisnode.misc&NODE_ANON ? text[UNKNOWN_USER] : useron.alias
                    537:                                        ,connection);
                    538:                                putnmsg(&cfg,i,str); 
                    539:                        } 
                    540:                }
                    541: 
                    542:        if(cfg.sys_exp_warn && useron.expire && useron.expire>now /* Warn user of coming */
                    543:                && (useron.expire-now)/(1440L*60L)<=cfg.sys_exp_warn) /* expiration */
                    544:                bprintf(text[AccountWillExpireInNDays],(useron.expire-now)/(1440L*60L));
                    545: 
                    546:        if(criterrs && SYSOP)
                    547:                bprintf(text[CriticalErrors],criterrs);
                    548:        if((i=getuserxfers(0,useron.number,0))!=0)
                    549:                bprintf(text[UserXferForYou],i,i>1 ? "s" : nulstr); 
                    550:        if((i=getuserxfers(useron.number,0,0))!=0)
                    551:                bprintf(text[UnreceivedUserXfer],i,i>1 ? "s" : nulstr);
                    552:        SYNC;
                    553:        sys_status&=~SS_PAUSEON;        /* Turn off the pause override flag */
                    554:        if(online==ON_REMOTE)
                    555:                rioctl(IOSM|ABORT);             /* Turn abort ability on */
                    556:        if(mailw) {
                    557:                if(yesno(text[ReadYourMailNowQ]))
                    558:                        readmail(useron.number,MAIL_YOUR); 
                    559:        }
                    560:        if(usrgrps && useron.misc&ASK_NSCAN && yesno(text[NScanAllGrpsQ]))
                    561:                scanallsubs(SCAN_NEW);
                    562:        if(usrgrps && useron.misc&ASK_SSCAN && yesno(text[SScanAllGrpsQ]))
                    563:                scanallsubs(SCAN_TOYOU);
                    564:        return(true);
                    565: }
                    566: 
                    567: /****************************************************************************/
                    568: /* Checks the system dsts.dab to see if it is a new day, if it is, all the  */
                    569: /* nodes' and the system's csts.dab are added to, and the dsts.dab's daily  */
                    570: /* stats are cleared. Also increments the logon values in dsts.dab if       */
                    571: /* applicable.                                                              */
                    572: /****************************************************************************/
                    573: ulong sbbs_t::logonstats()
                    574: {
                    575:     char str[MAX_PATH+1];
                    576:     int dsts,csts;
                    577:     uint i;
                    578:     time_t update_t=0;
                    579:     stats_t stats;
                    580:        node_t  node;
                    581:        struct tm tm, update_tm;
                    582: 
                    583:        sys_status&=~SS_DAILY;
                    584:        memset(&stats,0,sizeof(stats));
                    585:        sprintf(str,"%sdsts.dab",cfg.ctrl_dir);
                    586:        if((dsts=nopen(str,O_RDWR))==-1) {
                    587:                errormsg(WHERE,ERR_OPEN,str,O_RDWR);
                    588:                return(0L); 
                    589:        }
                    590:        read(dsts,&update_t,4);                 /* Last updated         */
                    591:        read(dsts,&stats.logons,4);             /* Total number of logons on system */
                    592:        close(dsts);
                    593:        now=time(NULL);
                    594:        if(update_t>now+(24L*60L*60L)) /* More than a day in the future? */
                    595:                errormsg(WHERE,ERR_CHK,"Daily stats time stamp",update_t);
                    596:        if(localtime_r(&update_t,&update_tm)==NULL)
                    597:                return(0);
                    598:        if(localtime_r(&now,&tm)==NULL)
                    599:                return(0);
                    600:        if((tm.tm_mday>update_tm.tm_mday && tm.tm_mon==update_tm.tm_mon)
                    601:                || tm.tm_mon>update_tm.tm_mon || tm.tm_year>update_tm.tm_year) {
                    602: 
                    603:                sprintf(str,"New Day - Prev: %s ",timestr(&update_t));
                    604:                logentry("!=",str);
                    605: 
                    606:                sys_status|=SS_DAILY;       /* New Day !!! */
                    607:                sprintf(str,"%slogon.lst",cfg.data_dir);    /* Truncate logon list */
                    608:                if((dsts=nopen(str,O_TRUNC|O_CREAT|O_WRONLY))==-1) {
                    609:                        errormsg(WHERE,ERR_OPEN,str,O_TRUNC|O_CREAT|O_WRONLY);
                    610:                        return(0L); 
                    611:                }
                    612:                close(dsts);
                    613:                for(i=0;i<=cfg.sys_nodes;i++) {
                    614:                        if(i) {     /* updating a node */
                    615:                                getnodedat(i,&node,1);
                    616:                                node.misc|=NODE_EVENT;
                    617:                                putnodedat(i,&node); 
                    618:                        }
                    619:                        sprintf(str,"%sdsts.dab",i ? cfg.node_path[i-1] : cfg.ctrl_dir);
                    620:                        if((dsts=nopen(str,O_RDWR))==-1) /* node doesn't have stats yet */
                    621:                                continue;
                    622:                        sprintf(str,"%scsts.dab",i ? cfg.node_path[i-1] : cfg.ctrl_dir);
                    623:                        if((csts=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) {
                    624:                                close(dsts);
                    625:                                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT);
                    626:                                continue; 
                    627:                        }
                    628:                        lseek(dsts,8L,SEEK_SET);        /* Skip time and logons */
                    629:                        write(csts,&now,4);
                    630:                        read(dsts,&stats.ltoday,4);
                    631:                        write(csts,&stats.ltoday,4);
                    632:                        lseek(dsts,4L,SEEK_CUR);        /* Skip total time on */
                    633:                        read(dsts,&stats.ttoday,4);
                    634:                        write(csts,&stats.ttoday,4);
                    635:                        read(dsts,&stats.uls,4);
                    636:                        write(csts,&stats.uls,4);
                    637:                        read(dsts,&stats.ulb,4);
                    638:                        write(csts,&stats.ulb,4);
                    639:                        read(dsts,&stats.dls,4);
                    640:                        write(csts,&stats.dls,4);
                    641:                        read(dsts,&stats.dlb,4);
                    642:                        write(csts,&stats.dlb,4);
                    643:                        read(dsts,&stats.ptoday,4);
                    644:                        write(csts,&stats.ptoday,4);
                    645:                        read(dsts,&stats.etoday,4);
                    646:                        write(csts,&stats.etoday,4);
                    647:                        read(dsts,&stats.ftoday,4);
                    648:                        write(csts,&stats.ftoday,4);
                    649:                        close(csts);
                    650:                        lseek(dsts,0L,SEEK_SET);        /* Go back to beginning */
                    651:                        write(dsts,&now,4);             /* Update time stamp  */
                    652:                        lseek(dsts,4L,SEEK_CUR);        /* Skip total logons */
                    653:                        stats.ltoday=0;
                    654:                        write(dsts,&stats.ltoday,4);  /* Logons today to 0 */
                    655:                        lseek(dsts,4L,SEEK_CUR);     /* Skip total time on */
                    656:                        stats.ttoday=0;              /* Set all other today variables to 0 */
                    657:                        write(dsts,&stats.ttoday,4);        /* Time on today to 0 */
                    658:                        write(dsts,&stats.ttoday,4);        /* Uploads today to 0 */
                    659:                        write(dsts,&stats.ttoday,4);        /* U/L Bytes today    */
                    660:                        write(dsts,&stats.ttoday,4);        /* Download today     */
                    661:                        write(dsts,&stats.ttoday,4);        /* Download bytes     */
                    662:                        write(dsts,&stats.ttoday,4);        /* Posts today        */
                    663:                        write(dsts,&stats.ttoday,4);        /* Emails today       */
                    664:                        write(dsts,&stats.ttoday,4);        /* Feedback today     */
                    665:                        write(dsts,&stats.ttoday,2);        /* New users Today    */
                    666:                        close(dsts); 
                    667:                } 
                    668:        }
                    669: 
                    670:        if(cfg.node_num==0)     /* called from event_thread() */
                    671:                return(0);
                    672: 
                    673:        if(thisnode.status==NODE_QUIET)       /* Quiet users aren't counted */
                    674:                return(0);
                    675: 
                    676:        if(REALSYSOP && !(cfg.sys_misc&SM_SYSSTAT))
                    677:                return(0);
                    678: 
                    679:        for(i=0;i<2;i++) {
                    680:                sprintf(str,"%sdsts.dab",i ? cfg.ctrl_dir : cfg.node_dir);
                    681:                if((dsts=nopen(str,O_RDWR))==-1) {
                    682:                        errormsg(WHERE,ERR_OPEN,str,O_RDWR);
                    683:                        return(0L); 
                    684:                }
                    685:                lseek(dsts,4L,SEEK_SET);        /* Skip time stamp */
                    686:                read(dsts,&stats.logons,4);
                    687:                read(dsts,&stats.ltoday,4);
                    688:                stats.logons++;
                    689:                stats.ltoday++;
                    690:                lseek(dsts,4L,SEEK_SET);        /* Rewind back and overwrite */
                    691:                write(dsts,&stats.logons,4);
                    692:                write(dsts,&stats.ltoday,4);
                    693:                close(dsts); 
                    694:        }
                    695:        return(stats.logons);
                    696: }
                    697: 
                    698: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.