Code restructure and some bug fixes
This commit is contained in:
parent
1497e5c4ea
commit
d1ac7f592a
|
@ -64,6 +64,10 @@ Function ImportFileDIZ (Var Desc: FileDescBuffer; Var DescLines: Byte;
|
||||||
|
|
||||||
Function IsThisUser (U: RecUser; Str: String) : Boolean;
|
Function IsThisUser (U: RecUser; Str: String) : Boolean;
|
||||||
|
|
||||||
|
// ECHOMAIL
|
||||||
|
|
||||||
|
Function GetNodeByAddress (Addr: String; Var TempNode: RecEchoMailNode) : Boolean;
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
|
||||||
Uses
|
Uses
|
||||||
|
@ -627,6 +631,25 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
Function GetNodeByAddress (Addr: String; Var TempNode: RecEchoMailNode) : Boolean;
|
||||||
|
Var
|
||||||
|
F : File;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
Assign (F, bbsCfg.DataPath + 'echonode.dat');
|
||||||
|
|
||||||
|
If Not ioReset(F, SizeOf(RecEchoMailNode), fmRWDN) Then Exit;
|
||||||
|
|
||||||
|
While Not Eof(F) And Not Result Do Begin
|
||||||
|
ioRead(F, TempNode);
|
||||||
|
|
||||||
|
Result := Addr2Str(TempNode.Address) = Addr;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close (F);
|
||||||
|
End;
|
||||||
|
|
||||||
Initialization
|
Initialization
|
||||||
|
|
||||||
bbsCfgStatus := GetBaseConfiguration(True, bbsCfg);
|
bbsCfgStatus := GetBaseConfiguration(True, bbsCfg);
|
||||||
|
|
|
@ -80,41 +80,21 @@ Var
|
||||||
{$I MIS_ANSIWFC.PAS}
|
{$I MIS_ANSIWFC.PAS}
|
||||||
|
|
||||||
Procedure ReadConfiguration;
|
Procedure ReadConfiguration;
|
||||||
Var
|
|
||||||
FileConfig : TFileBuffer;
|
|
||||||
DatLoc : String;
|
|
||||||
Begin
|
Begin
|
||||||
FileConfig := TFileBuffer.Create(SizeOf(RecConfig));
|
Case bbsCfgStatus of
|
||||||
|
cfgNotFound : If Not DaemonMode Then Begin
|
||||||
|
Console.WriteLine (#13#10 + 'ERROR: Unable to read MYSTIC.DAT. This file must exist in the same');
|
||||||
|
Console.WriteLine ('directory as MIS or MYSTICBBS environment location');
|
||||||
|
|
||||||
If Not FileConfig.OpenStream ('mystic.dat', 1, fmOpen, fmRWDN) Then Begin
|
Halt(1);
|
||||||
DatLoc := GetEnv('mysticbbs');
|
End;
|
||||||
|
cfgMisMatch : Begin
|
||||||
If DatLoc <> '' Then DatLoc := DirSlash(DatLoc);
|
WriteLn('ERROR: Data files are not current and must be upgraded.');
|
||||||
|
Halt(1);
|
||||||
If Not FileConfig.OpenStream (DatLoc + 'mystic.dat', 1, fmOpen, fmRWDN) Then Begin
|
End;
|
||||||
If Not DaemonMode Then Begin
|
|
||||||
Console.WriteLine (#13#10 + 'ERROR: Unable to read MYSTIC.DAT. This file must exist in the same');
|
|
||||||
Console.WriteLine ('directory as MIS');
|
|
||||||
|
|
||||||
Keyboard.Free;
|
|
||||||
Console.Free;
|
|
||||||
End;
|
|
||||||
|
|
||||||
FileConfig.Free;
|
|
||||||
|
|
||||||
Halt (1);
|
|
||||||
End;
|
|
||||||
End;
|
End;
|
||||||
|
|
||||||
FileConfig.ReadBlock (bbsConfig, SizeOf(bbsConfig));
|
DirChange(bbsCfg.SystemPath);
|
||||||
FileConfig.Free;
|
|
||||||
|
|
||||||
If bbsConfig.DataChanged <> mysDataChanged Then Begin
|
|
||||||
WriteLn('ERROR: Data files are not current and must be upgraded.');
|
|
||||||
Halt(1);
|
|
||||||
End;
|
|
||||||
|
|
||||||
DirChange(bbsConfig.SystemPath);
|
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function GetFocusPtr : TServerManager;
|
Function GetFocusPtr : TServerManager;
|
||||||
|
@ -253,6 +233,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
(*
|
||||||
Procedure LocalLogin;
|
Procedure LocalLogin;
|
||||||
Const
|
Const
|
||||||
BufferSize = 1024 * 4;
|
BufferSize = 1024 * 4;
|
||||||
|
@ -271,7 +252,7 @@ Begin
|
||||||
|
|
||||||
Client.FTelnetClient := True;
|
Client.FTelnetClient := True;
|
||||||
|
|
||||||
If Not Client.Connect(bbsConfig.inetInterface{'127.0.0.1'}, bbsConfig.InetTNPort) Then
|
If Not Client.Connect(bbsCfg.inetInterface{'127.0.0.1'}, bbsCfg.InetTNPort) Then
|
||||||
Console.WriteLine('Unable to connect')
|
Console.WriteLine('Unable to connect')
|
||||||
Else Begin
|
Else Begin
|
||||||
Done := False;
|
Done := False;
|
||||||
|
@ -332,7 +313,7 @@ Begin
|
||||||
|
|
||||||
SwitchFocus;
|
SwitchFocus;
|
||||||
End;
|
End;
|
||||||
|
*)
|
||||||
{$IFDEF UNIX}
|
{$IFDEF UNIX}
|
||||||
Procedure SetUserOwner;
|
Procedure SetUserOwner;
|
||||||
Var
|
Var
|
||||||
|
@ -362,63 +343,63 @@ Begin
|
||||||
SMTPServer := NIL;
|
SMTPServer := NIL;
|
||||||
NNTPServer := NIL;
|
NNTPServer := NIL;
|
||||||
BINKPServer := NIL;
|
BINKPServer := NIL;
|
||||||
NodeData := TNodeData.Create(bbsConfig.INetTNNodes);
|
NodeData := TNodeData.Create(bbsCfg.INetTNNodes);
|
||||||
|
|
||||||
If bbsConfig.InetTNUse Then Begin
|
If bbsCfg.InetTNUse Then Begin
|
||||||
TelnetServer := TServerManager.Create(bbsConfig, bbsConfig.InetTNPort, bbsConfig.INetTNNodes, NodeData, @CreateTelnet);
|
TelnetServer := TServerManager.Create(bbsCfg, bbsCfg.InetTNPort, bbsCfg.INetTNNodes, NodeData, @CreateTelnet);
|
||||||
|
|
||||||
TelnetServer.Server.FTelnetServer := True;
|
TelnetServer.Server.FTelnetServer := True;
|
||||||
TelnetServer.ClientMaxIPs := bbsConfig.InetTNDupes;
|
TelnetServer.ClientMaxIPs := bbsCfg.InetTNDupes;
|
||||||
TelnetServer.LogFile := 'telnet';
|
TelnetServer.LogFile := 'telnet';
|
||||||
|
|
||||||
Result := True;
|
Result := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If bbsConfig.InetSMTPUse Then Begin
|
If bbsCfg.InetSMTPUse Then Begin
|
||||||
SMTPServer := TServerManager.Create(bbsConfig, bbsConfig.INetSMTPPort, bbsConfig.inetSMTPMax, NodeData, @CreateSMTP);
|
SMTPServer := TServerManager.Create(bbsCfg, bbsCfg.INetSMTPPort, bbsCfg.inetSMTPMax, NodeData, @CreateSMTP);
|
||||||
|
|
||||||
SMTPServer.Server.FTelnetServer := False;
|
SMTPServer.Server.FTelnetServer := False;
|
||||||
SMTPServer.ClientMaxIPs := bbsConfig.INetSMTPDupes;
|
SMTPServer.ClientMaxIPs := bbsCfg.INetSMTPDupes;
|
||||||
SMTPServer.LogFile := 'smtp';
|
SMTPServer.LogFile := 'smtp';
|
||||||
|
|
||||||
Result := True;
|
Result := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If bbsConfig.InetPOP3Use Then Begin
|
If bbsCfg.InetPOP3Use Then Begin
|
||||||
POP3Server := TServerManager.Create(bbsConfig, bbsConfig.INetPOP3Port, bbsConfig.inetPOP3Max, NodeData, @CreatePOP3);
|
POP3Server := TServerManager.Create(bbsCfg, bbsCfg.INetPOP3Port, bbsCfg.inetPOP3Max, NodeData, @CreatePOP3);
|
||||||
|
|
||||||
POP3Server.Server.FTelnetServer := False;
|
POP3Server.Server.FTelnetServer := False;
|
||||||
POP3Server.ClientMaxIPs := bbsConfig.inetPOP3Dupes;
|
POP3Server.ClientMaxIPs := bbsCfg.inetPOP3Dupes;
|
||||||
POP3Server.LogFile := 'pop3';
|
POP3Server.LogFile := 'pop3';
|
||||||
|
|
||||||
Result := True;
|
Result := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If bbsConfig.InetFTPUse Then Begin
|
If bbsCfg.InetFTPUse Then Begin
|
||||||
FTPServer := TServerManager.Create(bbsConfig, bbsConfig.InetFTPPort, bbsConfig.inetFTPMax, NodeData, @CreateFTP);
|
FTPServer := TServerManager.Create(bbsCfg, bbsCfg.InetFTPPort, bbsCfg.inetFTPMax, NodeData, @CreateFTP);
|
||||||
|
|
||||||
FTPServer.Server.FTelnetServer := False;
|
FTPServer.Server.FTelnetServer := False;
|
||||||
FTPServer.ClientMaxIPs := bbsConfig.inetFTPDupes;
|
FTPServer.ClientMaxIPs := bbsCfg.inetFTPDupes;
|
||||||
FTPServer.LogFile := 'ftp';
|
FTPServer.LogFile := 'ftp';
|
||||||
|
|
||||||
Result := True;
|
Result := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If bbsConfig.InetNNTPUse Then Begin
|
If bbsCfg.InetNNTPUse Then Begin
|
||||||
NNTPServer := TServerManager.Create(bbsConfig, bbsConfig.InetNNTPPort, bbsConfig.inetNNTPMax, NodeData, @CreateNNTP);
|
NNTPServer := TServerManager.Create(bbsCfg, bbsCfg.InetNNTPPort, bbsCfg.inetNNTPMax, NodeData, @CreateNNTP);
|
||||||
|
|
||||||
NNTPServer.Server.FTelnetServer := False;
|
NNTPServer.Server.FTelnetServer := False;
|
||||||
NNTPServer.ClientMaxIPs := bbsConfig.inetNNTPDupes;
|
NNTPServer.ClientMaxIPs := bbsCfg.inetNNTPDupes;
|
||||||
NNTPServer.LogFile := 'nntp';
|
NNTPServer.LogFile := 'nntp';
|
||||||
|
|
||||||
Result := True;
|
Result := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If bbsConfig.InetBINKPUse Then Begin
|
If bbsCfg.InetBINKPUse Then Begin
|
||||||
BINKPServer := TServerManager.Create(bbsConfig, bbsConfig.InetBINKPPort, bbsConfig.inetBINKPMax, NodeData, @CreateBINKP);
|
BINKPServer := TServerManager.Create(bbsCfg, bbsCfg.InetBINKPPort, bbsCfg.inetBINKPMax, NodeData, @CreateBINKP);
|
||||||
|
|
||||||
BINKPServer.Server.FTelnetServer := False;
|
BINKPServer.Server.FTelnetServer := False;
|
||||||
BINKPServer.ClientMaxIPs := bbsConfig.inetBINKPDupes;
|
BINKPServer.ClientMaxIPs := bbsCfg.inetBINKPDupes;
|
||||||
BINKPServer.LogFile := 'binkp';
|
BINKPServer.LogFile := 'binkp';
|
||||||
|
|
||||||
Result := True;
|
Result := True;
|
||||||
|
@ -428,7 +409,7 @@ Begin
|
||||||
SetUserOwner;
|
SetUserOwner;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
TempPath := bbsConfig.SystemPath + 'temp0' + PathChar;
|
TempPath := bbsCfg.SystemPath + 'temp0' + PathChar;
|
||||||
|
|
||||||
DirCreate(TempPath);
|
DirCreate(TempPath);
|
||||||
End;
|
End;
|
||||||
|
@ -613,7 +594,7 @@ Begin
|
||||||
#09 : SwitchFocus;
|
#09 : SwitchFocus;
|
||||||
// #13 : {$IFDEF UNIX}Snoop{$ENDIF};
|
// #13 : {$IFDEF UNIX}Snoop{$ENDIF};
|
||||||
#27 : Break;
|
#27 : Break;
|
||||||
#32 : LocalLogin;
|
// #32 : LocalLogin;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If (FocusPtr <> NIL) Then
|
If (FocusPtr <> NIL) Then
|
||||||
|
@ -656,8 +637,6 @@ Begin
|
||||||
Console.WriteLine (' (DONE)');
|
Console.WriteLine (' (DONE)');
|
||||||
|
|
||||||
NodeData.Free;
|
NodeData.Free;
|
||||||
Keyboard.Free;
|
|
||||||
Console.Free;
|
|
||||||
|
|
||||||
Halt(255);
|
Halt(255);
|
||||||
End.
|
End.
|
||||||
|
|
|
@ -16,7 +16,8 @@ Uses
|
||||||
MIS_Server,
|
MIS_Server,
|
||||||
MIS_NodeData,
|
MIS_NodeData,
|
||||||
MIS_Common,
|
MIS_Common,
|
||||||
BBS_Records;
|
BBS_Records,
|
||||||
|
BBS_DataBase;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
M_NUL = 0;
|
M_NUL = 0;
|
||||||
|
@ -85,7 +86,7 @@ Type
|
||||||
Data
|
Data
|
||||||
);
|
);
|
||||||
|
|
||||||
TBinkPStatusUpdate = Procedure (Owner: Pointer; Str: String);
|
TBinkPStatusUpdate = Procedure (Owner: Pointer; Level: Byte; Str: String);
|
||||||
|
|
||||||
TBinkP = Class
|
TBinkP = Class
|
||||||
Owner : Pointer;
|
Owner : Pointer;
|
||||||
|
@ -116,6 +117,8 @@ Type
|
||||||
PasswordMD5 : Boolean;
|
PasswordMD5 : Boolean;
|
||||||
FileList : TProtocolQueue;
|
FileList : TProtocolQueue;
|
||||||
RcvdFiles : LongInt;
|
RcvdFiles : LongInt;
|
||||||
|
SentFiles : LongInt;
|
||||||
|
SkipFiles : LongInt;
|
||||||
|
|
||||||
Constructor Create (O: Pointer; Var C: TIOSocket; Var FL: TProtocolQueue; IsCli: Boolean; TOV: Word);
|
Constructor Create (O: Pointer; Var C: TIOSocket; Var FL: TProtocolQueue; IsCli: Boolean; TOV: Word);
|
||||||
Destructor Destroy; Override;
|
Destructor Destroy; Override;
|
||||||
|
@ -182,6 +185,8 @@ Begin
|
||||||
HaveNode := False;
|
HaveNode := False;
|
||||||
AuthState := SendWelcome;
|
AuthState := SendWelcome;
|
||||||
RcvdFiles := 0;
|
RcvdFiles := 0;
|
||||||
|
SentFiles := 0;
|
||||||
|
SkipFiles := 0;
|
||||||
|
|
||||||
If Not IsClient and UseMD5 Then
|
If Not IsClient and UseMD5 Then
|
||||||
AuthState := SendChallenge;
|
AuthState := SendChallenge;
|
||||||
|
@ -230,7 +235,7 @@ Var
|
||||||
Begin
|
Begin
|
||||||
Result := False;
|
Result := False;
|
||||||
|
|
||||||
Assign (EchoFile, bbsConfig.DataPath + 'echonode.dat');
|
Assign (EchoFile, bbsCfg.DataPath + 'echonode.dat');
|
||||||
|
|
||||||
If Not ioReset(EchoFile, SizeOf(RecEchoMailNode), fmRWDN) Then Exit;
|
If Not ioReset(EchoFile, SizeOf(RecEchoMailNode), fmRWDN) Then Exit;
|
||||||
|
|
||||||
|
@ -239,7 +244,7 @@ Begin
|
||||||
|
|
||||||
For Count := 1 to strWordCount(AddrList, ' ') Do Begin
|
For Count := 1 to strWordCount(AddrList, ' ') Do Begin
|
||||||
Addr1 := strWordGet(Count, AddrList, ' ');
|
Addr1 := strWordGet(Count, AddrList, ' ');
|
||||||
Addr2 := strAddr2Str(EchoNode.Address);
|
Addr2 := Addr2Str(EchoNode.Address);
|
||||||
UseDomain := Pos('@', Addr1) > 0;
|
UseDomain := Pos('@', Addr1) > 0;
|
||||||
|
|
||||||
If UseDomain Then
|
If UseDomain Then
|
||||||
|
@ -346,12 +351,12 @@ Procedure TBinkP.SendFrame (CmdType: Byte; CmdData: String);
|
||||||
Var
|
Var
|
||||||
DataSize : Word;
|
DataSize : Word;
|
||||||
Begin
|
Begin
|
||||||
DataSize := (Length(CmdData) + 2) OR $8000;
|
DataSize := (Length(CmdData) + 1) OR $8000;
|
||||||
|
|
||||||
Client.BufWriteStr(Char(Hi(DataSize)) + Char(Lo(DataSize)) + Char(CmdType) + CmdData + #0);
|
Client.BufWriteStr(Char(Hi(DataSize)) + Char(Lo(DataSize)) + Char(CmdType) + CmdData);
|
||||||
Client.BufFlush;
|
Client.BufFlush;
|
||||||
|
|
||||||
StatusUpdate (Owner, 'S ' + BinkCmdStr[CmdType] + ' ' + CmdData);
|
StatusUpdate (Owner, 2, 'S ' + BinkCmdStr[CmdType] + ' ' + CmdData);
|
||||||
|
|
||||||
// WriteLn (' S ' + BinkCmdStr[CmdType] + ' ' + CmdData);
|
// WriteLn (' S ' + BinkCmdStr[CmdType] + ' ' + CmdData);
|
||||||
// waitms(1000);
|
// waitms(1000);
|
||||||
|
@ -411,7 +416,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If RxFrameType = Command Then
|
If RxFrameType = Command Then
|
||||||
StatusUpdate (Owner, 'R ' + BinkCmdStr[RxCommand] + ' ' + GetDataStr);
|
StatusUpdate (Owner, 2, 'R ' + BinkCmdStr[RxCommand] + ' ' + GetDataStr);
|
||||||
|
|
||||||
|
|
||||||
// Case RxFrameType of
|
// Case RxFrameType of
|
||||||
|
@ -450,8 +455,8 @@ Begin
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
MD5Challenge := Copy(Str, Count + 4, 255);
|
MD5Challenge := Copy(Str, Count + 4, 255);
|
||||||
|
|
||||||
If Not IsClient Then
|
// If Not IsClient Then
|
||||||
StatusUpdate (Owner, Str);
|
StatusUpdate (Owner, 1, Str);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
// WriteLn ('AuthState: ', GetStateStr(AuthState), ', HasHeader: ', HaveHeader, ' Data: ', GetDataStr);
|
// WriteLn ('AuthState: ', GetStateStr(AuthState), ', HasHeader: ', HaveHeader, ' Data: ', GetDataStr);
|
||||||
|
@ -469,20 +474,20 @@ Begin
|
||||||
AuthState := SendWelcome;
|
AuthState := SendWelcome;
|
||||||
End;
|
End;
|
||||||
SendWelcome : Begin
|
SendWelcome : Begin
|
||||||
SendFrame (M_NUL, 'SYS ' + bbsConfig.BBSName);
|
SendFrame (M_NUL, 'SYS ' + bbsCfg.BBSName);
|
||||||
SendFrame (M_NUL, 'ZYZ ' + bbsConfig.SysopName);
|
SendFrame (M_NUL, 'ZYZ ' + bbsCfg.SysopName);
|
||||||
SendFrame (M_NUL, 'VER Mystic/' + Copy(mysVersion, 1, 4) + ' binkp/1.0');
|
SendFrame (M_NUL, 'VER Mystic/' + Copy(mysVersion, 1, 4) + ' binkp/1.0');
|
||||||
|
|
||||||
Str := '';
|
Str := '';
|
||||||
|
|
||||||
For Count := 1 to 30 Do
|
For Count := 1 to 30 Do
|
||||||
If strAddr2Str(bbsConfig.NetAddress[Count]) <> '0:0/0' Then Begin
|
If Addr2Str(bbsCfg.NetAddress[Count]) <> '0:0/0' Then Begin
|
||||||
If Str <> '' Then Str := Str + ' ';
|
If Str <> '' Then Str := Str + ' ';
|
||||||
|
|
||||||
Str := Str + strAddr2Str(bbsConfig.NetAddress[Count]);
|
Str := Str + Addr2Str(bbsCfg.NetAddress[Count]);
|
||||||
|
|
||||||
If bbsConfig.NetDomain[Count] <> '' Then
|
If bbsCfg.NetDomain[Count] <> '' Then
|
||||||
Str := Str + '@' + bbsConfig.NetDomain[Count];
|
Str := Str + '@' + bbsCfg.NetDomain[Count];
|
||||||
End;
|
End;
|
||||||
|
|
||||||
SendFrame (M_ADR, Str);
|
SendFrame (M_ADR, Str);
|
||||||
|
@ -526,7 +531,7 @@ Begin
|
||||||
NeedHeader := True;
|
NeedHeader := True;
|
||||||
HaveHeader := False;
|
HaveHeader := False;
|
||||||
|
|
||||||
StatusUpdate (Owner, 'ADR ' + AddressList);
|
StatusUpdate (Owner, 1, 'ADR ' + AddressList);
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
WaitPassword : If HaveHeader Then Begin
|
WaitPassword : If HaveHeader Then Begin
|
||||||
|
@ -561,7 +566,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If AuthState <> AuthOK Then
|
If AuthState <> AuthOK Then
|
||||||
StatusUpdate(Owner, 'Authorization failed');
|
StatusUpdate(Owner, 1, 'Authorization failed');
|
||||||
End;
|
End;
|
||||||
WaitPwdOK : If HaveHeader Then Begin
|
WaitPwdOK : If HaveHeader Then Begin
|
||||||
If RxCommand <> M_OK Then
|
If RxCommand <> M_OK Then
|
||||||
|
@ -587,6 +592,10 @@ Var
|
||||||
InPos : Cardinal;
|
InPos : Cardinal;
|
||||||
InTime : Cardinal;
|
InTime : Cardinal;
|
||||||
FSize : Cardinal;
|
FSize : Cardinal;
|
||||||
|
// LastRx : TBinkRxState = RxNone;
|
||||||
|
// LastTx : TBinkTxState = TxNone;
|
||||||
|
// LastHH : Boolean = False;
|
||||||
|
// LastNH : Boolean = False;
|
||||||
Begin
|
Begin
|
||||||
//WriteLn ('Begin File Transfers');
|
//WriteLn ('Begin File Transfers');
|
||||||
|
|
||||||
|
@ -601,10 +610,16 @@ Begin
|
||||||
|
|
||||||
// need to update states to handle getting FILE during an xfer
|
// need to update states to handle getting FILE during an xfer
|
||||||
// and what to do if the file frame goes past file size (fail/quit), etc
|
// and what to do if the file frame goes past file size (fail/quit), etc
|
||||||
|
(*
|
||||||
|
If (RxState <> LastRx) or (TxState <> LastTx) or (HaveHeader <> LastHH) or (NeedHeader <> LastNH) Then Begin
|
||||||
|
lastrx := rxstate;
|
||||||
|
lasttx := txstate;
|
||||||
|
lasthh := haveheader;
|
||||||
|
lastnh := needheader;
|
||||||
|
|
||||||
// waitms(100);
|
WriteLn ('rxstate=', ord(rxstate), ' txstate=', ord(txstate), ' have header ', haveheader, ' need header ', needheader);
|
||||||
// writeln ('rxstate=', ord(rxstate), ' txstate=', ord(txstate), ' have header ', haveheader, ' need header ', needheader);
|
End;
|
||||||
|
*)
|
||||||
Case RxState of
|
Case RxState of
|
||||||
RxWaitFile : If HaveHeader Then Begin
|
RxWaitFile : If HaveHeader Then Begin
|
||||||
If RxFrameType = Data Then Begin
|
If RxFrameType = Data Then Begin
|
||||||
|
@ -626,25 +641,27 @@ Begin
|
||||||
InTime := strS2I(strWordGet(3, Str, ' '));
|
InTime := strS2I(strWordGet(3, Str, ' '));
|
||||||
InPos := strS2I(strWordGet(4, Str, ' '));
|
InPos := strS2I(strWordGet(4, Str, ' '));
|
||||||
|
|
||||||
If FileExist(bbsConfig.InBoundPath + InFN) Then Begin
|
If FileExist(bbsCfg.InBoundPath + InFN) Then Begin
|
||||||
FSize := FileByteSize(bbsConfig.InBoundPath + InFN);
|
FSize := FileByteSize(bbsCfg.InBoundPath + InFN);
|
||||||
|
|
||||||
// fix timestamp and escape filen
|
// fix timestamp and escape filen
|
||||||
|
|
||||||
If FSize >= InSize Then Begin
|
If FSize >= InSize Then Begin
|
||||||
SendFrame (M_SKIP, EscapeFileName(InFN) + ' ' + strI2S(FSize) + ' ' + strI2S(InTime));
|
SendFrame (M_SKIP, EscapeFileName(InFN) + ' ' + strI2S(InSize) + ' ' + strI2S(InTime));
|
||||||
|
|
||||||
|
Inc (SkipFiles);
|
||||||
|
|
||||||
Continue;
|
Continue;
|
||||||
End Else Begin
|
End Else Begin
|
||||||
SendFrame (M_GET, EscapeFileName(InFN) + ' ' + strI2S(FSize) + ' ' + strI2S(InTime));
|
SendFrame (M_GET, EscapeFileName(InFN) + ' ' + strI2S(FSize) + ' ' + strI2S(InTime));
|
||||||
|
|
||||||
StatusUpdate(Owner, 'Receiving: ' + InFN);
|
|
||||||
|
|
||||||
InPos := FSize;
|
InPos := FSize;
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Assign (InFile, bbsConfig.InBoundPath + InFN);
|
StatusUpdate(Owner, 1, 'Receiving: ' + InFN);
|
||||||
|
|
||||||
|
Assign (InFile, bbsCfg.InBoundPath + InFN);
|
||||||
Reset (InFile, 1);
|
Reset (InFile, 1);
|
||||||
|
|
||||||
If IoResult <> 0 Then ReWrite (InFile, 1);
|
If IoResult <> 0 Then ReWrite (InFile, 1);
|
||||||
|
@ -657,6 +674,10 @@ Begin
|
||||||
NeedHeader := True;
|
NeedHeader := True;
|
||||||
HaveHeader := False;
|
HaveHeader := False;
|
||||||
RxState := RxDone;
|
RxState := RxDone;
|
||||||
|
// It seems BINKP never sends this IF the last file
|
||||||
|
// was skipped? Odd. Do we add a "LastWasSkipped"
|
||||||
|
// and do something after a small wait time? or
|
||||||
|
// just wait for it to timeout like it does now
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
RxGetData : If HaveHeader And (RxFrameType = Data) Then Begin
|
RxGetData : If HaveHeader And (RxFrameType = Data) Then Begin
|
||||||
|
@ -693,6 +714,8 @@ Begin
|
||||||
HaveHeader := False;
|
HaveHeader := False;
|
||||||
NeedHeader := True;
|
NeedHeader := True;
|
||||||
TxState := TxNextFile;
|
TxState := TxNextFile;
|
||||||
|
|
||||||
|
Inc (SkipFiles);
|
||||||
End Else
|
End Else
|
||||||
If RxCommand = M_GOT Then Begin
|
If RxCommand = M_GOT Then Begin
|
||||||
FileList.QData[FileList.QPos].Status := QueueSuccess;
|
FileList.QData[FileList.QPos].Status := QueueSuccess;
|
||||||
|
@ -703,6 +726,8 @@ Begin
|
||||||
HaveHeader := False;
|
HaveHeader := False;
|
||||||
NeedHeader := True;
|
NeedHeader := True;
|
||||||
TxState := TxNextFile;
|
TxState := TxNextFile;
|
||||||
|
|
||||||
|
Inc (SentFiles);
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
TxNextFile : If FileList.Next Then Begin
|
TxNextFile : If FileList.Next Then Begin
|
||||||
|
@ -714,7 +739,7 @@ Begin
|
||||||
// use real filetime instead of tempfiletime
|
// use real filetime instead of tempfiletime
|
||||||
SendFrame (M_FILE, EscapeFileName(FileList.QData[FileList.QPos].FileNew) + ' ' + strI2S(FileList.QData[FileList.QPos].FileSize) + ' ' + strI2S(TempFileTime) + ' 0');
|
SendFrame (M_FILE, EscapeFileName(FileList.QData[FileList.QPos].FileNew) + ' ' + strI2S(FileList.QData[FileList.QPos].FileSize) + ' ' + strI2S(TempFileTime) + ' 0');
|
||||||
|
|
||||||
StatusUpdate (Owner, 'Sending ' + FileList.QData[FileList.QPos].FileNew);
|
StatusUpdate (Owner, 1, 'Sending ' + FileList.QData[FileList.QPos].FileNew);
|
||||||
|
|
||||||
TxState := TxSendData;
|
TxState := TxSendData;
|
||||||
End Else Begin
|
End Else Begin
|
||||||
|
@ -729,6 +754,8 @@ Begin
|
||||||
TxState := TxNextFile;
|
TxState := TxNextFile;
|
||||||
HaveHeader := False;
|
HaveHeader := False;
|
||||||
NeedHeader := True;
|
NeedHeader := True;
|
||||||
|
|
||||||
|
Inc (SkipFiles);
|
||||||
End Else
|
End Else
|
||||||
If HaveHeader And (RxCommand = M_GET) Then Begin
|
If HaveHeader And (RxCommand = M_GET) Then Begin
|
||||||
Str := strWordGet(4, GetDataStr, ' ');
|
Str := strWordGet(4, GetDataStr, ' ');
|
||||||
|
@ -759,8 +786,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
Until ((RxState = RxDone) and (TxState = TxDone)) or (Not Client.Connected) or (TimerUp(TimeOut));
|
Until ((RxState = RxDone) and (TxState = TxDone)) or (Not Client.Connected) or (TimerUp(TimeOut));
|
||||||
|
|
||||||
If Not IsClient Then
|
StatusUpdate(Owner, 1, 'Session complete (' + strI2S(SentFiles) + ' sent, ' + strI2S(RcvdFiles) + ' rcvd, ' + strI2S(SkipFiles) + ' skip)');
|
||||||
StatusUpdate(Owner, 'Session complete');
|
|
||||||
|
|
||||||
If Client.Connected Then Client.BufFlush;
|
If Client.Connected Then Client.BufFlush;
|
||||||
End;
|
End;
|
||||||
|
@ -772,9 +798,9 @@ Var
|
||||||
Count : Byte;
|
Count : Byte;
|
||||||
Begin
|
Begin
|
||||||
For Count := 1 to 30 Do
|
For Count := 1 to 30 Do
|
||||||
If (strUpper(EchoNode.Domain) = strUpper(bbsConfig.NetDomain[Count])) and
|
If (strUpper(EchoNode.Domain) = strUpper(bbsCfg.NetDomain[Count])) and
|
||||||
(EchoNode.Address.Zone = bbsConfig.NetAddress[Count].Zone) and
|
(EchoNode.Address.Zone = bbsCfg.NetAddress[Count].Zone) and
|
||||||
(bbsConfig.NetPrimary[Count]) Then Begin
|
(bbsCfg.NetPrimary[Count]) Then Begin
|
||||||
Result := True;
|
Result := True;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
|
@ -794,9 +820,9 @@ End;
|
||||||
Function GetFTNOutPath (EchoNode: RecEchoMailNode) : String;
|
Function GetFTNOutPath (EchoNode: RecEchoMailNode) : String;
|
||||||
Begin;
|
Begin;
|
||||||
If IsFTNPrimary(EchoNode) Then
|
If IsFTNPrimary(EchoNode) Then
|
||||||
Result := bbsConfig.OutboundPath
|
Result := bbsCfg.OutboundPath
|
||||||
Else
|
Else
|
||||||
Result := DirLast(bbsConfig.OutboundPath) + strLower(EchoNode.Domain + '.' + strPadL(strI2H(EchoNode.Address.Zone, 3), 3, '0')) + PathChar;
|
Result := DirLast(bbsCfg.OutboundPath) + strLower(EchoNode.Domain + '.' + strPadL(strI2H(EchoNode.Address.Zone, 3), 3, '0')) + PathChar;
|
||||||
|
|
||||||
If EchoNode.Address.Point <> 0 Then
|
If EchoNode.Address.Point <> 0 Then
|
||||||
Result := Result + strI2H((EchoNode.Address.Net SHL 16) OR EchoNode.Address.Node, 8) + '.pnt' + PathChar;
|
Result := Result + strI2H((EchoNode.Address.Net SHL 16) OR EchoNode.Address.Node, 8) + '.pnt' + PathChar;
|
||||||
|
@ -909,7 +935,7 @@ Var
|
||||||
F : File;
|
F : File;
|
||||||
Begin
|
Begin
|
||||||
Queue := TProtocolQueue.Create;
|
Queue := TProtocolQueue.Create;
|
||||||
BinkP := TBinkP.Create (Server, Client, Queue, False, bbsConfig.inetBINKPTimeOut);
|
BinkP := TBinkP.Create (Server, Client, Queue, False, bbsCfg.inetBINKPTimeOut);
|
||||||
|
|
||||||
BinkP.StatusUpdate := @Status;
|
BinkP.StatusUpdate := @Status;
|
||||||
|
|
||||||
|
@ -923,7 +949,7 @@ Begin
|
||||||
|
|
||||||
QueueByNode(Queue, False, BinkP.EchoNode);
|
QueueByNode(Queue, False, BinkP.EchoNode);
|
||||||
|
|
||||||
Server.Status (ProcessID, 'Queued ' + strI2S(Queue.QSize - Before) + ' files for ' + strAddr2Str(BinkP.EchoNode.Address));
|
Server.Status (ProcessID, 'Queued ' + strI2S(Queue.QSize - Before) + ' files for ' + Addr2Str(BinkP.EchoNode.Address));
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -931,7 +957,7 @@ Begin
|
||||||
BinkP.DoTransfers;
|
BinkP.DoTransfers;
|
||||||
|
|
||||||
If BinkP.RcvdFiles > 0 Then Begin
|
If BinkP.RcvdFiles > 0 Then Begin
|
||||||
Assign (F, bbsConfig.SemaPath + 'echomail.in');
|
Assign (F, bbsCfg.SemaPath + fn_SemFileEchoIn);
|
||||||
ReWrite (F, 1);
|
ReWrite (F, 1);
|
||||||
Close (F);
|
Close (F);
|
||||||
End;
|
End;
|
||||||
|
|
|
@ -151,7 +151,7 @@ Begin
|
||||||
Password := '';
|
Password := '';
|
||||||
UserPos := -1;
|
UserPos := -1;
|
||||||
DataIP := '';
|
DataIP := '';
|
||||||
DataPort := Random(bbsConfig.inetFTPPortMax - bbsConfig.inetFTPPortMin) + bbsConfig.inetFTPPortMin;
|
DataPort := Random(bbsCfg.inetFTPPortMax - bbsCfg.inetFTPPortMin) + bbsCfg.inetFTPPortMin;
|
||||||
DataSocket := NIL;
|
DataSocket := NIL;
|
||||||
IsPassive := False;
|
IsPassive := False;
|
||||||
FBasePos := -1;
|
FBasePos := -1;
|
||||||
|
@ -166,7 +166,7 @@ Var
|
||||||
UserFile : File of RecUser;
|
UserFile : File of RecUser;
|
||||||
Begin
|
Begin
|
||||||
// change to getuserbypos
|
// change to getuserbypos
|
||||||
Assign (UserFile, bbsConfig.DataPath + 'users.dat');
|
Assign (UserFile, bbsCfg.DataPath + 'users.dat');
|
||||||
ioReset (UserFile, SizeOf(RecUser), fmRWDW);
|
ioReset (UserFile, SizeOf(RecUser), fmRWDW);
|
||||||
ioSeek (UserFile, UserPos - 1);
|
ioSeek (UserFile, UserPos - 1);
|
||||||
ioRead (UserFile, User);
|
ioRead (UserFile, User);
|
||||||
|
@ -189,7 +189,7 @@ Begin
|
||||||
Inc (User.DLk, FDir.Size DIV 1024);
|
Inc (User.DLk, FDir.Size DIV 1024);
|
||||||
Inc (User.DLkToday, FDir.Size DIV 1024);
|
Inc (User.DLkToday, FDir.Size DIV 1024);
|
||||||
|
|
||||||
Assign (FDirFile, bbsConfig.DataPath + TFBase.FileName + '.dir');
|
Assign (FDirFile, bbsCfg.DataPath + TFBase.FileName + '.dir');
|
||||||
ioReset (FDirFile, SizeOf(RecFileList), fmRWDW);
|
ioReset (FDirFile, SizeOf(RecFileList), fmRWDW);
|
||||||
ioSeek (FDirFile, DirPos - 1);
|
ioSeek (FDirFile, DirPos - 1);
|
||||||
ioWrite (FDirFile, FDir);
|
ioWrite (FDirFile, FDir);
|
||||||
|
@ -200,7 +200,7 @@ Begin
|
||||||
ioWrite (UserFile, User);
|
ioWrite (UserFile, User);
|
||||||
Close (UserFile);
|
Close (UserFile);
|
||||||
|
|
||||||
Assign (HistFile, bbsConfig.DataPath + 'history.dat');
|
Assign (HistFile, bbsCfg.DataPath + 'history.dat');
|
||||||
ioReset (HistFile, SizeOf(RecHistory), fmRWDW);
|
ioReset (HistFile, SizeOf(RecHistory), fmRWDW);
|
||||||
|
|
||||||
If IoResult <> 0 Then ReWrite(HistFile);
|
If IoResult <> 0 Then ReWrite(HistFile);
|
||||||
|
@ -248,8 +248,8 @@ Begin
|
||||||
|
|
||||||
If FDir.Flags And FDirOffline <> 0 Then Exit;
|
If FDir.Flags And FDirOffline <> 0 Then Exit;
|
||||||
|
|
||||||
If (FDir.Flags And FDirInvalid <> 0) And Not CheckAccess(User, True, bbsConfig.AcsDLUnvalid) Then Exit;
|
If (FDir.Flags And FDirInvalid <> 0) And Not CheckAccess(User, True, bbsCfg.AcsDLUnvalid) Then Exit;
|
||||||
If (FDir.Flags And FDirFailed <> 0) And Not CheckAccess(User, True, bbsConfig.AcsDLFailed) Then Exit;
|
If (FDir.Flags And FDirFailed <> 0) And Not CheckAccess(User, True, bbsCfg.AcsDLFailed) Then Exit;
|
||||||
|
|
||||||
If (FDir.Flags And FDirFree <> 0) or (User.Flags and UserNoRatio <> 0) or (TempFBase.Flags and FBFreeFiles <> 0) Then Begin
|
If (FDir.Flags And FDirFree <> 0) or (User.Flags and UserNoRatio <> 0) or (TempFBase.Flags and FBFreeFiles <> 0) Then Begin
|
||||||
Result := 0;
|
Result := 0;
|
||||||
|
@ -302,7 +302,7 @@ Begin
|
||||||
WaitSock.FTelnetServer := False;
|
WaitSock.FTelnetServer := False;
|
||||||
WaitSock.FTelnetClient := False;
|
WaitSock.FTelnetClient := False;
|
||||||
|
|
||||||
WaitSock.WaitInit(bbsConfig.inetInterface, DataPort);
|
WaitSock.WaitInit(bbsCfg.inetInterface, DataPort);
|
||||||
|
|
||||||
DataSocket := WaitSock.WaitConnection(10000);
|
DataSocket := WaitSock.WaitConnection(10000);
|
||||||
|
|
||||||
|
@ -372,7 +372,7 @@ Begin
|
||||||
|
|
||||||
FBaseFile := TFileBuffer.Create(FileBufSize);
|
FBaseFile := TFileBuffer.Create(FileBufSize);
|
||||||
|
|
||||||
If FBaseFile.OpenStream (bbsConfig.DataPath + 'fbases.dat', SizeOf(TempBase), fmOpen, fmRWDN) Then Begin
|
If FBaseFile.OpenStream (bbsCfg.DataPath + 'fbases.dat', SizeOf(TempBase), fmOpen, fmRWDN) Then Begin
|
||||||
Found := False;
|
Found := False;
|
||||||
|
|
||||||
While Not FBaseFile.EOF Do Begin
|
While Not FBaseFile.EOF Do Begin
|
||||||
|
@ -605,7 +605,7 @@ Procedure TFTPServer.cmdREIN;
|
||||||
Begin
|
Begin
|
||||||
ResetSession;
|
ResetSession;
|
||||||
|
|
||||||
If Not Client.WriteFile('220', bbsConfig.DataPath + 'ftpbanner.txt') Then
|
If Not Client.WriteFile('220', bbsCfg.DataPath + 'ftpbanner.txt') Then
|
||||||
Client.WriteLine (re_Greeting);
|
Client.WriteLine (re_Greeting);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -636,12 +636,12 @@ Procedure TFTPServer.cmdPASV;
|
||||||
// WaitSock : TIOSocket;
|
// WaitSock : TIOSocket;
|
||||||
Begin
|
Begin
|
||||||
If LoggedIn Then Begin
|
If LoggedIn Then Begin
|
||||||
If Not bbsConfig.inetFTPPassive Then Begin
|
If Not bbsCfg.inetFTPPassive Then Begin
|
||||||
Client.WriteLine(re_BadCommand);
|
Client.WriteLine(re_BadCommand);
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
DataPort := Random(bbsConfig.inetFTPPortMax - bbsConfig.inetFTPPortMin) + bbsConfig.inetFTPPortMin;
|
DataPort := Random(bbsCfg.inetFTPPortMax - bbsCfg.inetFTPPortMin) + bbsCfg.inetFTPPortMin;
|
||||||
|
|
||||||
{$IFDEF FTPDEBUG}
|
{$IFDEF FTPDEBUG}
|
||||||
LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort));
|
LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort));
|
||||||
|
@ -660,7 +660,7 @@ Begin
|
||||||
|
|
||||||
{$IFDEF FTPDEBUG} LOG('PASV Init'); {$ENDIF}
|
{$IFDEF FTPDEBUG} LOG('PASV Init'); {$ENDIF}
|
||||||
|
|
||||||
WaitSock.WaitInit(bbsConfig.inetInterface, DataPort);
|
WaitSock.WaitInit(bbsCfg.inetInterface, DataPort);
|
||||||
|
|
||||||
{$IFDEF FTPDEBUG} LOG('PASV Wait'); {$ENDIF}
|
{$IFDEF FTPDEBUG} LOG('PASV Wait'); {$ENDIF}
|
||||||
|
|
||||||
|
@ -738,13 +738,13 @@ Begin
|
||||||
|
|
||||||
DirFile := TFileBuffer.Create(FileBufSize);
|
DirFile := TFileBuffer.Create(FileBufSize);
|
||||||
|
|
||||||
If DirFile.OpenStream (bbsConfig.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin
|
If DirFile.OpenStream (bbsCfg.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin
|
||||||
While Not DirFile.EOF Do Begin
|
While Not DirFile.EOF Do Begin
|
||||||
DirFile.ReadRecord (Dir);
|
DirFile.ReadRecord (Dir);
|
||||||
|
|
||||||
If (Dir.Flags And FDirDeleted <> 0) Then Continue;
|
If (Dir.Flags And FDirDeleted <> 0) Then Continue;
|
||||||
If (Dir.Flags And FDirInvalid <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeUnvalid)) Then Continue;
|
If (Dir.Flags And FDirInvalid <> 0) And (Not CheckAccess(User, True, bbsCfg.AcsSeeUnvalid)) Then Continue;
|
||||||
If (Dir.Flags And FDirFailed <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeFailed)) Then Continue;
|
If (Dir.Flags And FDirFailed <> 0) And (Not CheckAccess(User, True, bbsCfg.AcsSeeFailed)) Then Continue;
|
||||||
|
|
||||||
If WildMatch(FileMask, Dir.FileName, False) Then
|
If WildMatch(FileMask, Dir.FileName, False) Then
|
||||||
DataSocket.WriteLine(Dir.FileName);
|
DataSocket.WriteLine(Dir.FileName);
|
||||||
|
@ -796,7 +796,7 @@ Begin
|
||||||
|
|
||||||
FBaseFile := TFileBuffer.Create(FileBufSize);
|
FBaseFile := TFileBuffer.Create(FileBufSize);
|
||||||
|
|
||||||
If FBaseFile.OpenStream (bbsConfig.DataPath + 'fbases.dat', SizeOf(RecFileBase), fmOpen, fmRWDN) Then Begin
|
If FBaseFile.OpenStream (bbsCfg.DataPath + 'fbases.dat', SizeOf(RecFileBase), fmOpen, fmRWDN) Then Begin
|
||||||
While Not FBaseFile.EOF Do Begin
|
While Not FBaseFile.EOF Do Begin
|
||||||
FBaseFile.ReadRecord (TempBase);
|
FBaseFile.ReadRecord (TempBase);
|
||||||
|
|
||||||
|
@ -822,14 +822,14 @@ Begin
|
||||||
|
|
||||||
DirFile := TFileBuffer.Create(FileBufSize);
|
DirFile := TFileBuffer.Create(FileBufSize);
|
||||||
|
|
||||||
If DirFile.OpenStream (bbsConfig.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin
|
If DirFile.OpenStream (bbsCfg.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin
|
||||||
While Not DirFile.EOF Do Begin
|
While Not DirFile.EOF Do Begin
|
||||||
DirFile.ReadRecord (Dir);
|
DirFile.ReadRecord (Dir);
|
||||||
|
|
||||||
If (Dir.Flags And FDirDeleted <> 0) Then Continue;
|
If (Dir.Flags And FDirDeleted <> 0) Then Continue;
|
||||||
If (Dir.Flags and FDirOffline <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeOffline)) Then Continue;
|
If (Dir.Flags and FDirOffline <> 0) And (Not CheckAccess(User, True, bbsCfg.AcsSeeOffline)) Then Continue;
|
||||||
If (Dir.Flags And FDirInvalid <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeUnvalid)) Then Continue;
|
If (Dir.Flags And FDirInvalid <> 0) And (Not CheckAccess(User, True, bbsCfg.AcsSeeUnvalid)) Then Continue;
|
||||||
If (Dir.Flags And FDirFailed <> 0) And (Not CheckAccess(User, True, bbsConfig.AcsSeeFailed)) Then Continue;
|
If (Dir.Flags And FDirFailed <> 0) And (Not CheckAccess(User, True, bbsCfg.AcsSeeFailed)) Then Continue;
|
||||||
|
|
||||||
If WildMatch(FileMask, Dir.FileName, False) Then
|
If WildMatch(FileMask, Dir.FileName, False) Then
|
||||||
DataSocket.WriteLine('-rw-r--r-- 1 ftp ftp ' + strPadL(strI2S(Dir.Size), 13, ' ') + ' ' + GetFTPDate(Dir.DateTime) + ' ' + Dir.FileName)
|
DataSocket.WriteLine('-rw-r--r-- 1 ftp ftp ' + strPadL(strI2S(Dir.Size), 13, ' ') + ' ' + GetFTPDate(Dir.DateTime) + ' ' + Dir.FileName)
|
||||||
|
@ -1024,7 +1024,7 @@ Begin
|
||||||
DirFile := TFileBuffer.Create(FileBufSize);
|
DirFile := TFileBuffer.Create(FileBufSize);
|
||||||
Found := -1;
|
Found := -1;
|
||||||
|
|
||||||
If DirFile.OpenStream (bbsConfig.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin
|
If DirFile.OpenStream (bbsCfg.DataPath + TempBase.FileName + '.dir', SizeOf(RecFileList), fmOpenCreate, fmRWDN) Then Begin
|
||||||
While Not DirFile.EOF Do Begin
|
While Not DirFile.EOF Do Begin
|
||||||
DirFile.ReadRecord (Dir);
|
DirFile.ReadRecord (Dir);
|
||||||
|
|
||||||
|
@ -1109,14 +1109,14 @@ Var
|
||||||
Begin
|
Begin
|
||||||
If LoggedIn Then Begin
|
If LoggedIn Then Begin
|
||||||
If Data = '' Then Begin
|
If Data = '' Then Begin
|
||||||
DataPort := Random(bbsConfig.inetFTPPortMax - bbsConfig.inetFTPPortMin) + bbsConfig.inetFTPPortMin;
|
DataPort := Random(bbsCfg.inetFTPPortMax - bbsCfg.inetFTPPortMin) + bbsCfg.inetFTPPortMin;
|
||||||
IsPassive := True;
|
IsPassive := True;
|
||||||
|
|
||||||
Client.WriteLine('229 Entering Extended Passive Mode (|||' + strI2S(DataPort) + '|)');
|
Client.WriteLine('229 Entering Extended Passive Mode (|||' + strI2S(DataPort) + '|)');
|
||||||
|
|
||||||
WaitSock := TIOSocket.Create;
|
WaitSock := TIOSocket.Create;
|
||||||
|
|
||||||
WaitSock.WaitInit(bbsConfig.inetInterface, DataPort);
|
WaitSock.WaitInit(bbsCfg.inetInterface, DataPort);
|
||||||
|
|
||||||
DataSocket := WaitSock.WaitConnection(10000);
|
DataSocket := WaitSock.WaitConnection(10000);
|
||||||
|
|
||||||
|
@ -1151,7 +1151,7 @@ Begin
|
||||||
Repeat
|
Repeat
|
||||||
{$IFDEF FTPDEBUG} LOG('Execute loop'); {$ENDIF}
|
{$IFDEF FTPDEBUG} LOG('Execute loop'); {$ENDIF}
|
||||||
|
|
||||||
If Client.WaitForData(bbsConfig.inetFTPTimeout * 1000) = 0 Then Break;
|
If Client.WaitForData(bbsCfg.inetFTPTimeout * 1000) = 0 Then Break;
|
||||||
|
|
||||||
If Terminated Then Exit;
|
If Terminated Then Exit;
|
||||||
|
|
||||||
|
|
|
@ -172,7 +172,7 @@ Begin
|
||||||
|
|
||||||
MBaseFile := TFileBuffer.Create(FileReadBuffer);
|
MBaseFile := TFileBuffer.Create(FileReadBuffer);
|
||||||
|
|
||||||
If MBaseFile.OpenStream (bbsConfig.DataPath + 'mbases.dat', SizeOf(TempBase), fmOpen, fmRWDN) Then Begin
|
If MBaseFile.OpenStream (bbsCfg.DataPath + 'mbases.dat', SizeOf(TempBase), fmOpen, fmRWDN) Then Begin
|
||||||
MBaseFile.ReadRecord (TempBase);
|
MBaseFile.ReadRecord (TempBase);
|
||||||
|
|
||||||
While Not MBaseFile.EOF Do Begin
|
While Not MBaseFile.EOF Do Begin
|
||||||
|
@ -237,7 +237,7 @@ Begin
|
||||||
|
|
||||||
MBaseFile := TFileBuffer.Create(FileReadBuffer);
|
MBaseFile := TFileBuffer.Create(FileReadBuffer);
|
||||||
|
|
||||||
If MBaseFile.OpenStream (bbsConfig.DataPath + 'mbases.dat', SizeOf(TempBase), fmOpen, fmRWDN) Then Begin
|
If MBaseFile.OpenStream (bbsCfg.DataPath + 'mbases.dat', SizeOf(TempBase), fmOpen, fmRWDN) Then Begin
|
||||||
MBaseFile.ReadRecord (TempBase);
|
MBaseFile.ReadRecord (TempBase);
|
||||||
|
|
||||||
While Not MBaseFile.EOF Do Begin
|
While Not MBaseFile.EOF Do Begin
|
||||||
|
@ -359,7 +359,7 @@ Begin
|
||||||
Found := False;
|
Found := False;
|
||||||
MBaseFile := TBufFile.Create(FileReadBuffer);
|
MBaseFile := TBufFile.Create(FileReadBuffer);
|
||||||
|
|
||||||
If MBaseFile.Open(bbsConfig.DataPath + 'mbases.dat', fmOpen, fmRWDN, SizeOf(RecMessageBase)) Then Begin
|
If MBaseFile.Open(bbsCfg.DataPath + 'mbases.dat', fmOpen, fmRWDN, SizeOf(RecMessageBase)) Then Begin
|
||||||
MBaseFile.Read(TempBase);
|
MBaseFile.Read(TempBase);
|
||||||
|
|
||||||
While Not MBaseFile.EOF Do Begin
|
While Not MBaseFile.EOF Do Begin
|
||||||
|
@ -430,8 +430,8 @@ Begin
|
||||||
MsgBase^.SetMailType(mmtEchoMail);
|
MsgBase^.SetMailType(mmtEchoMail);
|
||||||
|
|
||||||
Case TempBase.NetType of
|
Case TempBase.NetType of
|
||||||
1 : Assign (SemFile, bbsConfig.SemaPath + fn_SemFileEcho);
|
1 : Assign (SemFile, bbsCfg.SemaPath + fn_SemFileEcho);
|
||||||
2 : Assign (SemFile, bbsConfig.SemaPath + fn_SemFileNews);
|
2 : Assign (SemFile, bbsCfg.SemaPath + fn_SemFileNews);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
ReWrite (SemFile);
|
ReWrite (SemFile);
|
||||||
|
@ -547,7 +547,7 @@ Begin
|
||||||
|
|
||||||
// ignore groups and check postacs in loop instead of below?
|
// ignore groups and check postacs in loop instead of below?
|
||||||
|
|
||||||
Assign (MBaseFile, bbsConfig.DataPath + 'mbases.dat');
|
Assign (MBaseFile, bbsCfg.DataPath + 'mbases.dat');
|
||||||
|
|
||||||
If ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Begin
|
If ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Begin
|
||||||
ioRead (MBaseFile, TempBase);
|
ioRead (MBaseFile, TempBase);
|
||||||
|
@ -785,7 +785,7 @@ Begin
|
||||||
ClientWriteLine(re_Greeting);
|
ClientWriteLine(re_Greeting);
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
If Client.WaitForData(bbsConfig.inetNNTPTimeout * 1000) = 0 Then Break;
|
If Client.WaitForData(bbsCfg.inetNNTPTimeout * 1000) = 0 Then Break;
|
||||||
|
|
||||||
If Terminated Then Exit;
|
If Terminated Then Exit;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{$I M_OPS.PAS}
|
|
||||||
|
|
||||||
Unit MIS_Client_POP3;
|
Unit MIS_Client_POP3;
|
||||||
|
|
||||||
|
{$I M_OPS.PAS}
|
||||||
|
|
||||||
// RFC 1939
|
// RFC 1939
|
||||||
// optional TOP and APOP not implemented
|
// optional TOP and APOP not implemented
|
||||||
// needs to reformat long messages > 79 chars?
|
// needs to reformat long messages > 79 chars?
|
||||||
|
@ -23,7 +23,8 @@ Uses
|
||||||
BBS_MsgBase_ABS,
|
BBS_MsgBase_ABS,
|
||||||
BBS_MsgBase_JAM,
|
BBS_MsgBase_JAM,
|
||||||
BBS_MsgBase_Squish,
|
BBS_MsgBase_Squish,
|
||||||
BBS_Records;
|
BBS_Records,
|
||||||
|
BBS_DataBase;
|
||||||
|
|
||||||
Function CreatePOP3 (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TIOSocket) : TServerClient;
|
Function CreatePOP3 (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TIOSocket) : TServerClient;
|
||||||
|
|
||||||
|
@ -181,7 +182,7 @@ Var
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Begin
|
Begin
|
||||||
Assign (MBaseFile, bbsConfig.DataPath + 'mbases.dat');
|
Assign (MBaseFile, bbsCfg.DataPath + 'mbases.dat');
|
||||||
|
|
||||||
If Not ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Exit;
|
If Not ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Exit;
|
||||||
|
|
||||||
|
@ -216,9 +217,9 @@ Begin
|
||||||
MailInfo[MailSize].Text := TStringList.Create;
|
MailInfo[MailSize].Text := TStringList.Create;
|
||||||
|
|
||||||
AddLine ('Date: ' + ParseDateTime(MsgBase^.GetDate, MsgBase^.GetTime));
|
AddLine ('Date: ' + ParseDateTime(MsgBase^.GetDate, MsgBase^.GetTime));
|
||||||
AddLine ('From: ' + MsgBase^.GetFrom + ' <' + strReplace(MsgBase^.GetFrom, ' ', '_') + '@' + bbsConfig.inetDomain + '>');
|
AddLine ('From: ' + MsgBase^.GetFrom + ' <' + strReplace(MsgBase^.GetFrom, ' ', '_') + '@' + bbsCfg.inetDomain + '>');
|
||||||
AddLine ('X-Mailer: Mystic BBS ' + mysVersion);
|
AddLine ('X-Mailer: Mystic BBS ' + mysVersion);
|
||||||
AddLine ('To: ' + MsgBase^.GetTo + ' <' + strReplace(MsgBase^.GetTo, ' ', '_') + '@' + bbsConfig.inetDomain + '>');
|
AddLine ('To: ' + MsgBase^.GetTo + ' <' + strReplace(MsgBase^.GetTo, ' ', '_') + '@' + bbsCfg.inetDomain + '>');
|
||||||
AddLine ('Subject: ' + MsgBase^.GetSubj);
|
AddLine ('Subject: ' + MsgBase^.GetSubj);
|
||||||
AddLine ('Content-Type: text/plain; charset=us-ascii');
|
AddLine ('Content-Type: text/plain; charset=us-ascii');
|
||||||
AddLine ('');
|
AddLine ('');
|
||||||
|
@ -246,7 +247,7 @@ Var
|
||||||
MBase : RecMessageBase;
|
MBase : RecMessageBase;
|
||||||
MsgBase : PMsgBaseABS;
|
MsgBase : PMsgBaseABS;
|
||||||
Begin
|
Begin
|
||||||
Assign (MBaseFile, bbsConfig.DataPath + 'mbases.dat');
|
Assign (MBaseFile, bbsCfg.DataPath + 'mbases.dat');
|
||||||
|
|
||||||
If Not ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Exit;
|
If Not ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Exit;
|
||||||
|
|
||||||
|
@ -267,7 +268,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
|
|
||||||
For Count := 1 to MailSize Do Begin
|
For Count := 1 to MailSize Do Begin
|
||||||
If MailInfo[Count].Deleted or (MailInfo[Count].GotRETR and bbsConfig.inetPOP3Delete) Then Begin
|
If MailInfo[Count].Deleted or (MailInfo[Count].GotRETR and bbsCfg.inetPOP3Delete) Then Begin
|
||||||
MsgBase^.SeekFirst(1);
|
MsgBase^.SeekFirst(1);
|
||||||
|
|
||||||
While MsgBase^.SeekFound Do Begin
|
While MsgBase^.SeekFound Do Begin
|
||||||
|
@ -457,7 +458,7 @@ Begin
|
||||||
Client.WriteLine(re_Greeting);
|
Client.WriteLine(re_Greeting);
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
If Client.WaitForData(bbsConfig.inetPOP3TimeOut * 1000) = 0 Then Break;
|
If Client.WaitForData(bbsCfg.inetPOP3TimeOut * 1000) = 0 Then Break;
|
||||||
|
|
||||||
If Terminated Then Exit;
|
If Terminated Then Exit;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,8 @@ Uses
|
||||||
MIS_Server,
|
MIS_Server,
|
||||||
MIS_NodeData,
|
MIS_NodeData,
|
||||||
MIS_Common,
|
MIS_Common,
|
||||||
BBS_Records;
|
BBS_Records,
|
||||||
|
BBS_DataBase;
|
||||||
|
|
||||||
Function CreateSMTP (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TIOSocket) : TServerClient;
|
Function CreateSMTP (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TIOSocket) : TServerClient;
|
||||||
|
|
||||||
|
@ -89,7 +90,7 @@ Begin
|
||||||
If IsFrom Then
|
If IsFrom Then
|
||||||
Server.Status(ProcessID, 'User: ' + InName + ' Domain: ' + InDomain);
|
Server.Status(ProcessID, 'User: ' + InName + ' Domain: ' + InDomain);
|
||||||
|
|
||||||
If InDomain <> bbsConfig.iNetDomain Then Begin
|
If InDomain <> bbsCfg.iNetDomain Then Begin
|
||||||
Server.Status(ProcessID, 'Refused by domain: ' + InName + '@' + InDomain);
|
Server.Status(ProcessID, 'Refused by domain: ' + InName + '@' + InDomain);
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
@ -114,7 +115,7 @@ End;
|
||||||
|
|
||||||
Procedure TSMTPServer.cmdHELO;
|
Procedure TSMTPServer.cmdHELO;
|
||||||
Begin
|
Begin
|
||||||
Client.WriteLine('250 ' + bbsConfig.inetDomain);
|
Client.WriteLine('250 ' + bbsCfg.inetDomain);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure TSMTPServer.cmdRSET;
|
Procedure TSMTPServer.cmdRSET;
|
||||||
|
@ -209,7 +210,7 @@ Begin
|
||||||
MsgText.Add(InData);
|
MsgText.Add(InData);
|
||||||
Until False;
|
Until False;
|
||||||
|
|
||||||
Assign (MBaseFile, bbsConfig.DataPath + 'mbases.dat');
|
Assign (MBaseFile, bbsCfg.DataPath + 'mbases.dat');
|
||||||
ioReset (MBaseFile, SizeOf(RecMessageBase), fmRWDN);
|
ioReset (MBaseFile, SizeOf(RecMessageBase), fmRWDN);
|
||||||
ioRead (MBaseFile, MBase);
|
ioRead (MBaseFile, MBase);
|
||||||
Close (MBaseFile);
|
Close (MBaseFile);
|
||||||
|
@ -295,10 +296,10 @@ Var
|
||||||
Begin
|
Begin
|
||||||
ResetSession;
|
ResetSession;
|
||||||
|
|
||||||
Client.WriteLine('220 ' + bbsConfig.iNetDomain + ' Mystic SMTP Ready');
|
Client.WriteLine('220 ' + bbsCfg.iNetDomain + ' Mystic SMTP Ready');
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
If Client.WaitForData(bbsConfig.inetSMTPTimeout * 1000) = 0 Then Break;
|
If Client.WaitForData(bbsCfg.inetSMTPTimeout * 1000) = 0 Then Break;
|
||||||
|
|
||||||
If Terminated Then Exit;
|
If Terminated Then Exit;
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ Uses
|
||||||
MIS_Common,
|
MIS_Common,
|
||||||
MIS_NodeData,
|
MIS_NodeData,
|
||||||
MIS_Server,
|
MIS_Server,
|
||||||
BBS_Records;
|
BBS_Records,
|
||||||
|
BBS_DataBase;
|
||||||
|
|
||||||
{$IFDEF USEFORK}
|
{$IFDEF USEFORK}
|
||||||
function forkpty(__amaster:Plongint; __name:Pchar; __termp:Pointer; __winp:Pointer):longint;cdecl;external 'c' name 'forkpty';
|
function forkpty(__amaster:Plongint; __name:Pchar; __termp:Pointer; __winp:Pointer):longint;cdecl;external 'c' name 'forkpty';
|
||||||
|
@ -108,7 +109,7 @@ Begin
|
||||||
|
|
||||||
SI.dwFlags := STARTF_USESHOWWINDOW;
|
SI.dwFlags := STARTF_USESHOWWINDOW;
|
||||||
|
|
||||||
If bbsConfig.inetTNHidden Then
|
If bbsCfg.inetTNHidden Then
|
||||||
SI.wShowWindow := SW_HIDE
|
SI.wShowWindow := SW_HIDE
|
||||||
Else
|
Else
|
||||||
SI.wShowWindow := SW_SHOWMINNOACTIVE;
|
SI.wShowWindow := SW_SHOWMINNOACTIVE;
|
||||||
|
@ -124,7 +125,7 @@ Begin
|
||||||
|
|
||||||
ND.SetNodeInfo(Num, NI);
|
ND.SetNodeInfo(Num, NI);
|
||||||
|
|
||||||
FileErase (bbsConfig.DataPath + 'chat' + strI2S(Num) + '.dat');
|
FileErase (bbsCfg.DataPath + 'chat' + strI2S(Num) + '.dat');
|
||||||
End;
|
End;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
|
@ -6,19 +6,18 @@ Interface
|
||||||
|
|
||||||
Uses
|
Uses
|
||||||
m_Output,
|
m_Output,
|
||||||
m_Term_Ansi,
|
// m_Term_Ansi,
|
||||||
BBS_Records;
|
BBS_Records,
|
||||||
|
BBS_DataBase;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
TempPath : String;
|
TempPath : String;
|
||||||
// Console : TOutput;
|
// Term : TTermAnsi;
|
||||||
Term : TTermAnsi;
|
|
||||||
bbsConfig : RecConfig;
|
|
||||||
|
|
||||||
Function SearchForUser (UN: String; Var Rec: RecUser; Var RecPos: LongInt) : Boolean;
|
Function SearchForUser (UN: String; Var Rec: RecUser; Var RecPos: LongInt) : Boolean;
|
||||||
Function CheckAccess (User: RecUser; IgnoreGroup: Boolean; Str: String) : Boolean;
|
Function CheckAccess (User: RecUser; IgnoreGroup: Boolean; Str: String) : Boolean;
|
||||||
Function GetSecurityLevel (Level: Byte; SecLevel: RecSecurity) : Boolean;
|
Function GetSecurityLevel (Level: Byte; SecLevel: RecSecurity) : Boolean;
|
||||||
Function strAddr2Str (Addr : RecEchoMailAddr) : String;
|
//Function strAddr2Str (Addr : RecEchoMailAddr) : String;
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
|
||||||
|
@ -38,7 +37,7 @@ Begin
|
||||||
|
|
||||||
UserFile := TFileBuffer.Create (8 * 1024);
|
UserFile := TFileBuffer.Create (8 * 1024);
|
||||||
|
|
||||||
If UserFile.OpenStream (bbsConfig.DataPath + 'users.dat', SizeOf(RecUser), fmOpen, fmRWDN) Then
|
If UserFile.OpenStream (bbsCfg.DataPath + 'users.dat', SizeOf(RecUser), fmOpen, fmRWDN) Then
|
||||||
While Not UserFile.EOF Do Begin
|
While Not UserFile.EOF Do Begin
|
||||||
UserFile.ReadRecord (Rec);
|
UserFile.ReadRecord (Rec);
|
||||||
|
|
||||||
|
@ -203,7 +202,7 @@ Var
|
||||||
Begin
|
Begin
|
||||||
Result := False;
|
Result := False;
|
||||||
|
|
||||||
Assign (SecLevelFile, bbsConfig.DataPath + 'security.dat');
|
Assign (SecLevelFile, bbsCfg.DataPath + 'security.dat');
|
||||||
|
|
||||||
If Not ioReset (SecLevelFile, SizeOf(SecLevel), fmRWDN) Then Exit;
|
If Not ioReset (SecLevelFile, SizeOf(SecLevel), fmRWDN) Then Exit;
|
||||||
|
|
||||||
|
@ -214,6 +213,7 @@ Begin
|
||||||
Result := True;
|
Result := True;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
(*
|
||||||
Function strAddr2Str (Addr : RecEchoMailAddr) : String;
|
Function strAddr2Str (Addr : RecEchoMailAddr) : String;
|
||||||
Var
|
Var
|
||||||
Temp : String[20];
|
Temp : String[20];
|
||||||
|
@ -225,5 +225,5 @@ Begin
|
||||||
|
|
||||||
Result := Temp;
|
Result := Temp;
|
||||||
End;
|
End;
|
||||||
|
*)
|
||||||
End.
|
End.
|
||||||
|
|
|
@ -7,6 +7,7 @@ Unit MIS_NodeData;
|
||||||
Interface
|
Interface
|
||||||
|
|
||||||
Uses
|
Uses
|
||||||
|
BBS_DataBase,
|
||||||
MIS_Common;
|
MIS_Common;
|
||||||
|
|
||||||
Type
|
Type
|
||||||
|
@ -50,7 +51,7 @@ Begin
|
||||||
For Count := 1 to NodeTotal Do Begin
|
For Count := 1 to NodeTotal Do Begin
|
||||||
GetNodeInfo (Count, NI);
|
GetNodeInfo (Count, NI);
|
||||||
|
|
||||||
Assign (ChatFile, bbsConfig.DataPath + 'chat' + strI2S(NI.Num) + '.dat');
|
Assign (ChatFile, bbsCfg.DataPath + 'chat' + strI2S(NI.Num) + '.dat');
|
||||||
|
|
||||||
If ioReset(ChatFile, SizeOf(ChatRec), fmRWDN) Then Begin
|
If ioReset(ChatFile, SizeOf(ChatRec), fmRWDN) Then Begin
|
||||||
ioRead (ChatFile, Chat);
|
ioRead (ChatFile, Chat);
|
||||||
|
|
|
@ -271,19 +271,21 @@ Var
|
||||||
While Not MsgBase^.EOM Do
|
While Not MsgBase^.EOM Do
|
||||||
WriteStr (MsgBase^.GetString(79), #13);
|
WriteStr (MsgBase^.GetString(79), #13);
|
||||||
|
|
||||||
// SEEN-BY needs to include yourself and ANYTHING it is sent to (downlinks)
|
If MBase.NetType <> 3 Then Begin
|
||||||
// so we need to cycle through nodes for this mbase and add ALL of them
|
// SEEN-BY needs to include yourself and ANYTHING it is sent to (downlinks)
|
||||||
|
// so we need to cycle through nodes for this mbase and add ALL of them
|
||||||
|
|
||||||
TempStr1 := 'SEEN-BY: ' + strI2S(MsgBase^.GetOrigAddr.Net) + '/' + strI2S(MsgBase^.GetOrigAddr.Node) + ' ';
|
TempStr1 := 'SEEN-BY: ' + strI2S(MsgBase^.GetOrigAddr.Net) + '/' + strI2S(MsgBase^.GetOrigAddr.Node) + ' ';
|
||||||
|
|
||||||
If MsgBase^.GetOrigAddr.Net <> EchoNode.Address.Net Then
|
If MsgBase^.GetOrigAddr.Net <> EchoNode.Address.Net Then
|
||||||
TempStr1 := TempStr1 + strI2S(EchoNode.Address.Net) + '/';
|
TempStr1 := TempStr1 + strI2S(EchoNode.Address.Net) + '/';
|
||||||
|
|
||||||
TempStr1 := TempStr1 + strI2S(EchoNode.Address.Node);
|
TempStr1 := TempStr1 + strI2S(EchoNode.Address.Node);
|
||||||
|
|
||||||
WriteStr (TempStr1, #13);
|
WriteStr (TempStr1, #13);
|
||||||
WriteStr (#1 + 'PATH: ' + strI2S(MsgBase^.GetOrigAddr.Net) + '/' + strI2S(MsgBase^.GetOrigAddr.Node), #13);
|
WriteStr (#1 + 'PATH: ' + strI2S(MsgBase^.GetOrigAddr.Net) + '/' + strI2S(MsgBase^.GetOrigAddr.Node), #13);
|
||||||
WriteStr (#0#0, #0);
|
WriteStr (#0#0, #0);
|
||||||
|
End;
|
||||||
|
|
||||||
Close (F);
|
Close (F);
|
||||||
End;
|
End;
|
||||||
|
@ -381,4 +383,4 @@ Begin
|
||||||
FileErase (bbsCfg.SemaPath + fn_SemFileEchoOut);
|
FileErase (bbsCfg.SemaPath + fn_SemFileEchoOut);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
End.
|
End.
|
||||||
|
|
|
@ -3770,8 +3770,8 @@
|
||||||
process each PKT or bundle in order.
|
process each PKT or bundle in order.
|
||||||
|
|
||||||
+ When tossing an ECHOMAIL bundle, Mystic will now extract the bundle and
|
+ When tossing an ECHOMAIL bundle, Mystic will now extract the bundle and
|
||||||
then sort the contents of the bundle by filedate and secondly by filename
|
then sort the contents of the bundle by filedate and secondly by filename,
|
||||||
and process each PKT in the sorted order.
|
then process each PKT in the sorted order.
|
||||||
|
|
||||||
+ The message base editor now has a new function /R (Reset messages). This
|
+ The message base editor now has a new function /R (Reset messages). This
|
||||||
will take a single base or a selection of tagged bases and remove ALL
|
will take a single base or a selection of tagged bases and remove ALL
|
||||||
|
@ -3787,4 +3787,17 @@
|
||||||
the header and INTL kludge. This could cause tossers to not correctly
|
the header and INTL kludge. This could cause tossers to not correctly
|
||||||
reroute netmail to the correct destination.
|
reroute netmail to the correct destination.
|
||||||
|
|
||||||
|
! Fixed a bug in BINKP protocol on the client side where the client was not
|
||||||
|
sending the proper SKIP filesize back to the server. With BINKD this
|
||||||
|
could cause the BINKD server to just wait until the session times out
|
||||||
|
instead of sending EOB.
|
||||||
|
|
||||||
|
+ FIDOPOLL can now poll a single node by the address. IE:
|
||||||
|
fidopoll 46:1/100
|
||||||
|
|
||||||
|
+ FIDOPOLL now logs to "fidopoll.log" in the logs directory.
|
||||||
|
|
||||||
|
! SEEN-BY and PATH kludge lines are no longer added to exported netmail
|
||||||
|
messages.
|
||||||
|
|
||||||
<ALPHA 38 RELEASED>
|
<ALPHA 38 RELEASED>
|
||||||
|
|
Loading…
Reference in New Issue