This commit is contained in:
mysticbbs 2013-05-06 20:07:39 -04:00
parent cd4983db0b
commit cee65a7621
19 changed files with 178 additions and 138 deletions

View File

@ -166,7 +166,10 @@ Begin
Case Form.Execute of Case Form.Execute of
'D' : MBase.NetAddr := Configuration_EchoMailAddress(False); 'D' : MBase.NetAddr := Configuration_EchoMailAddress(False);
'7' : Configuration_NodeExport (MBase); '7' : Configuration_NodeExport (MBase);
#27 : Break; #27 : If (MBase.NetType > 0) And (MBase.EchoTag = '') And (MBase.NetType <> 3) Then
ShowMsgBox(0, 'Echo base requires echotag')
Else
Break;
End; End;
Until False; Until False;

View File

@ -276,13 +276,14 @@ Begin
Box.Header := ' Internet Servers '; Box.Header := ' Internet Servers ';
Box.Open (16, 9, 64, 15); Box.Open (16, 9, 64, 16);
VerticalLine (31, 11, 13); VerticalLine (31, 11, 14);
Form.AddStr ('D', ' Domain', 23, 11, 33, 11, 8, 25, 25, @Config.inetDomain, Topic + 'Internet domain name'); Form.AddStr ('D', ' Domain', 23, 11, 33, 11, 8, 25, 25, @Config.inetDomain, Topic + 'Internet domain name');
Form.AddBol ('B', ' IP Blocking', 18, 12, 33, 12, 13, 3, @Config.inetIPBlocking, Topic + 'Enable IP blocking'); Form.AddStr ('I', ' Interface', 20, 12, 33, 12, 11, 23, 23, @Config.inetInterface, Topic + 'Network interface IP address');
Form.AddBol ('L', ' IP Logging', 19, 13, 33, 13, 12, 3, @Config.inetIPLogging, Topic + 'Enable IP logging'); Form.AddBol ('B', ' IP Blocking', 18, 13, 33, 13, 13, 3, @Config.inetIPBlocking, Topic + 'Enable IP blocking');
Form.AddBol ('L', ' IP Logging', 19, 14, 33, 14, 12, 3, @Config.inetIPLogging, Topic + 'Enable IP logging');
Form.Execute; Form.Execute;

View File

@ -925,7 +925,6 @@ Var
Var Var
Ch : Char; Ch : Char;
Added : Boolean;
QWinSize : Byte; QWinSize : Byte;
QWinDataPos : Byte; QWinDataPos : Byte;
QWinData : Array[1..15] of String[79]; QWinData : Array[1..15] of String[79];
@ -963,8 +962,6 @@ Var
Var Var
Temp : Integer; Temp : Integer;
Begin Begin
Added := False;
Assign (InFile, Session.TempPath + 'msgtmp'); Assign (InFile, Session.TempPath + 'msgtmp');
{$I-} Reset(InFile); {$I+} {$I-} Reset(InFile); {$I+}
@ -1075,7 +1072,6 @@ Begin
Case Ch of Case Ch of
#27 : Break; #27 : Break;
#13 : If (LastLine < mysMaxMsgLines) and (Not NoMore) Then Begin #13 : If (LastLine < mysMaxMsgLines) and (Not NoMore) Then Begin
Added := True;
If QuoteTopPage + QuoteCurLine = QuoteLines Then NoMore := True; If QuoteTopPage + QuoteCurLine = QuoteLines Then NoMore := True;

View File

@ -2239,17 +2239,13 @@ Begin
End; End;
Procedure TBBSIO.PurgeInputBuffer; Procedure TBBSIO.PurgeInputBuffer;
{$IFDEF WINDOWS}
Var
Ch : Char;
{$ENDIF}
Begin Begin
{$IFDEF UNIX} {$IFDEF UNIX}
While Input.KeyPressed Do Input.ReadKey; While Input.KeyPressed Do Input.ReadKey;
{$ENDIF} {$ENDIF}
{$IFDEF WINDOWS} {$IFDEF WINDOWS}
If Not TBBSCore(Core).LocalMode Then TBBSCore(Core).Client.PurgeInputData(100); If Not TBBSCore(Core).LocalMode Then TBBSCore(Core).Client.PurgeInputData(100);
If TBBSCore(Core).LocalMode Then While Input.KeyPressed Do Ch := Input.ReadKey; If TBBSCore(Core).LocalMode Then While Input.KeyPressed Do Input.ReadKey;
{$ENDIF} {$ENDIF}
End; End;

View File

@ -4091,34 +4091,35 @@ Begin
End; End;
Function TMsgBase.WriteMSGDAT (Extended: Boolean) : LongInt; Function TMsgBase.WriteMSGDAT (Extended: Boolean) : LongInt;
{ returns last message added to qwk packet }
Var Var
DataFile : File; DataFile : File;
NdxFile : File of QwkNdxHdr; NdxFile : File of QwkNdxHdr;
NdxHdr : QwkNdxHdr; NdxHdr : QwkNdxHdr;
QwkHdr : QwkDATHdr; Header : String[128];
Temp : String; Chunks : Word;
MsgAdded : Integer; {# of message added in packet}
LastRead : LongInt;
BufStr : String[128]; BufStr : String[128];
Blocks : Word; MsgAdded : Integer;
Index : LongInt; LastRead : LongInt;
QwkIndex : LongInt;
TooBig : Boolean; TooBig : Boolean;
Procedure DoString (Str: String); Procedure DoString (Str: String);
Var Var
Count : SmallInt; Count : SmallInt;
Begin Begin
For Count := 1 to Length(Temp) Do Begin For Count := 1 to Length(Str) Do Begin
BufStr := BufStr + Temp[Count]; BufStr := BufStr + Str[Count];
If BufStr[0] = #128 Then Begin If BufStr[0] = #128 Then Begin
BlockWrite (DataFile, BufStr[1], 128); BlockWrite (DataFile, BufStr[1], 128);
BufStr := ''; BufStr := '';
End; End;
End; End;
End; End;
Var
TempStr : String;
Begin Begin
MsgAdded := 0; MsgAdded := 0;
@ -4132,13 +4133,11 @@ Begin
LastRead := MsgBase^.GetLastRead(Session.User.UserNum) + 1; LastRead := MsgBase^.GetLastRead(Session.User.UserNum) + 1;
MsgBase^.SeekFirst(LastRead); MsgBase^.SeekFirst (LastRead);
While MsgBase^.SeekFound Do Begin While MsgBase^.SeekFound Do Begin
If ((Config.qwkMaxBase > 0) and (MsgAdded = Config.qwkMaxBase)) or If ((Config.QwkMaxBase > 0) and (MsgAdded = Config.QwkMaxBase)) or
((Config.qwkMaxPacket > 0) and (TotalMsgs = Config.qwkMaxPacket)) Then Break; ((Config.QwkMaxPacket > 0) and (TotalMsgs = Config.QwkMaxPacket)) Then Break;
FillChar (QwkHdr, 128, ' ');
MsgBase^.MsgStartUp; MsgBase^.MsgStartUp;
@ -4152,81 +4151,86 @@ Begin
Inc (TotalMsgs); Inc (TotalMsgs);
LastRead := MsgBase^.GetMsgNum; LastRead := MsgBase^.GetMsgNum;
Chunks := 0;
Temp := strPadR(strUpper(MsgBase^.GetFrom), 25, ' '); BufStr := '';
Move (Temp[1], QwkHdr.UPFrom, 25); TooBig := False;
Temp := strPadR(strUpper(MsgBase^.GetTo), 25, ' '); QwkIndex := FileSize(DataFile) DIV 128 + 1;
Move (Temp[1], QwkHdr.UPTo, 25);
Temp := strPadR(MsgBase^.GetSubj, 25, ' ');
Move (Temp[1], QwkHdr.Subject, 25);
Temp := MsgBase^.GetDate;
Move (Temp[1], QwkHdr.Date, 8);
Temp := MsgBase^.GetTime;
Move (Temp[1], QwkHdr.Time, 5);
Temp := strPadR(strI2S(MsgBase^.GetMsgNum), 7, ' ');
Move (Temp[1], QwkHdr.MSGNum, 7);
Temp := strPadR(strI2S(MsgBase^.GetRefer), 8, ' ');
Move (Temp[1], QwkHdr.ReferNum, 8);
QwkHdr.Active := #225;
QwkHdr.ConfNum := MBase.Index;
QwkHdr.Status := ' ';
MsgBase^.MsgTxtStartUp; MsgBase^.MsgTxtStartUp;
Blocks := MsgBase^.GetTextLen DIV 128; While Not MsgBase^.EOM Do Begin
TempStr := MsgBase^.GetString(79);
If MsgBase^.GetTextLen MOD 128 > 0 Then Inc(Blocks, 2) Else Inc(Blocks); If TempStr[1] = #1 Then Continue;
Temp := strPadR(strI2S(Blocks), 6, ' '); Inc (Chunks, Length(TempStr));
End;
Move (Temp[1], QwkHdr.NumChunk, 6); If Chunks MOD 128 = 0 Then
Chunks := Chunks DIV 128 + 1
Else
Chunks := Chunks DIV 128 + 2;
Header :=
' ' +
strPadR(strI2S(MsgBase^.GetMsgNum), 7, ' ') +
MsgBase^.GetDate +
MsgBase^.GetTime +
strPadR(strUpper(MsgBase^.GetTo), 25, ' ') +
strPadR(strUpper(MsgBase^.GetFrom), 25, ' ') +
strPadR(strUpper(MsgBase^.GetSubj), 25, ' ') +
strPadR('', 12, ' ') +
strPadR(strI2S(MsgBase^.GetRefer), 8, ' ') +
strPadR(strI2S(Chunks), 6, ' ') +
#255 +
' ' +
' ' +
' ';
If MsgAdded = 1 Then Begin If MsgAdded = 1 Then Begin
Assign (NdxFile, Session.TempPath + strPadL(strI2S(MBase.Index), 3, '0') + '.ndx'); Assign (NdxFile, Session.TempPath + strPadL(strI2S(MBase.Index), 3, '0') + '.ndx');
ReWrite (NdxFile); ReWrite (NdxFile);
End; End;
Index := FileSize(DataFile) DIV 128 + 1; LONG2MSB (QwkIndex, NdxHdr.MsgPos);
Write (NdxFile, NdxHdr);
long2msb (Index, NdxHdr.MsgPos); BlockWrite (DataFile, Header[1], 128);
Write (NdxFile, NdxHdr);
BlockWrite (DataFile, QwkHdr, 128);
BufStr := '';
TooBig := False;
If Extended Then Begin If Extended Then Begin
If Length(MsgBase^.GetFrom) > 25 Then Begin If Length(MsgBase^.GetFrom) > 25 Then Begin
DoString('From: ' + MsgBase^.GetFrom + #227); DoString('From: ' + MsgBase^.GetFrom + #227);
TooBig := True; TooBig := True;
End; End;
If Length(MsgBase^.GetTo) > 25 Then Begin If Length(MsgBase^.GetTo) > 25 Then Begin
DoString('To: ' + MsgBase^.GetTo + #227); DoString('To: ' + MsgBase^.GetTo + #227);
TooBig := True; TooBig := True;
End; End;
If Length(MsgBase^.GetSubj) > 25 Then Begin If Length(MsgBase^.GetSubj) > 25 Then Begin
DoString('Subject: ' + MsgBase^.GetSubj + #227); DoString('Subject: ' + MsgBase^.GetSubj + #227);
TooBig := True; TooBig := True;
End; End;
If TooBig Then DoString(#227); If TooBig Then DoString(#227);
End; End;
MsgBase^.MsgTxtStartUp;
While Not MsgBase^.EOM Do Begin While Not MsgBase^.EOM Do Begin
Temp := MsgBase^.GetString(79) + #227; TempStr := MsgBase^.GetString(79) + #227;
If Temp[1] = #1 Then Continue; If TempStr[1] = #1 Then Continue;
DoString(Temp); DoString (TempStr);
End; End;
If BufStr <> '' Then Begin If BufStr <> '' Then Begin
BufStr := strPadR(BufStr, 128, ' '); BufStr := strPadR (BufStr, 128, ' ');
BlockWrite (DataFile, BufStr[1], 128); BlockWrite (DataFile, BufStr[1], 128);
End; End;
@ -4246,7 +4250,7 @@ Begin
MsgBase^.CloseMsgBase; MsgBase^.CloseMsgBase;
Dispose (MsgBase, Done); Dispose (MsgBase, Done);
Session.io.OutBS (Screen.CursorX, True); Session.io.OutBS (Screen.CursorX, True);
Session.io.OutFullLn (Session.GetPrompt(232)); Session.io.OutFullLn (Session.GetPrompt(232));
Result := LastRead; Result := LastRead;
@ -4331,7 +4335,10 @@ Begin
// Session.SystemLog('DEBUG: Archiving QWK packet'); // Session.SystemLog('DEBUG: Archiving QWK packet');
If Session.LocalMode Then Begin If Session.LocalMode Then Begin
FileErase (Config.QWKPath + Temp);
Session.FileBase.ExecuteArchive (Config.QWKPath + Temp, Session.User.ThisUser.Archive, Session.TempPath + '*', 1); Session.FileBase.ExecuteArchive (Config.QWKPath + Temp, Session.User.ThisUser.Archive, Session.TempPath + '*', 1);
Session.io.OutFullLn (Session.GetPrompt(235)); Session.io.OutFullLn (Session.GetPrompt(235));
End Else Begin End Else Begin
// Session.SystemLog('DEBUG: Arc QWK: Nonlocal mode'); // Session.SystemLog('DEBUG: Arc QWK: Nonlocal mode');

View File

@ -76,7 +76,7 @@ Type
DateRcvd : LongInt; DateRcvd : LongInt;
DateArrived : LongInt; DateArrived : LongInt;
MsgNum : LongInt; MsgNum : LongInt;
Attr1 : LongInt; Attr1 : Cardinal;
Attr2 : LongInt; Attr2 : LongInt;
TextOfs : LongInt; TextOfs : LongInt;
TextLen : LongInt; TextLen : LongInt;
@ -238,7 +238,7 @@ Type
Procedure MsgTxtStartUp; Virtual; {Do message text start up tasks} Procedure MsgTxtStartUp; Virtual; {Do message text start up tasks}
Function GetTxtPos : LongInt; Virtual; {Get indicator of msg text position} Function GetTxtPos : LongInt; Virtual; {Get indicator of msg text position}
Procedure SetTxtPos (TP: LongInt); Virtual; {Set text position} Procedure SetTxtPos (TP: LongInt); Virtual; {Set text position}
Procedure SetAttr1 (Mask: LongInt; St: Boolean); {Set attribute 1} Procedure SetAttr1 (Mask: Cardinal; St: Boolean); {Set attribute 1}
Function ReadIdx : Word; Function ReadIdx : Word;
Function WriteIdx : Word; Function WriteIdx : Word;
Procedure AddSubField (id: Word; Data: String); Procedure AddSubField (id: Word; Data: String);
@ -371,7 +371,7 @@ Begin
JM^.MsgTime := STime; JM^.MsgTime := STime;
End; End;
Procedure TMsgBaseJAM.SetAttr1 (Mask: LongInt; St: Boolean); Procedure TMsgBaseJAM.SetAttr1 (Mask: Cardinal; St: Boolean);
Begin Begin
If St Then If St Then
MsgHdr^.JamHdr.Attr1 := MsgHdr^.JamHdr.Attr1 Or Mask MsgHdr^.JamHdr.Attr1 := MsgHdr^.JamHdr.Attr1 Or Mask

View File

@ -45,7 +45,7 @@ Type
End; End;
SqFrameHdrType = Record SqFrameHdrType = Record
Id : LongInt; { Must equal SqHdrId } Id : Cardinal; { Must equal SqHdrId }
NextFrame : LongInt; { Next msg frame } NextFrame : LongInt; { Next msg frame }
PrevFrame : LongInt; { Prior msg frame } PrevFrame : LongInt; { Prior msg frame }
FrameLength : LongInt; { Length of this frame not counting header } FrameLength : LongInt; { Length of this frame not counting header }

View File

@ -96,7 +96,7 @@ Var
cfg_ExecPath : String[160]; cfg_ExecPath : String[160];
cfg_ExecUser : String[35]; cfg_ExecUser : String[35];
cfg_ExecPW : String[20]; cfg_ExecPW : String[20];
cfg_TextString : Byte; // cfg_TextString : Byte;
cfg_TextKeyword : Byte; cfg_TextKeyword : Byte;
cfg_TextComment : Byte; cfg_TextComment : Byte;
cfg_TextNormal : Byte; cfg_TextNormal : Byte;
@ -136,11 +136,9 @@ Type
CutTextRec = String[255]; CutTextRec = String[255];
Var Var
CutPasted : Boolean = False; CutPasted : Boolean = False;
CutTextPos : Word = 0; CutTextPos : Word = 0;
CutText : Array[1..MaxCutText] of CutTextPTR; CutText : Array[1..MaxCutText] of CutTextPTR;
Var
Console : TOutput; Console : TOutput;
Input : TInput; Input : TInput;
StartDir : String; StartDir : String;
@ -1855,7 +1853,7 @@ Begin
cfg_ExecPW := INI.ReadString('Execute', 'password', 'Guest'); cfg_ExecPW := INI.ReadString('Execute', 'password', 'Guest');
cfg_TextNormal := INI.ReadInteger('Colors', 'syn_normal', 30); cfg_TextNormal := INI.ReadInteger('Colors', 'syn_normal', 30);
cfg_TextKeyword := INI.ReadInteger('Colors', 'syn_keyword', 31); cfg_TextKeyword := INI.ReadInteger('Colors', 'syn_keyword', 31);
cfg_TextString := INI.ReadInteger('Colors', 'syn_string', 27); // cfg_TextString := INI.ReadInteger('Colors', 'syn_string', 27);
cfg_TextNumber := INI.ReadInteger('Colors', 'syn_number', 19); cfg_TextNumber := INI.ReadInteger('Colors', 'syn_number', 19);
cfg_TextComment := INI.ReadInteger('Colors', 'syn_comment', 23); cfg_TextComment := INI.ReadInteger('Colors', 'syn_comment', 23);
cfg_TextHex := INI.ReadInteger('Colors', 'syn_hex', 28); cfg_TextHex := INI.ReadInteger('Colors', 'syn_hex', 28);

View File

@ -1,6 +1,7 @@
Unit MIS_Client_FTP; Unit MIS_Client_FTP;
{$I M_OPS.PAS} {$I M_OPS.PAS}
{.$DEFINE FTPDEBUG} {.$DEFINE FTPDEBUG}
// does not send file/directory datestamps // does not send file/directory datestamps
@ -281,7 +282,7 @@ Begin
WaitSock.FTelnetServer := False; WaitSock.FTelnetServer := False;
WaitSock.FTelnetClient := False; WaitSock.FTelnetClient := False;
WaitSock.WaitInit(DataPort); WaitSock.WaitInit(bbsConfig.inetInterface, DataPort);
DataSocket := WaitSock.WaitConnection; DataSocket := WaitSock.WaitConnection;
@ -446,20 +447,23 @@ Begin
DataPort := Random(bbsConfig.inetFTPPortMax - bbsConfig.inetFTPPortMin) + bbsConfig.inetFTPPortMin; DataPort := Random(bbsConfig.inetFTPPortMax - bbsConfig.inetFTPPortMin) + bbsConfig.inetFTPPortMin;
{$IFDEF FTPDEBUG} LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort)); {$ENDIF} {$IFDEF FTPDEBUG}
LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort));
Server.Status(re_PassiveOK + '(' + strReplace(Client.HostIP, '.', ',') + ',' + strI2S(WordRec(DataPort).Hi) + ',' + strI2S(WordRec(DataPort).Lo) + ').');
{$ENDIF}
Client.WriteLine(re_PassiveOK + '(' + strReplace(Client.HostIP, '.', ',') + ',' + strI2S(WordRec(DataPort).Hi) + ',' + strI2S(WordRec(DataPort).Lo) + ').'); Client.WriteLine(re_PassiveOK + '(' + strReplace(Client.HostIP, '.', ',') + ',' + strI2S(WordRec(DataPort).Hi) + ',' + strI2S(WordRec(DataPort).Lo) + ').');
IsPassive := True; IsPassive := True;
WaitSock := TIOSocket.Create;
WaitSock := TIOSocket.Create;
WaitSock.FTelnetServer := False; WaitSock.FTelnetServer := False;
WaitSock.FTelnetClient := False; WaitSock.FTelnetClient := False;
{$IFDEF FTPDEBUG} LOG('PASV Init'); {$ENDIF} {$IFDEF FTPDEBUG} LOG('PASV Init'); {$ENDIF}
WaitSock.WaitInit(DataPort); WaitSock.WaitInit(bbsConfig.inetInterface, DataPort);
{$IFDEF FTPDEBUG} LOG('PASV Wait'); {$ENDIF} {$IFDEF FTPDEBUG} LOG('PASV Wait'); {$ENDIF}
@ -765,7 +769,7 @@ Begin
WaitSock := TIOSocket.Create; WaitSock := TIOSocket.Create;
WaitSock.WaitInit(DataPort); WaitSock.WaitInit(bbsConfig.inetInterface, DataPort);
DataSocket := WaitSock.WaitConnection; DataSocket := WaitSock.WaitConnection;
@ -813,7 +817,10 @@ Begin
Else Else
Data := ''; Data := '';
{$IFDEF FTPDEBUG} LOG('Cmd: ' + Cmd + ' Data: ' + Data); {$ENDIF} {$IFDEF FTPDEBUG}
LOG('Cmd: ' + Cmd + ' Data: ' + Data);
Server.Status ('Cmd: ' + Cmd + ' Data: ' + Data);
{$ENDIF}
If Cmd = 'CDUP' Then cmdCDUP Else If Cmd = 'CDUP' Then cmdCDUP Else
If Cmd = 'CWD' Then cmdCWD Else If Cmd = 'CWD' Then cmdCWD Else

View File

@ -17,7 +17,7 @@ Const
Type Type
TServerManager = Class; TServerManager = Class;
TServerClient = Class; TServerClient = Class;
TServerCreateProc = Function (Manager: TServerManager; Config: RecConfig; ND: TNodeData; Client: TIOSocket): TServerClient; TServerCreateProc = Function (Manager: TServerManager; Cfg: RecConfig; ND: TNodeData; Client: TIOSocket): TServerClient;
TServerManager = Class(TThread) TServerManager = Class(TThread)
Critical : TRTLCriticalSection; Critical : TRTLCriticalSection;
@ -37,7 +37,7 @@ Type
Port : LongInt; Port : LongInt;
TextPath : String[80]; TextPath : String[80];
Constructor Create (Config: RecConfig; PortNum: Word; CliMax: Word; ND: TNodeData; CreateProc: TServerCreateProc); Constructor Create (Cfg: RecConfig; PortNum: Word; CliMax: Word; ND: TNodeData; CreateProc: TServerCreateProc);
Destructor Destroy; Override; Destructor Destroy; Override;
Procedure Execute; Override; Procedure Execute; Override;
Procedure Status (Str: String); Procedure Status (Str: String);
@ -60,7 +60,7 @@ Uses
m_Strings, m_Strings,
m_DateTime; m_DateTime;
Constructor TServerManager.Create (Config: RecConfig; PortNum: Word; CliMax: Word; ND: TNodeData; CreateProc: TServerCreateProc); Constructor TServerManager.Create (Cfg: RecConfig; PortNum: Word; CliMax: Word; ND: TNodeData; CreateProc: TServerCreateProc);
Var Var
Count : Byte; Count : Byte;
Begin Begin
@ -82,7 +82,7 @@ Begin
ClientList := TList.Create; ClientList := TList.Create;
TextPath := Config.DataPath; TextPath := Config.DataPath;
NodeInfo := ND; NodeInfo := ND;
Config := Config; Config := Cfg;
For Count := 1 to ClientMax Do For Count := 1 to ClientMax Do
ClientList.Add(NIL); ClientList.Add(NIL);
@ -201,7 +201,7 @@ Begin
Repeat Until Server <> NIL; // Synchronize with server class Repeat Until Server <> NIL; // Synchronize with server class
Repeat Until ServerStatus <> NIL; // Syncronize with status class Repeat Until ServerStatus <> NIL; // Syncronize with status class
Server.WaitInit(Port); Server.WaitInit(Config.inetInterface, Port);
If Terminated Then Exit; If Terminated Then Exit;

View File

@ -71,7 +71,7 @@
PurgeMessageBases = false PurgeMessageBases = false
PostTextFiles = false PostTextFiles = false
PackMessageBases = false PackMessageBases = false
ImportEchoMail = true ImportEchoMail = false
ExportEchoMail = false ExportEchoMail = false
; ========================================================================== ; ==========================================================================

View File

@ -2,37 +2,6 @@ Unit MUTIL_Common;
{$I M_OPS.PAS} {$I M_OPS.PAS}
(*
add domain into this? how would this be used in routing? where is routing
configuration going?
Function IsAddressMatch (Str: String; Addr: RecEchoMailAddr) : Boolean;
Var
Zone : String;
Net : String;
Node : String;
A : Byte;
B : Byte;
Begin
Result := False;
A := Pos(':', Str);
B := Pos('/', Str);
If (A = 0) or (B <= A) Then Exit;
Zone := Copy(Str, 1, A - 1);
Net := Copy(Str, A + 1, B - 1 - A);
Node := Copy(Str, B + 1, 255);
If (Zone <> '*') and (Addr.Zone <> strS2I(Zone)) Then Exit;
If (Net <> '*') and (Addr.Net <> strS2I(Net)) Then Exit;
If (Node <> '*') and (Addr.Node <> strS2I(Node)) Then Exit;
Result := True;
End;
*)
Interface Interface
Uses Uses
@ -339,7 +308,9 @@ Begin
Inc (Count); Inc (Count);
End; End;
ShellDOS ('', Temp); Log (3, '!', 'Arc Result (' + strI2S(ShellDOS('', Temp)) + ') ' + Temp);
// ShellDOS ('', Temp);
End; End;
Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
@ -533,7 +504,10 @@ End;
Function GetFTNFlowName (Dest: RecEchoMailAddr) : String; Function GetFTNFlowName (Dest: RecEchoMailAddr) : String;
Begin Begin
Result := strI2H((Dest.Net SHL 16) OR Dest.Node, 8); If Dest.Point = 0 Then
Result := strI2H((Dest.Net SHL 16) OR Dest.Node, 8)
Else
Result := strI2H(Dest.Point, 8);
End; End;
Function IsFTNPrimary (EchoNode: RecEchoMailNode) : Boolean; Function IsFTNPrimary (EchoNode: RecEchoMailNode) : Boolean;
@ -558,6 +532,9 @@ Begin;
Result := bbsConfig.OutboundPath Result := bbsConfig.OutboundPath
Else Else
Result := DirLast(bbsConfig.OutboundPath) + strLower(EchoNode.Domain + '.' + strPadL(strI2H(EchoNode.Address.Zone, 3), 3, '0')) + PathChar; Result := DirLast(bbsConfig.OutboundPath) + strLower(EchoNode.Domain + '.' + strPadL(strI2H(EchoNode.Address.Zone, 3), 3, '0')) + PathChar;
If EchoNode.Address.Point <> 0 Then
Result := Result + strI2H((EchoNode.Address.Net SHL 16) OR EchoNode.Address.Node, 8) + '.pnt' + PathChar;
End; End;
Function GetNodeByIndex (Num: LongInt; Var TempNode: RecEchoMailNode) : Boolean; Function GetNodeByIndex (Num: LongInt; Var TempNode: RecEchoMailNode) : Boolean;
@ -587,6 +564,49 @@ Function GetNodeByRoute (Dest: RecEchoMailAddr; Var TempNode: RecEchoMailNode) :
Function IsMatch (Str: String) : Boolean; Function IsMatch (Str: String) : Boolean;
Function IsOneMatch (Mask: String) : Boolean;
Var
Zone : String;
Net : String;
Node : String;
Point : String;
A : Byte;
B : Byte;
C : Byte;
Begin
Result := False;
Zone := '';
Net := '';
Node := '';
Point := '';
A := Pos(':', Mask);
B := Pos('/', Mask);
C := Pos('.', Mask);
If A <> 0 Then Begin
Zone := Copy(Mask, 1, A - 1);
If B = 0 Then B := 255;
If C = 0 Then C := 255;
Net := Copy(Mask, A + 1, B - 1 - A);
Node := Copy(Mask, B + 1, C - 1 - B);
Point := Copy(Mask, C + 1, 255);
End;
If Zone = '' Then Zone := '*';
If Net = '' Then Net := '*';
If Node = '' Then Node := '*';
If Point = '' Then Point := '*';
If (Zone <> '*') and (Dest.Zone <> strS2I(Zone)) Then Exit;
If (Net <> '*') and (Dest.Net <> strS2I(Net)) Then Exit;
If (Node <> '*') and (Dest.Node <> strS2I(Node)) Then Exit;
If (Point <> '*') and (Dest.Point <> strS2I(Point)) Then Exit;
Result := True;
End;
(*
Function IsOneMatch (Mask: String) : Boolean; Function IsOneMatch (Mask: String) : Boolean;
Var Var
Zone : String; Zone : String;
@ -622,10 +642,9 @@ Function GetNodeByRoute (Dest: RecEchoMailAddr; Var TempNode: RecEchoMailNode) :
Result := True; Result := True;
End; End;
*)
Var Var
Mask : String = ''; Mask : String = '';
IsNot : Boolean;
OneRes : Boolean; OneRes : Boolean;
Procedure GetNextAddress; Procedure GetNextAddress;
@ -694,6 +713,10 @@ Var
Begin Begin
Result := False; Result := False;
// this doesn't check points because a point is not in the PKT header so
// we cannot compare it against the point aspect. maybe PKT 2.2 fixes
// this? research it someday
For Count := 1 to 30 Do Begin For Count := 1 to 30 Do Begin
Result := (bbsConfig.NetAddress[Count].Zone = Zone) And Result := (bbsConfig.NetAddress[Count].Zone = Zone) And
(bbsConfig.NetAddress[Count].Net = Net) And (bbsConfig.NetAddress[Count].Net = Net) And

View File

@ -122,8 +122,7 @@ Implementation
Constructor TPKTDupe.Create (Max: Cardinal); Constructor TPKTDupe.Create (Max: Cardinal);
Var Var
F : File; F : File;
RS : Cardinal;
Begin Begin
Inherited Create; Inherited Create;

View File

@ -54,7 +54,6 @@ End;
Procedure BundleMessages; Procedure BundleMessages;
Var Var
F : File; F : File;
T : Text;
PH : RecPKTHeader; PH : RecPKTHeader;
DirInfo : SearchRec; DirInfo : SearchRec;
NodeIndex : LongInt; NodeIndex : LongInt;
@ -156,9 +155,10 @@ Var
Begin Begin
// if msg originated from this echomail address then do not export // if msg originated from this echomail address then do not export
If (EchoNode.Address.Zone = MsgBase^.GetOrigAddr.Zone) and If (EchoNode.Address.Zone = MsgBase^.GetOrigAddr.Zone) and
(EchoNode.Address.Net = MsgBase^.GetOrigAddr.Net) and (EchoNode.Address.Net = MsgBase^.GetOrigAddr.Net) and
(EchoNode.Address.Node = MsgBase^.GetOrigAddr.Node) Then Exit; (EchoNode.Address.Node = MsgBase^.GetOrigAddr.Node) and
(EchoNode.Address.Point = MsgBase^.GetOrigAddr.Point) Then Exit;
Log (2, '+', ' Export #' + strI2S(MsgBase^.GetMsgNum) + ' to ' + strAddr2Str(EchoNode.Address)); Log (2, '+', ' Export #' + strI2S(MsgBase^.GetMsgNum) + ' to ' + strAddr2Str(EchoNode.Address));
@ -257,7 +257,7 @@ Var
If MBase.NetType = 3 Then If MBase.NetType = 3 Then
WriteStr (#1 + 'INTL ' + strAddr2Str(EchoNode.Address) + ' ' + strAddr2Str(MsgBase^.GetOrigAddr), #13); WriteStr (#1 + 'INTL ' + strAddr2Str(EchoNode.Address) + ' ' + strAddr2Str(MsgBase^.GetOrigAddr), #13);
WriteStr (#1 + 'TID: Mystic BBS ' + mysVersion, #13); WriteStr (#1 + 'TID: ' + mysSoftwareID + ' ' + mysVersion, #13);
MsgBase^.MsgTxtStartUp; MsgBase^.MsgTxtStartUp;

View File

@ -68,7 +68,6 @@ Var
TotalEcho : LongInt; TotalEcho : LongInt;
TotalNet : LongInt; TotalNet : LongInt;
TotalDupes : LongInt; TotalDupes : LongInt;
EchoNode : RecEchoMailNode;
DupeIndex : LongInt; DupeIndex : LongInt;
DupeMBase : RecMessageBase; DupeMBase : RecMessageBase;
CreateBases : Boolean; CreateBases : Boolean;

View File

@ -63,7 +63,6 @@ Var
UserTotal : Cardinal; UserTotal : Cardinal;
Link : RecMsgLink; Link : RecMsgLink;
Count : Cardinal; Count : Cardinal;
Addr : RecEchoMailAddr;
Begin Begin
FileMode := 66; FileMode := 66;
BaseKills := 0; BaseKills := 0;

View File

@ -325,7 +325,8 @@ Type
//EmailValidationLevel //EmailValidationLevel
//AllowEmailPWReset //AllowEmailPWReset
ForceNodeList : Boolean; ForceNodeList : Boolean;
Reserved : Array[1..811] of Char; inetInterface : String[23];
Reserved : Array[1..787] of Char;
End; End;
Const Const

View File

@ -34,12 +34,10 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- PGUP/DOWN moves bases in message base editor? - PGUP/DOWN moves bases in message base editor?
- AreaFix - AreaFix
- Echomail export saves last scanned pointers - Echomail export saves last scanned pointers
- Echomail export support for points
- Echomail export support for netmail routing - Echomail export support for netmail routing
- FileFix / TIC - FileFix / TIC
- Add "Add Export To" to global msgbase editor. Also Del Export? - Add "Add Export To" to global msgbase editor. Also Del Export?
! Use NetReply in RecMB also Reply to another base ! Use NetReply in RecMB also Reply to another base?
- cut/paste needs to be added back into the FS editor
- QWK put/get per individual users via FTP - QWK put/get per individual users via FTP
- EXCLUDE from all files list. important. - EXCLUDE from all files list. important.
- Reply to echomail via netmail. - Reply to echomail via netmail.

View File

@ -3308,4 +3308,17 @@
+ Further optimized the on-the-fly ANSI optimization generated by Mystic. I + Further optimized the on-the-fly ANSI optimization generated by Mystic. I
think its probably not possible to make it more efficient now. think its probably not possible to make it more efficient now.
+ MUTIL now properly exports echomail and netmail for BSO-style point nodes.
+ FIDOPOLL now supports sending/receiving echomail from point systems.
! Fixed a bug in the QWK download system that could cause some networked
message bases to get corrupted.
+ Mystic now allows the network interface to be defined for its MIS servers.
If you want it to work the same as before, you MUST set the "Interface"
value in "System Configuration -> Internet Options" to "0.0.0.0" without
the quotes.
<ALPHA 33 RELEASED> <ALPHA 33 RELEASED>