{$I M_OPS.PAS} Unit MIS_Client_POP3; Interface Uses SysUtils, m_Strings, m_FileIO, m_Socket_Class, m_DateTime, MIS_Server, MIS_NodeData, MIS_Common; Function CreatePOP3 (Owner: TServerManager; ND: TNodeData; CliSock: TSocketClass) : TServerClient; Type TPOP3Server = Class(TServerClient) Server : TServerManager; UserName : String[40]; Password : String[20]; LoggedIn : Boolean; Cmd : String; Data : String; User : UserRec; UserPos : LongInt; Constructor Create (Owner: TServerManager; CliSock: TSocketClass); Procedure Execute; Override; Destructor Destroy; Override; Procedure ResetSession; Procedure cmdUSER; Procedure cmdPASS; End; Implementation Const POP3TimeOut = 120; FileBufSize = 8 * 1024; re_OK = '+OK '; re_Error = '-ERR '; re_UnknownCommand = re_Error + 'Unknown command'; re_UnknownUser = re_Error + 'Unknown user'; re_BadLogin = re_Error + 'Bad credentials'; re_Greeting = 'Mystic POP3 Server'; re_Goodbye = re_OK + 'Goodbye'; re_SendUserPass = re_OK + 'Send user password'; re_LoggedIn = re_OK + 'Welcome'; Function CreatePOP3 (Owner: TServerManager; ND: TNodeData; CliSock: TSocketClass) : TServerClient; Begin Result := TPOP3Server.Create(Owner, CliSock); End; Constructor TPOP3Server.Create (Owner: TServerManager; CliSock: TSocketClass); Begin Inherited Create(Owner, CliSock); Server := Owner; End; Procedure TPOP3Server.ResetSession; Begin LoggedIn := False; UserName := ''; Password := ''; UserPos := -1; End; Procedure TPOP3Server.cmdUSER; Begin ResetSession; If SearchForUser(Data, User, UserPos) Then Begin Client.WriteLine(re_SendUserPass); UserName := Data; End Else Client.WriteLine(re_UnknownUser); End; Procedure TPOP3Server.cmdPASS; Begin If (UserName = '') or (UserPos = -1) Then Begin Client.WriteLine(re_UnknownUser); Exit; End; If strUpper(Data) = User.Password Then Begin LoggedIn := True; Client.WriteLine(re_LoggedIn); End Else Client.WriteLine(re_BadLogin); End; Procedure TPOP3Server.Execute; Var Str : String; Begin ResetSession; Client.WriteLine(re_Greeting); Repeat If Client.WaitForData(POP3TimeOut * 1000) = 0 Then Break; If Terminated Then Exit; If Client.ReadLine(Str) = -1 Then Exit; server.server.status(str); Cmd := strUpper(strWordGet(1, Str, ' ')); If Pos(' ', Str) > 0 Then Data := strStripB(Copy(Str, Pos(' ', Str) + 1, Length(Str)), ' ') Else Data := ''; If Cmd = 'PASS' Then cmdPASS Else If Cmd = 'QUIT' Then Break Else If Cmd = 'USER' Then cmdUSER Else Client.WriteLine(re_UnknownCommand); Until Terminated; If Not Terminated Then Client.WriteLine(re_Goodbye); End; Destructor TPOP3Server.Destroy; Begin Inherited Destroy; End; End.