home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / DBSECUR.PAS < prev    next >
Pascal/Delphi Source File  |  1999-10-12  |  5KB  |  170 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {         Copyright (c) 1998 Master-Bank                }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit DBSecur;
  11.  
  12. interface
  13.  
  14. {$I RX.INC}
  15.  
  16. uses SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  17.   Messages, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables,
  18.   RxLogin, LoginDlg, ChPswDlg;
  19.  
  20. type
  21.   TCheckUserEvent = function(UsersTable: TTable;
  22.     const Password: string): Boolean of object;
  23.  
  24. { TDBSecurity }
  25.  
  26.   TDBSecurity = class(TRxCustomLogin)
  27.   private
  28.     FDatabase: TDatabase;
  29.     FUsersTableName: TFileName;
  30.     FLoginNameField: PString;
  31.     FSelectAlias: Boolean;
  32.     FOnCheckUser: TCheckUserEvent;
  33.     FOnChangePassword: TChangePasswordEvent;
  34.     procedure SetDatabase(Value: TDatabase);
  35.     procedure SetUsersTableName(const Value: TFileName);
  36.     function GetLoginNameField: string;
  37.     procedure SetLoginNameField(const Value: string);
  38.   protected
  39.     function DoCheckUser(UsersTable: TTable; const UserName,
  40.       Password: string): Boolean; dynamic;
  41.     function DoLogin(var UserName: string): Boolean; override;
  42.     procedure Loaded; override;
  43.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  44.   public
  45.     constructor Create(AOwner: TComponent); override;
  46.     destructor Destroy; override;
  47.     function ChangePassword: Boolean;
  48.   published
  49.     property Database: TDatabase read FDatabase write SetDatabase;
  50.     property LoginNameField: string read GetLoginNameField write SetLoginNameField;
  51.     property SelectAlias: Boolean read FSelectAlias write FSelectAlias default False;
  52.     property UsersTableName: TFileName read FUsersTableName write SetUsersTableName;
  53.     property Active;
  54.     property AllowEmptyPassword;
  55.     property AttemptNumber;
  56.     property IniFileName;
  57.     property MaxPasswordLen;
  58.     property UpdateCaption;
  59. {$IFDEF WIN32}
  60.     property UseRegistry;
  61. {$ENDIF}
  62.     property OnCheckUser: TCheckUserEvent read FOnCheckUser write FOnCheckUser;
  63.     property OnChangePassword: TChangePasswordEvent read FOnChangePassword
  64.       write FOnChangePassword;
  65.     property AfterLogin;
  66.     property BeforeLogin;
  67.     property OnUnlock;
  68.     property OnUnlockApp;
  69.     property OnIconDblClick;
  70.   end;
  71.  
  72. implementation
  73.  
  74. uses AppUtils, VCLUtils;
  75.  
  76. { TDBSecurity }
  77.  
  78. constructor TDBSecurity.Create(AOwner: TComponent);
  79. begin
  80.   inherited Create(AOwner);
  81.   FSelectAlias := False;
  82.   FLoginNameField := NullStr;
  83. end;
  84.  
  85. destructor TDBSecurity.Destroy;
  86. begin
  87.   DisposeStr(FLoginNameField);
  88.   inherited Destroy;
  89. end;
  90.  
  91. procedure TDBSecurity.Notification(AComponent: TComponent; Operation: TOperation);
  92. begin
  93.   inherited Notification(AComponent, Operation);
  94.   if (Operation = opRemove) and (AComponent = Database) then Database := nil;
  95. end;
  96.  
  97. procedure TDBSecurity.Loaded;
  98. begin
  99.   inherited Loaded;
  100.   if not (csDesigning in ComponentState) and Active and
  101.     (Database <> nil) then
  102.   begin
  103.     Database.LoginPrompt := True;
  104.     if not Login then begin
  105.       TerminateApplication;
  106.     end;
  107.   end;
  108. end;
  109.  
  110. procedure TDBSecurity.SetDatabase(Value: TDatabase);
  111. begin
  112.   if FDatabase <> Value then begin
  113.     FDatabase := Value;
  114. {$IFDEF WIN32}
  115.     if Value <> nil then Value.FreeNotification(Self);
  116. {$ENDIF}
  117.   end;
  118. end;
  119.  
  120. procedure TDBSecurity.SetUsersTableName(const Value: TFileName);
  121. begin
  122.   if FUsersTableName <> Value then FUsersTableName := Value;
  123. end;
  124.  
  125. function TDBSecurity.GetLoginNameField: string;
  126. begin
  127.   Result := FLoginNameField^;
  128. end;
  129.  
  130. procedure TDBSecurity.SetLoginNameField(const Value: string);
  131. begin
  132.   AssignStr(FLoginNameField, Value);
  133. end;
  134.  
  135. function TDBSecurity.DoCheckUser(UsersTable: TTable; const UserName,
  136.   Password: string): Boolean;
  137. var
  138.   SaveLoggedUser: string;
  139. begin
  140.   if Assigned(FOnCheckUser) then begin
  141.     SaveLoggedUser := LoggedUser;
  142.     try
  143.       SetLoggedUser(UserName);
  144.       Result := FOnCheckUser(UsersTable, Password);
  145.     finally
  146.       SetLoggedUser(SaveLoggedUser);
  147.     end;
  148.   end
  149.   else Result := True;
  150. end;
  151.  
  152. function TDBSecurity.DoLogin(var UserName: string): Boolean;
  153. var
  154.   IconClick: TNotifyEvent;
  155. begin
  156.   IconClick := OnIconDblClick;
  157.   if Assigned(IconClick) then IconClick := DoIconDblClick;
  158.   Result := LoginDialog(Database, AttemptNumber, UsersTableName,
  159.     LoginNameField, MaxPasswordLen, DoCheckUser, IconClick, UserName,
  160.     IniFileName, UseRegistry, SelectAlias);
  161. end;
  162.  
  163. function TDBSecurity.ChangePassword: Boolean;
  164. begin
  165.   Result := ChangePasswordDialog(Database, AttemptNumber, UsersTableName,
  166.     LoginNameField, LoggedUser, MaxPasswordLen, AllowEmptyPassword,
  167.     FOnChangePassword);
  168. end;
  169.  
  170. end.