NTTP server functional. AUTH and LIST commands completed

This commit is contained in:
mysticbbs 2012-02-27 12:52:54 -05:00
parent cfbb2840e0
commit f74c99f392
2 changed files with 107 additions and 31 deletions

View File

@ -367,7 +367,7 @@ Begin
SMTPServer := TServerManager.Create(bbsConfig, bbsConfig.INetSMTPPort, bbsConfig.inetSMTPMax, NodeData, @CreateSMTP);
SMTPServer.Server.FTelnetServer := False;
SMTPServer.ClientMaxIPs := 1;
SMTPServer.ClientMaxIPs := bbsConfig.INetSMTPDupes;
Started := True;
End;
@ -394,7 +394,7 @@ Begin
NNTPServer := TServerManager.Create(bbsConfig, bbsConfig.InetNNTPPort, bbsConfig.inetNNTPMax, NodeData, @CreateNNTP);
NNTPServer.Server.FTelnetServer := False;
NNTPServer.ClientMaxIPs := 1;
NNTPServer.ClientMaxIPs := bbsConfig.inetNNTPDupes;
Started := True;
End;

View File

@ -1,11 +1,8 @@
{$I M_OPS.PAS}
Unit MIS_Client_NNTP;
// lookup:
// how to send greeting and goodbye?
// how to send capabilities so far only AUTHINFO
// determine base feature-set required
{$I M_OPS.PAS}
// RFC 977
Interface
@ -19,13 +16,13 @@ Uses
MIS_NodeData,
MIS_Common;
Function CreateNNTP (Owner: TServerManager; ND: TNodeData; CliSock: TSocketClass) : TServerClient;
Function CreateNNTP (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TSocketClass) : TServerClient;
Type
TNNTPServer = Class(TServerClient)
Server : TServerManager;
UserName : String[40];
Password : String[20];
UserName : String[30];
Password : String[15];
LoggedIn : Boolean;
Cmd : String;
Data : String;
@ -36,19 +33,28 @@ Type
Procedure Execute; Override;
Destructor Destroy; Override;
Procedure ClientWriteLine (Str: String);
Procedure ResetSession;
Procedure cmd_AUTHINFO;
Procedure cmd_GROUP;
Procedure cmd_LIST;
End;
Implementation
Uses
bbs_MsgBase_ABS,
bbs_MsgBase_JAM,
bbs_MsgBase_Squish;
Const
NNTPTimeOut = 180; // make configurable
re_Greeting = 'Mystic BBS NNTP Server';
re_Goodbye = 'Goodbye';
FileReadBuffer = 2048;
re_Greeting = '200 Mystic BBS NNTP server ready';
re_Goodbye = '205 Goodbye';
re_ListFollows = '215 List of newsgroups follows';
re_AuthOK = '281 Authentication accepted';
re_AuthBad = '381 Authentication rejected';
re_AuthPass = '381 Password required';
@ -56,7 +62,7 @@ Const
re_Unknown = '500 Unknown command';
re_UnknownOption = '501 Unknown option';
Function CreateNNTP (Owner: TServerManager; ND: TNodeData; CliSock: TSocketClass) : TServerClient;
Function CreateNNTP (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TSocketClass) : TServerClient;
Begin
Result := TNNTPServer.Create(Owner, CliSock);
End;
@ -68,6 +74,12 @@ Begin
Server := Owner;
End;
Procedure TNNTPServer.ClientWriteLine (Str: String);
Begin
Server.Server.Status('S:' + Str);
Client.WriteLine(Str);
End;
Procedure TNNTPServer.ResetSession;
Begin
LoggedIn := False;
@ -81,29 +93,91 @@ Var
NewCmd : String;
NewData : String;
Begin
ResetSession;
NewCmd := strWordGet(1, Data, ' ');
NewData := Copy(Data, Pos(' ', Data) + 1, 255);
If NewCmd = 'USER' Then Begin
If SearchForUser(NewData, User, UserPos) Then Begin
Client.WriteLine(re_AuthPass);
ClientWriteLine(re_AuthPass);
UserName := NewData;
End Else
Client.WriteLine(re_AuthBad);
ClientWriteLine(re_AuthBad);
End Else
If NewCmd = 'PASS' Then Begin
If UserPos = -1 Then
Client.WriteLine(re_AuthSync)
ClientWriteLine(re_AuthSync)
Else
If strUpper(NewData) = User.Password Then Begin
Client.WriteLine(re_AuthOK);
ClientWriteLine(re_AuthOK);
LoggedIn := True;
End Else
Client.WriteLine(re_AuthBad);
ClientWriteLine(re_AuthBad);
End Else
Client.WriteLine(re_UnknownOption);
ClientWriteLine(re_UnknownOption);
If LoggedIn Then
Server.Server.Status('Logged in as ' + UserName);
End;
Procedure TNNTPServer.cmd_GROUP;
Begin
// 211 number_of_estimated_articles first_msg last_msg newsname
// 411 nosuchnewsgroup
// this selects the "current" base
End;
Procedure TNNTPServer.cmd_LIST;
Var
MBaseFile : TBufFile;
TempBase : RecMessageBase;
MsgBase : PMsgBaseABS;
LowMessage : LongInt = 0;
HighMessage : LongInt = 0;
PostAbility : Char;
Begin
ClientWriteLine(re_ListFollows);
MBaseFile := TBufFile.Create(FileReadBuffer);
If MBaseFile.Open(bbsConfig.DataPath + 'mbases.dat', fmOpen, fmRWDN, SizeOf(RecMessageBase)) Then Begin
MBaseFile.Read(TempBase);
While Not MBaseFile.EOF Do Begin
MBaseFile.Read(TempBase);
If TempBase.NewsName = '' Then Continue;
If CheckAccess(User, True, TempBase.ListACS) Then Begin
LowMessage := 0;
HighMessage := 0;
Case CheckAccess(User, True, TempBase.PostACS) of
False : PostAbility := 'n';
True : PostAbility := 'y';
End;
Case TempBase.BaseType of
0 : MsgBase := New(PMsgBaseJAM, Init);
1 : MsgBase := New(PMsgBaseSquish, Init);
End;
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
If MsgBase^.OpenMsgBase Then Begin
LowMessage := 1;
HighMessage := MsgBase^.GetHighActiveMsgNum;
End;
Dispose (MsgBase, Done);
ClientWriteLine (TempBase.NewsName + ' ' + strI2S(LowMessage) + ' ' + strI2S(HighMessage) + ' ' + PostAbility);
End;
End;
End;
MBaseFile.Free;
ClientWriteLine('.');
End;
Procedure TNNTPServer.Execute;
@ -112,16 +186,16 @@ Var
Begin
ResetSession;
Client.WriteLine(re_Greeting);
ClientWriteLine(re_Greeting);
Repeat
If Client.WaitForData(NNTPTimeOut * 1000) = 0 Then Break;
If Client.WaitForData(bbsConfig.inetNNTPTimeout * 1000) = 0 Then Break;
If Terminated Then Exit;
If Client.ReadLine(Str) = -1 Then Exit;
//server.server.status(str);
Server.Server.Status('C:' + Str);
Cmd := strUpper(strWordGet(1, Str, ' '));
@ -131,11 +205,13 @@ Begin
Data := '';
If Cmd = 'AUTHINFO' Then cmd_AUTHINFO Else
If Cmd = 'QUIT' Then Break Else
Client.WriteLine(re_Unknown);
If Cmd = 'GROUP' Then cmd_GROUP Else
If Cmd = 'LIST' Then cmd_LIST Else
If Cmd = 'QUIT' Then Break Else
ClientWriteLine(re_Unknown);
Until Terminated;
If Not Terminated Then Client.WriteLine(re_Goodbye);
If Not Terminated Then ClientWriteLine(re_Goodbye);
End;
Destructor TNNTPServer.Destroy;
@ -143,4 +219,4 @@ Begin
Inherited Destroy;
End;
End.
End.