--- sbbs/src/sbbs3/useredit.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/useredit.cpp 2018/04/24 16:43:05 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet online sysop user editor */ -/* $Id: useredit.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: useredit.cpp,v 1.1.1.2 2018/04/24 16:43:05 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 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2010 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 * @@ -68,7 +68,8 @@ void sbbs_t::useredit(int usernumber) if(!(cfg.sys_misc&SM_L_SYSOP)) return; if(cfg.node_misc&NM_SYSPW && !chksyspass()) - return; } + return; + } #endif if(usernumber) user.number=usernumber; @@ -89,13 +90,16 @@ void sbbs_t::useredit(int usernumber) bputs(text[NoUserData]); getkey(0); sys_status&=~SS_INUEDIT; - return; } } + return; + } + } unixtodstr(&cfg,time(NULL),str); unixtodstr(&cfg,user.laston,tmp); if(strcmp(str,tmp) && user.ltoday) { user.ltoday=user.ttoday=user.ptoday=user.etoday=user.textra=0; user.freecdt=cfg.level_freecdtperday[user.level]; - putuserdat(&cfg,&user); } /* Leave alone */ + putuserdat(&cfg,&user); /* Leave alone */ + } if(user.misc&DELETED) bputs(text[Deleted]); else if(user.misc&INACTIVE) @@ -117,7 +121,7 @@ void sbbs_t::useredit(int usernumber) if(user.netmail[0]) bprintf(text[UserNetMail],user.netmail); - sprintf(str,"%suser/%4.4u.msg", cfg.data_dir,user.number); + SAFEPRINTF2(str,"%suser/%4.4u.msg", cfg.data_dir,user.number); i=fexist(str); if(user.comment[0] || i) bprintf(text[UeditCommentLine],i ? '+' : ' ' @@ -146,7 +150,7 @@ void sbbs_t::useredit(int usernumber) bprintf(text[UserUploads],ultoac(user.ulb,tmp),user.uls); if(user.leech) - sprintf(str,text[UserLeech],user.leech); + SAFEPRINTF(str,text[UserLeech],user.leech); else str[0]=0; bprintf(text[UserDownloads],ultoac(user.dlb,tmp),user.dls,str); @@ -163,13 +167,14 @@ void sbbs_t::useredit(int usernumber) lncntr=0; bprintf(text[UeditPrompt],user.number,l); if(user.level>useron.level && console&CON_R_INPUT) - strcpy(str,"QG[]?/{},"); + SAFECOPY(str,"QG[]?/{},"); else - strcpy(str,"ABCDEFGHIJKLMNOPQRSTUVWXYZ+[]?/{}~*$#"); + SAFECOPY(str,"ABCDEFGHIJKLMNOPQRSTUVWXYZ+[]?/{}~*$#"); l=getkeys(str,l); if(l&0x80000000L) { user.number=(ushort)(l&~0x80000000L); - continue; } + continue; + } switch(l) { case 'A': bputs(text[EnterYourAlias]); @@ -197,35 +202,44 @@ void sbbs_t::useredit(int usernumber) if(!noyes(text[UeditRestoreQ])) { putuserrec(&cfg,user.number,U_MISC,8 ,ultoa(user.misc&~DELETED,str,16)); - putusername(&cfg,user.number,user.alias); } - break; } + putusername(&cfg,user.number,user.alias); + } + break; + } if(user.misc&INACTIVE) { if(!noyes(text[UeditActivateQ])) putuserrec(&cfg,user.number,U_MISC,8 ,ultoa(user.misc&~INACTIVE,str,16)); - break; } + break; + } if(!noyes(text[UeditDeleteQ])) { getsmsg(user.number); if(getmail(&cfg,user.number,0)) { if(yesno(text[UeditReadUserMailWQ])) - readmail(user.number,MAIL_YOUR); } + readmail(user.number,MAIL_YOUR); + } if(getmail(&cfg,user.number,1)) { if(yesno(text[UeditReadUserMailSQ])) - readmail(user.number,MAIL_SENT); } + readmail(user.number,MAIL_SENT); + } putuserrec(&cfg,user.number,U_MISC,8 ,ultoa(user.misc|DELETED,str,16)); putusername(&cfg,user.number,nulstr); - break; } + break; + } if(!noyes(text[UeditDeactivateUserQ])) { if(getmail(&cfg,user.number,0)) { if(yesno(text[UeditReadUserMailWQ])) - readmail(user.number,MAIL_YOUR); } + readmail(user.number,MAIL_YOUR); + } if(getmail(&cfg,user.number,1)) { if(yesno(text[UeditReadUserMailSQ])) - readmail(user.number,MAIL_SENT); } + readmail(user.number,MAIL_SENT); + } putuserrec(&cfg,user.number,U_MISC,8 ,ultoa(user.misc|INACTIVE,str,16)); - break; } + break; + } break; case 'E': if(!yesno(text[ChangeExemptionQ])) @@ -238,12 +252,14 @@ void sbbs_t::useredit(int usernumber) if(c==CR) break; if(c=='?') { menu("exempt"); - continue; } + continue; + } if(user.level>useron.level && !(useron.exempt&FLAG(c)) && console&CON_R_INPUT) continue; user.exempt^=FLAG(c); - putuserrec(&cfg,user.number,U_EXEMPT,8,ultoa(user.exempt,tmp,16)); } + putuserrec(&cfg,user.number,U_EXEMPT,8,ultoa(user.exempt,tmp,16)); + } break; case 'F': i=1; @@ -261,18 +277,21 @@ void sbbs_t::useredit(int usernumber) break; case 4: bprintf(text[FlagEditing],ltoaf(user.flags4,tmp)); - break; } + break; + } c=(char)getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?1234\r",0); if(sys_status&SS_ABORT) break; if(c==CR) break; if(c=='?') { - sprintf(str,"flags%d",i); + SAFEPRINTF(str,"flags%d",i); menu(str); - continue; } + continue; + } if(isdigit(c)) { i=c&0xf; - continue; } + continue; + } if(user.level>useron.level && console&CON_R_INPUT) switch(i) { case 1: @@ -290,7 +309,8 @@ void sbbs_t::useredit(int usernumber) case 4: if(!(useron.flags4&FLAG(c))) continue; - break; } + break; + } switch(i) { case 1: user.flags1^=FLAG(c); @@ -311,7 +331,9 @@ void sbbs_t::useredit(int usernumber) user.flags4^=FLAG(c); putuserrec(&cfg,user.number,U_FLAGS4,8 ,ultoa(user.flags4,tmp,16)); - break; } } + break; + } + } break; case 'G': bputs(text[GoToUser]); @@ -320,14 +342,17 @@ void sbbs_t::useredit(int usernumber) i=atoi(str); if(i>lastuser(&cfg)) break; - if(i) user.number=i; } + if(i) user.number=i; + } else { i=finduser(str); - if(i) user.number=i; } } + if(i) user.number=i; + } + } break; case 'H': /* edit user's information file */ attr(LIGHTGRAY); - sprintf(str,"%suser/%4.4u.msg", cfg.data_dir,user.number); + SAFEPRINTF2(str,"%suser/%4.4u.msg", cfg.data_dir,user.number); editfile(str); break; case 'I': @@ -436,7 +461,7 @@ void sbbs_t::useredit(int usernumber) if(sys_status&SS_ABORT) break; bputs(text[UeditUploads]); - sprintf(str,"%u",user.uls); + SAFEPRINTF(str,"%u",user.uls); if(getstr(str,5,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) putuserrec(&cfg,user.number,U_ULS,5,str); if(sys_status&SS_ABORT) @@ -448,7 +473,7 @@ void sbbs_t::useredit(int usernumber) if(sys_status&SS_ABORT) break; bputs(text[UeditDownloads]); - sprintf(str,"%u",user.dls); + SAFEPRINTF(str,"%u",user.dls); if(getstr(str,5,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) putuserrec(&cfg,user.number,U_DLS,5,str); break; @@ -459,7 +484,8 @@ void sbbs_t::useredit(int usernumber) bprintf(text[QuickValidateFmt] ,i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],str) ,ltoaf(cfg.val_exempt[i],tmp) - ,ltoaf(cfg.val_rest[i],tmp3)); } + ,ltoaf(cfg.val_rest[i],tmp3)); + } ASYNC; bputs(text[QuickValidatePrompt]); c=getkey(0); @@ -479,7 +505,8 @@ void sbbs_t::useredit(int usernumber) if(user.expire0) { user.number=i; putusername(&cfg,user.number,user.alias); - putuserdat(&cfg,&user); } } + putuserdat(&cfg,&user); + } + } break; case 'Z': if(!yesno(text[ChangeRestrictsQ])) @@ -513,9 +542,11 @@ void sbbs_t::useredit(int usernumber) if(c==CR) break; if(c=='?') { menu("restrict"); - continue; } + continue; + } user.rest^=FLAG(c); - putuserrec(&cfg,user.number,U_REST,8,ultoa(user.rest,tmp,16)); } + putuserrec(&cfg,user.number,U_REST,8,ultoa(user.rest,tmp,16)); + } break; case '?': CLS; @@ -556,7 +587,7 @@ void sbbs_t::useredit(int usernumber) putuserrec(&cfg,user.number,U_MIN,10,ultoa(user.min,tmp,10)); break; case '#': /* read new user questionaire */ - sprintf(str,"%suser/%4.4u.dat", cfg.data_dir,user.number); + SAFEPRINTF2(str,"%suser/%4.4u.dat", cfg.data_dir,user.number); if(!cfg.new_sof[0] || !fexist(str)) break; read_sif_dat(cfg.new_sof,str); @@ -586,11 +617,14 @@ void sbbs_t::useredit(int usernumber) for(i=k-1;i;i--) { user.number=i; getuserdat(&cfg,&user); - if(chk_ar(ar,&user)) { + if(chk_ar(ar,&user,/* client: */NULL)) { outchar(BEL); - break; } } + break; + } + } if(!i) - user.number=k; } + user.number=k; + } break; case '}': if(stype==SEARCH_TXT) @@ -603,11 +637,14 @@ void sbbs_t::useredit(int usernumber) for(i=k+1;i<=j;i++) { user.number=i; getuserdat(&cfg,&user); - if(chk_ar(ar,&user)) { + if(chk_ar(ar,&user,/* client: */NULL)) { outchar(BEL); - break; } } + break; + } + } if(i>j) - user.number=k; } + user.number=k; + } break; case ']': if(user.number==lastuser(&cfg)) @@ -641,11 +678,11 @@ int sbbs_t::searchup(char *search,int us if(!search[0]) return(usernum); - sprintf(userdat,"%suser/user.dat", cfg.data_dir); + SAFEPRINTF(userdat,"%suser/user.dat", cfg.data_dir); if((file=nopen(userdat,O_RDONLY|O_DENYNONE))==-1) return(usernum); - flen=filelength(file); + flen=(long)filelength(file); lseek(file,(long)((long)usernum*U_LEN),0); while((i*U_LEN)<=(ulong)flen) { @@ -699,7 +736,7 @@ int sbbs_t::searchdn(char *search,int us if(!search[0]) return(usernum); - sprintf(userdat,"%suser/user.dat", cfg.data_dir); + SAFEPRINTF(userdat,"%suser/user.dat", cfg.data_dir); if((file=nopen(userdat,O_RDONLY|O_DENYNONE))==-1) return(usernum); while(i) { @@ -754,7 +791,7 @@ void sbbs_t::maindflts(user_t* user) if(user->rows) rows=user->rows; bprintf(text[UserDefaultsHdr],user->alias,user->number); - sprintf(str,"%s%s%s%s%s" + safe_snprintf(str,sizeof(str),"%s%s%s%s%s" ,user->misc&AUTOTERM ? "Auto Detect ":nulstr ,user->misc&ANSI ? "ANSI ":"TTY " ,user->misc&COLOR ? "(Color) ":"(Mono) " @@ -768,7 +805,7 @@ void sbbs_t::maindflts(user_t* user) if(user->rows) ultoa(user->rows,tmp,10); else - sprintf(tmp,"Auto Detect (%ld)",rows); + SAFEPRINTF(tmp,"Auto Detect (%ld)",rows); bprintf(text[UserDefaultsRows],tmp); if(cfg.total_shells>1) bprintf(text[UserDefaultsCommandSet] @@ -804,18 +841,21 @@ void sbbs_t::maindflts(user_t* user) if(useron.exempt&FLAG('Q') || user->misc&QUIET) bprintf(text[UserDefaultsQuiet] ,user->misc&QUIET ? text[On] : text[Off]); - if(user->prot!=' ') - sprintf(str,"%c",user->prot); - else - strcpy(str,"None"); + SAFECOPY(str,"None"); + for(i=0;iprot==cfg.prot[i]->mnemonic) { + SAFECOPY(str,cfg.prot[i]->name); + break; + } + } bprintf(text[UserDefaultsProtocol],str - ,user->misc&AUTOHANG ? "(Hang-up After Xfer)":nulstr); + ,user->misc&AUTOHANG ? "(Auto-Hangup)":nulstr); if(cfg.sys_misc&SM_PWEDIT && !(user->rest&FLAG('G'))) bputs(text[UserDefaultsPassword]); ASYNC; bputs(text[UserDefaultsWhich]); - strcpy(str,"HTBALPRSYFNCQXZ\r"); + SAFECOPY(str,"HTBALPRSYFNCQXZ\r"); if(cfg.sys_misc&SM_PWEDIT && !(user->rest&FLAG('G'))) strcat(str,"W"); if(useron.exempt&FLAG('Q') || user->misc&QUIET) @@ -835,19 +875,22 @@ void sbbs_t::maindflts(user_t* user) if(yesno(text[AutoTerminalQ])) { user->misc|=AUTOTERM; user->misc&=~(ANSI|RIP|WIP|HTML); - user->misc|=autoterm; } + user->misc|=autoterm; + } else user->misc&=~AUTOTERM; if(!(user->misc&AUTOTERM)) { if(yesno(text[AnsiTerminalQ])) user->misc|=ANSI; else - user->misc&=~(ANSI|COLOR); } + user->misc&=~(ANSI|COLOR); + } if(user->misc&ANSI) { if(yesno(text[ColorTerminalQ])) user->misc|=COLOR; else - user->misc&=~COLOR; } + user->misc&=~COLOR; + } if(!yesno(text[ExAsciiTerminalQ])) user->misc|=NO_EXASCII; else @@ -856,7 +899,8 @@ void sbbs_t::maindflts(user_t* user) if(!noyes(text[RipTerminalQ])) user->misc|=RIP; else - user->misc&=~RIP; } + user->misc&=~RIP; + } putuserrec(&cfg,user->number,U_MISC,8,ultoa(user->misc,str,16)); break; case 'B': @@ -864,25 +908,26 @@ void sbbs_t::maindflts(user_t* user) putuserrec(&cfg,user->number,U_MISC,8,ultoa(user->misc,str,16)); break; case 'E': - if(noyes("Use an external editor")) { + if(noyes(text[UseExternalEditorQ])) { putuserrec(&cfg,user->number,U_XEDIT,8,nulstr); - break; } + break; + } if(user->xedit) user->xedit--; for(i=0;iname, cfg.xedit[i]->ar); + uselect(1,i,text[ExternalEditorHeading],cfg.xedit[i]->name, cfg.xedit[i]->ar); if((i=uselect(0,user->xedit,0,0,0))>=0) putuserrec(&cfg,user->number,U_XEDIT,8,cfg.xedit[i]->code); break; case 'K': /* Command shell */ for(i=0;iname,cfg.shell[i]->ar); + uselect(1,i,text[CommandShellHeading],cfg.shell[i]->name,cfg.shell[i]->ar); if((i=uselect(0,user->shell,0,0,0))>=0) putuserrec(&cfg,user->number,U_SHELL,8,cfg.shell[i]->code); break; case 'A': for(i=0;iext,cfg.fcomp[i]->ar); + uselect(1,i,text[ArchiveTypeHeading],cfg.fcomp[i]->ext,cfg.fcomp[i]->ar); if((i=uselect(0,0,0,0,0))>=0) putuserrec(&cfg,user->number,U_TMPEXT,3,cfg.fcomp[i]->ext); break; @@ -907,7 +952,7 @@ void sbbs_t::maindflts(user_t* user) case 'S': user->misc^=SPIN; if(!(user->misc&SPIN)) { - if(!yesno("Spinning cursor on pause prompts")) + if(!yesno(text[SpinningCursorOnPauseQ])) user->misc|=NOPAUSESPIN; else user->misc&=~NOPAUSESPIN; @@ -942,7 +987,8 @@ void sbbs_t::maindflts(user_t* user) bputs(text[EnterNetMailAddress]); if(!getstr(user->netmail,LEN_NETMAIL,K_EDIT|K_AUTODEL|K_LINE)) break; - putuserrec(&cfg,user->number,U_NETMAIL,LEN_NETMAIL,user->netmail); } + putuserrec(&cfg,user->number,U_NETMAIL,LEN_NETMAIL,user->netmail); + } putuserrec(&cfg,user->number,U_MISC,8,ultoa(user->misc,str,16)); break; case 'C': @@ -966,7 +1012,8 @@ void sbbs_t::maindflts(user_t* user) if(strcmp(str,user->pass)) { bputs(text[WrongPassword]); pause(); - break; } + break; + } bputs(text[NewPassword]); if(!getstr(str,LEN_PASS,K_UPPER|K_LINE)) break; @@ -974,7 +1021,8 @@ void sbbs_t::maindflts(user_t* user) if(!chkpass(str,user,false)) { CRLF; pause(); - break; } + break; + } bputs(text[VerifyPassword]); console|=CON_R_ECHOX; getstr(tmp,LEN_PASS*2,K_UPPER); @@ -982,37 +1030,40 @@ void sbbs_t::maindflts(user_t* user) if(strcmp(str,tmp)) { bputs(text[WrongPassword]); pause(); - break; } + break; + } if(!online) break; putuserrec(&cfg,user->number,U_PASS,LEN_PASS,str); now=time(NULL); putuserrec(&cfg,user->number,U_PWMOD,8,ultoa(now,tmp,16)); bputs(text[PasswordChanged]); - sprintf(str,"%s changed password",useron.alias); - logline(nulstr,str); + SAFEPRINTF(str,"%s changed password",useron.alias); + logline(LOG_NOTICE,nulstr,str); } - sprintf(str,"%suser/%04u.sig",cfg.data_dir,user->number); - if(fexist(str) && yesno("View signature")) + SAFEPRINTF2(str,"%suser/%04u.sig",cfg.data_dir,user->number); + if(fexist(str) && yesno(text[ViewSignatureQ])) printfile(str,P_NOATCODES); - if(!noyes("Create/Edit signature")) + if(!noyes(text[CreateEditSignatureQ])) editfile(str); - else if(fexist(str) && !noyes("Delete signature")) + else if(fexist(str) && !noyes(text[DeleteSignatureQ])) remove(str); break; case 'Z': xfer_prot_menu(XFER_DOWNLOAD); SYNC; mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); + SAFECOPY(str,"Q"); for(i=0;idlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { - sprintf(tmp,"%c",cfg.prot[i]->mnemonic); - strcat(str,tmp); } + if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) { + SAFEPRINTF(tmp,"%c",cfg.prot[i]->mnemonic); + strcat(str,tmp); + } ch=(char)getkeys(str,0); if(ch=='Q' || sys_status&SS_ABORT) { ch=' '; - putuserrec(&cfg,user->number,U_PROT,1,&ch); } + putuserrec(&cfg,user->number,U_PROT,1,&ch); + } else putuserrec(&cfg,user->number,U_PROT,1,&ch); if(yesno(text[HangUpAfterXferQ])) @@ -1022,7 +1073,9 @@ void sbbs_t::maindflts(user_t* user) putuserrec(&cfg,user->number,U_MISC,8,ultoa(user->misc,str,16)); break; default: - return; } } + return; + } + } } void sbbs_t::purgeuser(int usernumber) @@ -1032,9 +1085,9 @@ void sbbs_t::purgeuser(int usernumber) user.number=usernumber; getuserdat(&cfg,&user); - sprintf(str,"Purged %s #%u",user.alias,usernumber); + SAFEPRINTF2(str,"Purged %s #%u",user.alias,usernumber); logentry("!*",str); - delallmail(usernumber); + delallmail(usernumber, MAIL_ANY); putusername(&cfg,usernumber,nulstr); putuserrec(&cfg,usernumber,U_MISC,8,ultoa(user.misc|DELETED,str,16)); }