From 486c01f2f16ebebc1cbaca4a895a8699f6220dda Mon Sep 17 00:00:00 2001 From: mysticbbs Date: Sun, 22 Sep 2013 01:32:42 -0400 Subject: [PATCH] FTP mailer --- mystic/README.txt | 84 +++++++++++++++--- mystic/bbs_cfg_echomail.pas | 21 ++++- mystic/fidopoll.pas | 155 +++++++++++++++++++++++++++++++-- mystic/mis_client_binkp.pas | 132 ++++++++++++++-------------- mystic/mis_client_ftp.pas | 3 + mystic/mutil_echoimport.pas | 3 + mystic/mutil_importmsgbase.pas | 3 + mystic/mutil_importna.pas | 9 ++ mystic/mystic.pas | 2 +- mystic/qwkpoll.pas | 2 +- mystic/records.pas | 2 +- mystic/whatsnew.txt | 12 +++ 12 files changed, 340 insertions(+), 88 deletions(-) diff --git a/mystic/README.txt b/mystic/README.txt index 2161d42..3974885 100644 --- a/mystic/README.txt +++ b/mystic/README.txt @@ -1,22 +1,86 @@ +======== + ABOUT +======== + This archive contains the source code for Mystic BBS software. Mystic BBS is Copyright 1997-Current year by James Coyle. -Mystic BBS is currently compiled exclusively using Free Pascal -compiler (www.freepascal.org) the current release being 2.6.0. - Mystic BBS is released under GPL Version 3 licensing which is included in the archive. An information header is prefixed on each source file that compiles to an executable. -Current build options used with Free Pascal are as follows: +========================= + COMPILING MYSTIC BBS +========================= -fpc -CX -XX -Xs -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -WN +Mystic BBS is currently compiled exclusively using Free Pascal +compiler (www.freepascal.org) the recommended release being 2.6.2. -(-WN is specific to Windows so it should be omitted on other platforms) +Current build options used with Free Pascal are below, contained in example +build.bat and build.sh (for Windows and Linux respectively). These use the +current recommend compiler options along with Free Pascal's Whole Program +Optimization. Each file is called as "build " so: -Mystic BBS is compiled to require a Pentium 3 or better processor (SSE instruction set) which -means that it should run on any computer built in the late 90s up to current day. + Windows: build mystic <- Compiles mystic.exe + Linux: sh build.sh mystic <- Compiles mystic binary + +========================= + BUILD.BAT (WINDOWS) +========================= + +@echo off + +REM Purpose: Compile an EXE using whole program optimization +REM +REM To use this, change the \dev\mdl to point to the path where Mystic's MDL +REM source code is found. If you compile with ALL code in the same folder, then +REM change this to your folder where all source code is located. This build.bat +REM is intended to be ran from the same directory as Mystic's source code. +REM + +SET MDLPATH=d:\dev\mdl + +del *.wpo + +fpc -Fi%MDLPATH% -Fu%MDLPATH% -CX -XX -Xs- -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -WN -FW%1-1.wpo -OWall %1 +fpc -Fi%MDLPATH% -Fu%MDLPATH% -CX -XX -Xs- -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -WN -Fw%1-1.wpo -FW%1-2.wpo -OWall -Owall %1 +fpc -Fi%MDLPATH% -Fu%MDLPATH% -CX -XX -Xs -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -WN -Fw%1-2.wpo -Owall %1 + +============================= + BUILD.SH (LINUX 32-BIT) +============================= + +# Purpose: Compile an executable using whole program optimization +# +# To use this, change the /mystic variable below to the path where Mystic's MDL +# soure code is found. If you compile with ALL code in the same folder, then +# change this to your folder where all the source code is located. This build +# script is intended to be ran from the same directory as Mystic's source code. + +export MDLPATH=/mystic + +rm *.wpo + +fpc -Fi$MDLPATH -Fu$MDLPATH -CX -XX -Xs- -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -FW$1-1.wpo -OWall $1 +fpc -Fi$MDLPATH -Fu$MDLPATH -CX -XX -Xs- -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -Fw$1-1.wpo -FW$1-2.wpo -OWall -Owall $1 +fpc -Fi$MDLPATH -Fu$MDLPATH -CX -XX -Xs -O3 -B -OpPENTIUM3 -OoREGVAR -OoSTACKFRAME -OoPEEPHOLE -OoASMCSE -Fw$1-2.wpo -Owall $1 + +=========================== + AUTOMATED COMPILATION +=========================== + +While a specific automated compilation script is not provided in this README, the +contents should provide enough to make this happen. The basic structure would be: + + ! CREATE A BACKUP OF YOUR CURRENT MYSTIC SYSTEM + 1. Call GIT to synch against the latest repository for the latest source code + 2. Call BUILD script for each of the Mystic executables + 3. Copy newly compiled Mystic executables to appropriate location in Mystic folder + +============================ + ADDITIONAL INFORMATION +============================ Mystic BBS project can be found at mysticbbs.sourceforge.net @@ -27,10 +91,8 @@ encouraged that fixes and additions be coordinated with the current authors. !!! WARNING!!! -The current code here reflects the latest 1.10 alphas and is not yet compatible with 1.09. +The current code here reflects the latest 1.10 alphas and is not compatible with 1.09. With the 1.10 final/stable release we will be officially annoucing Mystic as a GPL program and at that time we will branch off to a current stable and development code base as well as release an upgrade package to get everyone on the same page with both binary and source distributions. - -If you are not running at least 1.10 Alpha 15 than this code will not run for you. diff --git a/mystic/bbs_cfg_echomail.pas b/mystic/bbs_cfg_echomail.pas index c1f3788..6f7b464 100644 --- a/mystic/bbs_cfg_echomail.pas +++ b/mystic/bbs_cfg_echomail.pas @@ -159,8 +159,27 @@ Begin Box.Close; End; + 1 : Begin + Box.Header := ' FTP '; + + Box.Open (15, 7, 65, 16); + + VerticalLine (32, 9, 14); + + Form.AddStr ('H', ' Hostname' , 22, 9, 34, 9, 10, 30, 60, @Node.ftpOutHost, Topic); + Form.AddStr ('L', ' Login' , 25, 10, 34, 10, 7, 20, 20, @Node.ftpOutLogin, Topic); + Form.AddMask ('P', ' Password' , 22, 11, 34, 11, 10, 20, 20, @Node.ftpOutPass, Topic); + Form.AddBol ('A', ' Passive' , 23, 12, 34, 12, 9, 3, @Node.ftpPassive, Topic); + Form.AddStr ('O', ' Out Directory', 17, 13, 34, 13, 15, 30, 60, @Node.ftpOutDir, Topic); + Form.AddStr ('I', ' In Directory' , 18, 14, 34, 14, 14, 30, 60, @Node.ftpInDir, Topic); + + Form.Execute; + + Box.Close; + + End; 2 : Begin - Box.Header := ' DIRECTORY '; + Box.Header := ' Directory '; Box.Open (15, 8, 64, 13); diff --git a/mystic/fidopoll.pas b/mystic/fidopoll.pas index f827a5a..e0ab84b 100644 --- a/mystic/fidopoll.pas +++ b/mystic/fidopoll.pas @@ -1,5 +1,26 @@ Program FidoPoll; +// ==================================================================== +// Mystic BBS Software Copyright 1997-2013 By James Coyle +// ==================================================================== +// +// This file is part of Mystic BBS. +// +// Mystic BBS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Mystic BBS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Mystic BBS. If not, see . +// +// ==================================================================== + {$I M_OPS.PAS} Uses @@ -10,6 +31,7 @@ Uses m_Strings, m_IO_Sockets, m_Protocol_Queue, + m_tcp_Client_FTP, BBS_Records, BBS_DataBase, MIS_Client_BINKP; @@ -42,26 +64,146 @@ Begin End; End; -Function PollNodeDirectory (OnlyNew: Boolean; Var Queue: TProtocolQueue; Var EchoNode: RecEchoMailNode) : Boolean; +Function FindBundleName (Str: String) : String; +Var + FN : String; + Ext : String; + Last : Byte; Begin - Result := False; + FN := JustFileName(Str); + Ext := strLower(JustFileExt(Str)); + + Last := Byte(Ext[Length(Ext)]); + + If Not (Last in [48..57, 97..122]) Then Last := 48; + + Repeat + Result := FN + '.' + Ext; + Result[Length(Result)] := Char(Last); + + If Not FileExist(Result) Then Break; + + Inc (Last); + + If Last = 58 Then Last := 97; + If Last = 123 Then Exit; // no 0-9,a-z could be generated + Until False; End; Function PollNodeFTP (OnlyNew: Boolean; Var Queue: TProtocolQueue; Var EchoNode: RecEchoMailNode) : Boolean; +Var + FTP : TFTPClient; + Count : LongInt; Begin Result := False; Queue.Clear; - PrintStatus(NIL, 1, 'Scanning ' + Addr2Str(EchoNode.Address)); + PrintStatus (NIL, 1, 'Scanning ' + Addr2Str(EchoNode.Address)); QueueByNode (Queue, True, EchoNode); + PrintStatus (NIL, 1, 'Queued ' + strI2S(Queue.QSize) + ' files (' + strI2S(Queue.QFSize) + ' bytes) to ' + Addr2Str(EchoNode.Address)); + + If OnlyNew and (Queue.QSize = 0) Then Exit; + + PrintStatus (NIL, 1, 'Polling FTP node ' + Addr2Str(EchoNode.Address)); + + FTP := TFTPClient.Create(bbsCfg.iNetInterface); + + If FTP.OpenConnection(EchoNode.ftpOutHost) Then Begin + PrintStatus (NIL, 1, 'Connected'); + + If FTP.Authenticate(EchoNode.ftpOutLogin, EchoNode.ftpOutPass) Then Begin + If FTP.GetDirectoryList(EchoNode.ftpPassive, True, EchoNode.ftpInDir) Then Begin + For Count := 1 to FTP.ResponseData.Count Do Begin + PrintStatus (NIL, 1, 'Receiving ' + FTP.ResponseData.Strings[Count - 1]); + + If FTP.GetFile (EchoNode.ftpPassive, bbsCfg.InboundPath + FTP.ResponseData.Strings[Count - 1]) = ftpResOK Then Begin + If FTP.SendCommand('DELE ' + FTP.ResponseData.Strings[Count - 1]) <> 250 Then + FileErase(bbsCfg.InboundPath + FTP.ResponseData.Strings[Count - 1]) + Else + PrintStatus (NIL, 1, 'Unable to delete from server ' + FTP.ResponseData.Strings[Count - 1]); + End Else + PrintStatus (NIL, 1, 'Failed'); + End; + End Else + PrintStatus (NIL, 1, 'Unable to list ' + EchoNode.ftpInDir); + + If Queue.QSize > 0 Then Begin + If FTP.ChangeDirectory(EchoNode.ftpOutDir) Then Begin + For Count := 1 to Queue.QSize Do Begin + PrintStatus (NIL, 1, 'Sending ' + Queue.QData[Count]^.FileNew); + + If FTP.SendFile(EchoNode.ftpPassive, Queue.QData[Count]^.FilePath + Queue.QData[Count]^.FileName, Queue.QData[Count]^.FileNew) = ftpResOK Then Begin + FileErase (Queue.QData[Count]^.FilePath + Queue.QData[Count]^.FileName); + RemoveFilesFromFLO (GetFTNOutPath(EchoNode), TempPath, Queue.QData[Count]^.FilePath + Queue.QData[Count]^.FileName); + End Else + PrintStatus (NIL, 1, 'Failed'); + End; + End Else + PrintStatus (NIL, 1, 'Unable to change to ' + echoNode.ftpOutDir); + End; + End Else + PrintStatus (NIL, 1, 'Unable to authenticate'); + End Else + PrintStatus (NIL, 1, 'Unable to connect'); + + PrintStatus (NIL, 1, 'Session complete'); + + FTP.Free; +End; + +Function PollNodeDirectory (OnlyNew: Boolean; Var Queue: TProtocolQueue; Var EchoNode: RecEchoMailNode) : Boolean; +Var + Count : LongInt; + DirInfo : SearchRec; + PKTName : String; + NewName : String; + OutPath : String; +Begin + Result := False; + + Queue.Clear; + + PrintStatus (NIL, 1, 'Scanning ' + Addr2Str(EchoNode.Address)); + + QueueByNode (Queue, False, EchoNode); + PrintStatus(NIL, 1, 'Queued ' + strI2S(Queue.QSize) + ' files (' + strI2S(Queue.QFSize) + ' bytes) to ' + Addr2Str(EchoNode.Address)); If OnlyNew and (Queue.QSize = 0) Then Exit; - PrintStatus(NIL, 1, 'Polling FTP node ' + Addr2Str(EchoNode.Address)); + PrintStatus(NIL, 1, 'Polling DIRECTORY node ' + Addr2Str(EchoNode.Address)); + + OutPath := GetFTNOutPath(EchoNode); + + For Count := 1 to Queue.QSize Do Begin + PKTName := Queue.QData[Count]^.FilePath + Queue.QData[Count]^.FileName; + NewName := FindBundleName(EchoNode.DirInDir + Queue.QData[Count]^.FileNew); + + PrintStatus (NIL, 1, 'Move ' + PKTName + ' to ' + NewName); + + If (Not FileExist(NewName)) And FileReName(PKTName, NewName) Then + RemoveFilesFromFLO (OutPath, TempPath, PKTName) + Else + PrintStatus (NIL, 1, 'Failed to move to ' + NewName); + End; + + FindFirst (EchoNode.DirOutDir + '*', AnyFile, DirInfo); + + While DosError = 0 Do Begin + If DirInfo.Attr And Directory = 0 Then Begin + PrintStatus (NIL, 1, 'Move ' + EchoNode.DirOutDir + DirInfo.Name + ' to ' + bbsCfg.InboundPath); + + If (Not FileExist(bbsCfg.InboundPath + DirInfo.Name)) and (Not FileReName(EchoNode.DirOutDir + DirInfo.Name, bbsCfg.InboundPath + DirInfo.Name)) Then + PrintStatus (NIL, 1, 'Failed to move to ' + EchoNode.DirOutDir + DirInfo.Name); + End; + + FindNext (DirInfo); + End; + + FindClose (DirInfo); End; Function PollNodeBINKP (OnlyNew: Boolean; Var Queue: TProtocolQueue; Var EchoNode: RecEchoMailNode) : Boolean; @@ -220,9 +362,8 @@ Begin End; If ParamCount = 0 Then Begin - WriteLn ('This will likely be a temporary program which will be fused into'); - WriteLn ('either MIS or MUTIL in the future (or both). Note only BINKP is'); - WriteLn ('currently supported. FTN via FTP may be included in the future'); + WriteLn ('This program will send and retreive echomail packets for configured'); + WriteLn ('echomail nodes using any of BINKP, FTP, or Directory-based transmission'); WriteLn; WriteLn ('FIDOPOLL SEND - Only send/poll if node has new outbound messages'); WriteLn ('FIDOPOLL FORCED - Poll/send to all configured/activenodes'); diff --git a/mystic/mis_client_binkp.pas b/mystic/mis_client_binkp.pas index 2569600..d2b462a 100644 --- a/mystic/mis_client_binkp.pas +++ b/mystic/mis_client_binkp.pas @@ -122,7 +122,6 @@ Type Constructor Create (O: Pointer; Var C: TIOSocket; Var FL: TProtocolQueue; IsCli: Boolean; TOV: Word); Destructor Destroy; Override; - Procedure RemoveFilesFromFLO (FN: String); Function AuthenticateNode (AddrList: String) : Boolean; Function EscapeFileName (Str: String) : String; Function RestoreFileName (Str: String) : String; @@ -138,8 +137,10 @@ Function CreateBINKP (Owner: TServerManager; Config: RecConfig; ND: TNodeData; C // these need to be moved to a generic area -Function GetFTNOutPath (EchoNode: RecEchoMailNode) : String; -Procedure QueueByNode (Var Queue: TProtocolQueue; SkipHold: Boolean; EchoNode: RecEchoMailNode); +Function GetFTNFlowName (Dest: RecEchoMailAddr) : String; +Function GetFTNOutPath (EchoNode: RecEchoMailNode) : String; +Procedure QueueByNode (Var Queue: TProtocolQueue; SkipHold: Boolean; EchoNode: RecEchoMailNode); +Procedure RemoveFilesFromFLO (OutPath, TP, FN: String); Type TBINKPServer = Class(TServerClient) @@ -273,66 +274,6 @@ Begin Close (EchoFile); End; -Procedure TBinkP.RemoveFilesFromFLO (FN: String); -Var - Str : String; - DirInfo : SearchRec; - OrigFile : Text; - NewFile : Text; - Matched : Boolean; -Begin - // Scan all FLO files in outbound directory, and PRUNE them all. - - // possible issue if multiple BINKP connections are going. we need - // to revamp this to perform appropriate file locking and waiting. - // also should be moved to mis_common since FTN-FTP will also perform - // the same procedure. - // could also perform a critical section as a cheesy way to do this? - - FindFirst (SetOutPath + '*.?lo', AnyFile, DirInfo); - - While DosError = 0 Do Begin - FileRename (SetOutPath + DirInfo.Name, TempPath + DirInfo.Name); - - Assign (NewFile, SetOutPath + DirInfo.Name); - ReWrite (NewFile); - Append (NewFile); - - Assign (OrigFile, TempPath + DirInfo.Name); - Reset (OrigFile); - - While Not Eof (OrigFile) Do Begin - ReadLn (OrigFile, Str); - - If (Str = '') or (Str[1] = '!') Then - WriteLn (NewFile, Str) - Else Begin - Case Str[1] of - '~', - '#', - '^' : Matched := strUpper(FN) = strUpper(Copy(Str, 2, 255)); - Else - Matched := (strUpper(FN) = strUpper(Str)); - End; - - If Not Matched Then - WriteLn (NewFile, Str); - End; - End; - - Close (NewFile); - Close (OrigFile); - Erase (OrigFile); - - If FileByteSize(SetOutPath + DirInfo.Name) = 0 Then - FileErase(SetOutPath + DirInfo.Name); - - FindNext (DirInfo); - End; - - FindClose (DirInfo); -End; - Function TBinkP.GetDataStr : String; Var SZ : Byte; @@ -725,7 +666,7 @@ Begin FileList.QData[FileList.QPos]^.Status := QueueSuccess; FileErase (FileList.QData[FileList.QPos]^.FilePath + FileList.QData[FileList.QPos]^.FileName); - RemoveFilesFromFLO (FileList.QData[FileList.QPos]^.FilePath + FileList.QData[FileList.QPos]^.FileName); + RemoveFilesFromFLO (SetOutPath, TempPath, FileList.QData[FileList.QPos]^.FilePath + FileList.QData[FileList.QPos]^.FileName); HaveHeader := False; NeedHeader := True; @@ -832,6 +773,65 @@ Begin; Result := Result + strI2H((EchoNode.Address.Net SHL 16) OR EchoNode.Address.Node, 8) + '.pnt' + PathChar; End; +Procedure RemoveFilesFromFLO (OutPath, TP, FN: String); +Var + Str : String; + DirInfo : SearchRec; + OrigFile : Text; + NewFile : Text; + Matched : Boolean; +Begin + // Scan all FLO files in outbound directory, and PRUNE them all. + + // This should probably be changed to honor and create BSY files and + // instead of pruning ALL FLO files it should prune a single file. + // Need to review the code and figure out why I did it this way to + // begin with. + + FindFirst (OutPath + '*.?lo', AnyFile, DirInfo); + + While DosError = 0 Do Begin + FileRename (OutPath + DirInfo.Name, TP + DirInfo.Name); + + Assign (NewFile, OutPath + DirInfo.Name); + ReWrite (NewFile); + Append (NewFile); + + Assign (OrigFile, TP + DirInfo.Name); + Reset (OrigFile); + + While Not Eof (OrigFile) Do Begin + ReadLn (OrigFile, Str); + + If (Str = '') or (Str[1] = '!') Then + WriteLn (NewFile, Str) + Else Begin + Case Str[1] of + '~', + '#', + '^' : Matched := strUpper(FN) = strUpper(Copy(Str, 2, 255)); + Else + Matched := (strUpper(FN) = strUpper(Str)); + End; + + If Not Matched Then + WriteLn (NewFile, Str); + End; + End; + + Close (NewFile); + Close (OrigFile); + Erase (OrigFile); + + If FileByteSize(OutPath + DirInfo.Name) = 0 Then + FileErase(OutPath + DirInfo.Name); + + FindNext (DirInfo); + End; + + FindClose (DirInfo); +End; + Procedure QueueByNode (Var Queue: TProtocolQueue; SkipHold: Boolean; EchoNode: RecEchoMailNode); Var DirInfo : SearchRec; @@ -855,7 +855,7 @@ Begin Continue; End; - If Not ((strUpper(JustFileName(DirInfo.Name)) = strUpper(GetFTNFlowName(EchoNode.Address))) and EchoNode.Active and (EchoNode.ProtType = 0)) Then Begin + If Not ((strUpper(JustFileName(DirInfo.Name)) = strUpper(GetFTNFlowName(EchoNode.Address))) and EchoNode.Active) Then Begin FindNext (DirInfo); Continue; @@ -895,7 +895,7 @@ Begin Continue; End; - If Not ((strUpper(JustFileName(DirInfo.Name)) = strUpper(GetFTNFlowName(EchoNode.Address))) and EchoNode.Active and (EchoNode.ProtType = 0)) Then Begin + If Not ((strUpper(JustFileName(DirInfo.Name)) = strUpper(GetFTNFlowName(EchoNode.Address))) and EchoNode.Active) Then Begin FindNext (DirInfo); Continue; diff --git a/mystic/mis_client_ftp.pas b/mystic/mis_client_ftp.pas index 8c138ee..00ff9e0 100644 --- a/mystic/mis_client_ftp.pas +++ b/mystic/mis_client_ftp.pas @@ -736,6 +736,9 @@ Begin OpenDataSession; + // if qwlbyFTP.acs then + DataSocket.WriteLine(bbsCfg.QwkBBSID + '.qwk'); + DirFile := TFileBuffer.Create(FileBufSize); If DirFile.OpenStream (bbsCfg.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin diff --git a/mystic/mutil_echoimport.pas b/mystic/mutil_echoimport.pas index 179930a..89affc7 100644 --- a/mystic/mutil_echoimport.pas +++ b/mystic/mutil_echoimport.pas @@ -206,6 +206,9 @@ Var MBase.DefQScan := INI.ReadInteger(Header_ECHOIMPORT, 'qwk_scan', 1); MBase.NetAddr := 1; + MBase.FileName := strReplace(MBase.FileName, '/', '_'); + MBase.FileName := strReplace(MBase.FileName, '\', '_'); + For Count := 1 to 30 Do If bbsCfg.NetAddress[Count].Zone = PKT.PKTHeader.DestZone Then Begin MBase.NetAddr := Count; diff --git a/mystic/mutil_importmsgbase.pas b/mystic/mutil_importmsgbase.pas index 6df7b0e..dd9279a 100644 --- a/mystic/mutil_importmsgbase.pas +++ b/mystic/mutil_importmsgbase.pas @@ -70,6 +70,9 @@ Begin MBase.DefQScan := INI.ReadInteger(Header_IMPORTMB, 'qwk_scan', 1); MBase.NetAddr := 1; + MBase.FileName := strReplace(MBase.FileName, '/', '_'); + MBase.FileName := strReplace(MBase.FileName, '\', '_'); + For Count := 1 to 30 Do If strAddr2Str(bbsCfg.NetAddress[Count]) = INI.ReadString(Header_IMPORTNA, 'netaddress', '') Then Begin MBase.NetAddr := Count; diff --git a/mystic/mutil_importna.pas b/mystic/mutil_importna.pas index 4df886b..3ddc292 100644 --- a/mystic/mutil_importna.pas +++ b/mystic/mutil_importna.pas @@ -51,6 +51,12 @@ Begin TagName := strStripLow(strWordGet(1, Str, ' ')); BaseName := strStripLow(strStripB(Copy(Str, Pos(' ', Str), 255), ' ')); +// TagName := strReplace(TagName, '/', '_'); +// TagName := strReplace(TagName, '\', '_'); + +// If Pos(TagName, '/') > 0 Then Continue; +// If Pos(TagName, '\') > 0 Then Continue; + ProcessStatus (BaseName, False); If Not IsDupeMBase(TagName) Then Begin @@ -86,6 +92,9 @@ Begin MBase.DefQScan := strS2I(INI.ReadString(Header_IMPORTNA, 'qwk_scan', '1')); MBase.NetAddr := 1; + MBase.FileName := strReplace(MBase.FileName, '/', '_'); + MBase.FileName := strReplace(MBase.FileName, '\', '_'); + For Count := 1 to 30 Do If strAddr2Str(bbsCfg.NetAddress[Count]) = INI.ReadString(Header_IMPORTNA, 'netaddress', '') Then Begin MBase.NetAddr := Count; diff --git a/mystic/mystic.pas b/mystic/mystic.pas index 27735dd..aab7d48 100644 --- a/mystic/mystic.pas +++ b/mystic/mystic.pas @@ -282,7 +282,7 @@ Begin Assign (Session.ThemeFile, bbsCfg.DataPath + 'theme.dat'); {$I-} Reset (Session.ThemeFile); {$I+} If IoResult <> 0 Then Begin - Console.WriteLine ('ERROR: No theme configuration.'); + Console.WriteLine ('ERROR: No theme configuration'); DisposeClasses; Halt(1); End; diff --git a/mystic/qwkpoll.pas b/mystic/qwkpoll.pas index 9d950fb..f4bbbf2 100644 --- a/mystic/qwkpoll.pas +++ b/mystic/qwkpoll.pas @@ -61,7 +61,7 @@ Begin If QWK.TotalMessages > 0 Then Begin WriteLn (' - Sending reply packet'); - Case FTP.SendFile(QwkNet.UsePassive, TempPath + QwkNet.PacketID + '.rep') of + Case FTP.SendFile(QwkNet.UsePassive, TempPath + QwkNet.PacketID + '.rep', QwkNet.PacketID) of ftpResOK : SentFile := True; ftpResBadData : WriteLn (' - Unable to open data connection'); Else diff --git a/mystic/records.pas b/mystic/records.pas index b4878bd..3f2cd23 100644 --- a/mystic/records.pas +++ b/mystic/records.pas @@ -108,7 +108,7 @@ Type ArcType : String[4]; MailType : Byte; // 0=BINKP,1=FTP,2=Dir binkHost : String[60]; - UNUSED1 : Byte; + ftpPassive : Boolean; ProtType : Byte; binkTimeout : Word; binkBlock : Word; diff --git a/mystic/whatsnew.txt b/mystic/whatsnew.txt index 9bdcf3f..d8c15f5 100644 --- a/mystic/whatsnew.txt +++ b/mystic/whatsnew.txt @@ -3815,4 +3815,16 @@ ! Netmail messages will no longer export from MUTIL if their destination address is one of your configured AKA addresses. + + Mystic echomail nodes can now be configured as a "Directory" session type, + which means that Mystic (FIDOPOLL) will send bundles to/from locally + configured inbound and outbound directories instead of using BINKP or FTP. + + ! Mystic's FTP server was not sending the QWK packet name in directory + listings when the NLST command was used (instead of LIST). + + + When importing a FIDONET.NA format file, or when creating message bases + during echomail import OR when using the ImportMsgBase function, MUTIL + will now change any filenames (calculated from ECHOTAG) to replace both + \ and / with a _ character. +