safety4d/src/Safety4D.Validation.pas
Thulio Bittencourt 04d38189fd refactor
2021-04-07 22:03:05 -03:00

155 lines
3.7 KiB
ObjectPascal

unit Safety4D.Validation;
interface
uses
Safety4D.Interfaces;
type
TSafety4DValidation = class(TInterfacedObject, iSafety4DValidation)
private
[weak]
FParent : iSafety4D;
FuserKey : String;
FResource : String;
FAction : String;
FApplication : String;
public
constructor Create(aParent : iSafety4D);
destructor Destroy; override;
class function New(aParent : iSafety4D) : iSafety4DValidation;
function userKey( aValue : String ) : iSafety4DValidation; overload;
function userKey : String; overload;
function resource ( aValue : String ) : iSafety4DValidation; overload;
function resource : string; overload;
function action ( aValue : String ) : iSafety4DValidation; overload;
function action : string; overload;
function application ( aValue : String ) : iSafety4DValidation; overload;
function application : string; overload;
function validate : boolean;
function &End : iSafety4D;
end;
implementation
uses
System.SysUtils;
{ TSafety4DValidation }
function TSafety4DValidation.&end : iSafety4D;
begin
Result := FParent;
end;
function TSafety4DValidation.action(aValue: String): iSafety4DValidation;
begin
Result := Self;
FAction := aValue;
end;
function TSafety4DValidation.action: string;
begin
Result := FAction;
end;
function TSafety4DValidation.application: string;
begin
Result := FApplication;
end;
function TSafety4DValidation.application(aValue: String): iSafety4DValidation;
begin
Result := Self;
FApplication := aValue;
end;
constructor TSafety4DValidation.Create(aParent : iSafety4D);
begin
FParent := aParent;
end;
destructor TSafety4DValidation.Destroy;
begin
inherited;
end;
class function TSafety4DValidation.New(aParent : iSafety4D): iSafety4DValidation;
begin
Result := Self.Create(aParent);
end;
function TSafety4DValidation.resource: string;
begin
Result := FResource;
end;
function TSafety4DValidation.resource(aValue: String): iSafety4DValidation;
begin
Result := Self;
FResource := aValue;
end;
function TSafety4DValidation.userKey(aValue: String): iSafety4DValidation;
begin
Result := Self;
FuserKey := aValue;
end;
function TSafety4DValidation.userKey: String;
begin
Result := FuserKey;
end;
function TSafety4DValidation.validate: boolean;
var
FAllAcess : Boolean;
FAllBlock : Boolean;
iGroupPermission : iSafety4DGroupListActions;
begin
Result := False;
FAllAcess := False;
FAllBlock := False;
try
FParent.resources.exists(FApplication, FResource, FAction);
FParent.userKey.exists(FuserKey);
for var UserPermission in FParent.userKey.getUserKeyPermissions(FuserKey) do
begin
iGroupPermission := FParent.groupPermission.getGroupPermission(UserPermission);
for var aAction in iGroupPermission.actions.getActions do
begin
if UpperCase(aAction) = UpperCase(FResource+'.'+FAction) then
begin
Result := True;
exit;
end;
if aAction = '*' then
FAllAcess := True;
end;
for var aNotAction in iGroupPermission.notActions.getNotActions do
begin
if UpperCase(aNotAction) = UpperCase(FResource+'.'+FAction) then
if FParent.configurations.exceptions then
raise Exception.Create('Access not allowed to these resources');
if aNotAction = '*' then
FAllBlock := True;
end;
if not Result and FAllAcess then Result := FAllAcess;
if not Result and FAllBlock then
if FParent.configurations.exceptions then
raise Exception.Create('Access not allowed to these resources');
end;
except on e : Exception do
raise Exception.Create(e.Message);
end;
end;
end.