Lots of stuff
This commit is contained in:
parent
dd87ac4e08
commit
0bbc3aeeb9
|
@ -74,6 +74,7 @@ Var
|
||||||
1 : OS := 'Linux ';
|
1 : OS := 'Linux ';
|
||||||
2 : OS := 'OSX ';
|
2 : OS := 'OSX ';
|
||||||
3 : OS := 'All ';
|
3 : OS := 'All ';
|
||||||
|
4 : OS := 'OS/2 ';
|
||||||
End;
|
End;
|
||||||
|
|
||||||
List.Add (strPadR(YesNoStr[Arc.Active], 5, ' ') + strPadR(Arc.Ext, 7, ' ') + OS + ' ' + Arc.Desc, 0);
|
List.Add (strPadR(YesNoStr[Arc.Active], 5, ' ') + strPadR(Arc.Ext, 7, ' ') + OS + ' ' + Arc.Desc, 0);
|
||||||
|
|
|
@ -157,7 +157,7 @@ Begin
|
||||||
Form.AddStr ('D', ' Description' , 6, 7, 21, 7, 13, 23, 35, @Node.Description, Topic + 'Node description');
|
Form.AddStr ('D', ' Description' , 6, 7, 21, 7, 13, 23, 35, @Node.Description, Topic + 'Node description');
|
||||||
Form.AddBol ('A', ' Active' , 11, 8, 21, 8, 8, 3, @Node.Active, Topic + 'Is node active?');
|
Form.AddBol ('A', ' Active' , 11, 8, 21, 8, 8, 3, @Node.Active, Topic + 'Is node active?');
|
||||||
Form.AddStr ('R', ' Archive Type' , 5, 9, 21, 9, 14, 4, 4, @Node.ArcType, Topic + 'Archive type for packets');
|
Form.AddStr ('R', ' Archive Type' , 5, 9, 21, 9, 14, 4, 4, @Node.ArcType, Topic + 'Archive type for packets');
|
||||||
Form.AddTog ('E', ' Network Type' , 5, 10, 21, 10, 14, 7, 0, 1, 'FidoNet QWK', @Node.NetType, Topic);
|
// Form.AddTog ('E', ' Network Type' , 5, 10, 21, 10, 14, 7, 0, 1, 'FidoNet QWK', @Node.NetType, Topic);
|
||||||
Form.AddTog ('L', ' Session Type' , 5, 11, 21, 11, 14, 5, 0, 1, 'BinkP FTP', @Node.ProtType, Topic);
|
Form.AddTog ('L', ' Session Type' , 5, 11, 21, 11, 14, 5, 0, 1, 'BinkP FTP', @Node.ProtType, Topic);
|
||||||
Form.AddTog ('Y', ' Export Type' , 6, 12, 21, 12, 13, 6, 0, 3, 'Normal Crash Direct Hold', @Node.MailType, Topic);
|
Form.AddTog ('Y', ' Export Type' , 6, 12, 21, 12, 13, 6, 0, 3, 'Normal Crash Direct Hold', @Node.MailType, Topic);
|
||||||
Form.AddStr ('W', ' *Fix Password', 4, 13, 21, 13, 15, 20, 20, @Node.AreaFixPass, Topic + 'Password required for Area/FileFix');
|
Form.AddStr ('W', ' *Fix Password', 4, 13, 21, 13, 15, 20, 20, @Node.AreaFixPass, Topic + 'Password required for Area/FileFix');
|
||||||
|
|
|
@ -200,6 +200,9 @@ Var
|
||||||
Write (FBaseFile, FBase);
|
Write (FBaseFile, FBase);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
Var
|
||||||
|
KillData : Boolean;
|
||||||
|
Count : LongInt;
|
||||||
Begin
|
Begin
|
||||||
Assign (FBaseFile, bbsCfg.DataPath + 'fbases.dat');
|
Assign (FBaseFile, bbsCfg.DataPath + 'fbases.dat');
|
||||||
|
|
||||||
|
@ -235,7 +238,28 @@ Begin
|
||||||
InsertRecord;
|
InsertRecord;
|
||||||
MakeList;
|
MakeList;
|
||||||
End;
|
End;
|
||||||
'D' : If (List.Picked < List.ListMax) Then
|
'D' : If List.Marked > 0 Then Begin
|
||||||
|
If ShowMsgBox(1, 'Delete ' + strI2S(List.Marked) + ' bases?') Then Begin
|
||||||
|
KillData := ShowMsgBox(1, 'Delete data files for ' + strI2S(List.Marked) + ' bases?');
|
||||||
|
|
||||||
|
For Count := List.ListMax DownTo 1 Do
|
||||||
|
If List.List[Count].Tagged = 1 Then Begin
|
||||||
|
Seek (FBaseFile, Count - 1);
|
||||||
|
Read (FBaseFile, FBase);
|
||||||
|
|
||||||
|
KillRecord (FBaseFile, Count, SizeOf(FBase));
|
||||||
|
|
||||||
|
If KillData Then Begin
|
||||||
|
FileErase (bbsCfg.DataPath + FBase.FileName + '.dir');
|
||||||
|
FileErase (bbsCfg.DataPath + FBase.FileName + '.dat');
|
||||||
|
FileErase (bbsCfg.DataPath + FBase.FileName + '.scn');
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
MakeList;
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
If (List.Picked < List.ListMax) Then
|
||||||
If ShowMsgBox(1, 'Delete this entry?') Then Begin
|
If ShowMsgBox(1, 'Delete this entry?') Then Begin
|
||||||
Seek (FBaseFile, List.Picked - 1);
|
Seek (FBaseFile, List.Picked - 1);
|
||||||
Read (FBaseFile, FBase);
|
Read (FBaseFile, FBase);
|
||||||
|
|
|
@ -159,7 +159,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
1 : Begin
|
1 : Begin
|
||||||
BoxOpen (4, 4, 33, 17);
|
BoxOpen (4, 4, 33, 18);
|
||||||
CoolBoxOpen (3, 'Configuration');
|
CoolBoxOpen (3, 'Configuration');
|
||||||
|
|
||||||
Form.AddNone ('S', ' S System Paths', 5, 5, 5, 5, 28, '');
|
Form.AddNone ('S', ' S System Paths', 5, 5, 5, 5, 28, '');
|
||||||
|
@ -172,8 +172,9 @@ Begin
|
||||||
Form.AddNone ('M', ' M Message Base Settings', 5, 12, 5, 12, 28, '');
|
Form.AddNone ('M', ' M Message Base Settings', 5, 12, 5, 12, 28, '');
|
||||||
Form.AddNone ('E', ' E EchoMail Addresses', 5, 13, 5, 13, 28, '');
|
Form.AddNone ('E', ' E EchoMail Addresses', 5, 13, 5, 13, 28, '');
|
||||||
Form.AddNone ('N', ' N EchoMail Nodes', 5, 14, 5, 14, 28, '');
|
Form.AddNone ('N', ' N EchoMail Nodes', 5, 14, 5, 14, 28, '');
|
||||||
Form.AddNone ('O', ' O Offline Mail Settings', 5, 15, 5, 15, 28, '');
|
Form.AddNone ('Q', ' Q QWK Networking', 5, 15, 5, 15, 28, '');
|
||||||
Form.AddNone ('C', ' C Console Settings', 5, 16, 5, 16, 28, '');
|
Form.AddNone ('O', ' O Local QWK Settings', 5, 16, 5, 16, 28, '');
|
||||||
|
Form.AddNone ('C', ' C Console Settings', 5, 17, 5, 17, 28, '');
|
||||||
|
|
||||||
Res := Form.Execute;
|
Res := Form.Execute;
|
||||||
MenuPos[1] := Form.ItemPos;
|
MenuPos[1] := Form.ItemPos;
|
||||||
|
@ -205,7 +206,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
2 : Begin
|
2 : Begin
|
||||||
BoxOpen (25, 4, 53, 13);
|
BoxOpen (25, 4, 53, 12);
|
||||||
CoolBoxOpen (24, 'Servers');
|
CoolBoxOpen (24, 'Servers');
|
||||||
|
|
||||||
Form.AddNone ('I', ' I Internet Server Options', 26, 5, 26, 5, 27, '');
|
Form.AddNone ('I', ' I Internet Server Options', 26, 5, 26, 5, 27, '');
|
||||||
|
|
|
@ -74,6 +74,7 @@ Var
|
||||||
1 : OS := 'Linux ';
|
1 : OS := 'Linux ';
|
||||||
2 : OS := 'OSX';
|
2 : OS := 'OSX';
|
||||||
3 : OS := 'All';
|
3 : OS := 'All';
|
||||||
|
4 : OS := 'OS/2';
|
||||||
End;
|
End;
|
||||||
|
|
||||||
//'Active OSID Batch Key Description');
|
//'Active OSID Batch Key Description');
|
||||||
|
|
|
@ -286,7 +286,7 @@ Begin
|
||||||
Form.AddStr ('D', ' Domain', 23, 11, 33, 11, 8, 25, 25, @bbsCfg.inetDomain, Topic + 'Internet domain name');
|
Form.AddStr ('D', ' Domain', 23, 11, 33, 11, 8, 25, 25, @bbsCfg.inetDomain, Topic + 'Internet domain name');
|
||||||
Form.AddStr ('I', ' Interface', 20, 12, 33, 12, 11, 23, 23, @bbsCfg.inetInterface, Topic + 'Network interface IP address');
|
Form.AddStr ('I', ' Interface', 20, 12, 33, 12, 11, 23, 23, @bbsCfg.inetInterface, Topic + 'Network interface IP address');
|
||||||
Form.AddBol ('B', ' IP Blocking', 18, 13, 33, 13, 13, 3, @bbsCfg.inetIPBlocking, Topic + 'Enable IP blocking');
|
Form.AddBol ('B', ' IP Blocking', 18, 13, 33, 13, 13, 3, @bbsCfg.inetIPBlocking, Topic + 'Enable IP blocking');
|
||||||
Form.AddBol ('L', ' Logging', 22, 14, 33, 14, 12, 3, @bbsCfg.inetLogging, Topic + 'Enable server logging');
|
Form.AddBol ('L', ' Logging', 22, 14, 33, 14, 9, 3, @bbsCfg.inetLogging, Topic + 'Enable server logging');
|
||||||
|
|
||||||
Form.Execute;
|
Form.Execute;
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,7 @@ Function TBBSCore.TimeLeft : Integer;
|
||||||
Begin
|
Begin
|
||||||
If Not TimerOn Then Begin
|
If Not TimerOn Then Begin
|
||||||
TimeLeft := 0;
|
TimeLeft := 0;
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,17 @@
|
||||||
Unit BBS_DataBase;
|
Unit BBS_DataBase;
|
||||||
|
|
||||||
|
// for all functions... need to go through code and remove old stuff and
|
||||||
|
// replace with this new stuff one at a time. including moving everything
|
||||||
|
// to bbscfg.
|
||||||
|
|
||||||
{$I M_OPS.PAS}
|
{$I M_OPS.PAS}
|
||||||
|
|
||||||
Interface
|
Interface
|
||||||
|
|
||||||
Uses
|
Uses
|
||||||
|
m_Types,
|
||||||
|
m_Output,
|
||||||
|
m_Input,
|
||||||
BBS_Records,
|
BBS_Records,
|
||||||
BBS_MsgBase_ABS,
|
BBS_MsgBase_ABS,
|
||||||
BBS_MsgBase_JAM,
|
BBS_MsgBase_JAM,
|
||||||
|
@ -14,17 +21,22 @@ Var
|
||||||
bbsCfg : RecConfig;
|
bbsCfg : RecConfig;
|
||||||
bbsCfgPath : String;
|
bbsCfgPath : String;
|
||||||
bbsCfgStatus : Byte;
|
bbsCfgStatus : Byte;
|
||||||
|
Console : TOutput = NIL;
|
||||||
|
Keyboard : TInput = NIL;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
CfgOK = 0;
|
CfgOK = 0;
|
||||||
CfgNotFound = 1;
|
CfgNotFound = 1;
|
||||||
CfgMisMatch = 2;
|
CfgMisMatch = 2;
|
||||||
|
|
||||||
|
Type
|
||||||
|
FileDescBuffer = Array[1..99] of String[50];
|
||||||
|
|
||||||
// GENERAL
|
// GENERAL
|
||||||
|
|
||||||
Function GetBaseConfiguration (UseEnv: Boolean; Var TempCfg: RecConfig) : Byte;
|
Function GetBaseConfiguration (UseEnv: Boolean; Var TempCfg: RecConfig) : Byte;
|
||||||
Function PutBaseConfiguration (Var TempCfg: RecConfig) : Boolean;
|
Function PutBaseConfiguration (Var TempCfg: RecConfig) : Boolean;
|
||||||
Function ShellDOS (ExecPath: String; Command: String) : LongInt;
|
Function ExecuteProgram (ExecPath: String; Command: String) : LongInt;
|
||||||
Function Addr2Str (Addr : RecEchoMailAddr) : String;
|
Function Addr2Str (Addr : RecEchoMailAddr) : String;
|
||||||
|
|
||||||
// MESSAGE BASE
|
// MESSAGE BASE
|
||||||
|
@ -40,6 +52,8 @@ Procedure MBaseAssignData (Var User: RecUser; Var Msg: PMsgBaseABS; Var Te
|
||||||
|
|
||||||
Procedure ExecuteArchive (TempP: String; FName: String; Temp: String; Mask: String; Mode: Byte);
|
Procedure ExecuteArchive (TempP: String; FName: String; Temp: String; Mask: String; Mode: Byte);
|
||||||
Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt;
|
Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt;
|
||||||
|
Function IsDuplicateFile (Base: RecFileBase; FileName: String; Global: Boolean) : Boolean;
|
||||||
|
Function ImportFileDIZ (Var Desc: FileDescBuffer; Var DescLines: Byte; TempP, FN: String) : Boolean;
|
||||||
|
|
||||||
// USER
|
// USER
|
||||||
|
|
||||||
|
@ -174,10 +188,14 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function ShellDOS (ExecPath: String; Command: String) : LongInt;
|
Function ExecuteProgram (ExecPath: String; Command: String) : LongInt;
|
||||||
Var
|
Var
|
||||||
CurDIR : String;
|
CurDIR : String;
|
||||||
|
Image : TConsoleImageRec;
|
||||||
Begin
|
Begin
|
||||||
|
If Console <> NIL Then
|
||||||
|
Console.GetScreenImage(1, 1, 80, 25, Image);
|
||||||
|
|
||||||
GetDIR (0, CurDIR);
|
GetDIR (0, CurDIR);
|
||||||
|
|
||||||
If ExecPath <> '' Then DirChange(ExecPath);
|
If ExecPath <> '' Then DirChange(ExecPath);
|
||||||
|
@ -195,6 +213,9 @@ Begin
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
DirChange(CurDIR);
|
DirChange(CurDIR);
|
||||||
|
|
||||||
|
If Console <> NIL Then
|
||||||
|
Console.PutScreenImage(Image);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
|
Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
|
||||||
|
@ -412,7 +433,109 @@ Begin
|
||||||
Inc (Count);
|
Inc (Count);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
ShellDOS ('', Temp);
|
ExecuteProgram ('', Temp);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function IsDuplicateFile (Base: RecFileBase; FileName: String; Global: Boolean) : Boolean;
|
||||||
|
|
||||||
|
Procedure CheckOneArea;
|
||||||
|
Var
|
||||||
|
TempFile : TFileBuffer;
|
||||||
|
Temp : RecFileList;
|
||||||
|
Begin
|
||||||
|
TempFile := TFileBuffer.Create(8 * 1024);
|
||||||
|
|
||||||
|
If Not TempFile.OpenStream (bbsCfg.DataPath + Base.FileName + '.dir', SizeOf(RecFileList), fmOpen, fmRWDN) Then Begin
|
||||||
|
TempFile.Free;
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
While Not TempFile.EOF Do Begin
|
||||||
|
TempFile.ReadRecord(Temp);
|
||||||
|
|
||||||
|
{$IFDEF FS_SENSITIVE}
|
||||||
|
If (Temp.FileName = FileName) And (Temp.Flags And FDirDeleted = 0) Then Begin
|
||||||
|
{$ELSE}
|
||||||
|
If (strUpper(Temp.FileName) = strUpper(FileName)) And (Temp.Flags And FDirDeleted = 0) Then Begin
|
||||||
|
{$ENDIF}
|
||||||
|
Result := True;
|
||||||
|
|
||||||
|
Break;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
TempFile.Free;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Var
|
||||||
|
BaseFile : File;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
If Global Then Begin
|
||||||
|
Assign (BaseFile, bbsCfg.DataPath + 'fbases.dat');
|
||||||
|
|
||||||
|
If ioReset (BaseFile, SizeOf(RecFileBase), fmRWDN) Then Begin
|
||||||
|
While Not EOF(BaseFile) And Not Result Do Begin
|
||||||
|
ioRead (BaseFile, Base);
|
||||||
|
|
||||||
|
CheckOneArea;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close (BaseFile);
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
CheckOneArea;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function ImportFileDIZ (Var Desc: FileDescBuffer; Var DescLines: Byte; TempP, FN: String) : Boolean;
|
||||||
|
|
||||||
|
Procedure RemoveLine (Num: Byte);
|
||||||
|
Var
|
||||||
|
Count : Byte;
|
||||||
|
Begin
|
||||||
|
For Count := Num To DescLines - 1 Do
|
||||||
|
Desc[Count] := Desc[Count + 1];
|
||||||
|
|
||||||
|
Desc[DescLines] := '';
|
||||||
|
|
||||||
|
Dec (DescLines);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Var
|
||||||
|
DizFile : Text;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
DescLines := 0;
|
||||||
|
|
||||||
|
ExecuteArchive (TempP, FN, '', 'file_id.diz', 2);
|
||||||
|
|
||||||
|
Assign (DizFile, FileFind(TempP + 'file_id.diz'));
|
||||||
|
|
||||||
|
{$I-} Reset (DizFile); {$I+}
|
||||||
|
|
||||||
|
If IoResult = 0 Then Begin
|
||||||
|
While Not Eof(DizFile) Do Begin
|
||||||
|
Inc (DescLines);
|
||||||
|
ReadLn (DizFile, Desc[DescLines]);
|
||||||
|
|
||||||
|
Desc[DescLines] := strStripLow(Desc[DescLines]);
|
||||||
|
|
||||||
|
If DescLines = bbsCfg.MaxFileDesc Then Break;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close (DizFile);
|
||||||
|
Erase (DizFile);
|
||||||
|
|
||||||
|
While (Desc[1] = '') and (DescLines > 0) Do
|
||||||
|
RemoveLine(1);
|
||||||
|
|
||||||
|
While (Desc[DescLines] = '') And (DescLines > 0) Do
|
||||||
|
Dec (DescLines);
|
||||||
|
|
||||||
|
Result := True;
|
||||||
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Initialization
|
Initialization
|
||||||
|
|
|
@ -50,7 +50,8 @@ Uses
|
||||||
MIS_Client_FTP,
|
MIS_Client_FTP,
|
||||||
MIS_Client_NNTP,
|
MIS_Client_NNTP,
|
||||||
MIS_Client_BINKP,
|
MIS_Client_BINKP,
|
||||||
BBS_Records;
|
BBS_Records,
|
||||||
|
BBS_DataBase;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
FocusTelnet = 0;
|
FocusTelnet = 0;
|
||||||
|
|
|
@ -823,7 +823,7 @@ End;
|
||||||
|
|
||||||
Procedure Status (Owner: Pointer; Str: String);
|
Procedure Status (Owner: Pointer; Str: String);
|
||||||
Begin
|
Begin
|
||||||
TServerManager(Owner).Status(Str);
|
TServerManager(Owner).Status(-1, Str);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Constructor TBINKPServer.Create (Owner: TServerManager; CliSock: TIOSocket);
|
Constructor TBINKPServer.Create (Owner: TServerManager; CliSock: TIOSocket);
|
||||||
|
@ -857,7 +857,7 @@ Begin
|
||||||
|
|
||||||
QueueByNode(Queue, False, BinkP.EchoNode);
|
QueueByNode(Queue, False, BinkP.EchoNode);
|
||||||
|
|
||||||
Server.Status ('Queued ' + strI2S(Queue.QSize - Before) + ' files for ' + strAddr2Str(BinkP.EchoNode.Address));
|
Server.Status (ProcessID, 'Queued ' + strI2S(Queue.QSize - Before) + ' files for ' + strAddr2Str(BinkP.EchoNode.Address));
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
|
|
@ -447,7 +447,7 @@ Begin
|
||||||
|
|
||||||
If Not OpenDataSession Then Exit;
|
If Not OpenDataSession Then Exit;
|
||||||
|
|
||||||
Server.Status ('Receiving: ' + Str);
|
Server.Status (ProcessID, 'Receiving: ' + Str);
|
||||||
|
|
||||||
InTransfer := True;
|
InTransfer := True;
|
||||||
Result := True;
|
Result := True;
|
||||||
|
@ -455,10 +455,10 @@ Begin
|
||||||
Assign (F, Str);
|
Assign (F, Str);
|
||||||
|
|
||||||
If FileExist(Str) And IsAppend Then Begin
|
If FileExist(Str) And IsAppend Then Begin
|
||||||
Reset (F, 1);
|
ioReset (F, 1, fmRWDW);
|
||||||
Seek (F, FileSize(F));
|
Seek (F, FileSize(F));
|
||||||
End Else Begin
|
End Else Begin
|
||||||
ReWrite (F, 1);
|
ioReWrite (F, 1, fmRWDW);
|
||||||
|
|
||||||
IsAppend := False;
|
IsAppend := False;
|
||||||
End;
|
End;
|
||||||
|
@ -474,6 +474,8 @@ Begin
|
||||||
|
|
||||||
Close (F);
|
Close (F);
|
||||||
|
|
||||||
|
Server.Status(ProcessID, 'Receive complete');
|
||||||
|
|
||||||
If Result Then
|
If Result Then
|
||||||
Client.WriteLine (re_XferOK);
|
Client.WriteLine (re_XferOK);
|
||||||
|
|
||||||
|
@ -496,7 +498,7 @@ Begin
|
||||||
|
|
||||||
OpenDataSession;
|
OpenDataSession;
|
||||||
|
|
||||||
Server.Status('Sending: ' + Str);
|
Server.Status(ProcessID, 'Sending: ' + Str);
|
||||||
|
|
||||||
While Not Eof(F) Do Begin
|
While Not Eof(F) Do Begin
|
||||||
BlockRead (F, Buf, SizeOf(Buf), Res);
|
BlockRead (F, Buf, SizeOf(Buf), Res);
|
||||||
|
@ -510,6 +512,8 @@ Begin
|
||||||
|
|
||||||
Close (F);
|
Close (F);
|
||||||
|
|
||||||
|
Server.Status(ProcessID, 'Send complete');
|
||||||
|
|
||||||
Client.WriteLine (re_XferOK);
|
Client.WriteLine (re_XferOK);
|
||||||
|
|
||||||
CloseDataSession;
|
CloseDataSession;
|
||||||
|
@ -575,6 +579,7 @@ Begin
|
||||||
|
|
||||||
If SearchForUser(Data, User, UserPos) Then Begin
|
If SearchForUser(Data, User, UserPos) Then Begin
|
||||||
Client.WriteLine(re_UserOkay);
|
Client.WriteLine(re_UserOkay);
|
||||||
|
|
||||||
UserName := Data;
|
UserName := Data;
|
||||||
End Else
|
End Else
|
||||||
Client.WriteLine(re_UserUnknown);
|
Client.WriteLine(re_UserUnknown);
|
||||||
|
@ -594,7 +599,7 @@ Begin
|
||||||
|
|
||||||
GetSecurityLevel(User.Security, SecLevel);
|
GetSecurityLevel(User.Security, SecLevel);
|
||||||
|
|
||||||
Server.Status (User.Handle + ' logged in');
|
Server.Status (ProcessID, User.Handle + ' logged in');
|
||||||
End Else
|
End Else
|
||||||
Client.WriteLine(re_BadPW);
|
Client.WriteLine(re_BadPW);
|
||||||
End;
|
End;
|
||||||
|
@ -644,7 +649,7 @@ Begin
|
||||||
{$IFDEF FTPDEBUG}
|
{$IFDEF FTPDEBUG}
|
||||||
LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort));
|
LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort));
|
||||||
|
|
||||||
Server.Status(re_PassiveOK + '(' + strReplace(Client.HostIP, '.', ',') + ',' + strI2S(WordRec(DataPort).Hi) + ',' + strI2S(WordRec(DataPort).Lo) + ').');
|
Server.Status(ProcessID, re_PassiveOK + '(' + strReplace(Client.HostIP, '.', ',') + ',' + strI2S(WordRec(DataPort).Hi) + ',' + strI2S(WordRec(DataPort).Lo) + ').');
|
||||||
{$ENDIF}
|
{$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) + ').');
|
||||||
|
@ -845,6 +850,15 @@ Procedure TFTPServer.cmdSTOR (IsAppend: Boolean);
|
||||||
Var
|
Var
|
||||||
TempPos : LongInt;
|
TempPos : LongInt;
|
||||||
TempBase : RecFileBase;
|
TempBase : RecFileBase;
|
||||||
|
BaseFile : File;
|
||||||
|
CurDIR : String;
|
||||||
|
DizFile : Text;
|
||||||
|
Desc : FileDescBuffer;
|
||||||
|
DescSize : Byte;
|
||||||
|
Dir : RecFileList;
|
||||||
|
DirPos : LongInt = -1;
|
||||||
|
DesFile : File;
|
||||||
|
Count : Byte;
|
||||||
Begin
|
Begin
|
||||||
If Not LoggedIn Then Begin
|
If Not LoggedIn Then Begin
|
||||||
Client.WriteLine(re_BadCommand);
|
Client.WriteLine(re_BadCommand);
|
||||||
|
@ -861,30 +875,126 @@ Begin
|
||||||
TempPos := FindDirectory(TempBase);
|
TempPos := FindDirectory(TempBase);
|
||||||
|
|
||||||
If (TempPos = -1) Or Not ValidDirectory(TempBase) Then Begin
|
If (TempPos = -1) Or Not ValidDirectory(TempBase) Then Begin
|
||||||
|
Client.WriteLine(re_NoAccess + ': Directory not found');
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
If bbsCfg.UploadBase > 0 Then Begin
|
||||||
|
Assign (BaseFile, bbsCfg.DataPath + 'fbases.dat');
|
||||||
|
ioReset (BaseFile, SizeOf(RecMessageBase), fmRWDN);
|
||||||
|
|
||||||
|
If ioSeek (BaseFile, bbsCfg.UploadBase - 1) Then
|
||||||
|
ioRead (BaseFile, TempBase);
|
||||||
|
|
||||||
|
Close (BaseFile);
|
||||||
|
End;
|
||||||
|
|
||||||
|
If (Not CheckAccess (User, True, TempBase.ULACS)) or
|
||||||
|
(TempBase.Flags AND FBSlowMedia <> 0) or
|
||||||
|
(Length(FileMask) > 70) Then Begin
|
||||||
|
|
||||||
|
Client.WriteLine(re_NoAccess);
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
If bbsCfg.FreeUL > 0 Then Begin
|
||||||
|
GetDIR (0, CurDIR);
|
||||||
|
|
||||||
|
{$I-} ChDIR (TempBase.Path); {$I+}
|
||||||
|
|
||||||
|
If (IoResult <> 0) or (DiskFree(0) DIV 1024 < bbsCfg.FreeUL) Then Begin
|
||||||
|
ChDIR (CurDIR);
|
||||||
|
|
||||||
|
Client.WriteLine(re_NoAccess + ': No disk space');
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
ChDIR (CurDIR);
|
||||||
|
End;
|
||||||
|
|
||||||
|
If Not IsAppend And IsDuplicateFile (TempBase, FileMask, bbsCfg.FDupeScan = 2) Then Begin
|
||||||
Client.WriteLine(re_BadFile);
|
Client.WriteLine(re_BadFile);
|
||||||
|
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
server.status('calling recvfile');
|
RecvFile (TempBase.Path + JustFile(Data), IsAppend);
|
||||||
|
|
||||||
RecvFile ('d:\code\mystic1\temp0\infile.tmp', IsAppend);
|
ImportFileDIZ(Desc, DescSize, TempPath, TempBase.Path + JustFile(Data));
|
||||||
|
|
||||||
// Client.WriteLine(re_BadFile);
|
If DescSize = 0 Then Begin
|
||||||
|
DescSize := 1;
|
||||||
|
Desc[1] := 'No Description';
|
||||||
|
End;
|
||||||
|
|
||||||
|
Assign (BaseFile, BbsCfg.DataPath + TempBase.FileName + '.dir');
|
||||||
|
|
||||||
|
If Not ioReset (BaseFile, SizeOf(RecFileList), fmRWDW) Then
|
||||||
|
ioReWrite (BaseFile, SizeOf(RecFileList), fmRWDW);
|
||||||
|
|
||||||
|
If IsAppend Then Begin
|
||||||
|
While Not Eof(BaseFile) Do Begin
|
||||||
|
ioRead (BaseFile, Dir);
|
||||||
|
|
||||||
|
If JustFile(Data) = Dir.FileName Then Begin
|
||||||
|
DirPos := FilePos(BaseFile);
|
||||||
|
|
||||||
|
Break;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
If DirPos = -1 Then Begin
|
||||||
|
FillChar (Dir, SizeOf(Dir), 0);
|
||||||
|
|
||||||
|
Dir.FileName := JustFile(Data);
|
||||||
|
Dir.DateTime := CurDateDOS;
|
||||||
|
Dir.Uploader := User.Handle;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Dir.DescLines := DescSize;
|
||||||
|
Dir.Size := FileByteSize(TempBase.Path + JustFile(Data));
|
||||||
|
|
||||||
|
Assign (DesFile, BbsCfg.DataPath + TempBase.FileName + '.des');
|
||||||
|
|
||||||
|
If Not ioReset (DesFile, 1, fmRWDW) Then
|
||||||
|
ioReWrite (DesFile, 1, fmRWDW);
|
||||||
|
|
||||||
|
Dir.DescPtr := FileSize(DesFile);
|
||||||
|
|
||||||
|
Seek (DesFile, Dir.DescPtr);
|
||||||
|
|
||||||
|
For Count := 1 to DescSize Do
|
||||||
|
BlockWrite (DesFile, Desc[Count][0], Length(Desc[Count]) + 1);
|
||||||
|
|
||||||
|
Close (DesFile);
|
||||||
|
|
||||||
|
If DirPos = -1 Then
|
||||||
|
Seek (BaseFile, FileSize(BaseFile))
|
||||||
|
Else
|
||||||
|
Seek (BaseFile, DirPos - 1);
|
||||||
|
|
||||||
|
ioWrite (BaseFile, Dir);
|
||||||
|
Close (BaseFile);
|
||||||
|
|
||||||
// dreadful things required to do for upload process:
|
// dreadful things required to do for upload process:
|
||||||
|
|
||||||
// find upload base
|
// find upload base -- done
|
||||||
// check diskspace
|
// check diskspace -- done
|
||||||
// check slowmedia
|
// check slowmedia -- done
|
||||||
// check access
|
// check access -- done
|
||||||
// check filename length
|
// check filename length -- done
|
||||||
// duplicate file checking
|
// duplicate file checking -- done
|
||||||
// get file
|
// get file -- done
|
||||||
// update user statistics
|
// update user statistics
|
||||||
// update history statistics
|
// update history statistics
|
||||||
// archive testing
|
// archive testing
|
||||||
// file_id.diz importing
|
// file_id.diz importing -- done?
|
||||||
|
// save file to db (or update if append)
|
||||||
|
// test all of it.
|
||||||
|
|
||||||
// other things: add no desc and ftp test batch to configuration?
|
// other things: add no desc and ftp test batch to configuration?
|
||||||
End;
|
End;
|
||||||
|
@ -1058,10 +1168,11 @@ Begin
|
||||||
|
|
||||||
{$IFDEF FTPDEBUG}
|
{$IFDEF FTPDEBUG}
|
||||||
LOG('Cmd: ' + Cmd + ' Data: ' + Data);
|
LOG('Cmd: ' + Cmd + ' Data: ' + Data);
|
||||||
Server.Status ('Cmd: ' + Cmd + ' Data: ' + Data);
|
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
//If Cmd = 'APPE' Then cmdSTOR(True) Else
|
// Server.Status (ProcessID, 'Cmd: ' + Cmd + ' Data: ' + Data);
|
||||||
|
|
||||||
|
If Cmd = 'APPE' Then cmdSTOR(True) Else
|
||||||
If Cmd = 'CDUP' Then cmdCDUP Else
|
If Cmd = 'CDUP' Then cmdCDUP Else
|
||||||
If Cmd = 'CWD' Then cmdCWD Else
|
If Cmd = 'CWD' Then cmdCWD Else
|
||||||
If Cmd = 'DELE' Then Client.WriteLine(re_NoAccess) Else
|
If Cmd = 'DELE' Then Client.WriteLine(re_NoAccess) Else
|
||||||
|
@ -1098,7 +1209,7 @@ Begin
|
||||||
If GotQuit Then Begin
|
If GotQuit Then Begin
|
||||||
Client.WriteLine(re_Goodbye);
|
Client.WriteLine(re_Goodbye);
|
||||||
|
|
||||||
Server.Status (User.Handle + ' logged out');
|
Server.Status (ProcessID, User.Handle + ' logged out');
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ End;
|
||||||
|
|
||||||
Procedure TNNTPServer.ClientWriteLine (Str: String);
|
Procedure TNNTPServer.ClientWriteLine (Str: String);
|
||||||
Begin
|
Begin
|
||||||
Server.Status('S:' + Str);
|
Server.Status(ProcessID, 'S:' + Str);
|
||||||
Client.WriteLine(Str);
|
Client.WriteLine(Str);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ Begin
|
||||||
ClientWriteLine(re_UnknownOption);
|
ClientWriteLine(re_UnknownOption);
|
||||||
|
|
||||||
If LoggedIn Then
|
If LoggedIn Then
|
||||||
Server.Status('Logged in as ' + UserName);
|
Server.Status(ProcessID, 'Logged in as ' + UserName);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure TNNTPServer.cmd_GROUP;
|
Procedure TNNTPServer.cmd_GROUP;
|
||||||
|
@ -535,7 +535,7 @@ Begin
|
||||||
If HackCount >= HackThreshold Then Begin
|
If HackCount >= HackThreshold Then Begin
|
||||||
EndSession := True; // someone is being a douchebag
|
EndSession := True; // someone is being a douchebag
|
||||||
|
|
||||||
Server.Status('Flood attempt from ' + Client.PeerIP + '. Goodbye');
|
Server.Status(ProcessID, 'Flood attempt from ' + Client.PeerIP + '. Goodbye');
|
||||||
|
|
||||||
MsgText.Free;
|
MsgText.Free;
|
||||||
|
|
||||||
|
@ -848,7 +848,7 @@ Begin
|
||||||
|
|
||||||
If Client.ReadLine(Str) = -1 Then Exit;
|
If Client.ReadLine(Str) = -1 Then Exit;
|
||||||
|
|
||||||
Server.Status('C:' + Str);
|
Server.Status(ProcessID, 'C:' + Str);
|
||||||
|
|
||||||
Cmd := strUpper(strWordGet(1, Str, ' '));
|
Cmd := strUpper(strWordGet(1, Str, ' '));
|
||||||
|
|
||||||
|
|
|
@ -314,7 +314,7 @@ Begin
|
||||||
|
|
||||||
Client.WriteLine(re_LoggedIn);
|
Client.WriteLine(re_LoggedIn);
|
||||||
|
|
||||||
Server.Status(User.Handle + ' logged in');
|
Server.Status(ProcessID, User.Handle + ' logged in');
|
||||||
End Else
|
End Else
|
||||||
Client.WriteLine(re_BadLogin);
|
Client.WriteLine(re_BadLogin);
|
||||||
End;
|
End;
|
||||||
|
@ -491,7 +491,7 @@ Begin
|
||||||
If GotQuit Then Begin
|
If GotQuit Then Begin
|
||||||
Client.WriteLine(re_Goodbye);
|
Client.WriteLine(re_Goodbye);
|
||||||
|
|
||||||
Server.Status (User.Handle + ' logged out');
|
Server.Status (ProcessID, User.Handle + ' logged out');
|
||||||
|
|
||||||
DeleteMessages;
|
DeleteMessages;
|
||||||
End;
|
End;
|
||||||
|
|
|
@ -87,17 +87,17 @@ Begin
|
||||||
InDomain := Copy(Data, Pos('@', Data) + 1, Pos('>', Data) - Pos('@', Data) - 1);
|
InDomain := Copy(Data, Pos('@', Data) + 1, Pos('>', Data) - Pos('@', Data) - 1);
|
||||||
|
|
||||||
If IsFrom Then
|
If IsFrom Then
|
||||||
Server.Status('User: ' + InName + ' Domain: ' + InDomain);
|
Server.Status(ProcessID, 'User: ' + InName + ' Domain: ' + InDomain);
|
||||||
|
|
||||||
If InDomain <> bbsConfig.iNetDomain Then Begin
|
If InDomain <> bbsConfig.iNetDomain Then Begin
|
||||||
Server.Status('Refused by domain: ' + InName + '@' + InDomain);
|
Server.Status(ProcessID, 'Refused by domain: ' + InName + '@' + InDomain);
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Result := SearchForUser(InName, User, UserPos);
|
Result := SearchForUser(InName, User, UserPos);
|
||||||
|
|
||||||
If Not Result Then
|
If Not Result Then
|
||||||
Server.Status('Refused by name: ' + InName + '@' + InDomain);
|
Server.Status(ProcessID, 'Refused by name: ' + InName + '@' + InDomain);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure TSMTPServer.ResetSession;
|
Procedure TSMTPServer.ResetSession;
|
||||||
|
@ -195,7 +195,7 @@ Begin
|
||||||
If HackCount >= SMTPHackThresh Then Begin
|
If HackCount >= SMTPHackThresh Then Begin
|
||||||
EndSession := True; // someone is being a douchebag
|
EndSession := True; // someone is being a douchebag
|
||||||
|
|
||||||
Server.Status('Flood attempt from ' + FromName + ' (' + Client.PeerIP + '); Goodbye');
|
Server.Status(ProcessID, 'Flood attempt from ' + FromName + ' (' + Client.PeerIP + '); Goodbye');
|
||||||
|
|
||||||
MsgText.Free;
|
MsgText.Free;
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
|
|
||||||
For MsgLoop := 0 To ToList.Count - 1 Do Begin
|
For MsgLoop := 0 To ToList.Count - 1 Do Begin
|
||||||
Server.Status('Sending mail from ' + FromName + ' to ' + ToList.Strings[MsgLoop]);
|
Server.Status(ProcessID, 'Sending mail from ' + FromName + ' to ' + ToList.Strings[MsgLoop]);
|
||||||
|
|
||||||
MsgBase^.StartNewMsg;
|
MsgBase^.StartNewMsg;
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ Uses
|
||||||
|
|
||||||
Var
|
Var
|
||||||
TempPath : String;
|
TempPath : String;
|
||||||
Console : TOutput;
|
// Console : TOutput;
|
||||||
Term : TTermAnsi;
|
Term : TTermAnsi;
|
||||||
bbsConfig : RecConfig;
|
bbsConfig : RecConfig;
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ Type
|
||||||
Constructor Create (Cfg: 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 (ProcID: LongInt; Str: String);
|
||||||
Function CheckIP (IP, Mask: String) : Boolean;
|
Function CheckIP (IP, Mask: String) : Boolean;
|
||||||
Function IsBlockedIP (Var Client: TIOSocket) : Boolean;
|
Function IsBlockedIP (Var Client: TIOSocket) : Boolean;
|
||||||
Function DuplicateIPs (Var Client: TIOSocket) : Byte;
|
Function DuplicateIPs (Var Client: TIOSocket) : Byte;
|
||||||
|
@ -51,6 +51,7 @@ Type
|
||||||
TServerClient = Class(TThread)
|
TServerClient = Class(TThread)
|
||||||
Client : TIOSocket;
|
Client : TIOSocket;
|
||||||
Manager : TServerManager;
|
Manager : TServerManager;
|
||||||
|
ProcessID : LongInt;
|
||||||
|
|
||||||
Constructor Create (Owner: TServerManager; CliSock: TIOSocket);
|
Constructor Create (Owner: TServerManager; CliSock: TIOSocket);
|
||||||
Destructor Destroy; Override;
|
Destructor Destroy; Override;
|
||||||
|
@ -164,7 +165,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure TServerManager.Status (Str: String);
|
Procedure TServerManager.Status (ProcID: LongInt; Str: String);
|
||||||
Var
|
Var
|
||||||
Res : String;
|
Res : String;
|
||||||
T : Text;
|
T : Text;
|
||||||
|
@ -177,7 +178,7 @@ Begin
|
||||||
If ServerStatus.Count > MaxStatusText Then
|
If ServerStatus.Count > MaxStatusText Then
|
||||||
ServerStatus.Delete(0);
|
ServerStatus.Delete(0);
|
||||||
|
|
||||||
Res := '(' + Copy(DateDos2Str(CurDateDos, 1), 1, 5) + ' ' + TimeDos2Str(CurDateDos, 0) + ') ' + Str;
|
Res := FormatDate (CurDateDT, 'NNN DD HH:II') + ' ' + strI2S(ProcID + 1) + ' ' + Str;
|
||||||
|
|
||||||
If Length(Res) > 74 Then Begin
|
If Length(Res) > 74 Then Begin
|
||||||
ServerStatus.Add(Copy(Res, 1, 74));
|
ServerStatus.Add(Copy(Res, 1, 74));
|
||||||
|
@ -185,7 +186,7 @@ Begin
|
||||||
If ServerStatus.Count > MaxStatusText Then
|
If ServerStatus.Count > MaxStatusText Then
|
||||||
ServerStatus.Delete(0);
|
ServerStatus.Delete(0);
|
||||||
|
|
||||||
ServerStatus.Add(strRep(' ', 14) + Copy(Res, 75, 255));
|
ServerStatus.Add(strRep(' ', 15) + Copy(Res, 75, 255));
|
||||||
End Else
|
End Else
|
||||||
ServerStatus.Add(Res);
|
ServerStatus.Add(Res);
|
||||||
|
|
||||||
|
@ -222,9 +223,9 @@ Begin
|
||||||
If Terminated Then Exit;
|
If Terminated Then Exit;
|
||||||
|
|
||||||
If ClientMax = 0 Then
|
If ClientMax = 0 Then
|
||||||
Status('WARNING: At least one server is configured 0 max clients');
|
Status(-1, 'WARNING: At least one server is configured 0 max clients');
|
||||||
|
|
||||||
Status('Opening server socket on port ' + strI2S(Port));
|
Status(-1, 'Opening server socket on port ' + strI2S(Port));
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
NewClient := Server.WaitConnection(0);
|
NewClient := Server.WaitConnection(0);
|
||||||
|
@ -234,7 +235,7 @@ Begin
|
||||||
If (ClientMax > 0) And (ClientActive >= ClientMax) Then Begin
|
If (ClientMax > 0) And (ClientActive >= ClientMax) Then Begin
|
||||||
Inc (ClientRefused);
|
Inc (ClientRefused);
|
||||||
|
|
||||||
Status ('BUSY: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
Status (-1, 'BUSY: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
||||||
|
|
||||||
If Not NewClient.WriteFile('', TextPath + 'busy.txt') Then
|
If Not NewClient.WriteFile('', TextPath + 'busy.txt') Then
|
||||||
NewClient.WriteLine('BUSY');
|
NewClient.WriteLine('BUSY');
|
||||||
|
@ -246,7 +247,7 @@ Begin
|
||||||
If IsBlockedIP(NewClient) Then Begin
|
If IsBlockedIP(NewClient) Then Begin
|
||||||
Inc (ClientBlocked);
|
Inc (ClientBlocked);
|
||||||
|
|
||||||
Status('BLOCK: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
Status(-1, 'BLOCK: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
||||||
|
|
||||||
If Not NewClient.WriteFile('', TextPath + 'blocked.txt') Then
|
If Not NewClient.WriteFile('', TextPath + 'blocked.txt') Then
|
||||||
NewClient.WriteLine('BLOCKED');
|
NewClient.WriteLine('BLOCKED');
|
||||||
|
@ -258,7 +259,7 @@ Begin
|
||||||
If (ClientMaxIPs > 0) and (DuplicateIPs(NewClient) >= ClientMaxIPs) Then Begin
|
If (ClientMaxIPs > 0) and (DuplicateIPs(NewClient) >= ClientMaxIPs) Then Begin
|
||||||
Inc (ClientRefused);
|
Inc (ClientRefused);
|
||||||
|
|
||||||
Status('MULTI: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
Status(-1, 'MULTI: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
||||||
|
|
||||||
If Not NewClient.WriteFile('', TextPath + 'dupeip.txt') Then
|
If Not NewClient.WriteFile('', TextPath + 'dupeip.txt') Then
|
||||||
NewClient.WriteLine('Only ' + strI2S(ClientMaxIPs) + ' connection(s) per user');
|
NewClient.WriteLine('Only ' + strI2S(ClientMaxIPs) + ' connection(s) per user');
|
||||||
|
@ -270,13 +271,13 @@ Begin
|
||||||
Inc (ClientTotal);
|
Inc (ClientTotal);
|
||||||
Inc (ClientActive);
|
Inc (ClientActive);
|
||||||
|
|
||||||
Status ('Connect: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
Status (-1, 'Connect: ' + NewClient.PeerIP + ' (' + NewClient.PeerName + ')');
|
||||||
|
|
||||||
NewClientProc(Self, Config, NodeInfo, NewClient);
|
NewClientProc(Self, Config, NodeInfo, NewClient);
|
||||||
End;
|
End;
|
||||||
Until Terminated;
|
Until Terminated;
|
||||||
|
|
||||||
Status ('Shutting down server...');
|
Status (-1, 'Shutting down server...');
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Destructor TServerManager.Destroy;
|
Destructor TServerManager.Destroy;
|
||||||
|
@ -321,6 +322,7 @@ Begin
|
||||||
For Count := 0 to Manager.ClientMax - 1 Do
|
For Count := 0 to Manager.ClientMax - 1 Do
|
||||||
If Manager.ClientList[Count] = NIL Then Begin
|
If Manager.ClientList[Count] = NIL Then Begin
|
||||||
Manager.ClientList[Count] := Self;
|
Manager.ClientList[Count] := Self;
|
||||||
|
ProcessID := Count;
|
||||||
Break;
|
Break;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,9 @@ Begin
|
||||||
If FileExist(ParamStr(1)) Then
|
If FileExist(ParamStr(1)) Then
|
||||||
FN := ParamStr(1)
|
FN := ParamStr(1)
|
||||||
Else
|
Else
|
||||||
|
If FileExist(ParamStr(1) + '.ini') Then
|
||||||
|
FN := ParamStr(1) + '.ini'
|
||||||
|
Else
|
||||||
If FileExist('mutil.ini') Then
|
If FileExist('mutil.ini') Then
|
||||||
FN := 'mutil.ini'
|
FN := 'mutil.ini'
|
||||||
Else Begin
|
Else Begin
|
||||||
|
|
|
@ -106,7 +106,7 @@ Type
|
||||||
ArcType : String[4];
|
ArcType : String[4];
|
||||||
MailType : Byte;
|
MailType : Byte;
|
||||||
binkHost : String[60];
|
binkHost : String[60];
|
||||||
NetType : Byte;
|
UNUSED1 : Byte;
|
||||||
ProtType : Byte;
|
ProtType : Byte;
|
||||||
binkTimeout : Word;
|
binkTimeout : Word;
|
||||||
binkBlock : Word;
|
binkBlock : Word;
|
||||||
|
|
|
@ -7,8 +7,14 @@ design elements/issues.
|
||||||
|
|
||||||
BUGS AND POSSIBLE ISSUES
|
BUGS AND POSSIBLE ISSUES
|
||||||
========================
|
========================
|
||||||
|
- need to add QWK network ID to all message bases (remove QWK net flag?)
|
||||||
! Auto create of message bases is including periods in the filename?
|
- need to add QWK networking editor (type: hub, or node)
|
||||||
|
- need to add QWK network link back to networks defined in editor for each
|
||||||
|
message base. Also need to add both to global editor?
|
||||||
|
- need to also have the ability to link a specific user account to a QWK
|
||||||
|
network from the editor.
|
||||||
|
- need function to exchange qwk with uplink (passive, login, pw, host, port)
|
||||||
|
packet type (qwke/qwk)
|
||||||
|
|
||||||
! Gender character is asking for ASCII number. Make new functions for areas
|
! Gender character is asking for ASCII number. Make new functions for areas
|
||||||
where we don't want that.
|
where we don't want that.
|
||||||
|
@ -37,6 +43,8 @@ BUGS AND POSSIBLE ISSUES
|
||||||
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
||||||
=========================================
|
=========================================
|
||||||
|
|
||||||
|
- make tiosocket buffer size dynamic. increase data sockets in ftp to 32kb
|
||||||
|
- all display files to search for .hlp before ANS?
|
||||||
- fix END in lightbar file lists so it doesn't suck.
|
- fix END in lightbar file lists so it doesn't suck.
|
||||||
- externalize qwk and file list compiler class. qwk for mystic/mis filelist
|
- externalize qwk and file list compiler class. qwk for mystic/mis filelist
|
||||||
for mystic/mutil. add compiler templates, file include, and new vs all
|
for mystic/mutil. add compiler templates, file include, and new vs all
|
||||||
|
@ -44,16 +52,20 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
||||||
- make embedded ANSI in file_id display correctly.
|
- make embedded ANSI in file_id display correctly.
|
||||||
- abstract ansi browser to be used for ansi archive viewer and sysop file
|
- abstract ansi browser to be used for ansi archive viewer and sysop file
|
||||||
manager (as well as the ANSI gallery).
|
manager (as well as the ANSI gallery).
|
||||||
|
- msg readers uses msgbase_ansi like mystic 2
|
||||||
- when mutil is tossing a packet and auto creates an area figure out if there
|
- when mutil is tossing a packet and auto creates an area figure out if there
|
||||||
can be a way to automatically create the uplink back to the originating
|
can be a way to automatically create the uplink back to the originating
|
||||||
node.
|
node.
|
||||||
|
- expand max filename size for 70 to 255 chars?
|
||||||
|
- make file list use buffered IO class for reading .dir files (8k)
|
||||||
- global user editor for user flags, def protocol, etc etc
|
- global user editor for user flags, def protocol, etc etc
|
||||||
- ability to configure auto signatures (2 of them) one for handle and one
|
- ability to configure auto signatures (2 of them) one for handle and one
|
||||||
for real names
|
for real name bases
|
||||||
- ability to download ANSIs while actually viewing them in the gallery
|
- ability to download ANSIs while actually viewing them in the gallery
|
||||||
- optional Menu scroller during input?
|
- optional Menu scroller during input?
|
||||||
- Menu type: Lightbar/Form OR just change standard lightbar to work that
|
- Menu type: Lightbar/Form OR just change standard lightbar to work that
|
||||||
way which i think is the best approach actually.
|
way which i think is the best approach actually but will it break existing
|
||||||
|
lightbars (shouldnt?)
|
||||||
- ESC moves back in ANSI gallery only exits if dir = root?
|
- ESC moves back in ANSI gallery only exits if dir = root?
|
||||||
- Color, boxtype, and input configuration for configuration
|
- Color, boxtype, and input configuration for configuration
|
||||||
- global file editor like msg base
|
- global file editor like msg base
|
||||||
|
@ -62,8 +74,8 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
||||||
something and also add in the "created" date to the voting question itself
|
something and also add in the "created" date to the voting question itself
|
||||||
- Fix up new FS editor to use passed template and editor contraints.
|
- Fix up new FS editor to use passed template and editor contraints.
|
||||||
- Test with file description editor.
|
- Test with file description editor.
|
||||||
- ACS to allow "selecable reply base"
|
|
||||||
- Strip pipe colors/ANSI from message option?
|
- Strip pipe colors/ANSI from message option?
|
||||||
|
- allow ANSI option for msg bases?
|
||||||
- AREAS.BBS import?
|
- AREAS.BBS import?
|
||||||
- PGUP/DOWN moves bases in message base editor?
|
- PGUP/DOWN moves bases in message base editor?
|
||||||
- AreaFix
|
- AreaFix
|
||||||
|
|
|
@ -3613,4 +3613,16 @@
|
||||||
is flagged as a FTP network account, their reply packet will need to be
|
is flagged as a FTP network account, their reply packet will need to be
|
||||||
"handle.rep".
|
"handle.rep".
|
||||||
|
|
||||||
|
+ The file base configuration editor now allows bulk file base deletion
|
||||||
|
if a list of bases are tagged when delete is requested.
|
||||||
|
|
||||||
|
+ Mystic's FTP server now supports uploading directly to Mystic's file bases
|
||||||
|
using FTP. It will also attempt to use the archive configuration to import
|
||||||
|
FILE_ID.DIZ files.
|
||||||
|
|
||||||
|
+ MIS server status updates now use a MMM DD format date instead of MM/DD
|
||||||
|
which was confusing/annoying for people outside of North America.
|
||||||
|
|
||||||
|
+ The FTP server now allows resumed uploads via the APPE function.
|
||||||
|
|
||||||
<ALPHA 37 RELEASED>
|
<ALPHA 37 RELEASED>
|
||||||
|
|
Loading…
Reference in New Issue