Componentes.Terceros.jvcl/official/3.32/run/JvBDESecurity.pas

210 lines
6.2 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvDBSecur.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 2001,2002 SGB Software
All Rights Reserved.
Contributor(s):
Hofi
Last Modified: 2004-10-07
Changes:
2004-10-07:
* Added
TJvCustomLogin
property Caption to support a custom dialog Caption.
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvBDESecurity.pas 10753 2006-06-28 08:12:28Z obones $
unit JvBDESecurity;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
SysUtils, Classes, DBTables,
JvLoginForm, JvBDELoginDialog, JvBDECheckPasswordForm;
type
TCheckUserEvent = function(UsersTable: TTable; const Password: string): Boolean of object;
TJvDBSecurity = class(TJvCustomLogin)
private
FDatabase: TDatabase;
FUsersTableName: TFileName;
FLoginNameField: string;
FSelectAlias: Boolean;
FOnCheckUser: TCheckUserEvent;
FOnChangePassword: TChangePasswordEvent;
FOnLoginFailure: TJvDBLoginEvent;
procedure SetDatabase(Value: TDatabase);
procedure SetUsersTableName(const Value: TFileName);
function GetLoginNameField: string;
procedure SetLoginNameField(const Value: string);
protected
function DoCheckUser(UsersTable: TTable; const UserName,
Password: string): Boolean; dynamic;
function DoLogin(var UserName: string): Boolean; override;
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
function ChangePassword: Boolean;
published
property Database: TDatabase read FDatabase write SetDatabase;
property LoginNameField: string read GetLoginNameField write SetLoginNameField;
property SelectAlias: Boolean read FSelectAlias write FSelectAlias default False;
property UsersTableName: TFileName read FUsersTableName write SetUsersTableName;
property Active;
property AllowEmptyPassword;
property AppStorage;
property AppStoragePath;
property AttemptNumber;
property Caption;
property MaxPasswordLen;
property UpdateCaption;
property OnCheckUser: TCheckUserEvent read FOnCheckUser write FOnCheckUser;
property OnChangePassword: TChangePasswordEvent read FOnChangePassword
write FOnChangePassword;
property AfterLogin;
property BeforeLogin;
property OnUnlock;
property OnUnlockApp;
property OnIconDblClick;
property OnLoginFailure: TJvDBLoginEvent read FOnLoginFailure write FOnLoginFailure;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvBDESecurity.pas $';
Revision: '$Revision: 10753 $';
Date: '$Date: 2006-06-28 10:12:28 +0200 (mer., 28 juin 2006) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
constructor TJvDBSecurity.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSelectAlias := False;
FLoginNameField := '';
end;
procedure TJvDBSecurity.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = Database) then
Database := nil;
end;
procedure TJvDBSecurity.Loaded;
begin
inherited Loaded;
if not (csDesigning in ComponentState) and Active and (Database <> nil) then
begin
Database.LoginPrompt := True;
if not Login then
TerminateApplication;
end;
end;
procedure TJvDBSecurity.SetDatabase(Value: TDatabase);
begin
if FDatabase <> Value then
begin
FDatabase := Value;
if Value <> nil then
Value.FreeNotification(Self);
end;
end;
procedure TJvDBSecurity.SetUsersTableName(const Value: TFileName);
begin
if FUsersTableName <> Value then
FUsersTableName := Value;
end;
function TJvDBSecurity.GetLoginNameField: string;
begin
Result := FLoginNameField;
end;
procedure TJvDBSecurity.SetLoginNameField(const Value: string);
begin
FLoginNameField := Value;
end;
function TJvDBSecurity.DoCheckUser(UsersTable: TTable;
const UserName, Password: string): Boolean;
var
SaveLoggedUser: string;
begin
if Assigned(FOnCheckUser) then
begin
SaveLoggedUser := LoggedUser;
try
SetLoggedUser(UserName);
Result := FOnCheckUser(UsersTable, Password);
finally
SetLoggedUser(SaveLoggedUser);
end;
end
else
Result := True;
end;
function TJvDBSecurity.DoLogin(var UserName: string): Boolean;
var
IconClick: TNotifyEvent;
begin
IconClick := OnIconDblClick;
if Assigned(IconClick) then
IconClick := DoIconDblClick;
Result := LoginDialog(Database, AttemptNumber, UsersTableName,
LoginNameField, MaxPasswordLen, DoCheckUser, IconClick, UserName,
AppStorage, AppStoragePath, SelectAlias, FOnLoginFailure, OnGetPassword);
end;
function TJvDBSecurity.ChangePassword: Boolean;
begin
Result := ChangePasswordDialog(Database, AttemptNumber, UsersTableName,
LoginNameField, LoggedUser, MaxPasswordLen, AllowEmptyPassword,
FOnChangePassword);
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.