wmlogin.pp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. unit wmlogin;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb, fpjsonrpc,
  6. fpjson, IBConnection, sqldb, webjsonrpc, fpextdirect, sqldbwebdata;
  7. type
  8. { TSessionManagement }
  9. TSessionManagement = class(TExtDirectModule)
  10. IBConnection1: TIBConnection;
  11. Logout: TJSONRPCHandler;
  12. Login: TJSONRPCHandler;
  13. SessionManagement: TJSONRPCHandler;
  14. QAuthenticate: TSQLQuery;
  15. SQLTransaction1: TSQLTransaction;
  16. procedure DataModuleCreate(Sender: TObject);
  17. procedure LoginExecute(Sender: TObject; const Params: TJSONData;
  18. out Res: TJSONData);
  19. procedure LogoutExecute(Sender: TObject; const Params: TJSONData;
  20. out Res: TJSONData);
  21. private
  22. function AuthenticateUser(AUsername, APassword: String): Integer;
  23. procedure DoOnNewSession(Sender: TObject);
  24. { private declarations }
  25. public
  26. { public declarations }
  27. end;
  28. var
  29. SessionManagement: TSessionManagement;
  30. implementation
  31. uses inifiles;
  32. {$R *.lfm}
  33. { TSessionManagement }
  34. function TSessionManagement.AuthenticateUser(AUsername,APassword : String) : Integer;
  35. begin
  36. With QAuthenticate do
  37. begin
  38. ParamByName('Login').AsString:=AUserName;
  39. ParamByName('Password').AsString:=APassword;
  40. Open;
  41. try
  42. if (EOF and BOF) then
  43. Result:=-1
  44. else
  45. begin
  46. Result:=FieldByName('U_ID').AsInteger;
  47. Session.Variables['UserName']:=FieldByName('U_NAME').AsString;
  48. end;
  49. Session.Variables['UserID']:=IntToStr(Result);
  50. finally
  51. Close;
  52. end;
  53. end;
  54. end;
  55. procedure TSessionManagement.LoginExecute(Sender: TObject;
  56. const Params: TJSONData; out Res: TJSONData);
  57. Var
  58. A : TJSONArray ;
  59. AUserName,APassword : String;
  60. begin
  61. A:=Params as TJSONArray;
  62. AUserName:=A.Strings[0];
  63. APassword:=A.Strings[1];
  64. Res:=TJSONIntegerNumber.Create(AuthenticateUser(AUsername,APassword));
  65. end;
  66. procedure TSessionManagement.LogoutExecute(Sender: TObject;
  67. const Params: TJSONData; out Res: TJSONData);
  68. begin
  69. // To be sure
  70. Session.Variables['UserID']:='-1';
  71. Session.Terminate;
  72. // A result must always be sent back.
  73. Res:=TJSONString.Create('Bye');
  74. end;
  75. procedure TSessionManagement.DoOnNewSession(Sender : TObject);
  76. begin
  77. // The cookies must all originate from the same path, otherwise the 2 datamodules will use a different session.
  78. (Sender as TFPWebSession).SessionCookiePath:='/';
  79. end;
  80. procedure TSessionManagement.DataModuleCreate(Sender: TObject);
  81. Var
  82. FN : String;
  83. Ini : TMemIniFile;
  84. begin
  85. // The following 2 statements are needed because the 2 properties are (currently) not published.
  86. OnNewSession:=@DoOnNewSession;
  87. CreateSession:=True;
  88. FN:=ChangeFileExt(Paramstr(0),'.ini');
  89. If FileExists(FN) then
  90. begin
  91. Ini:=TMemIniFile.Create(FN);
  92. try
  93. With IBConnection1 do
  94. begin
  95. DatabaseName:=Ini.ReadString('Database','Path',DatabaseName);
  96. UserName:=Ini.ReadString('Database','UserName',UserName);
  97. Password:=Ini.ReadString('Database','Password',Password);
  98. end;
  99. finally
  100. Ini.Free;
  101. end;
  102. end;
  103. IBConnection1.Connected:=True;
  104. end;
  105. initialization
  106. RegisterHTTPModule('Login', TSessionManagement);
  107. end.