authactns.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. unit authactns;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. BrookAction, BrookHttpDefs, BrookSession, BrookUtils, Classes, SysUtils;
  6. type
  7. { TLog }
  8. TLog = class(TBrookAction)
  9. private
  10. FLog: TStringList;
  11. function GetText: string;
  12. public
  13. constructor Create; override;
  14. destructor Destroy; override;
  15. procedure Request(ARequest: TBrookRequest;
  16. AResponse: TBrookResponse); override;
  17. procedure Load;
  18. procedure Save;
  19. procedure Add(const ALog: string);
  20. procedure Add(const ALog: string; const AArgs: array of const);
  21. property Log: TStringList read FLog;
  22. property Text: string read GetText;
  23. end;
  24. { TAuth }
  25. TAuth = class(TLog)
  26. private
  27. FSession: TBrookSession;
  28. public
  29. constructor Create; override;
  30. destructor Destroy; override;
  31. procedure Request(ARequest: TBrookRequest;
  32. AResponse: TBrookResponse); override;
  33. procedure Location(const AActionClassName: string);
  34. procedure Get; override;
  35. property Session: TBrookSession read FSession;
  36. end;
  37. { TLogin }
  38. TLogin = class(TAuth)
  39. public
  40. procedure Get; override;
  41. procedure Post; override;
  42. end;
  43. { TLogout }
  44. TLogout = class(TAuth)
  45. public
  46. procedure Request(ARequest: TBrookRequest;
  47. AResponse: TBrookResponse); override;
  48. end;
  49. implementation
  50. { TLog }
  51. constructor TLog.Create;
  52. begin
  53. inherited Create;
  54. FLog := TStringList.Create;
  55. end;
  56. destructor TLog.Destroy;
  57. begin
  58. FLog.Free;
  59. inherited Destroy;
  60. end;
  61. function TLog.GetText: string;
  62. begin
  63. Result := FLog.Text;
  64. end;
  65. procedure TLog.Request(ARequest: TBrookRequest; AResponse: TBrookResponse);
  66. begin
  67. Load;
  68. inherited;
  69. end;
  70. procedure TLog.Load;
  71. begin
  72. if FileExists('log.html') then
  73. FLog.LoadFromFile('log.html');
  74. end;
  75. procedure TLog.Save;
  76. begin
  77. Log.SaveToFile('log.html');
  78. end;
  79. procedure TLog.Add(const ALog: string);
  80. begin
  81. FLog.Add(ALog);
  82. end;
  83. procedure TLog.Add(const ALog: string; const AArgs: array of const);
  84. begin
  85. FLog.Add(Format(ALog, AArgs));
  86. end;
  87. { TAuth }
  88. constructor TAuth.Create;
  89. begin
  90. inherited Create;
  91. FSession := TBrookSession.Create(nil);
  92. FSession.CookieSecure := True;
  93. FSession.TimeOut := 0;
  94. end;
  95. destructor TAuth.Destroy;
  96. begin
  97. FSession.Free;
  98. inherited Destroy;
  99. end;
  100. procedure TAuth.Request(ARequest: TBrookRequest; AResponse: TBrookResponse);
  101. begin
  102. Session.Start(ARequest);
  103. if Session.Exists('name') then
  104. inherited
  105. else
  106. if ARequest.GetNextPathInfo = 'login' then
  107. inherited
  108. else
  109. Location('TLogin');
  110. end;
  111. procedure TAuth.Location(const AActionClassName: string);
  112. begin
  113. Redirect(UrlFor(AActionClassName), 302);
  114. end;
  115. procedure TAuth.Get;
  116. begin
  117. Location('TChatGetMsg');
  118. end;
  119. { TLogin }
  120. procedure TLogin.Get;
  121. begin
  122. Render('login.html', ['']);
  123. end;
  124. procedure TLogin.Post;
  125. const
  126. MSG = '<div class="msgln"><i>User <b>%s</b> has entered the room.</i><br></div>';
  127. var
  128. VName: string;
  129. begin
  130. if Fields.Values['name'] = '' then
  131. Render('login.html', ['Please type your name.'])
  132. else
  133. begin
  134. VName := Fields.Values['name'];
  135. Add(MSG, [VName]);
  136. Save;
  137. Session.Fields.Add('name=' + VName);
  138. Session.Finish(HttpResponse);
  139. Location('TChatGetMsg');
  140. end;
  141. end;
  142. { TLogout }
  143. procedure TLogout.Request(ARequest: TBrookRequest; AResponse: TBrookResponse);
  144. const
  145. MSG = '<div class="msgln"><i>User <b>%s</b> has left the room.</i><br></div>';
  146. begin
  147. inherited;
  148. Add(MSG, [Session.Fields.Values['name']]);
  149. Save;
  150. Session.Expire(ARequest, AResponse);
  151. Location('TChatGetMsg');
  152. end;
  153. initialization
  154. TAuth.Register('/');
  155. TLogin.Register('/login', rmGet);
  156. TLogin.Register('/login', rmPost);
  157. TLogout.Register('/logout', rmGet);
  158. end.