diff --git a/axenums.e b/axenums.e index 1832eb3..25de8f3 100644 --- a/axenums.e +++ b/axenums.e @@ -44,3 +44,5 @@ EXPORT ENUM SUBTYPE_ANYCMD=-1, SUBTYPE_CONFCMD=0, SUBTYPE_NODECMD=1, SUBTYPE_CMD -> User Keys Flags /* show new user message */ /* show all users only once */ EXPORT ENUM USER_NEWMSG=1,USER_TOCONF1=2, USER_ONETIME_MSG=4,USER_SCRNCLR=8,USER_DONATED=16,USER_ED_FULLSCREEN=32,USER_ED_PROMPT=64,USER_BGFILECHECK=128 + +EXPORT ENUM PWD_LEGACY=0, PWD_PBKDF2_5=1, PWD_PBKDF2_50=2, PWD_PBKDF2_100=3,PWD_PBKDF2_1000=4,PWD_PBKDF2_10000=5 \ No newline at end of file diff --git a/axobjects.e b/axobjects.e index d04fa97..90c5b6b 100644 --- a/axobjects.e +++ b/axobjects.e @@ -87,10 +87,14 @@ EXPORT OBJECT userMisc uploadBytesBCD[8]:ARRAY OF CHAR eMail[50]:ARRAY OF CHAR lastDlCPS:LONG - unused[142]:ARRAY OF CHAR - ->unknown[28]:ARRAY OF CHAR - ->nodeFlags[32]:ARRAY OF LONG - ->confFlags2[10]:ARRAY OF LONG + pwdHash[32]:ARRAY OF CHAR + salt[8]:ARRAY OF CHAR + pwdType:CHAR + forcePwdReset:CHAR + accountLocked:CHAR + invalidAttempts:CHAR + pwdLastUpdated:LONG + unused[94]:ARRAY OF CHAR ENDOBJECT EXPORT OBJECT tempAccess diff --git a/express.e b/express.e index 0d74eeb..e493fc0 100644 --- a/express.e +++ b/express.e @@ -26,7 +26,7 @@ MODULE 'intuition/screens','intuition/intuition','intuition/gadgetclass','exec/p 'libraries/asyncio' MODULE '*axcommon','*axconsts','*axenums','*axobjects','*miscfuncs','*stringlist','*ftpd','*httpd','*errors','*mailssl','*zmodem', - '*xymodem','*hydra','*bcd','*pwdhash','*tooltypes','*expversion' + '*xymodem','*hydra','*bcd','*pwdhash','*sha256','*tooltypes','*expversion' DEF masterMsg:acpMessage DEF resmp: PTR TO mp @@ -42,7 +42,7 @@ DEF singleNode=0: PTR TO singlePort DEF masterNode=0: PTR TO multiPort DEF debug=FALSE DEF consoleDebugLevel=LOG_NONE -DEF debugLogLevel=LOG_NONE +DEF debugLogLevel=LOG_ERROR DEF inputLogging=FALSE DEF inac=FALSE @@ -150,8 +150,8 @@ DEF tTCPS=0 ->DEF tTTM=0 DEF ulTTTM=0 DEF dlTTTM=0 -DEF dTBT=0 -DEF uTBT=0 +DEF dTBT[8]:ARRAY OF CHAR +DEF uTBT[8]:ARRAY OF CHAR DEF beenUDd=0 DEF lcFileXfr=0 DEF recFileNames:PTR TO stringlist @@ -279,7 +279,8 @@ DEF doorSilent=FALSE DEF cancelTransferOffHook=FALSE DEF aeGoodFile=0 -DEF sysopdl,numFiles,fsize,dtfsize +DEF sysopdl,numFiles,fsize +DEF dtfsize[8]:ARRAY OF CHAR DEF zModemInfo: zModem DEF chatSerFlag=0,chatConFlag=0 @@ -356,7 +357,8 @@ DEF includeDeact=FALSE DEF bgChecking=FALSE -DEF ftptime=0 +DEF ftptime1=0 +DEF ftptime2=0 DEF nativeTelnet=FALSE DEF nativeFtp=FALSE @@ -366,7 +368,10 @@ DEF offHookFlag=TRUE DEF lastIAC=FALSE DEF lastIAC2=FALSE +DEF iaccmd=0 DEF nawsMode=0 +DEF willsent=FALSE +DEF dosent=FALSE DEF nodeStart=0 @@ -383,7 +388,7 @@ DEF zmodemRxBuffer=0 DEF zModemRxBufferSize=65536 DEF bufferedBytes=0 DEF bufferReadOffset=0 -->DEF lastCarrierCheck=0 +DEF lastCarrierCheck=0 DEF cmdShortcuts=FALSE DEF shortcuts:PTR TO stringlist @@ -902,6 +907,125 @@ PROC resetSystem() ENDIF ENDPROC +PROC checkPasswordStrength(newPass:PTR TO CHAR) + DEF min,act,lower=0,upper=0,num=0,sym=0,i + min:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_LENGTH') + IF min>0 + IF StrLen(newPass)0 + act:=0 + IF min>4 THEN min:=4 + FOR i:=0 TO StrLen(newPass)-1 + IF (newPass[i]>=48) AND (newPass[i]<=57) + num:=1 + ELSEIF (newPass[i]>=65) AND (newPass[i]<=90) + upper:=1 + ELSEIF (newPass[i]>=97) AND (newPass[i]<=122) + lower:=1 + ELSE + sym:=1 + ENDIF + ENDFOR + act:=lower+upper+num+sym + IF act=0 + IF userMisc.invalidAttempts>=maxAttempts + userMisc.accountLocked:=TRUE + userMisc.invalidAttempts:=0 + ENDIF + ENDIF + ELSE + userMisc.invalidAttempts:=0 + ENDIF + +ENDPROC res + + PROC acceptIncomingConnection(sock,ftp) DEF ni:PTR TO nodeInfo DEF socket @@ -1054,8 +1178,8 @@ PROC checkDoorMsg(mode) ->calculate the new password hash StrCopy(tempstring,servermsg.string) IF StrLen(tempstring)>0 - UpperStr(tempstring) - loggedOnUser.pwdHash:=calcPasswordHash(tempstring) + setNewPassword(loggedOnUser,loggedOnUserMisc,tempstring) + loggedOnUserMisc.pwdLastUpdated:=getSystemTime() ENDIF ENDIF CASE DT_LOCATION @@ -1368,11 +1492,12 @@ PROC checkDoorMsg(mode) inac:=FALSE ENDPROC returnval -PROC getPass2(prompt: PTR TO CHAR,password:PTR TO CHAR,pwdhash:LONG, max:LONG,outstr=NIL:PTR TO CHAR) +PROC getPass2(prompt: PTR TO CHAR,password:PTR TO CHAR,userPwd, max:LONG,outstr=NIL:PTR TO CHAR) DEF c,i,j DEF pass[200]:STRING DEF tempstr[255]:STRING + DEF passType i:=1 IF (password<>NIL) @@ -1427,13 +1552,39 @@ PROC getPass2(prompt: PTR TO CHAR,password:PTR TO CHAR,pwdhash:LONG, max:LONG,ou aePuts('\b\n') RETURN RESULT_SUCCESS ENDIF - ELSE - UpperStr(pass) - IF calcPasswordHash(pass)=pwdhash + ELSEIF userPwd + IF checkUserPassword(loggedOnUser,loggedOnUserMisc,pass) + IF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','LEGACY') + passType:=PWD_LEGACY + ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_5') + passType:=PWD_PBKDF2_5 + ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_50') + passType:=PWD_PBKDF2_50 + ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_100') + passType:=PWD_PBKDF2_100 + ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_1000') + passType:=PWD_PBKDF2_1000 + ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_10000') + passType:=PWD_PBKDF2_10000 + ELSE + passType:=PWD_PBKDF2_100 + ENDIF + + IF loggedOnUserMisc.pwdType<>passType + setNewPassword(loggedOnUser,loggedOnUserMisc,pass) + ENDIF + + IF checkToolTypeExists(TOOLTYPE_BBSCONFIG,0,'STRICT_PASSWORD_POLICY') + IF checkPasswordStrength(pass)<>TRUE THEN loggedOnUserMisc.forcePwdReset:=TRUE + ENDIF purgeLine() aePuts('\b\n') RETURN RESULT_SUCCESS ENDIF + ELSE + purgeLine() + aePuts('\b\n') + RETURN RESULT_SUCCESS ENDIF ENDIF aePuts('\b\n') @@ -3309,8 +3460,8 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n ->calculate the new password hash StrCopy(tempstring,msg.string) IF StrLen(tempstring)>0 - UpperStr(tempstring) - loggedOnUser.pwdHash:=calcPasswordHash(tempstring) + setNewPassword(loggedOnUser,loggedOnUserMisc,tempstring) + loggedOnUserMisc.pwdLastUpdated:=getSystemTime() ENDIF ENDIF CASE DT_LOCATION @@ -3512,8 +3663,8 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n CASE BB_LOCAL AstrCopy(msg.string,cmds.bbsLoc,200) CASE ZMODEMSEND - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=NIL dlTTTM:=NIL tTEFF:=NIL @@ -3522,8 +3673,8 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n ch:=downloadFile(tempstring) IF((logonType>=LOGON_TYPE_REMOTE) AND (checkCarrier()=FALSE)) THEN msg.data:=-2 ELSE msg.data:=ch CASE BATCHZMODEMSEND - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=NIL dlTTTM:=NIL tTEFF:=NIL @@ -3531,8 +3682,8 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n ch:=downloadFile(msg.filler1) IF((logonType>=LOGON_TYPE_REMOTE) AND (checkCarrier()=FALSE)) THEN msg.data:=-2 ELSE msg.data:=ch CASE ZMODEMRECEIVE - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=NIL dlTTTM:=NIL tTEFF:=NIL @@ -3788,8 +3939,8 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n ioFlags[IOFLAG_SER_OUT]:=msg.data CASE AXNET_SEND - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=0 dlTTTM:=0 tTEFF:=0 @@ -3802,8 +3953,8 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n ENDIF ENDIF CASE AXNET_RECEIVE - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=0 dlTTTM:=0 tTEFF:=0 @@ -3831,8 +3982,12 @@ PROC processXimMsg(msgcmd,msg:PTR TO jhMessage,tooltype,command,privcmd,params,n IF checkConfAccess(msg.data+1) THEN msg.data:=1 ELSE msg.data:=0 ENDIF CASE PASSWORD_HASH - formatUnsignedLong(calcPasswordHash(msg.string),tempstring) - AstrCopy(msg.string,tempstring,20) + IF loggedOnUserMisc.pwdType=PWD_LEGACY + formatUnsignedLong(calcPasswordHash(msg.string),tempstring) + ELSE + StrCopy(tempstring,loggedOnUserMisc.pwdHash,32) + ENDIF + AstrCopy(msg.string,tempstring,40) CASE GET_GNSFLAG msg.data:=IF(nonStopDisplayFlag) THEN 1 ELSE 0 CASE DISPLAY_FILE @@ -9105,7 +9260,7 @@ PROC doorLog(type, str:PTR TO CHAR) formatLongDateTime(getSystemTime(),str1) IF StrLen(str)>0 - StringF(string,'[\s[25]] \s - \d - \s[10]',str1,name,type,str) + StringF(string,'[\s[25]] \s - \d - \s',str1,name,type,str) ELSE StringF(string,'[\s[25]] \s - \d - Exiting',str1,name,type) ENDIF @@ -9416,8 +9571,8 @@ PROC checkAttachedFile(msgnumb,flag) StrCopy(tempStr,'') - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=NIL ulTTTM:=0 tTEFF:=NIL @@ -11013,13 +11168,13 @@ PROC chooseComputer() ENDFOR aePuts('\b\n') -jLoop5: +jLoop6: aePuts('Choose computer type: ') stat:=lineInput('','',3,INPUT_TIMEOUT,tempStr) IF(stat<0) THEN RETURN stat IF(StrLen(tempStr)=0) THEN RETURN RESULT_SUCCESS stat:=Val(tempStr) - IF((stat <= 0) OR (stat > computerTypes.count())) THEN JUMP jLoop5 + IF((stat <= 0) OR (stat > computerTypes.count())) THEN JUMP jLoop6 loggedOnUser.secBulletin:=stat-1 @@ -12354,7 +12509,7 @@ PROC checkFIBForFileSize(fullPath:PTR TO CHAR, checkConfNum, fBlock:PTR TO filei IF(dp=NIL) IF tfsizeList<>NIL THEN tfsizeList.setItem(checkConfNum-1,tfsizeList.item(checkConfNum-1)+fsize) - dtfsize:=dtfsize+fsize + addBCD(dtfsize,fsize) ENDIF ENDPROC dp @@ -12365,14 +12520,14 @@ PROC checkForFileSize(checkFilename:PTR TO CHAR, checkConfNum, tfsizeList:PTR TO DEF path[255]:STRING,str[255]:STRING,tempstr[100]:STRING,tempstr2[100]:STRING DEF fname1[255]:STRING,fname2[255]:STRING DEF final[255]:STRING - DEF ft,dp + DEF ft=0,dp DEF fBlock: PTR TO fileinfoblock - DEF fLock=0 + DEF fLock=0,fLock2,res DEF drivenum DEF ramDir[255]:STRING DEF patternBuf,patBufLen - DEF debugcount + DEF debugcount,xit IF checkConfNum=-1 THEN checkConfNum:=currentConf @@ -12388,7 +12543,7 @@ PROC checkForFileSize(checkFilename:PTR TO CHAR, checkConfNum, tfsizeList:PTR TO IF StriCmp(fname1,fname2) StringF(tempstr,' File (\s) not found.\b\n',fname1) IF (ftpConn=FALSE) THEN aePuts(tempstr) - RETURN RESULT_FAILURE + RETURN RESULT_NOT_FOUND ENDIF ENDIF @@ -12397,7 +12552,7 @@ PROC checkForFileSize(checkFilename:PTR TO CHAR, checkConfNum, tfsizeList:PTR TO IF StriCmp(fname1,fname2) StringF(tempstr,' File (\s) not found.\b\n',fname1) IF ftpConn=FALSE THEN aePuts(tempstr) - RETURN RESULT_FAILURE + RETURN RESULT_NOT_FOUND ENDIF ENDIF @@ -12462,6 +12617,7 @@ jumpIn: IF MatchPatternNoCase(patternBuf,ramDir) THEN fLock:=Lock(final,ACCESS_READ) ENDWHILE Close(ft) + ft:=0 ELSE fLock:=Lock(final,ACCESS_READ) ENDIF @@ -12480,6 +12636,10 @@ jumpIn: IF(doflag) IF fLock=NIL + StringF(ramDir,'RAM:DirCaches/Conf\dDir\d',checkConfNum,drivenum-1) + IF fileExists(ramDir) + ft:=Open(ramDir,MODE_OLDFILE) + ENDIF IF((fLock:=Lock(final,ACCESS_READ))=0) FreeDosObject(DOS_FIB,fBlock) StringF(str,'Error, Path \s missing, adjust paths file..',path) @@ -12500,32 +12660,58 @@ jumpIn: IF(wflag=0) THEN JUMP gotit debugcount:=0 - WHILE (ExNext(fLock,fBlock)) /* my change.. prior to this we had a blank file name */ - debugcount++ - IF(fBlock.direntrytype<0) + WHILE TRUE + IF(ft=0) + xit:=ExNext(fLock,fBlock)=0 + ELSE + xit:=(Fgets(ft,tempstr,255)=0) + ENDIF + EXIT xit + + debugcount++ + IF ft ORELSE (fBlock.direntrytype<0) gotit: - StrCopy(tempstr,fBlock.filename) + IF ft + IF tempstr[StrLen(tempstr)-1]=10 THEN SetStr(tempstr,StrLen(tempstr)-1) + ELSE + StrCopy(tempstr,fBlock.filename) + ENDIF UpperStr(tempstr) stat:=MatchPatternNoCase(patternBuf,tempstr) + res:=TRUE IF((stat<>0) OR sysopdl) fflag:=1 IF(sysopdl) StrCopy(final,checkFilename) ELSE - StrCopy(final,path) - StrAdd(final,fBlock.filename) + IF ft<>0 + StringF(final,'\s\s',path,tempstr) + fLock2:=Lock(final,ACCESS_READ) + IF fLock2 + Examine(fLock2,fBlock) + UnLock(fLock2) + ELSE + res:=FALSE + ENDIF + ELSE + StringF(final,'\s\s',path,fBlock.filename) + ENDIF ENDIF - IF (dp:=checkFIBForFileSize(final, checkConfNum, fBlock,tfsizeList,freeDFlagList,cfn, z))=-1 - FreeDosObject(DOS_FIB,fBlock) - UnLock(fLock) - RETURN 11 + IF res + IF (dp:=checkFIBForFileSize(final, checkConfNum, fBlock,tfsizeList,freeDFlagList,cfn, z))=-1 + FreeDosObject(DOS_FIB,fBlock) + UnLock(fLock) + IF ft<>0 THEN Close(ft) + RETURN 11 + ENDIF ENDIF IF(wflag=0) FreeDosObject(DOS_FIB,fBlock) UnLock(fLock) + IF ft<>0 THEN Close(ft) IF(dp<>NIL) THEN RETURN RESULT_FAILURE ELSE RETURN RESULT_SUCCESS ENDIF ENDIF @@ -12537,6 +12723,7 @@ gotit: IF(stat<0) FreeDosObject(DOS_FIB,fBlock) UnLock(fLock) + IF ft<>0 THEN Close(ft) RETURN RESULT_NO_CARRIER ENDIF SELECT stat @@ -12545,21 +12732,26 @@ gotit: IF(stat<0) FreeDosObject(DOS_FIB,fBlock) UnLock(fLock) + IF ft<>0 THEN Close(ft) RETURN RESULT_NO_CARRIER ENDIF CASE 3 /* ^C */ aePuts('**Break\b\n') FreeDosObject(DOS_FIB,fBlock) UnLock(fLock) + IF ft<>0 THEN Close(ft) RETURN 10 ENDSELECT ENDIF ENDIF ENDWHILE UnLock(fLock) + IF ft<>0 THEN Close(ft) + ft:=0 fLock:=0 IF(z=1) THEN JUMP outst ENDIF +nxt: StringF(tempstr,'DLPATH.\d',drivenum++) UNTIL pstat=0 @@ -12575,7 +12767,7 @@ outst: StringF(str,' File (\s) not found.\b\n',checkFilename) aePuts(str) ENDIF - RETURN RESULT_FAILURE + RETURN RESULT_NOT_FOUND ENDIF IF(dp<>NIL) THEN RETURN RESULT_FAILURE @@ -13382,7 +13574,7 @@ PROC xprfopen() MOVE.L A0,fn MOVE.L A1,am - loadA4() + loadA4({tasksA4}) IF StriCmp(am,'r') filemode:=MODE_OLDFILE @@ -13476,7 +13668,7 @@ PROC xprfclose() -> A0 MOVE.L A0,fp - loadA4() + loadA4({tasksA4}) StringF(tempstr,'xprfclose \d',fp) debugLog(LOG_DEBUG,tempstr) @@ -13491,7 +13683,7 @@ PROC xprfclose() ENDIF ENDIF IF zModemInfo.needUpdateDownloadStats - zmdownloadcompleted(zModemInfo.filesize) + zmdownloadcompleted(zModemInfo.filesize,zModemInfo.filesize-zModemInfo.resumePos) zModemInfo.needUpdateDownloadStats:=FALSE ENDIF @@ -13507,7 +13699,7 @@ PROC xprchkabort() DEF winmsg:PTR TO intuimessage,res ->DEF tempstr[255]:STRING - loadA4() + loadA4({tasksA4}) res:=0 IF windowZmodem<>NIL @@ -13542,7 +13734,7 @@ PROC xprfread() MOVE.L D1,bcount MOVE.L A1,fp - loadA4() + loadA4({tasksA4}) ->StringF(tempstr,'xprfread: \d bytes',bsize*bcount) ->debugLog(LOG_DEBUG,tempstr) @@ -13576,7 +13768,7 @@ PROC xprfwrite() MOVE.L D1,bcount MOVE.L A1,fp - loadA4() + loadA4({tasksA4}) ->StringF(tempstr,'xprfwrite: \d bytes',Mul(bsize,bcount)) ->debugLog(LOG_DEBUG,tempstr) @@ -13610,7 +13802,7 @@ PROC xprsread() MOVE.L D0,bsize MOVE.L D1,timeout - loadA4() + loadA4({tasksA4}) StringF(tempstr,'xprsread: \d bytes \d timeout',bsize,timeout) debugLog(LOG_DEBUG,tempstr) @@ -13881,7 +14073,7 @@ PROC xprswrite() MOVE.L A0,buf MOVE.L D0,bsize - loadA4() + loadA4({tasksA4}) StringF(tempstr,'xprswrite: \d bytes',bsize) debugLog(LOG_DEBUG,tempstr) @@ -13908,7 +14100,7 @@ PROC xprfseek() MOVE.L D0,offset MOVE.L D1,origin - loadA4() + loadA4({tasksA4}) StringF(tempstr,'xprfseek: \d offset',offset) debugLog(LOG_DEBUG,tempstr) @@ -13940,7 +14132,7 @@ PROC xprsflushAsm() ENDPROC D0 PROC xprsflush() - loadA4() + loadA4({tasksA4}) debugLog(LOG_DEBUG,'xprsflush') ENDPROC FALSE @@ -13959,7 +14151,7 @@ PROC xprupdate() MOVE.L A0,xpru - loadA4() + loadA4({tasksA4}) IF(xpru.xpru_updatemask AND XPRU_ERRORMSG)<>0 AstrCopy(zModemInfo.zStat,xpru.xpru_errormsg,60) @@ -14057,7 +14249,7 @@ PROC xprsetserial() MOVE.L D0,newstatus - loadA4() + loadA4({tasksA4}) StringF(tempstr,'xprsetserial \d',newstatus) debugLog(LOG_DEBUG,tempstr) @@ -14081,7 +14273,7 @@ PROC xprfinfo() MOVE.L A0,fn MOVE.L D0,fitype - loadA4() + loadA4({tasksA4}) StringF(tempstr,'xprsfinfo - fitype \d \s',fitype,fn) debugLog(LOG_DEBUG,tempstr) @@ -14126,7 +14318,7 @@ ENDPROC D0 PROC xprunlink() DEF fn MOVE.L A0,fn - loadA4() + loadA4({tasksA4}) ENDPROC xprunlink2(fn) PROC xprunlink2(fn) @@ -14162,7 +14354,7 @@ PROC xprffirst() DEF buffer:PTR TO CHAR MOVE.L A0,buffer - loadA4() + loadA4({tasksA4}) ENDPROC xprffirst2(buffer) PROC xprffirst2(buffer) @@ -14186,7 +14378,7 @@ PROC xprfnext() MOVE.L A0,buffer - loadA4() + loadA4({tasksA4}) ENDPROC xprfnext2(buffer) @@ -14409,7 +14601,7 @@ PROC updateZDisplay() ENDIF ELSE IF zModemInfo.currentOperation=ZMODEM_DOWNLOAD - StringF(tempstr,'[Node \d] Send Window (\d/\d)',node,zModemInfo.currentDL,zModemInfo.total) + StringF(tempstr,'[Node \d] Send Window (\d/\d)',node,zModemInfo.currentDL,zModemInfo.totalDL) AstrCopy(zModemInfo.titleBar,tempstr) ELSE StringF(tempstr,'[Node \d] Receive Window (\d/??)',node,zModemInfo.currentUL) @@ -14551,7 +14743,7 @@ PROC downloadFile(str: PTR TO CHAR,forceZmodem=FALSE) ENDFOR ENDIF - res:=downloadFiles(templist,0,FALSE,forceZmodem) + res:=downloadFiles(templist,NIL,FALSE,forceZmodem) clearFlagItems(templist) END templist @@ -14633,17 +14825,20 @@ PROC ftpUploadFileStart(fileName:PTR TO CHAR,resumefrom) zModemInfo.filesize:=0 zModemInfo.resumePos:=resumefrom zModemInfo.transPos:=0 - ftptime:=getSystemTime() + ftptime1,ftptime2:=getSystemTime() updateZDisplay() ENDPROC PROC ftpUploadFileEnd(fileName:PTR TO CHAR,success) DEF i DEF str[255]:STRING + DEF t1,t2 IF ftpConn THEN ulTTTM:=0 - ulTTTM:=ulTTTM+getSystemTime()-ftptime + t1,t2:=getSystemTime() + + ulTTTM:=ulTTTM+Mul(t1-ftptime1,50)+t2-ftptime2 setEnvStat(ENV_UPLOADING) IF ftpConn @@ -14651,7 +14846,8 @@ PROC ftpUploadFileEnd(fileName:PTR TO CHAR,success) StringF(str,'\tUploading \s \d bytes',fileName,zModemInfo.transPos) callersLog(str) - StringF(str,'\t 1 file(s), \dk bytes, \d minute(s). \d second(s), \d cps, N/A % efficiency.',Shr(zModemInfo.transPos,10),Div(ulTTTM,60),Mod(ulTTTM,60),tTCPS) + ulTTTM:=Div(ulTTTM,50) + StringF(str,'\t 1 file(s), \dk bytes, \d minute(s). \d second(s), \d cps, N/A % efficiency.',Shr(zModemInfo.transPos-zModemInfo.resumePos,10),Div(ulTTTM,60),Mod(ulTTTM,60),tTCPS) callersLog(str) ELSE callersLog('\tUpload Failed..') @@ -14665,14 +14861,13 @@ PROC ftpUploadFileEnd(fileName:PTR TO CHAR,success) ENDIF ENDPROC -PROC ftpDownloadFileStart(fileName:PTR TO CHAR,filelen) +PROC ftpDownloadFileStart(fileName:PTR TO CHAR,filelen,resume) DEF fileItem:PTR TO flagFileItem DEF item:PTR TO flagFileItem DEF fn:PTR TO CHAR DEF i - ftptime:=getSystemTime() - + ftptime1,ftptime2:=getSystemTime() fileItem:=NIL fn:=FilePart(fileName) @@ -14692,7 +14887,7 @@ PROC ftpDownloadFileStart(fileName:PTR TO CHAR,filelen) ENDIF zModemInfo.filesize:=filelen - zModemInfo.resumePos:=0 + zModemInfo.resumePos:=resume zModemInfo.transPos:=0 tTEFF:=0 tTCPS:=0 @@ -14708,10 +14903,13 @@ PROC ftpDownloadFileEnd(fileName:PTR TO CHAR, result) DEF fn:PTR TO CHAR DEF tempStr[255]:STRING DEF i + DEF t1,t2 IF ftpConn THEN dlTTTM:=0 - dlTTTM:=dlTTTM+getSystemTime()-ftptime + t1,t2:=getSystemTime() + + dlTTTM:=dlTTTM+Mul(t1-ftptime1,50)+t2-ftptime2 fileItem:=NIL fn:=FilePart(fileName) @@ -14724,11 +14922,12 @@ PROC ftpDownloadFileEnd(fileName:PTR TO CHAR, result) IF fileItem=NIL THEN RETURN - IF (result) THEN updateDownloadStats(fileItem,zModemInfo.filesize) + IF (result) THEN updateDownloadStats(fileItem,zModemInfo.filesize,zModemInfo.filesize-zModemInfo.resumePos) IF ftpConn + dlTTTM:=Div(dlTTTM,50) IF result - StringF(tempStr,'\t 1 file(s), \dk bytes, \d minutes \d seconds \d cps, N/A % efficiency.',Shr(zModemInfo.filesize,10) AND $003fffff,Div(dlTTTM,60),Mod(dlTTTM,60),tTCPS) + StringF(tempStr,'\t 1 file(s), \dk bytes, \d minutes \d seconds \d cps, N/A % efficiency.',Shr(zModemInfo.filesize-zModemInfo.resumePos,10) AND $003fffff,Div(dlTTTM,60),Mod(dlTTTM,60),tTCPS) callersLog(tempStr) udLog(tempStr) ELSE @@ -14959,9 +15158,7 @@ ENDPROC res<>0 PROC ftpAuth(userName:PTR TO CHAR,password:PTR TO CHAR) IF StriCmp(userName,loggedOnUser.name,31)=FALSE THEN RETURN FALSE - UpperStr(password) - IF calcPasswordHash(password)<>loggedOnUser.pwdHash THEN RETURN FALSE -ENDPROC TRUE +ENDPROC checkUserPassword(loggedOnUser,loggedOnUserMisc,password) PROC ftpFindFile(filename:PTR TO CHAR,outFullFilename:PTR TO CHAR) DEF fileList:PTR TO stdlist @@ -14977,41 +15174,43 @@ PROC ftpFindFile(filename:PTR TO CHAR,outFullFilename:PTR TO CHAR) END fileList ENDPROC -PROC updateDownloadStats(fileItem:PTR TO flagFileItem,fsize) +PROC updateDownloadStats(fileItem:PTR TO flagFileItem,fsize,sentsize) DEF cb:PTR TO confBase dlFileCount++ - dTBT:=addWO(dTBT,fsize) + addBCD(dTBT,sentsize) IF sopt.toggles[TOGGLES_CREDITBYKB] fsize:=Shr(fsize,10) AND $003fffff ENDIF - IF(checkSecurity(ACS_CONFERENCE_ACCOUNTING)) - saveMsgPointers(currentConf,currentMsgBase) + IF sentsize + IF(checkSecurity(ACS_CONFERENCE_ACCOUNTING)) + saveMsgPointers(currentConf,currentMsgBase) - IF(freeDownloads=FALSE) - IF creditAccountTrackDownloads(loggedOnUser) - cb:=confBases.item(getConfIndex(fileItem.confNum,1)) + IF(freeDownloads=FALSE) + IF creditAccountTrackDownloads(loggedOnUser) + cb:=confBases.item(getConfIndex(fileItem.confNum,1)) - addBCD(cb.downloadBytesBCD,fsize) - cb.bytesDownload:=convertFromBCD(cb.downloadBytesBCD) - cb.downloads:=cb.downloads+1 + addBCD(cb.downloadBytesBCD,fsize) + cb.bytesDownload:=convertFromBCD(cb.downloadBytesBCD) + cb.downloads:=cb.downloads+1 + ENDIF ENDIF - ENDIF - loadMsgPointers(currentConf,currentMsgBase) - ELSE - IF(freeDownloads=FALSE) - IF creditAccountTrackDownloads(loggedOnUser) + loadMsgPointers(currentConf,currentMsgBase) + ELSE + IF(freeDownloads=FALSE) + IF creditAccountTrackDownloads(loggedOnUser) - addBCD(loggedOnUserMisc.downloadBytesBCD,fsize) - loggedOnUser.bytesDownload:=convertFromBCD(loggedOnUserMisc.downloadBytesBCD) - loggedOnUser.downloads:=loggedOnUser.downloads+1 + addBCD(loggedOnUserMisc.downloadBytesBCD,fsize) + loggedOnUser.bytesDownload:=convertFromBCD(loggedOnUserMisc.downloadBytesBCD) + loggedOnUser.downloads:=loggedOnUser.downloads+1 + ENDIF ENDIF ENDIF + loggedOnUser.dailyBytesDld:=loggedOnUser.dailyBytesDld+fsize + IF bytesADL<>$7fffffff THEN bytesADL:=bytesADL-fsize ENDIF - loggedOnUser.dailyBytesDld:=loggedOnUser.dailyBytesDld+fsize - IF bytesADL<>$7fffffff THEN bytesADL:=bytesADL-fsize ENDPROC PROC ftpUpload(uploadFolder:PTR TO CHAR,ftpPorts,ftpDataPorts) @@ -15117,13 +15316,13 @@ PROC ftpDownload(fileList: PTR TO stdlist, updateDownloadStats,ftpPorts,ftpDataP ENDPROC ->this returns 0 = fail, 1 = success unlike most of the routines -PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, forceZmodem=FALSE) +PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize:PTR TO CHAR, updateDownloadStats, forceZmodem=FALSE) DEF tempstr[255]:STRING DEF tempstr2[255]:STRING DEF debugstr[255]:STRING DEF xprio: PTR TO xprIO DEF result - DEF time1,time2 + DEF time1,time2,ticks1,ticks2 DEF oldshared DEF ftpPorts:PTR TO LONG,ftpDataPorts:PTR TO LONG,httpPorts:PTR TO LONG DEF zm=NIL: PTR TO zmodem_t @@ -15139,6 +15338,7 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, DEF internalName[10]:STRING DEF path[255]:STRING DEF txwindow,rxwindow + DEF tmpBCD[8]:ARRAY OF CHAR DEF protocol[255]:STRING @@ -15210,7 +15410,7 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, zModemInfo.shouldUpdateDownloadStats:=updateDownloadStats zModemInfo.needUpdateDownloadStats:=FALSE - zModemInfo.currentDL:=0;zModemInfo.total:=fileList.count();zModemInfo.transPos:=0;zModemInfo.filesize:=0;zModemInfo.errorCount:=0;zModemInfo.errorPos:=0; zModemInfo.resumePos:=0 + zModemInfo.currentDL:=0;zModemInfo.totalDL:=fileList.count();zModemInfo.transPos:=0;zModemInfo.filesize:=0;zModemInfo.errorCount:=0;zModemInfo.errorPos:=0; zModemInfo.resumePos:=0 AstrCopy(zModemInfo.zStat,'') AstrCopy(zModemInfo.fileName,'') AstrCopy(zModemInfo.lastTime,'') @@ -15372,7 +15572,7 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, hyd.hyd_flush:={zmflush} hyd.hyd_isconnected:={zmisconnected} hyd.hyd_iscancelled:=NIL - hyd.hyd_logmessage:={zmlputs} + hyd.hyd_logmessage:={debugLog} hyd.hyd_getkey:={hydgetkey} hyd.hyd_sysidle:={hydsysidle} hyd.hyd_chatwrite:={hydchatwrite} @@ -15380,10 +15580,10 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, ELSEIF xmodemFlag OR ymodemFlag xym:=NEW xym - xym.log_level:=ZM_LOG_DEBUG + binaryRaw:=(telnetSocket>=0) xymodem_init(xym, 0, - {zmlputs}, + {debugLog}, {zmprogress}, IF telnetSocket>=0 THEN {zmrecvbyteTelnet} ELSE {zmrecvbyteSerial}, {zmisconnected}, @@ -15404,13 +15604,12 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, {zmnextfile}, 2048,0,binaryRaw,65536) xym.total_files:=fileList.count() - xym.total_bytes:=estimatedSize + IF estimatedSize THEN CopyMem(estimatedSize,xym.total_bytes,8) ELSE convertToBCD(0,xym.total_bytes) ELSE zm:=NEW zm - zm.log_level:=ZM_LOG_DEBUG binaryRaw:=(telnetSocket>=0) zmodem_init(zm, 0, - {zmlputs}, + {debugLog}, {zmprogress}, IF telnetSocket>=0 THEN {zmrecvbyteTelnet} ELSE {zmrecvbyteSerial}, {zmisconnected}, @@ -15431,12 +15630,19 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, {zmnextfile}, maxBlkSize,0,binaryRaw,65536) zm.total_files:=fileList.count() - zm.total_bytes:=estimatedSize + IF estimatedSize THEN CopyMem(estimatedSize,zm.total_bytes,8) ELSE convertToBCD(0,zm.total_bytes) ENDIF ENDIF asynciobase:=OpenLibrary('asyncio.library',0) + IF telnetSocket>=0 + willsent:=0 + dosent:=0 + iac(telnetSocket,253,0) ->do binary + iac(telnetSocket,251,0) ->will binary + ENDIF + IF ext StringF(debugstr,'xpr setup options = \s',tempstr) debugLog(LOG_DEBUG,debugstr) @@ -15465,10 +15671,10 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, IF ext xprio.xpr_filename:=NIL - time1:=getSystemTime() + time1,ticks1:=getSystemTime() result:=XprotocolSend(xprio) - time2:=getSystemTime() - dlTTTM:=time2-time1; + time2,ticks2:=getSystemTime() + dlTTTM:=Mul(time2-time1,50)+ticks2-ticks1; IF zModemInfo.transPos<>zModemInfo.filesize THEN result:=FALSE ELSE IF hydraFlag @@ -15484,14 +15690,20 @@ PROC downloadFiles(fileList: PTR TO stdlist, estimatedSize, updateDownloadStats, result:=zmodem_send_files(zm, NIL,{dlTimeTaken}) ENDIF dlTTTM:=dlTimeTaken + ENDIF - IF dlTTTM - tTCPS:=Mul(Div(dTBT,dlTTTM),50) - ELSE - tTCPS:=Mul(dTBT,50) - ENDIF - dlTTTM:=Div(dlTTTM,50) - tTEFF:=calcEfficiency(tTCPS,onlineBaud) + IF dlTTTM + CopyMem(dTBT,tmpBCD,8) + mulBCD(tmpBCD,50) + tTCPS:=divBCD(tmpBCD,dlTTTM) + ELSE + tTCPS:=convertFromBCD(dTBT) + ENDIF + tTEFF:=calcEfficiency(tTCPS,onlineBaud) + + IF telnetSocket>=0 + iac(telnetSocket,254,0) ->dont binary + iac(telnetSocket,252,0) ->wont binary ENDIF IF ext @@ -15551,7 +15763,7 @@ PROC checklist(lfnames: PTR TO stdlist, sizeList:PTR TO stdlist, freeDFlagList:P item:=lfnames.item(i) IF(StrLen(item.fileName)>0) status:=checkForFileSize(item.fileName,item.confNum,sizeList,freeDFlagList,clrfinal,0) - IF((status=11) OR (status=10)) THEN RETURN RESULT_SUCCESS + IF((status=RESULT_SIGNALLED) OR (status=RESULT_PRIVATE)) THEN RETURN RESULT_SUCCESS ENDIF ENDFOR ENDPROC RESULT_SUCCESS @@ -15788,7 +16000,7 @@ PROC hydsysidle() tv.secs:=1 tv.micro:=0 setSingleFDS(fds,telnetSocket) - WaitSelect(telnetSocket+1,fds,fds,0,tv,consig) + WaitSelect(telnetSocket+1,fds,fds,0,tv,{consig}) ELSE /*openTimer() setTimer(1,0) @@ -15977,21 +16189,6 @@ PROC hydstatus(hyd:PTR TO hydra_t,xmit) ENDIF ENDPROC/*hydra_status()*/ -PROC zmlputs(level, str:PTR TO CHAR) - SELECT level - CASE ZM_LOG_DEBUG - debugLog(LOG_DEBUG,str) - CASE ZM_LOG_INFO - debugLog(LOG_DEBUG,str) - CASE ZM_LOG_NOTICE - debugLog(LOG_DEBUG,str) - CASE ZM_LOG_WARNING - debugLog(LOG_WARN,str) - CASE ZM_LOG_ERR - debugLog(LOG_ERROR,str) - ENDSELECT -ENDPROC - PROC zmprogress(pos,cnt,filesize,s1,s2,errors,startpos,filename:PTR TO CHAR,newfile,blocksize) DEF t1,t2,t,td,n DEF h,m,s @@ -16066,7 +16263,7 @@ PROC zmrecvbyteTelnet(timeout) DEF r DEF tv:timeval ->DEF sysTime - + MOVE.L bufferReadOffset,A0 MOVE.L bufferedBytes,A1 MOVE.L zmodemRxBuffer,A2 @@ -16098,22 +16295,41 @@ testiac: BRA recret test1: - CMP.B #250,D0 - BCC.S test2 - - MOVEQ.L #2,D2 - MOVE.L D2,lastIAC - BRA repbuff - -test2: MOVEQ.L #2,D2 MOVE.L D2,lastIAC + MOVE.L D0,iaccmd BRA repbuff testiac2: CMP.B #2,D2 - BNE.S testiac3 + BNE testiac3 + + TST.B D0 + BNE notbin + + CMP.L #251,iaccmd + BNE.S notwill + TST.L dosent + BNE.S notwill + MOVEM.L D0-D7/A0-A6,-(A7) + iac(telnetSocket,253,0) ->if will binary then do binary + dosent:=1 + MOVEM.L (A7)+,D0-D7/A0-A6 + +notwill: + CMP.L #253,iaccmd + BNE.S notdo + + TST.L willsent + BNE.S notdo + MOVEM.L D0-D7/A0-A6,-(A7) + iac(telnetSocket,251,0) ->if do binary then will binary + willsent:=1 + MOVEM.L (A7)+,D0-D7/A0-A6 + +notdo: +notbin: CLR.L D2 MOVE.L D2,lastIAC BRA repbuff @@ -16128,8 +16344,8 @@ testiac3: buffempty: res:=1 - bufferReadOffset:=0 - bufferedBytes:=0 + bufferReadOffset:=0 + bufferedBytes:=0 IF timeout tv.secs:=timeout @@ -16144,8 +16360,8 @@ buffempty: IF (r:=Recv(telnetSocket,zmodemRxBuffer,zModemRxBufferSize,0))<>-1 bufferedBytes:=bufferedBytes+r ENDIF - ENDIF - + ENDIF + IF r<=0 IF (checkCarrier()=FALSE) THEN RETURN -1 ENDIF @@ -16171,11 +16387,27 @@ redo1: RETURN res ELSEIF (res>=250) AND (res<255) lastIAC:=2 + iac1:=res ELSE WriteF('unknown IAC \d\b\n',res) lastIAC:=2 ENDIF ELSEIF lastIAC=2 + IF res=0 + IF iac1=251 + //will + iacr[0]:=255 + iacr[1]:=253 + iacr[2]:=0 + serPuts(iacr,3,TRUE,TRUE) + ELSEIF iac1=253 + //do + iacr[0]:=255 + iacr[1]:=251 + iacr[2]:=0 + serPuts(iacr,3,TRUE,TRUE) + ENDIF + ENDIF lastIAC:=0 ELSEIF res=255 lastIAC:=1 @@ -16199,6 +16431,8 @@ redo1: n:=(zModemRxBufferSize-bufferedBytes) UNTIL (r=-1) OR (n=0) + sysTime:=getSystemTime() + IF ((lastCarrierCheck+5)NIL - uTBT:=addWO(uTBT,filesize) + addBCD(uTBT,filesize) recFileNames.add(FilePart(fname)) ulFileCount++ doBgCheck() @@ -16366,11 +16600,11 @@ PROC zmfclose(fh) ENDIF ENDPROC -PROC zmdownloadcompleted(fsize) +PROC zmdownloadcompleted(fsize,sentsize) DEF fileItem:PTR TO flagFileItem fileItem:=zModemInfo.fileList.item(zModemInfo.currentDL) removeFlagFromList(FilePart(fileItem.fileName),fileItem.confNum) - updateDownloadStats(fileItem,fsize) + updateDownloadStats(fileItem,fsize,sentsize) ENDPROC PROC zmfseek(fh,offset,origin) @@ -16424,7 +16658,7 @@ PROC createBackgroundFileCheckThread() proc:=CreateNewProc(tags) END tags[countTags(tags)] IF proc<>NIL - saveA4thread(proc.task) + saveA4(proc.task,{threadtasksA4}) ELSE transfering:=FALSE bgChecking:=FALSE @@ -16446,8 +16680,9 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE DEF tempstr[255]:STRING,tempstr2[255]:STRING,debugstr[255]:STRING DEF result DEF xprio=NIL: PTR TO xprIO - DEF time1,time2 + DEF time1,time2,ticks1,ticks2 DEF oldshared,bgport + DEF internalName[10]:STRING DEF msg:PTR TO jhMessage,tags=NIL:PTR TO LONG DEF ftpPorts:PTR TO LONG,ftpDataPorts:PTR TO LONG,httpPorts:PTR TO LONG DEF protocol[255]:STRING @@ -16462,12 +16697,14 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE DEF ulTimeTaken DEF ext=TRUE DEF txwindow,rxwindow + DEF tmpBCD[8]:ARRAY OF CHAR statWinType:=0 ObtainSemaphore(bgData) bgData.checkedCount:=0 - bgData.checkedBytes:=0 + convertToBCD(0,bgData.checkedBytes) + ReleaseSemaphore(bgData) IF (forceZmodem) OR (loggedOnUser=NIL) @@ -16476,34 +16713,42 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE StrCopy(protocol,(xprLib.item(loggedOnUser.xferProtocol))) ENDIF + IF(StriCmp(protocol,'INTERNAL')) + StrCopy(internalName,'ZModem') + ext:=FALSE + ENDIF + IF(StriCmp(protocol,'HYDRA')) StrCopy(protocol,'INTERNAL') hydraFlag:=TRUE statWinType:=1 + StrCopy(internalName,'Hydra') ext:=FALSE ENDIF IF(StriCmp(protocol,'INTERNALXM')) StrCopy(protocol,'INTERNAL') xmodemFlag:=TRUE + StrCopy(internalName,'XModem') ext:=FALSE ENDIF IF(StriCmp(protocol,'INTERNALYM')) StrCopy(protocol,'INTERNAL') ymodemFlag:=TRUE + StrCopy(internalName,'YModem') ext:=FALSE ENDIF IF(StriCmp(protocol,'INTERNAL8K')) StrCopy(protocol,'INTERNAL') maxBlkSize:=8192 + StrCopy(internalName,'ZModem') ext:=FALSE ENDIF - IF(StriCmp(protocol,'INTERNAL')) THEN ext:=FALSE - IF (StriCmp(protocol,'XPRZM')) + StrCopy(internalName,'ZModem') StrCopy(protocol,'INTERNAL') ext:=TRUE ENDIF @@ -16549,8 +16794,8 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE wantzwin:=FALSE checkOffhookFlag() receivePlayPen(TRUE) - IF (uTBT>0) AND (ulTTTM>0) - tTEFF:=calcEfficiency(Div(uTBT,ulTTTM),onlineBaud) + IF (ulTTTM>0) + tTEFF:=calcEfficiency(divBCD(uTBT,ulTTTM),onlineBaud) ELSE tTEFF:=0 ENDIF @@ -16578,8 +16823,8 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE wantzwin:=FALSE checkOffhookFlag() receivePlayPen(TRUE) - IF (uTBT>0) AND (ulTTTM>0) - tTEFF:=calcEfficiency(Div(uTBT,ulTTTM),onlineBaud) + IF (ulTTTM>0) + tTEFF:=calcEfficiency(divBCD(uTBT,ulTTTM),onlineBaud) ELSE tTEFF:=0 ENDIF @@ -16659,7 +16904,7 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE hyd.hyd_flush:={zmflush} hyd.hyd_isconnected:={zmisconnected} hyd.hyd_iscancelled:=NIL - hyd.hyd_logmessage:={zmlputs} + hyd.hyd_logmessage:={debugLog} hyd.hyd_getkey:={hydgetkey} hyd.hyd_sysidle:={hydsysidle} hyd.hyd_chatwrite:={hydchatwrite} @@ -16667,10 +16912,9 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE ELSEIF xmodemFlag OR ymodemFlag xym:=NEW xym - xym.log_level:=ZM_LOG_DEBUG binaryRaw:=(telnetSocket>=0) xymodem_init(xym, 0, - {zmlputs}, + {debugLog}, {zmprogress}, IF telnetSocket>=0 THEN {zmrecvbyteTelnet} ELSE {zmrecvbyteSerial}, {zmisconnected}, @@ -16692,10 +16936,9 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE 2048,0,binaryRaw,0) ELSE zm:=NEW zm - zm.log_level:=ZM_LOG_DEBUG binaryRaw:=(telnetSocket>=0) zmodem_init(zm, 0, - {zmlputs}, + {debugLog}, {zmprogress}, IF telnetSocket>=0 THEN {zmrecvbyteTelnet} ELSE {zmrecvbyteSerial}, {zmisconnected}, @@ -16720,6 +16963,13 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE asynciobase:=OpenLibrary('asyncio.library',0) + IF telnetSocket>=0 + willsent:=0 + dosent:=0 + iac(telnetSocket,253,0) ->do binary + iac(telnetSocket,251,0) ->will binary + ENDIF + IF ext StrCopy(tempstr,'') IF(StriCmp(protocol,'INTERNAL')) @@ -16758,10 +17008,10 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE ENDIF IF ext - time1:=getSystemTime() + time1,ticks1:=getSystemTime() result:=XprotocolReceive(xprio) - time2:=getSystemTime() - ulTTTM:=Mul(time2-time1,50) + time2,ticks2:=getSystemTime() + ulTTTM:=Mul(time2-time1,50)+ticks2-ticks1; ELSE IF hydraFlag result:=hydra_do_transfer(hyd,file,NIL,NIL,NIL,{ulTimeTaken}) @@ -16773,13 +17023,19 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE ulTTTM:=ulTimeTaken ENDIF IF ulTTTM - tTCPS:=Mul(Div(uTBT,ulTTTM),50) + CopyMem(uTBT,tmpBCD,8) + mulBCD(tmpBCD,50) + tTCPS:=divBCD(tmpBCD,ulTTTM) ELSE - tTCPS:=Mul(uTBT,50) + tTCPS:=convertFromBCD(uTBT) ENDIF tTEFF:=calcEfficiency(tTCPS,onlineBaud) - ulTTTM:=Div(ulTTTM,50) + IF telnetSocket>=0 + iac(telnetSocket,254,0) ->dont binary + iac(telnetSocket,252,0) ->wont binary + ENDIF + IF ext XprotocolCleanup(xprio) ELSE @@ -16799,7 +17055,7 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE IF msg msg.command:=BG_EXIT msg.msg.length:=SIZEOF jhMessage - + msg.msg.ln.type:=NT_FREEMSG ->signal background checking to finish PutMsg(bgport,msg) @@ -16823,7 +17079,11 @@ PROC fileUpload(file,forceZmodem=FALSE) HANDLE Delay(50) - aePuts(protocol) + IF(StriCmp(protocol,'INTERNAL')) + aePuts(internalName) + ELSE + aePuts(xprTitle.item(loggedOnUser.xferProtocol)) + ENDIF IF(result) THEN aePuts(' upload successful\b\n') ELSE aePuts(' upload unsuccessful\b\n') IF tags<>NIL THEN END tags @@ -17493,7 +17753,7 @@ PROC receivePlayPen(log) ObtainSemaphore(bgData) ulFileCount:=bgData.checkedCount - uTBT:=bgData.checkedBytes + CopyMem(bgData.checkedBytes,uTBT,8) ReleaseSemaphore(bgData) recFileNames.clear() @@ -17541,7 +17801,7 @@ PROC receivePlayPen(log) s++ ENDWHILE ulFileCount++ - uTBT:=addWO(uTBT,fib.size) + addBCD(uTBT,fib.size) IF log StringF(tempstr,'\tUploading \s[12] \d bytes',fib.filename, fib.size) udLog(tempstr) @@ -17947,6 +18207,7 @@ PROC doBgCheck() IF msg msg.command:=BG_CHECKFILE AstrCopy(msg.string,FilePart(zModemInfo.fileName),200) + msg.msg.ln.type:=NT_FREEMSG msg.msg.length:=SIZEOF jhMessage ->signal background checking to check the file @@ -17962,7 +18223,7 @@ PROC backgroundFileCheckThread() DEF exit=FALSE DEF msgcmd,type - loadA4thread() + loadA4({threadtasksA4}) bgCheckPort:=createPort(bgCheckPortName,0) IF bgCheckPort @@ -18015,6 +18276,8 @@ PROC checkFileExternal(temp: PTR TO CHAR, checkFile: PTR TO CHAR) stat:=RESULT_SUCCESS +debugLog(LOG_ERROR,'debug10d1') + IF readToolType(TOOLTYPE_FCHECK,temp,'CHECKER',s) StrCopy(options,s) ELSE @@ -18038,32 +18301,41 @@ PROC checkFileExternal(temp: PTR TO CHAR, checkFile: PTR TO CHAR) pri:=0 ENDIF ->(RTS) +debugLog(LOG_ERROR,'debug10d2') StrAdd(options,' ') StrAdd(options,checkFile) StringF(fileName,'\sOutPut_Of_Test',nodeWorkDir) IF((fi:=Open(fileName,MODE_NEWFILE)))<>0 filetags:=NEW [SYS_INPUT,0,SYS_OUTPUT,fi,NP_STACKSIZE,stack,NP_PRIORITY,pri,TAG_DONE]:LONG +debugLog(LOG_ERROR,'debug10d3') SystemTagList(options,filetags) +debugLog(LOG_ERROR,'debug10d4') END filetags[countTags(filetags)] Close(fi) +debugLog(LOG_ERROR,'debug10d5') IF bgChecking=FALSE THEN displayOutPutofTest() +debugLog(LOG_ERROR,'debug10d6') IF(readToolType(TOOLTYPE_FCHECK,temp,'SCRIPT',s)) StrAdd(s,' ') IF(fi:=Open('NIL:',MODE_NEWFILE))<>0 filetags:=NEW [SYS_INPUT,0,SYS_OUTPUT,fi,NP_STACKSIZE,stack,NP_PRIORITY,pri,TAG_DONE]:LONG +debugLog(LOG_ERROR,'debug10d7') StringF(options,'\s \s \s \d',s,checkFile,FilePart(checkFile),node) SystemTagList(options,filetags) +debugLog(LOG_ERROR,'debug10d8') END filetags[countTags(filetags)] Close(fi) ENDIF ENDIF +debugLog(LOG_ERROR,'debug10d9') StringF(options,'\sOutPut_Of_Test',nodeWorkDir) i:=1 StringF(fileName,'ERROR.\d',i) i++ +debugLog(LOG_ERROR,'debug10d10') WHILE(readToolType(TOOLTYPE_FCHECK,temp,fileName,s)) fi1:=Open(options,MODE_OLDFILE) WHILE((ReadStr(fi1,image)<>-1)) OR (StrLen(image)>0) @@ -18078,11 +18350,15 @@ PROC checkFileExternal(temp: PTR TO CHAR, checkFile: PTR TO CHAR) StringF(fileName,'ERROR.\d',i) i++ ENDWHILE +debugLog(LOG_ERROR,'debug10d11') SetProtection(options,FIBF_OTR_DELETE) DeleteFile(options) +debugLog(LOG_ERROR,'debug10d12') ELSE +debugLog(LOG_ERROR,'debug10d13') RETURN 0,stat ENDIF +debugLog(LOG_ERROR,'debug10d14') ENDPROC 1,stat PROC testFile(str: PTR TO CHAR, path: PTR TO CHAR) @@ -18118,7 +18394,9 @@ PROC testFile(str: PTR TO CHAR, path: PTR TO CHAR) aePuts('\b\n') StrAdd(temp4,temp) +debugLog(LOG_ERROR,'debug10d') r,stat:=checkFileExternal(temp2,temp4) +debugLog(LOG_ERROR,'debug10e') RETURN stat ENDIF ENDIF @@ -18238,6 +18516,7 @@ PROC sysopUpload() DEF tempstr2[255]:STRING DEF destpath[255]:STRING DEF string[255]:STRING + DEF tmpBCD[8]:ARRAY OF CHAR DEF str[255]:STRING DEF stat,cnt DEF spacehi,spacelo,space2hi,space2lo @@ -18280,8 +18559,8 @@ PROC sysopUpload() ulFileCount:=0 skipdFiles.clear() - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) dlTTTM:=0 ulTTTM:=0 tTEFF:=0 @@ -18295,7 +18574,12 @@ PROC sysopUpload() sysopUploading:=FALSE aePuts('\b\n\b\nFile Uploading Complete...\b\n') - StringF(string,' \d file(s), \dk bytes, \d minute(s). \d second(s), \d cps, \d% efficiency.',ulFileCount,Shr(uTBT,10) AND $003fffff,Div(ulTTTM,60),Mod(ulTTTM,60),tTCPS,tTEFF) + CopyMem(uTBT,tmpBCD,8) + divBCD1024(tmpBCD) + formatBCD(tmpBCD,tempstr) + + ulTTTM:=Div(ulTTTM,50) + StringF(string,' \d file(s), \sk bytes, \d minute(s). \d second(s), \d cps, \d% efficiency.',ulFileCount,tempstr,Div(ulTTTM,60),Mod(ulTTTM,60),tTCPS,tTEFF) aePuts(string) aePuts('\b\n\b\n') @@ -18393,12 +18677,13 @@ PROC uploadaFile(uLFType,cmd,attach,alreadyUploaded=FALSE) -> JOE DEF odate[20]:STRING,fcomment[256]:STRING DEF ray[256]:STRING,ray2[256]:STRING,string[256]:STRING DEF buff[255]:STRING + DEF tmpBCD[8]:ARRAY OF CHAR DEF tempstr[255]:STRING,tempstr2[255]:STRING,tempstr3[255]:STRING DEF uaf,f DEF foundDupe=0 DEF mstat /* check for carrier. trying to stop upload guru from parcial upload */ DEF fsstr[11]:STRING - DEF tempsize,bgCnt,bgBytes + DEF tempsize,bgCnt DEF dizSysCmd[255]:STRING DEF exitLoop @@ -18476,8 +18761,8 @@ PROC uploadaFile(uLFType,cmd,attach,alreadyUploaded=FALSE) -> JOE /* uploading to another device?? */ IF(StrLen(sopt.ramPen)>0) THEN StrCopy(path,sopt.ramPen) ELSE StringF(path,'\sNode\d/Playpen/',cmds.bbsLoc,node) - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=0 dlTTTM:=0 tTEFF:=0 @@ -18497,15 +18782,19 @@ PROC uploadaFile(uLFType,cmd,attach,alreadyUploaded=FALSE) -> JOE pcps:=NIL ObtainSemaphore(bgData) bgCnt:=bgData.checkedCount - bgBytes:=bgData.checkedBytes ReleaseSemaphore(bgData) - IF(ulFileCount<>0) OR (bgBytes<>0) + IF(ulFileCount<>0) OR (bgCnt<>0) peff:=tTEFF pcps:=tTCPS ENDIF - StringF(string,' \d file(s), \dk bytes, \d minute(s). \d second(s), \d cps, \d% efficiency.',ulFileCount,Shr(uTBT,10) AND $003fffff,Div(ulTTTM,60),Mod(ulTTTM,60),pcps,peff) + CopyMem(uTBT,tmpBCD,8) + divBCD1024(tmpBCD) + formatBCD(tmpBCD,tempstr) + + ulTTTM:=Div(ulTTTM,50) + StringF(string,' \d file(s), \sk bytes, \d minute(s). \d second(s), \d cps, \d% efficiency.',ulFileCount,tempstr,Div(ulTTTM,60),Mod(ulTTTM,60),pcps,peff) aePuts(string) IF (pcps > loggedOnUserKeys.upCPS2) @@ -18589,6 +18878,7 @@ PROC uploadaFile(uLFType,cmd,attach,alreadyUploaded=FALSE) -> JOE /* loop thru uploaded (ing) list of files & move to where they belong*/ /* this gets the list of files uploaded */ + FOR x:=0 TO recFileNames.count()-1 StrCopy(str,recFileNames.item(x)) IF(cmds.acLvl[LVL_CAPITOLS_in_FILE]=1) THEN UpperStr(str) @@ -18793,6 +19083,7 @@ cNext: status2:=testFile(str,path) IF((status2=RESULT_NOT_ALLOWED) OR (status2=RESULT_SUCCESS)) THEN aePuts('\b\nTested Ok...') ENDIF + status:=checkForFile(str) IF(moveToLCFILES) @@ -18894,6 +19185,7 @@ move_It: /* gets here if lostcarrier, and file is complete but not when file StringF(fmtstr,'\l\s[13] \s \s \s\n',str,fsstr,odate,fcomment) ENDIF + IF(StrLen(str) < 13) /* for big file name on lost carrier */ IF(checksym) fmtstr[13]:=checksym @@ -18961,7 +19253,7 @@ eit: cleanItUp() /* we get here after lcfile but gugued*/ - tempsize:=uTBT + tempsize:=convertFromBCD(uTBT) IF sopt.toggles[TOGGLES_CREDITBYKB] tempsize:=Shr(tempsize,10) AND $003fffff ENDIF @@ -19108,7 +19400,7 @@ PROC doBackgroundCheck(fname:PTR TO CHAR) ObtainSemaphore(bgData) bgData.checkedCount:=bgData.checkedCount+1 - bgData.checkedBytes:=bgData.checkedBytes+fsize + addBCD(bgData.checkedBytes,fsize) ReleaseSemaphore(bgData) sysopULStats(hold) @@ -19382,7 +19674,7 @@ PROC downloadAFile(cmdcode: PTR TO CHAR, params) HANDLE DEF tsec,min,secs,i,x,status,mystat,proto DEF peff,pcps ->DEF tempsize,tbad - DEF badBCD[8]:ARRAY OF CHAR + DEF tmpBCD[8]:ARRAY OF CHAR DEF bcdStr[20]:STRING DEF tempStr[255]:STRING DEF tempStr2[255]:STRING @@ -19415,7 +19707,7 @@ PROC downloadAFile(cmdcode: PTR TO CHAR, params) HANDLE estDlCPS:=Div(onlineBaud,10) ENDIF - dtfsize:=0 + convertToBCD(0,dtfsize) displayULStats(loggedOnUser,loggedOnUserMisc) /* Show User stats.. Num Dnloads, uploads */ @@ -19431,18 +19723,18 @@ PROC downloadAFile(cmdcode: PTR TO CHAR, params) HANDLE ENDIF IF(loggedOnUser.secBoard<2) - convertToBCD(0,badBCD) + convertToBCD(0,tmpBCD) FOR i:=1 TO loggedOnUser.secLibrary - addBCD2(badBCD,loggedOnUserMisc.uploadBytesBCD) + addBCD2(tmpBCD,loggedOnUserMisc.uploadBytesBCD) ENDFOR - subBCD2(badBCD,loggedOnUserMisc.downloadBytesBCD) - IF badBCD[0]>=$50 + subBCD2(tmpBCD,loggedOnUserMisc.downloadBytesBCD) + IF tmpBCD[0]>=$50 ->result was negative StrCopy(bcdStr,'0') cnt:=0 ELSE - formatBCD(badBCD,bcdStr) - cnt:=convertFromBCD(badBCD) + formatBCD(tmpBCD,bcdStr) + cnt:=convertFromBCD(tmpBCD) ->bad needs to be used in a signed comparison, so don't allow values >7fffffff IF cnt<0 THEN cnt:=$7fffffff @@ -19604,7 +19896,7 @@ arestart: ENDIF status:=checkForFileSize(tempStr,currentConf,tfsizes,freeDFlags,finalList,0) - IF((status=RESULT_FAILURE) OR (status=11) OR (status=10)) + IF((status=RESULT_FAILURE) OR (status=RESULT_SIGNALLED) OR (status=RESULT_PRIVATE)) Throw(ERR_EXCEPT,RESULT_SUCCESS) ENDIF ENDLOOP @@ -19633,10 +19925,12 @@ astart: ENDIF aePuts(tempStr) - tsec:=Div(dtfsize,estDlCPS) - min:=tsec/60 - secs:=tsec-(min*60) - StringF(tempStr,' \d files, \dk bytes, \d mins \d secs\b\n',numFiles,Shr(dtfsize,10) AND $003fffff,min,secs) + tsec:=divBCD(dtfsize,estDlCPS) + min:=Div(tsec,60) + secs:=tsec-(Mul(min,60)) + CopyMem(dtfsize,tmpBCD,8) + divBCD1024(tmpBCD) + StringF(tempStr,' \d files, \dk bytes, \d mins \d secs\b\n',numFiles,convertFromBCD(tmpBCD),min,secs) aePuts(tempStr) IF(min>(Div(timeLimit,60))) AND (checkSecurity(ACS_OVERRIDE_TIMELIMIT)=FALSE) @@ -19667,8 +19961,8 @@ breakd: IF (mystat<>13) THEN aePuts('Goodbye!\b\n\b\n') ELSE aePuts('\b\n\b\n') - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) ulTTTM:=0 dlTTTM:=0 tTEFF:=0 @@ -19692,15 +19986,18 @@ breakd: ->peff:=Div(tTEFF,onlineNFiles) ->pcps:=Div(tTCPS,onlineNFiles) peff:=tTEFF - pcps:=tTCPS + pcps:=tTCPS + loggedOnUserMisc.lastDlCPS:=pcps ENDIF ->// (RTS) added dnload cps rate Fri Mar 27 13:13:29 1992 - StringF(string,' \d files, \dk bytes, \d minutes \d seconds \d cps, \d% efficiency at \d',dlFileCount,Shr(dTBT,10) AND $003fffff,Div(dlTTTM,60),Mod(dlTTTM,60),pcps,peff,onlineBaud) + CopyMem(dTBT,tmpBCD,8) + divBCD1024(tmpBCD) + formatBCD(tmpBCD,tempStr) + dlTTTM:=Div(dlTTTM,50) + StringF(string,' \d files, \sk bytes, \d minutes \d seconds \d cps, \d% efficiency at \d',dlFileCount,tempStr,Div(dlTTTM,60),Mod(dlTTTM,60),pcps,peff,onlineBaud) aePuts(string) aePuts('\b\n\b\n') - loggedOnUserMisc.lastDlCPS:=pcps - /* is this baud higher then max cps up ? */ IF(pcps > loggedOnUserKeys.dnCPS2) loggedOnUserKeys.dnCPS2:=pcps @@ -19722,17 +20019,19 @@ breakd: udLog('\tDownload Failed..') ENDIF - IF (uTBT>0) + IF (ulFileCount>0) ->hydra uploads ObtainSemaphore(bgData) bgData.checkedCount:=0 - bgData.checkedBytes:=0 + convertToBCD(0,bgData.checkedBytes) ReleaseSemaphore(bgData) IF ulTTTM - tTCPS:=Div(uTBT,ulTTTM) + CopyMem(uTBT,tmpBCD,8) + mulBCD(tmpBCD,50) + tTCPS:=divBCD(tmpBCD,ulTTTM) ELSE - tTCPS:=uTBT + tTCPS:=convertFromBCD(uTBT) ENDIF tTEFF:=calcEfficiency(tTCPS,onlineBaud) @@ -20673,9 +20972,9 @@ PROC editInfo(which:LONG, hoozer:PTR TO user, hoozer2:PTR TO userKeys, hoozer3: aePuts('No-Save\b\n') flag:=1 CASE " " - ->page:=Eor(page,1) - ->sendCLS() - ->displayAccount(which,page,hoozer,hoozer2,hoozer3,f6) + page:=Eor(page,1) + sendCLS() + displayAccount(which,page,hoozer,hoozer2,hoozer3,f6) CASE "+" IF(onlineEdit=FALSE) which:=which+1 @@ -20694,6 +20993,28 @@ PROC editInfo(which:LONG, hoozer:PTR TO user, hoozer2:PTR TO userKeys, hoozer3: loadAccount(which,hoozer,hoozer2,hoozer3) displayAccountInfo(which,page,hoozer,hoozer2,hoozer3,f6) ENDIF + CASE "~" /* SAVE */ + aePuts('Save\b\n') + hoozer.newUser:=0 + displayAccountInfo(which,page,hoozer,hoozer2,hoozer3,f6) + IF(hoozer.slotNumber=0) + hoozer2.number:=0 + stat:=saveAccount(hoozer,hoozer2,hoozer3,which,1) /* 1 = FORCE SAVE */ + + IF(stat<>RESULT_SUCCESS) THEN aePuts('Can''t Save account\b\n') + ELSE + hoozer2.number:=hoozer.slotNumber + /* save using Slot_number */ + stat:=saveAccount(hoozer,hoozer2,hoozer3,0,0) /* Not forced */ + IF(stat<>RESULT_SUCCESS) THEN aePuts('Can''t Save account\b\n') + ENDIF + + IF logonType>=LOGON_TYPE_REMOTE + StringF(tempStr,'\tREMOTE Account Maintenance on Account \d',hoozer.slotNumber) + ELSE + StringF(tempStr,'\tLOCAL Account Maintenance on Account \d',hoozer.slotNumber) + ENDIF + callersLog(tempStr) CASE "!" /* Credit Maintenance */ creditMaintenance(which,hoozer,hoozer2,hoozer3,f6) displayAccount(which,page,hoozer,hoozer2,hoozer3,f6) @@ -20756,59 +21077,53 @@ PROC editInfo(which:LONG, hoozer:PTR TO user, hoozer2:PTR TO userKeys, hoozer3: deleteConfAccess(stat) displayAccountInfo(which,page,hoozer,hoozer2,hoozer3,f6) flag:=0 - CASE "~" /* SAVE */ - aePuts('Save\b\n') - hoozer.newUser:=0 - displayAccountInfo(which,page,hoozer,hoozer2,hoozer3,f6) - IF(hoozer.slotNumber=0) - hoozer2.number:=0 - stat:=saveAccount(hoozer,hoozer2,hoozer3,which,1) /* 1 = FORCE SAVE */ - - IF(stat<>RESULT_SUCCESS) THEN aePuts('Can''t Save account\b\n') - ELSE - hoozer2.number:=hoozer.slotNumber - /* save using Slot_number */ - stat:=saveAccount(hoozer,hoozer2,hoozer3,0,0) /* Not forced */ - IF(stat<>RESULT_SUCCESS) THEN aePuts('Can''t Save account\b\n') - ENDIF - - IF logonType>=LOGON_TYPE_REMOTE - StringF(tempStr,'\tREMOTE Account Maintenance on Account \d',hoozer.slotNumber) - ELSE - StringF(tempStr,'\tLOCAL Account Maintenance on Account \d',hoozer.slotNumber) - ENDIF - callersLog(tempStr) - CASE "9" /* RE-ACTIVATE */ aePuts('Re-Activate\b\n') hoozer.slotNumber:=which flag:=0 - CASE "A" /* NAME */ - aePuts('') - StrCopy(tempStr,hoozer.name) - lineInput('',tempStr,30,INPUT_TIMEOUT,tempStr) - AstrCopy(hoozer.name,tempStr,31) - UpperStr(tempStr) - AstrCopy(hoozer2.userName,tempStr,31) - flag:=0 - CASE "B" /* Real Name */ - aePuts('') - StrCopy(tempStr,hoozer3.realName) - lineInput('',tempStr,25,INPUT_TIMEOUT,tempStr) - AstrCopy(hoozer3.realName,tempStr,26) - flag:=0 - CASE "C" /* Location */ - aePuts('') - StrCopy(tempStr,hoozer.location) - lineInput('',tempStr,29,INPUT_TIMEOUT,tempStr) - AstrCopy(hoozer.location,tempStr,30) - flag:=0 - CASE "D" /* PASS */ - IF((logonType>=LOGON_TYPE_REMOTE) AND (f6=FALSE)) - IF(loggedOnUser.slotNumber=1) - aePuts('') + ENDSELECT - StrCopy(tempStr,'') + IF (page=0) + SELECT command + CASE "A" /* NAME */ + aePuts('') + StrCopy(tempStr,hoozer.name) + lineInput('',tempStr,30,INPUT_TIMEOUT,tempStr) + AstrCopy(hoozer.name,tempStr,31) + UpperStr(tempStr) + AstrCopy(hoozer2.userName,tempStr,31) + flag:=0 + CASE "B" /* Real Name */ + aePuts('') + StrCopy(tempStr,hoozer3.realName) + lineInput('',tempStr,25,INPUT_TIMEOUT,tempStr) + AstrCopy(hoozer3.realName,tempStr,26) + flag:=0 + CASE "C" /* Location */ + aePuts('') + StrCopy(tempStr,hoozer.location) + lineInput('',tempStr,29,INPUT_TIMEOUT,tempStr) + AstrCopy(hoozer.location,tempStr,30) + flag:=0 + CASE "D" /* PASS */ + IF((logonType>=LOGON_TYPE_REMOTE) AND (f6=FALSE)) + IF(loggedOnUser.slotNumber=1) + aePuts('') + + StrCopy(tempStr,'') + StrAdd(tempStr,' ') + FOR i:=1 TO 9 + StrAddChar(tempStr,8) + ENDFOR + aePuts(tempStr) + lineInput('','',50,INPUT_TIMEOUT,tempStr) + IF StrLen(tempStr)>0 + setNewPassword(hoozer,hoozer3,tempStr) + hoozer3.pwdLastUpdated:=getSystemTime() + ENDIF + ENDIF + ELSE + StrCopy(tempStr,'') StrAdd(tempStr,' ') FOR i:=1 TO 9 StrAddChar(tempStr,8) @@ -20816,176 +21131,189 @@ PROC editInfo(which:LONG, hoozer:PTR TO user, hoozer2:PTR TO userKeys, hoozer3: aePuts(tempStr) lineInput('','',50,INPUT_TIMEOUT,tempStr) IF StrLen(tempStr)>0 - UpperStr(tempStr) - hoozer.pwdHash:=calcPasswordHash(tempStr) + setNewPassword(hoozer,hoozer3,tempStr) + hoozer3.pwdLastUpdated:=getSystemTime() ENDIF ENDIF - ELSE - StrCopy(tempStr,'') - StrAdd(tempStr,' ') - FOR i:=1 TO 9 - StrAddChar(tempStr,8) - ENDFOR - aePuts(tempStr) - lineInput('','',50,INPUT_TIMEOUT,tempStr) - IF StrLen(tempStr)>0 - UpperStr(tempStr) - hoozer.pwdHash:=calcPasswordHash(tempStr) - ENDIF - ENDIF - flag:=0 - CASE "E" /* Phone number */ - aePuts('') - StrCopy(tempStr,hoozer.phoneNumber) - lineInput('',tempStr,12,INPUT_TIMEOUT,tempStr) - AstrCopy(hoozer.phoneNumber,tempStr,13) - flag:=0 - CASE "F" /* conference access */ - aePuts('') - StrCopy(tempStr,hoozer.conferenceAccess) - lineInput('',tempStr,9,INPUT_TIMEOUT,tempStr) - AstrCopy(hoozer.conferenceAccess,tempStr,10) - flag:=0 - CASE "G" /* RATIO */ - aePuts('') - hoozer.secLibrary:=numberInput(hoozer.secLibrary) - flag:=0 - CASE "H" /* SEC_Level */ - IF((logonType>=LOGON_TYPE_REMOTE) AND (f6=FALSE)) - IF(loggedOnUser.slotNumber=1) + flag:=0 + CASE "E" /* Phone number */ + aePuts('') + StrCopy(tempStr,hoozer.phoneNumber) + lineInput('',tempStr,12,INPUT_TIMEOUT,tempStr) + AstrCopy(hoozer.phoneNumber,tempStr,13) + flag:=0 + CASE "F" /* conference access */ + aePuts('') + StrCopy(tempStr,hoozer.conferenceAccess) + lineInput('',tempStr,9,INPUT_TIMEOUT,tempStr) + AstrCopy(hoozer.conferenceAccess,tempStr,10) + flag:=0 + CASE "G" /* RATIO */ + aePuts('') + hoozer.secLibrary:=numberInput(hoozer.secLibrary) + flag:=0 + CASE "H" /* SEC_Level */ + IF((logonType>=LOGON_TYPE_REMOTE) AND (f6=FALSE)) + IF(loggedOnUser.slotNumber=1) + aePuts('') + hoozer.secStatus:=numberInput(hoozer.secStatus) + ENDIF + ELSE aePuts('') hoozer.secStatus:=numberInput(hoozer.secStatus) ENDIF - ELSE - aePuts('') - hoozer.secStatus:=numberInput(hoozer.secStatus) - ENDIF - flag:=0 - CASE "I" /* Ratio Type */ - aePuts('') - hoozer.secBoard:=numberInput(hoozer.secBoard) - IF((hoozer.secBoard<0) OR (hoozer.secBoard > 2)) - sendBELL() - hoozer.secBoard:=0 - ENDIF - StringF(tempStr,'I> Ratio Type ....: \l\d[5]',hoozer.secBoard) - aePuts(tempStr) - IF(hoozer.secBoard=0) THEN aePuts(' <-Byte)') - IF(hoozer.secBoard=1) THEN aePuts(' <-B/F) ') - IF(hoozer.secBoard=2) THEN aePuts(' <-File)') - flag:=0 - CASE "J" /* conference ReJoin */ - aePuts('') - value1,value2:=rJoinInput(hoozer.confRJoin, hoozer.msgBaseRJoin) - hoozer.confRJoin:=value1 - hoozer.msgBaseRJoin:=value2 - flag:=0 - CASE "K" /* UPLOADS */ - aePuts('') - hoozer.uploads:=numberInput(hoozer.uploads) - flag:=0 - CASE "L" /* MESSAGES_POSTED */ - aePuts('') - hoozer.messagesPosted:=numberInput(hoozer.messagesPosted) - flag:=0 - CASE "M" /* DOWNLOADS */ - aePuts('') - hoozer.downloads:=numberInput(hoozer.downloads) - flag:=0 - CASE "N" /* New user ?? */ - aePuts(' ') - command:=yesNo(0) - IF(command) THEN hoozer.newUser:=1 ELSE hoozer.newUser:=0 - flag:=0 - CASE "#" - aePuts('') - hoozer.timesCalled:=numberInput(hoozer.timesCalled) - flag:=0 - CASE "%" - aePuts('') - hoozer2.timesOnToday:=numberInput(getTodaysCalls(hoozer,hoozer2)) - flag:=0 - CASE "O" /* Bytes Uploaded */ - aePuts('') - - bcdNumberInput(hoozer3.uploadBytesBCD) - hoozer.bytesUpload:=convertFromBCD(hoozer3.uploadBytesBCD) + flag:=0 + CASE "I" /* Ratio Type */ + aePuts('') + hoozer.secBoard:=numberInput(hoozer.secBoard) + IF((hoozer.secBoard<0) OR (hoozer.secBoard > 2)) + sendBELL() + hoozer.secBoard:=0 + ENDIF + StringF(tempStr,'I> Ratio Type ....: \l\d[5]',hoozer.secBoard) + aePuts(tempStr) + IF(hoozer.secBoard=0) THEN aePuts(' <-Byte)') + IF(hoozer.secBoard=1) THEN aePuts(' <-B/F) ') + IF(hoozer.secBoard=2) THEN aePuts(' <-File)') + flag:=0 + CASE "J" /* conference ReJoin */ + aePuts('') + value1,value2:=rJoinInput(hoozer.confRJoin, hoozer.msgBaseRJoin) + hoozer.confRJoin:=value1 + hoozer.msgBaseRJoin:=value2 + flag:=0 + CASE "K" /* UPLOADS */ + aePuts('') + hoozer.uploads:=numberInput(hoozer.uploads) + flag:=0 + CASE "L" /* MESSAGES_POSTED */ + aePuts('') + hoozer.messagesPosted:=numberInput(hoozer.messagesPosted) + flag:=0 + CASE "M" /* DOWNLOADS */ + aePuts('') + hoozer.downloads:=numberInput(hoozer.downloads) + flag:=0 + CASE "N" /* New user ?? */ + aePuts(' ') + command:=yesNo(0) + IF(command) THEN hoozer.newUser:=1 ELSE hoozer.newUser:=0 + flag:=0 + CASE "#" + aePuts('') + hoozer.timesCalled:=numberInput(hoozer.timesCalled) + flag:=0 + CASE "%" + aePuts('') + hoozer2.timesOnToday:=numberInput(getTodaysCalls(hoozer,hoozer2)) + flag:=0 + CASE "O" /* Bytes Uploaded */ + aePuts('') + + bcdNumberInput(hoozer3.uploadBytesBCD) + hoozer.bytesUpload:=convertFromBCD(hoozer3.uploadBytesBCD) - flag:=0 - CASE "P" /* Bytes Downloaded */ - aePuts('') - bcdNumberInput(hoozer3.downloadBytesBCD) - hoozer.bytesDownload:=convertFromBCD(hoozer3.downloadBytesBCD) - flag:=0 - CASE "Q" /* Daily Bytes Limit */ - aePuts(' ') - IF hoozer.todaysBytesLimit<>0 - temp:=hoozer.todaysBytesLimit-hoozer.dailyBytesLimit - ELSE - temp:=0 - ENDIF - hoozer.dailyBytesLimit:=longNumberInput(hoozer.dailyBytesLimit) - hoozer.todaysBytesLimit:=hoozer.dailyBytesLimit - IF hoozer.todaysBytesLimit<>0 THEN hoozer.todaysBytesLimit:=hoozer.todaysBytesLimit+temp - flag:=0 - CASE "R" /* Time_Total */ - aePuts('') - hoozer.timeTotal:=Mul(numberInput(Div(hoozer.timeTotal,60)),60) - IF(hoozer.timeTotal0 + temp:=hoozer.todaysBytesLimit-hoozer.dailyBytesLimit + ELSE + temp:=0 + ENDIF + hoozer.dailyBytesLimit:=longNumberInput(hoozer.dailyBytesLimit) + hoozer.todaysBytesLimit:=hoozer.dailyBytesLimit + IF hoozer.todaysBytesLimit<>0 THEN hoozer.todaysBytesLimit:=hoozer.todaysBytesLimit+temp + flag:=0 + CASE "R" /* Time_Total */ + aePuts('') + hoozer.timeTotal:=Mul(numberInput(Div(hoozer.timeTotal,60)),60) + IF(hoozer.timeTotal65535 THEN hoozer2.oldUpCPS:=65535 ELSE hoozer2.oldUpCPS:=hoozer2.upCPS2 - flag:=0; - CASE "T" /* zero dncps rate */ - aePuts('') - hoozer2.dnCPS2:=longNumberInput(hoozer2.dnCPS2) - IF hoozer2.dnCPS2>65535 THEN hoozer2.oldDnCPS:=65535 ELSE hoozer2.oldDnCPS:=hoozer2.dnCPS2 - flag:=0 - CASE "U" /* Time_Limit */ - aePuts('') - hoozer.timeLimit:=Mul(numberInput(Div(hoozer.timeLimit,60)),60) - IF(hoozer.timeTotal65535 THEN hoozer2.oldUpCPS:=65535 ELSE hoozer2.oldUpCPS:=hoozer2.upCPS2 + flag:=0; + CASE "T" /* zero dncps rate */ + aePuts('') + hoozer2.dnCPS2:=longNumberInput(hoozer2.dnCPS2) + IF hoozer2.dnCPS2>65535 THEN hoozer2.oldDnCPS:=65535 ELSE hoozer2.oldDnCPS:=hoozer2.dnCPS2 + flag:=0 + CASE "U" /* Time_Limit */ + aePuts('') + hoozer.timeLimit:=Mul(numberInput(Div(hoozer.timeLimit,60)),60) + IF(hoozer.timeTotal Force Pwd Reset: \l\s[3]',tempStr2) + aePuts(tempStr) + + IF hoozer3.accountLocked THEN StrCopy(tempStr2,'Yes') ELSE StrCopy(tempStr2,'No') + StringF(tempStr,'C> Account Locked : \l\s',tempStr2) + aePuts(tempStr) + + StringF(tempStr,'D> Invalid Pwd Att: \l\d[3]',hoozer3.invalidAttempts) + aePuts(tempStr) + + formatLongDateTime(hoozer3.pwdLastUpdated,tempStr2) + StringF(tempStr,'Last Pwd Reset : \l\s',tempStr2) + aePuts(tempStr) + + SELECT hoozer3.pwdType + CASE PWD_LEGACY + StrCopy(tempStr2,'LEGACY ') + CASE PWD_PBKDF2_5 + StrCopy(tempStr2,'PBKDF2(5) ') + CASE PWD_PBKDF2_50 + StrCopy(tempStr2,'PBKDF2(50) ') + CASE PWD_PBKDF2_100 + StrCopy(tempStr2,'PBKDF2(100) ') + CASE PWD_PBKDF2_1000 + StrCopy(tempStr2,'PBKDF2(1000) ') + CASE PWD_PBKDF2_10000 + StrCopy(tempStr2,'PBKDF2(10000)') + ENDSELECT + + StringF(tempStr,'Pwd Type ......: \s',tempStr2) + aePuts(tempStr) + + ENDIF + displayAccountActions(who) ENDPROC @@ -22576,12 +22942,48 @@ PROC displayAccountInfo(who:LONG, page,hoozer:PTR TO user, hoozer2:PTR TO userKe StringF(tempStr,'\l\d[6]',Div((hoozer.chatLimit-hoozer.chatRemain),60)) aePuts(tempStr) ENDIF + + IF page=1 + IF hoozer3.forcePwdReset THEN StrCopy(tempStr2,'Yes') ELSE StrCopy(tempStr2,'No') + StringF(tempStr,'\l\s[3]',tempStr2) + aePuts(tempStr) + + IF hoozer3.accountLocked THEN StrCopy(tempStr2,'Yes') ELSE StrCopy(tempStr2,'No') + StringF(tempStr,'\l\s[3]',tempStr2) + aePuts(tempStr) + + StringF(tempStr,'\l\d[3]',hoozer3.invalidAttempts) + aePuts(tempStr) + + formatLongDateTime(hoozer3.pwdLastUpdated,tempStr2) + StringF(tempStr,'\l\s',tempStr2) + aePuts(tempStr) + + SELECT hoozer3.pwdType + CASE PWD_LEGACY + StrCopy(tempStr2,'LEGACY ') + CASE PWD_PBKDF2_5 + StrCopy(tempStr2,'PBKDF2(5) ') + CASE PWD_PBKDF2_50 + StrCopy(tempStr2,'PBKDF2(50) ') + CASE PWD_PBKDF2_100 + StrCopy(tempStr2,'PBKDF2(100) ') + CASE PWD_PBKDF2_1000 + StrCopy(tempStr2,'PBKDF2(1000) ') + CASE PWD_PBKDF2_10000 + StrCopy(tempStr2,'PBKDF2(10000)') + ENDSELECT + + StringF(tempStr,'\s',tempStr2) + aePuts(tempStr) + + ENDIF displayAccountActions(who) ENDPROC PROC bulkAccountEditor() DEF flag,command - DEF settings[16]:ARRAY OF LONG + DEF settings[18]:ARRAY OF LONG DEF areaName[255]:STRING DEF secLevel[3]:STRING DEF i,v,v2,r,p @@ -22592,7 +22994,7 @@ PROC bulkAccountEditor() displayBulkScreen() - FOR i:=0 TO 15 + FOR i:=0 TO 17 settings[i]:=String(15) ENDFOR StrCopy(areaName,'') @@ -22706,11 +23108,27 @@ PROC bulkAccountEditor() ELSE StrCopy(settings[15],'') ENDIF + CASE "!" + IF StrLen(settings[16])=0 + StrCopy(settings[16],'1') + ELSEIF StrCmp(settings[16],'1') + StrCopy(settings[16],'0') + ELSE + StrCopy(settings[16],'') + ENDIF + CASE "&" + IF StrLen(settings[17])=0 + StrCopy(settings[17],'1') + ELSEIF StrCmp(settings[17],'1') + StrCopy(settings[17],'0') + ELSE + StrCopy(settings[17],'') + ENDIF CASE "1" /* select area Name */ - aePuts(' ') + aePuts(' ') lineInput('',areaName,10,INPUT_TIMEOUT,areaName) CASE "2" /* select access Level */ - aePuts(' ') + aePuts(' ') lineInput('',secLevel,3,INPUT_TIMEOUT,secLevel) v,r:=Val(secLevel) IF r=0 THEN StrCopy(secLevel,'') @@ -22772,10 +23190,13 @@ PROC displayBulkScreen() aePuts('Y> Chat Limit ....:') aePuts('#> Times Called ..:') - aePuts('Filter Settings:') + aePuts('!> Force Pwd Reset:') + aePuts('&> Accnt Locked ..:') + + aePuts('Filter Settings:') - aePuts('1> Select Area Name :') - aePuts('2> Select Sec Level :') + aePuts('1> Select Area Name :') + aePuts('2> Select Sec Level :') aePuts('3> Include deactivated :') aePuts('~=Apply Changes @=Presets =Exit\b\n') ENDPROC @@ -22826,15 +23247,20 @@ PROC displayBulkSettings(settings:PTR TO LONG, areaName:PTR TO CHAR, secLevel:PT StringF(tempStr,' \s',IF StrLen(settings[15])=0 THEN 'Leave Unchanged' ELSE IF Val(settings[15])=0 THEN 'Deactivate ' ELSE 'Activate ') aePuts(tempStr) + StringF(tempStr,' \s',IF StrLen(settings[16])=0 THEN 'Leave Unchanged' ELSE IF Val(settings[16])=1 THEN 'Yes ' ELSE 'No ') + aePuts(tempStr) + StringF(tempStr,' \s',IF StrLen(settings[17])=0 THEN 'Leave Unchanged' ELSE IF Val(settings[17])=1 THEN 'Yes ' ELSE 'No ') + aePuts(tempStr) + i,tot:=calcAffected(areaName,secLevel) - StringF(tempStr,'[\d/\d] Users will be updated. ',i,tot) + StringF(tempStr,'[\d/\d] Users will be updated. ',i,tot) aePuts(tempStr) - StringF(tempStr,'\s',IF StrLen(areaName)=0 THEN 'N/A' ELSE areaName) + StringF(tempStr,'\s',IF StrLen(areaName)=0 THEN 'N/A' ELSE areaName) aePuts(tempStr) - StringF(tempStr,'\s',IF StrLen(secLevel)=0 THEN 'N/A' ELSE secLevel) + StringF(tempStr,'\s',IF StrLen(secLevel)=0 THEN 'N/A' ELSE secLevel) aePuts(tempStr) StringF(tempStr,'\s',IF includeDeact THEN 'Yes' ELSE 'No ') @@ -22953,6 +23379,13 @@ PROC applyBulkChanges(settings:PTR TO LONG,areaName:PTR TO CHAR,secLevel:PTR TO IF Val(settings[15])=0 THEN tempUser.slotNumber:=0 ELSE tempUser.slotNumber:=sn tempUserKeys.number:=tempUser.slotNumber ENDIF + IF StrLen(settings[16])>0 + IF Val(settings[16])=0 THEN tempUserMisc.forcePwdReset:=FALSE ELSE tempUserMisc.forcePwdReset:=TRUE + ENDIF + + IF StrLen(settings[17])>0 + IF Val(settings[17])=0 THEN tempUserMisc.accountLocked:=FALSE ELSE tempUserMisc.accountLocked:=TRUE + ENDIF Seek(fh,-SIZEOF user,OFFSET_CURRENT) Write(fh,tempUser,SIZEOF user) @@ -24862,8 +25295,8 @@ ENDPROC RESULT_SUCCESS PROC internalCommandW() DEF stat,option - DEF str[100]:STRING - DEF str2[100]:STRING + DEF str[255]:STRING + DEF str2[255]:STRING DEF temp IF checkSecurity(ACS_EDIT_USER_INFO)=FALSE THEN RETURN RESULT_NOT_ALLOWED @@ -25151,15 +25584,35 @@ PROC internalCommandW() CASE 6 ->EDIT PASSWORD IF (checkSecurity(ACS_EDIT_PASSWORD)=FALSE) THEN JUMP cant - aePuts('Password: ') - stat:=lineInput('','',50,INPUT_TIMEOUT,str) + + stat:=getPass2('Enter New Password: ',0,0,50,str) IF(stat<0) THEN RETURN stat IF(StrLen(str)=0) THEN JUMP cant - UpperStr(str) - stat:=calcPasswordHash(str) - StringF(str,'new hash: \h',stat) - debugLog(LOG_DEBUG,str) - loggedOnUser.pwdHash:=stat + + stat:=getPass2('Reenter New Password: ',0,0,50,str2) + IF(stat<0) THEN RETURN stat + IF(StrLen(str2)=0) THEN JUMP cant + + IF StrCmp(str,str2) + stat:=checkPasswordStrength(str) + IF stat=1 + stat:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_LENGTH') + StringF(str,'\b\nPassword length must be at least \d chars, changes not saved',stat) + aePuts(str) + Delay(60) + ELSEIF stat=2 + stat:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_STRENGTH') + StringF(str,'\b\nPassword must have at least \d of these:\b\n upper case,lower case, numeric and symbols - changes not saved',stat) + aePuts(str) + Delay(60) + ELSE + setNewPassword(loggedOnUser,loggedOnUserMisc,str) + loggedOnUserMisc.pwdLastUpdated:=getSystemTime() + ENDIF + ELSE + aePuts('\b\nPasswords do not match, changes not saved') + Delay(60) + ENDIF CASE 7 ->EDIT NUMBER OF SCREEN LINES REPEAT @@ -25454,8 +25907,8 @@ PROC internalCommandZOOM() aePuts('Not supported locally...\b\n') RETURN RESULT_SUCCESS ENDIF - dTBT:=0 - uTBT:=0 + convertToBCD(0,dTBT) + convertToBCD(0,uTBT) dlTTTM:=0 ulTTTM:=0 tTEFF:=NIL @@ -27619,7 +28072,7 @@ PROC processLoggedOnUser() timeLimit:=loggedOnUser.timeTotal-loggedOnUser.timeUsed IF (loggedOnUser.todaysBytesLimit<>0) - bytesADL:=loggedOnUser.todaysBytesLimit + bytesADL:=loggedOnUser.todaysBytesLimit-loggedOnUser.dailyBytesDld ELSE bytesADL:=$7fffffff ENDIF @@ -27998,7 +28451,13 @@ PROC processFtpLoggedOnUser() loggedOnUser.chatRemain:=loggedOnUser.chatLimit loggedOnUser.dailyBytesDld:=0 loggedOnUser.timeTotal:=loggedOnUser.timeLimit + loggedOnUser.todaysBytesLimit:=loggedOnUser.dailyBytesLimit ELSE + IF loggedOnUser.dailyBytesLimit=0 + loggedOnUser.todaysBytesLimit:=0 + ELSE + IF loggedOnUser.todaysBytesLimit0) - bytesADL:=loggedOnUser.todaysBytesLimit + bytesADL:=loggedOnUser.todaysBytesLimit-loggedOnUser.dailyBytesDld ELSE bytesADL:=$7fffffff ENDIF @@ -28257,8 +28716,8 @@ PROC checkPassword() stat:=lineInput('','',50,INPUT_TIMEOUT,tempStr) IF(stat<0) THEN RETURN RESULT_NO_CARRIER IF(StrLen(tempStr)>0) - UpperStr(tempStr) - loggedOnUser.pwdHash:=calcPasswordHash(tempStr) + setNewPassword(loggedOnUser,loggedOnUserMisc,tempStr) + loggedOnUserMisc.pwdLastUpdated:=getSystemTime() ENDIF ENDIF ENDIF @@ -28269,7 +28728,7 @@ PROC checkPassword() ENDIF ENDIF IF StrLen(resetCode)=0 - stat:=getPass2(passwordPrompt,0,loggedOnUser.pwdHash,50,tempStr) + stat:=getPass2(passwordPrompt,0,TRUE,50,tempStr) IF(stat<0) IF stat=RESULT_NO_CARRIER THEN RETURN RESULT_NO_CARRIER ELSE RETURN RESULT_SLEEP_LOGOFF ENDIF @@ -28536,7 +28995,7 @@ PROC processLogon() DEF newUser DEF userNum DEF stat,ch - DEF hrs,calcHrs,autovalPreset + DEF hrs,calcHrs,autovalPreset,pwdExpiryDays ripMode:=FALSE confNameType:=NAME_TYPE_USERNAME @@ -28811,6 +29270,7 @@ logonLoop: logoffLog('N') ENDIF + saveAccount(loggedOnUser,loggedOnUserKeys,loggedOnUserMisc,0,0) END loggedOnUser loggedOnUser:=NIL END loggedOnUserKeys @@ -28844,6 +29304,78 @@ logonLoop: RETURN ENDIF + IF loggedOnUserMisc.accountLocked + aePuts('\b\nYour account is locked out (possibly due to repeated password failures)\b\n\b\n') + aePuts('Leave a comment for the sysop...\b\n\b\n') + processCommand('C') + + aePuts('\b\nThanks you will now be disconnected...\b\n\b\n') + state:=STATE_LOGGING_OFF + RETURN + ENDIF + + pwdExpiryDays:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'PASSWORD_EXPIRY_DAYS') + IF pwdExpiryDays>=0 + IF (loggedOnUserMisc.pwdLastUpdated+Mul(pwdExpiryDays,86400))TRUE + IF stat=1 + stat:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_LENGTH') + StringF(tempStr,'\b\nPassword length must be at least \d chars, try again..\b\n\b\n',stat) + aePuts(tempStr) + ELSEIF stat=2 + stat:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_STRENGTH') + StringF(tempStr,'\b\nPassword must have at least \d of these:\b\n upper case,lower case, numeric and symbols, try again..\b\n\b\n',stat) + aePuts(tempStr) + ENDIF + ELSE + setNewPassword(loggedOnUser,loggedOnUserMisc,tempStr) + loggedOnUserMisc.pwdLastUpdated:=getSystemTime() + loggedOnUserMisc.forcePwdReset:=FALSE + ENDIF + ENDIF + ELSE + aePuts('\b\nPasswords do not match, please try again.\b\n\b\n') + ENDIF + ENDIF + ENDIF + retryCount++ + UNTIL (retryCount>3) OR (loggedOnUserMisc.forcePwdReset=FALSE) + + IF (loggedOnUserMisc.forcePwdReset) + aePuts('\b\nYou have not updated your password so you will now be disconnected...\b\n\b\n') + state:=STATE_LOGGING_OFF + RETURN + ENDIF + ENDIF + IF logonType>=LOGON_TYPE_REMOTE runExecuteOn('LOGON') IF (checkToolTypeExists(TOOLTYPE_BBSCONFIG,0,'MAIL_ON_LOGON')) AND (StrLen(mailOptions.sysopEmail)>0) @@ -29232,16 +29764,41 @@ jLoop4: JUMP jLoop3 ENDIF - aePuts('Enter a PassWord: ') - stat:=lineInput('','',50,INPUT_TIMEOUT,string) +jLoop5: + + stat:=getPass2('Enter a PassWord: ',0,0,50,string) IF(stat<0) THEN RETURN stat IF(StrLen(string)=0) aePuts('\b\n') JUMP jLoop4 ENDIF - UpperStr(string) - loggedOnUser.pwdHash:=calcPasswordHash(string) + stat:=getPass2('Reenter the PassWord: ',0,0,50,str2) + IF(stat<0) THEN RETURN stat + + IF(StrCmp(string,str2)=0) + aePuts('\b\nPasswords do not match, try again..\b\n') + JUMP jLoop5 + ENDIF + + stat:=checkPasswordStrength(string) + IF stat<>TRUE + + IF stat=1 + stat:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_LENGTH') + StringF(string,'\b\nPassword length must be at least \d chars, try again..\b\n',stat) + aePuts(string) + ELSEIF stat=2 + stat:=readToolTypeInt(TOOLTYPE_BBSCONFIG,0,'MIN_PASSWORD_STRENGTH') + StringF(string,'\b\nPassword must have at least \d of these:\b\n upper case,lower case, numeric and symbols, try again..\b\n',stat) + aePuts(string) + ENDIF + JUMP jLoop5 + ENDIF + + setNewPassword(loggedOnUser,loggedOnUserMisc,string) + loggedOnUserMisc.pwdLastUpdated:=getSystemTime() + aePuts('\b\n') stat:=numberOfLinesTest() IF(stat<0) THEN RETURN stat @@ -30379,7 +30936,7 @@ PROC main() HANDLE netTrans:=0 ENDIF - saveA4() + saveA4(FindTask(0),{tasksA4}) StringF(bgCheckPortName,'bgCheckPort\d',node) @@ -30964,29 +31521,12 @@ PROC main() HANDLE ENDSELECT ENDPROC -PROC saveA4() - MOVEM.L D0-D7/A0-A6,-(A7) - MOVE.L 4,A6 - SUB.L A1,A1 - JSR -$126(A6) ->findtask - MOVE.L D0,D7 - - LEA regA4(PC),A0 - LEA tasksA4(PC),A1 - MOVE.L node,D0 - ADD.W D0,D0 - ADD.W D0,D0 - MOVE.L A4,0(A0,D0.W) - MOVE.L D7,0(A1,D0.W) - MOVEM.L (A7)+,D0-D7/A0-A6 -ENDPROC - -PROC saveA4thread(taskID) +PROC saveA4(taskID,tasktable) MOVEM.L D0-D7/A0-A6,-(A7) MOVE.L taskID,D7 LEA regA4(PC),A0 - LEA threadtasksA4(PC),A1 + MOVE.L tasktable,A1 MOVE.L node,D0 ADD.W D0,D0 ADD.W D0,D0 @@ -30995,7 +31535,7 @@ PROC saveA4thread(taskID) MOVEM.L (A7)+,D0-D7/A0-A6 ENDPROC -PROC loadA4() +PROC loadA4(tasktable) MOVEM.L D0-D7/A0-A3/A5-A6,-(A7) MOVE.L 4,A6 @@ -31004,7 +31544,7 @@ PROC loadA4() MOVE.L D0,D1 LEA regA4(PC),A0 - LEA tasksA4(PC),A1 + MOVE.L tasktable,A1 CLR.L D0 findA4task: MOVE.L 0(A1,D0.W),D2 @@ -31023,34 +31563,6 @@ taskfound: MOVEM.L (A7)+,D0-D7/A0-A3/A5-A6 ENDPROC -PROC loadA4thread() - MOVEM.L D0-D7/A0-A3/A5-A6,-(A7) - MOVE.L 4,A6 - SUB.L A1,A1 - JSR -$126(A6) ->findtask - MOVE.L D0,D1 - - LEA regA4(PC),A0 - LEA threadtasksA4(PC),A1 - CLR.L D0 -findA4threadtask: - MOVE.L 0(A1,D0.W),D2 - CMP.L D1,D2 - BEQ threadtaskfound - - ADD.L #4,D0 - CMP.L #128,D0 - BNE findA4threadtask - - MOVE.L #AG_BADPARM,D7 - JSR -$6c(A6) ->Alert(AG_BADPARM) - -threadtaskfound: - MOVE.L 0(A0,D0),A4 - MOVEM.L (A7)+,D0-D7/A0-A3/A5-A6 - -ENDPROC - tasksA4: LONG NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL LONG NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL diff --git a/makefile b/makefile index 9c630f4..824ff6e 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ options=DEBUG IGNORECACHE NILCHECK OPTI SYM SHOWFNAME compiler=EVO expprogramname=AmiExpress acpprogramname=ACP -version=5.5.0 +version=5.6.0-dev all: acp express5 jsonimport icon2cfg qwk ftn @@ -14,7 +14,7 @@ release: acp express5 jsonimport icon2cfg qwk ftn acp: acp.e acpversion.m axcommon.m jsonparser.m jsoncreate.m stringlist.m $(compiler) acp $(options) -express5: express.e expversion.m axcommon.m axconsts.m miscfuncs.m axobjects.m axenums.m stringlist.m errors.m mailssl.m ftpd.m httpd.m xymodem.m zmodem.m hydra.m tooltypes.m pwdhash.m bcd.m +express5: express.e expversion.m axcommon.m axconsts.m miscfuncs.m axobjects.m axenums.m stringlist.m errors.m mailssl.m ftpd.m httpd.m xymodem.m zmodem.m hydra.m tooltypes.m pwdhash.m bcd.m sha256.m $(compiler) express $(options) copy express express5 delete express @@ -40,10 +40,10 @@ jsonparser.m: jsonparser.e miscfuncs.m jsoncreate.m: jsoncreate.e miscfuncs.m jsonparser.m $(compiler) jsoncreate $(options) -zmodem.m: zmodem.e +zmodem.m: zmodem.e bcd.m $(compiler) zmodem $(options) -xymodem.m: xymodem.e +xymodem.m: xymodem.e bcd.m $(compiler) xymodem $(options) hydra.m: hydra.e @@ -91,17 +91,20 @@ acpversion.m: acpversion.e acpversion.e: verinfogen verinfogen acpversion.e $(acpprogramname) $(version) usedate -bcd.m: bcd.e +bcd.m: bcd.e axobjects.m $(compiler) bcd $(options) -ftpd.m: ftpd.e tooltypes.m stringlist.m axobjects.m axenums.m miscfuncs.m +sha256.m: sha256.e + $(compiler) sha256 $(options) + +ftpd.m: ftpd.e tooltypes.m stringlist.m axobjects.m axenums.m miscfuncs.m bcd.m $(compiler) ftpd $(options) httpd.m: httpd.e axcommon.m stringlist.m $(compiler) httpd $(options) clean: - delete expversion.e acpversion.e delete express verinfogen express5 acp qwk ftn jsonimport icon2cfg miscfuncs.m stringlist.m errors.m mailssl.m jsoncreate.m jsonparser.m axcommon.m ftpd.m httpd.m axconsts.m axobjects.m axenums.m zmodem.m xymodem.m hydra.m bcd.m expversion.m acpversion.m pwdhash.m tooltypes.m + delete expversion.e acpversion.e delete express verinfogen express5 acp qwk ftn jsonimport icon2cfg miscfuncs.m stringlist.m errors.m mailssl.m jsoncreate.m jsonparser.m axcommon.m ftpd.m httpd.m axconsts.m axobjects.m axenums.m zmodem.m xymodem.m hydra.m bcd.m expversion.m acpversion.m pwdhash.m tooltypes.m sha256.m .PHONY: expversion.e \ No newline at end of file diff --git a/sha256.e b/sha256.e new file mode 100644 index 0000000..807f4ce --- /dev/null +++ b/sha256.e @@ -0,0 +1,353 @@ +OPT MODULE + +CONST SIZE_OF_SHA_256_HASH=32 +CONST SIZE_OF_SHA_256_CHUNK=64 +CONST TOTAL_LEN_LEN=8 + +OBJECT sha_256 + hash:PTR TO CHAR + chunk[SIZE_OF_SHA_256_CHUNK]: ARRAY OF CHAR + chunk_pos:PTR TO CHAR + space_left:LONG + total_len:LONG + h[8]:ARRAY OF LONG +ENDOBJECT + +/* + * Comments from pseudo-code at https://en.wikipedia.org/wiki/SHA-2 are reproduced here. + * When useful for clarification, portions of the pseudo-code are reproduced here too. + */ + +/* + * @brief Rotate a 32-bit value by a number of bits to the right. + * @param value The value to be rotated. + * @param count The number of bits to rotate by. + * @return The rotated value. + */ +PROC right_rot(value, count) + MOVE.L value,D0 + MOVE.L count,D1 + ROR.L D1,D0 +ENDPROC D0 + +/* + * @brief Update a hash value under calculation with a new chunk of data. + * @param h Pointer to the first hash item, of a total of eight. + * @param p Pointer to the chunk data, which has a standard length. + * + * @note This is the SHA-256 work horse. + */ +PROC consume_chunk(h:PTR TO LONG, p:PTR TO CHAR) + DEF i,j + DEF ah[8]:ARRAY OF LONG + DEF w[16]:ARRAY OF LONG + DEF s0,s1,ch + DEF k:PTR TO LONG + DEF temp1,temp2,maj + + /* Initialize working variables to current hash value: */ + FOR i:=0 TO 7 DO ah[i]:=h[i] + + /* + * The w-array is really w[64], but since we only need 16 of them at a time, we save stack by + * calculating 16 at a time. + * + * This optimization was not there initially and the rest of the comments about w[64] are kept in their + * initial state. + */ + + /* + * create a 64-entry message schedule array w[0..63] of 32-bit words (The initial values in w[0..63] + * don't matter, so many implementations zero them here) copy chunk into first 16 words w[0..15] of the + * message schedule array + */ + + /* Compression function main loop: */ + FOR i:=0 TO 3 + FOR j:=0 TO 15 + IF (i = 0) + w[j]:=Lsl(p[0],24) OR Lsl(p[1],16) OR Lsl(p[2],8) OR p[3] + p+=4 + ELSE + /* Extend the first 16 words into the remaining 48 words w[16..63] of the + * message schedule array: */ + s0:=Eor( + Eor( + right_rot(w[(j + 1) AND $f], 7), + right_rot(w[(j + 1) AND $f], 18)), + Lsr(w[(j + 1) AND $f],3)) + s1:=Eor + (Eor( + right_rot(w[(j + 14) AND $f], 17), + right_rot(w[(j + 14) AND $f], 19)), + Lsr(w[(j + 14) AND $f],10)) + w[j]:=w[j] + s0 + w[(j + 9) AND $f] + s1 + ENDIF + s1:=Eor(Eor(right_rot(ah[4], 6),right_rot(ah[4], 11)),right_rot(ah[4], 25)) + ch:=Eor((ah[4] AND ah[5]),(Not(ah[4]) AND ah[6])) + + /* + * Initialize array of round constants: + * (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311): + */ + k:={kdata} + + temp1:=ah[7] + s1 + ch + k[Lsl(i,4) OR j] + w[j] + s0:= Eor(Eor(right_rot(ah[0], 2),right_rot(ah[0], 13)),right_rot(ah[0], 22)) + maj:= Eor(Eor(ah[0] AND ah[1],ah[0] AND ah[2]),ah[1] AND ah[2]) + temp2:=s0+maj + + ah[7]:=ah[6] + ah[6]:=ah[5] + ah[5]:=ah[4] + ah[4]:=ah[3]+temp1 + ah[3]:=ah[2] + ah[2]:=ah[1] + ah[1]:=ah[0] + ah[0]:=temp1+temp2 + ENDFOR + ENDFOR + + /* Add the compressed chunk to the current hash value: */ + FOR i:=0 TO 7 DO h[i]:=h[i]+ah[i] +ENDPROC + +/* + * Public functions. See header file for documentation. + */ + +PROC sha_256_init(sha_256:PTR TO sha_256, hash:PTR TO CHAR) + sha_256.hash:=hash + sha_256.chunk_pos:=sha_256.chunk + sha_256.space_left:=SIZE_OF_SHA_256_CHUNK + sha_256.total_len:=0 + + /* + * Initialize hash values (first 32 bits of the fractional parts of the square roots of the first 8 primes + * 2..19): + */ + sha_256.h[0]:=$6a09e667 + sha_256.h[1]:=$bb67ae85 + sha_256.h[2]:=$3c6ef372 + sha_256.h[3]:=$a54ff53a + sha_256.h[4]:=$510e527f + sha_256.h[5]:=$9b05688c + sha_256.h[6]:=$1f83d9ab + sha_256.h[7]:=$5be0cd19 +ENDPROC + +PROC sha_256_write(sha_256:PTR TO sha_256, data,len) + DEF p + DEF consumed_len + p:=data + sha_256.total_len:=sha_256.total_len+len + + WHILE (len > 0) + /* + * If the input chunks have sizes that are multiples of the calculation chunk size, no copies are + * necessary. We operate directly on the input data instead. + */ + IF ((sha_256.space_left = SIZE_OF_SHA_256_CHUNK) AND (len >= SIZE_OF_SHA_256_CHUNK)) + consume_chunk(sha_256.h, p) + len -= SIZE_OF_SHA_256_CHUNK + p += SIZE_OF_SHA_256_CHUNK + CONT TRUE + ENDIF + /* General case, no particular optimization. */ + consumed_len:=IF (len < sha_256.space_left) THEN len ELSE sha_256.space_left + CopyMem(p, sha_256.chunk_pos, consumed_len) + sha_256.space_left -= consumed_len + len -= consumed_len + p += consumed_len + IF (sha_256.space_left = 0) + consume_chunk(sha_256.h, sha_256.chunk) + sha_256.chunk_pos:=sha_256.chunk + sha_256.space_left:=SIZE_OF_SHA_256_CHUNK + ELSE + sha_256.chunk_pos:=sha_256.chunk_pos+consumed_len + ENDIF + ENDWHILE +ENDPROC + +PROC sha_256_close(sha_256:PTR TO sha_256) + + DEF pos:PTR TO CHAR + DEF space_left + DEF h:PTR TO LONG + DEF left,len,i,hash:PTR TO LONG + pos:=sha_256.chunk_pos + space_left:=sha_256.space_left + h:=sha_256.h + /* + * The current chunk cannot be full. Otherwise, it would already have be consumed. I.e. there is space left for + * at least one byte. The next step in the calculation is to add a single one-bit to the data. + */ + pos[]++:=$80 + space_left-- + + /* + * Now, the last step is to add the total data length at the end of the last chunk, and zero padding before + * that. But we do not necessarily have enough space left. If not, we pad the current chunk with zeroes, and add + * an extra chunk at the end. + */ + IF (space_left < TOTAL_LEN_LEN) + MemFill(pos,space_left,0) + consume_chunk(h, sha_256.chunk) + pos:=sha_256.chunk + space_left:=SIZE_OF_SHA_256_CHUNK + ENDIF + left:=space_left - TOTAL_LEN_LEN + MemFill(pos,left,0) + pos+= left + len:=sha_256.total_len + pos[7]:=Lsl(len,3) + len:=Lsr(len,5) + FOR i:=6 TO 0 STEP -1 + pos[i]:=len + len:=Lsr(len,8) + ENDFOR + consume_chunk(h, sha_256.chunk) + /* Produce the final hash value (big-endian): */ + hash:=sha_256.hash + FOR i:=0 TO 7 + hash[i]:=h[i] + ENDFOR + +ENDPROC sha_256.hash + +EXPORT PROC calc_sha_256(hash:PTR TO CHAR, input, len) + DEF sha_256:PTR TO sha_256 + + NEW sha_256 + sha_256_init(sha_256, hash) + sha_256_write(sha_256, input, len) + sha_256_close(sha_256) + END sha_256 +ENDPROC + +kdata: LONG $428a2f98, $71374491, $b5c0fbcf, $e9b5dba5, $3956c25b, $59f111f1, $923f82a4, + $ab1c5ed5, $d807aa98, $12835b01, $243185be, $550c7dc3, $72be5d74, $80deb1fe, + $9bdc06a7, $c19bf174, $e49b69c1, $efbe4786, $0fc19dc6, $240ca1cc, $2de92c6f, + $4a7484aa, $5cb0a9dc, $76f988da, $983e5152, $a831c66d, $b00327c8, $bf597fc7, + $c6e00bf3, $d5a79147, $06ca6351, $14292967, $27b70a85, $2e1b2138, $4d2c6dfc, + $53380d13, $650a7354, $766a0abb, $81c2c92e, $92722c85, $a2bfe8a1, $a81a664b, + $c24b8b70, $c76c51a3, $d192e819, $d6990624, $f40e3585, $106aa070, $19a4c116, + $1e376c08, $2748774c, $34b0bcb5, $391c0cb3, $4ed8aa4a, $5b9cca4f, $682e6ff3, + $748f82ee, $78a5636f, $84c87814, $8cc70208, $90befffa, $a4506ceb, $bef9a3f7, + $c67178f2 + +/* $OpenBSD: pkcs5_pbkdf2.c,v 1.11 2019/11/21 16:07:24 tedu Exp $ */ + +/*- + * Copyright (c) 2008 Damien Bergamini + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * HMAC-SHA-1 (from RFC 2202). + */ +PROC hmac_sha1(text:PTR TO CHAR, text_len, key:PTR TO CHAR, key_len, digest:PTR TO CHAR) + DEF k_pad:PTR TO CHAR + DEF tk[SIZE_OF_SHA_256_HASH]:ARRAY OF CHAR + DEF i + + k_pad:=New(SIZE_OF_SHA_256_CHUNK+text_len) + + IF (key_len > SIZE_OF_SHA_256_CHUNK) + calc_sha_256(tk,key, key_len) + key:=tk + key_len:=SIZE_OF_SHA_256_HASH + ENDIF + + CopyMem(key,k_pad, key_len) + CopyMem(text,k_pad+SIZE_OF_SHA_256_CHUNK, text_len) + FOR i:=0 TO SIZE_OF_SHA_256_CHUNK-1 DO k_pad[i]:=Eor(k_pad[i],$36) + + calc_sha_256(digest,k_pad, SIZE_OF_SHA_256_CHUNK+text_len) + Dispose(k_pad) + + k_pad:=New(SIZE_OF_SHA_256_CHUNK+SIZE_OF_SHA_256_HASH) + CopyMem(key,k_pad,key_len) + CopyMem(digest, k_pad+SIZE_OF_SHA_256_CHUNK, SIZE_OF_SHA_256_HASH) + + FOR i:=0 TO SIZE_OF_SHA_256_CHUNK-1 DO k_pad[i]:=Eor(k_pad[i],$5c) + + calc_sha_256(digest,k_pad, SIZE_OF_SHA_256_CHUNK+SIZE_OF_SHA_256_HASH) + Dispose(k_pad) +ENDPROC + +/* + * Password-Based Key Derivation Function 2 (PKCS #5 v2.0). + * Code based on IEEE Std 802.11-2007, Annex H.4.2. + */ +EXPORT PROC pkcs5_pbkdf2(pass:PTR TO CHAR, pass_len, salt:PTR TO CHAR, salt_len, key:PTR TO CHAR, key_len, rounds) + DEF asalt:PTR TO CHAR + DEF obuf[SIZE_OF_SHA_256_HASH]:ARRAY OF CHAR + DEF d1[SIZE_OF_SHA_256_HASH]: ARRAY OF CHAR + DEF d2[SIZE_OF_SHA_256_HASH]:ARRAY OF CHAR + DEF i,j,count,r + + IF ((rounds < 1) OR (key_len = 0)) THEN JUMP bad + + IF ((salt_len = 0) OR (salt_len > ($7fffffff - 4))) THEN JUMP bad + + IF ((asalt:=New(salt_len + 4))=0) THEN JUMP bad + + CopyMem(salt, asalt, salt_len) + + count:=0 + WHILE(key_len>0) + count++ + asalt[salt_len]:=Shr(count,24) + asalt[salt_len+1]:=Shr(count,16) + asalt[salt_len+2]:=Shr(count,8) + asalt[salt_len+3]:=count AND 255 + + hmac_sha1(asalt, salt_len + 4, pass, pass_len, d1) + CopyMem(d1,obuf,SIZE_OF_SHA_256_HASH) + + FOR i:=1 TO rounds-1 + hmac_sha1(d1, SIZE_OF_SHA_256_HASH, pass, pass_len, d2) + CopyMem(d2,d1,SIZE_OF_SHA_256_HASH) + FOR j:=0 TO SIZE_OF_SHA_256_HASH-1 + obuf[j]:=Eor(obuf[j],d1[j]) + ENDFOR + ENDFOR + + IF key_len < SIZE_OF_SHA_256_HASH THEN r:=key_len ELSE r:=SIZE_OF_SHA_256_HASH + CopyMem(obuf,key,r) + key+=r + key_len-=r + ENDWHILE + + MemFill(asalt,salt_len + 4,0) + Dispose(asalt) + + MemFill(d1,SIZE_OF_SHA_256_HASH,0) + MemFill(d2,SIZE_OF_SHA_256_HASH,0) + MemFill(obuf,SIZE_OF_SHA_256_HASH,0) + + RETURN 0 + +bad: + /* overwrite with 0 in case caller doesn't check return code */ + MemFill(key,key_len,0) +ENDPROC -1 + +EXPORT PROC calcPasswordSalt(s:PTR TO CHAR) + DEF i + FOR i:=0 TO 7 + s[i]:=Rnd(95)+32 + ENDFOR +ENDPROC diff --git a/zmodem.e b/zmodem.e index 1701e57..c777e85 100644 --- a/zmodem.e +++ b/zmodem.e @@ -468,7 +468,6 @@ EXPORT OBJECT zmodem_t block_size:LONG max_block_size:LONG max_file_size:LONG /* 0 = unlimited */ - log_level:PTR TO INT user_data:LONG /* Callbacks */ @@ -528,10 +527,6 @@ ENDPROC Not(crc) PROC lprintf(zm:PTR TO zmodem_t, level, str:PTR TO CHAR) DEF p IF(zm.zm_lputs=NIL) THEN RETURN -1 - - IF(zm.log_level<>NIL) - IF(level > zm.log_level) THEN RETURN 0 - ENDIF p:=zm.zm_lputs ENDPROC p(level,str) @@ -1415,7 +1410,7 @@ PROC zmodem_recv_data32(zm: PTR TO zmodem_t, p: PTR TO CHAR, maxlen, l: PTR TO L n++ ENDLOOP l[]:=l[]+n - + subpkt_type:=c AND $ff crc:=ucrc32(subpkt_type,crc)