Skip to content

Commit

Permalink
Merge branch 'pr/338' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
mobius1qwe committed May 17, 2023
2 parents 0951a7c + 5bd8c76 commit 0c1cd80
Show file tree
Hide file tree
Showing 15 changed files with 950 additions and 1,074 deletions.
45 changes: 40 additions & 5 deletions CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,26 @@ interface
uses
Classes, SysUtils, DateUtils,
uRESTDWConsts, uRESTDWAbout, uRESTDWDataUtils, uRESTDWJSONInterface,
uRESTDWTools;
uRESTDWTools, uRESTDWParams;

type
TOnBasicAuth = Procedure(Welcomemsg, AccessTag, DataRoute,
Username, Password : String;
Var Params : TRESTDWParams;
Var ErrorCode : Integer;
Var ErrorMessage : String;
Var Accept : Boolean) Of Object;
TOnGetToken = Procedure(Welcomemsg,
AccessTag : String;
Params : TRESTDWParams;
// AuthOptions : TRESTDWAuthToken;
Var ErrorCode : Integer;
Var ErrorMessage : String;
Var TokenID : String;
Var Accept : Boolean) Of Object;
TOnRenewToken = Procedure() of Object;


TRESTDWAuthenticatorBase = class(TRESTDWComponent)
private
FAuthDialog: Boolean;
Expand All @@ -44,12 +61,16 @@ TRESTDWAuthBasic = class(TRESTDWAuthenticatorBase)
private
FPassword: String;
FUserName: String;
FOnBasicAuth: TOnBasicAuth;
public
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
function ValidateAuth(aUserName, aPassword: string): boolean;
published
property UserName: String read FUserName write FUserName;
property Password: String read FPassword write FPassword;
//eventos
property OnBasicAuth: TOnBasicAuth read FOnBasicAuth write FOnBasicAuth;
end;

TRESTDWAuthToken = class(TRESTDWAuthenticatorBase)
Expand All @@ -69,6 +90,8 @@ TRESTDWAuthToken = class(TRESTDWAuthenticatorBase)
FToken: String;
FAutoGetToken: Boolean;
FAutoRenewToken: Boolean;
FOnGetToken: TOnGetToken;
FOnRenewToken: TOnRenewToken;
procedure ClearToken;
procedure SetGetTokenEvent(AValue: String);
procedure SetToken(AValue: String);
Expand Down Expand Up @@ -100,6 +123,9 @@ TRESTDWAuthToken = class(TRESTDWAuthenticatorBase)
property Token: String read FToken write SetToken;
property AutoGetToken: Boolean read FAutoGetToken write FAutoGetToken;
property AutoRenewToken: Boolean read FAutoRenewToken write FAutoRenewToken;
// eventos
Property OnGetToken: TOnGetToken Read FOnGetToken Write FOnGetToken;
Property OnRenewToken: TOnRenewToken Read FOnRenewToken Write FOnRenewToken;
end;

TRESTDWAuthOAuth = class(TRESTDWAuthenticatorBase)
Expand Down Expand Up @@ -146,6 +172,11 @@ destructor TRESTDWAuthBasic.Destroy;
inherited;
end;

function TRESTDWAuthBasic.ValidateAuth(aUserName, aPassword: string): boolean;
begin
Result := (aUserName = UserName) and (aPassword = Password)
end;

{ TRESTDWAuthToken }

procedure TRESTDWAuthToken.Assign(ASource: TPersistent);
Expand Down Expand Up @@ -469,11 +500,15 @@ function TRESTDWAuthToken.ValidateToken(AValue: String): Boolean;
if Result then
begin
Result := False;
LHeader := DecodeStrings(LHeader{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
LBody := DecodeStrings(LBody{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
Secrets := DecodeStrings(GetSecretsValue(LBody){$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
LHeader := DecodeStrings(LHeader{$IFDEF RESTDWLAZARUS},
csUndefined{$ENDIF});
LBody := DecodeStrings(LBody{$IFDEF RESTDWLAZARUS},
csUndefined{$ENDIF});
Secrets := DecodeStrings(GetSecretsValue(LBody){$IFDEF RESTDWLAZARUS},
csUndefined{$ENDIF});
Secrets := DecodeStrings
(GetSecretsValue(Secrets){$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
(GetSecretsValue(Secrets){$IFDEF RESTDWLAZARUS},
csUndefined{$ENDIF});
Result := ReadBody(LBody);
end;
finally
Expand Down
82 changes: 25 additions & 57 deletions CORE/Source/Basic/Mechanics/uRESTDWDataUtils.pas
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,6 @@ interface
DateUtils;

Type
// TODO mover isso daqui pro authenticator na próxima versão.
TRESTDWAuthOptionTypes = (rdwOATBasic, rdwOATBearer, rdwOATToken);
TRESTDWAuthOption = (rdwAONone, rdwAOBasic, rdwAOBearer,
rdwAOToken, rdwOAuth);
TRESTDWTokenType = (rdwTS, rdwJWT, rdwPersonal);
TRESTDWAuthOptions = Set of TRESTDWAuthOption;
TRESTDWCryptType = (rdwAES256, rdwHSHA256, rdwRSA);
TRESTDWTokenRequest = (rdwtHeader, rdwtRequest);
{$IFDEF RESTDWLAZARUS}
DWInteger = Longint;
DWInt64 = Int64;
Expand Down Expand Up @@ -87,7 +79,6 @@ interface
DataSize : DWInt64; //new for ver15
End;

Type
TTokenValue = Class
Private
vInitRequest,
Expand Down Expand Up @@ -124,7 +115,6 @@ interface
Property Token : String Read ToToken;
End;

Type
TRESTDWAuthOptionParam = Class(TPersistent)
Private
vCustom404TitleMessage,
Expand All @@ -148,7 +138,6 @@ interface
Property CustomAuthErrorPage : TStringList Read vCustomAuthErrorPage Write SetCustomAuthErrorPage;
End;

Type
TRESTDWAuthTokenParam = Class(TRESTDWAuthOptionParam)
Private
vInitRequest,
Expand Down Expand Up @@ -188,7 +177,6 @@ interface
Property LifeCycle : Integer Read vLifeCycle Write vLifeCycle;
End;

Type
TRESTDWAuthOptionBasic = Class(TRESTDWAuthOptionParam)
Private
vUserName,
Expand All @@ -202,7 +190,6 @@ interface
Property Password : String Read vPassword Write vPassword;
End;

Type
TRESTDWAuthOAuth = Class(TRESTDWAuthOptionParam)
Private
vRedirectURI,
Expand Down Expand Up @@ -234,7 +221,6 @@ interface
Property Expires_in : TDateTime Read vExpiresin;
End;

Type
TRESTDWAuthOptionBearerClient = Class(TRESTDWAuthOptionParam)
Private
vGetTokenName,
Expand Down Expand Up @@ -267,7 +253,6 @@ interface
Property AutoRenewToken : Boolean Read vAutoRenewToken Write vAutoRenewToken;
End;

Type
TRESTDWAuthOptionTokenClient = Class(TRESTDWAuthOptionParam)
Private
vSecrets,
Expand Down Expand Up @@ -300,7 +285,6 @@ interface
Property AutoRenewToken : Boolean Read vAutoRenewToken Write vAutoRenewToken;
End;

Type
TRESTDWAuthOptionBearerServer = Class(TRESTDWAuthTokenParam)
Private
Protected
Expand All @@ -309,7 +293,6 @@ interface
Function FromToken(Value : String) : Boolean; Override;
End;

Type
TRESTDWAuthOptionTokenServer = Class(TRESTDWAuthTokenParam)
Private
Protected
Expand All @@ -318,7 +301,6 @@ interface
Function FromToken(Value : String) : Boolean; Override;
End;

Type
TRESTDWServerAuthOptionParams = Class(TPersistent)
Private
FOwner : TPersistent;
Expand All @@ -338,7 +320,6 @@ interface
Property OptionParams : TRESTDWAuthOptionParam Read RDWAuthOptionParam Write RDWAuthOptionParam;
End;

Type
TRESTDWClientAuthOptionParams = Class(TPersistent)
Private
FOwner : TPersistent;
Expand All @@ -357,7 +338,6 @@ interface
Property OptionParams : TRESTDWAuthOptionParam Read RDWAuthOptionParam Write RDWAuthOptionParam;
End;

Type
TRESTDWAuthRequest = Class
Private
vToken : String;
Expand All @@ -366,7 +346,6 @@ interface
Property Token : String Read vToken Write vToken;
End;

Type
TRESTDWDataUtils = Class
Public
Class Procedure ParseRESTURL (Const Cmd : String;
Expand Down Expand Up @@ -433,8 +412,6 @@ interface
{$ENDIF}) : Boolean;
End;



Function GettokenValue (Value : String) : String;
Function GetTokenType (Value : String) : TRESTDWTokenType;
Function CountExpression(Value : String;
Expand Down Expand Up @@ -708,7 +685,7 @@ implementation
Result := Format('{"alg": "%s", "typ": "%s"}', [GetCryptType, GetTokenType]);
End;

Function TTokenValue.ToToken : String;
Function TTokenValue.ToToken : String;
Var
viss,
vBuildData : String;
Expand Down Expand Up @@ -745,39 +722,30 @@ implementation
vBuildData := Format(cValueToken, [viss,
IntToStr(DateTimeToUnix(vFinalRequest, False)),
IntToStr(DateTimeToUnix(vInitRequest, False)),
EncodeStrings(Format(cValueKeyToken, [EncodeStrings(vSecrets{$IFDEF FPC}, csUndefined{$ENDIF}), vMD5])
{$IFDEF FPC}, csUndefined{$ENDIF})])
EncodeStrings(Format(cValueKeyToken, [EncodeStrings(vSecrets{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF}), vMD5])
{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF})])
Else
vBuildData := Format(cValueTokenNoLife, [viss,
IntToStr(DateTimeToUnix(vInitRequest, False)),
EncodeStrings(Format(cValueKeyToken, [EncodeStrings(vSecrets{$IFDEF FPC}, csUndefined{$ENDIF}), vMD5])
{$IFDEF FPC}, csUndefined{$ENDIF})]);
Result := Result + '.' + EncodeStrings(vBuildData{$IFDEF FPC}, csUndefined{$ENDIF});
EncodeStrings(Format(cValueKeyToken, [EncodeStrings(vSecrets{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF}), vMD5])
{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF})]);
Result := Result + '.' + EncodeStrings(vBuildData{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
Result := Format(cTokenStringRDWTS, [Result + '.' + vCripto.Encrypt(Result)]);
End;
End;
End;

Function TTokenValue.ToJSON : String;
Function TTokenValue.ToJSON : String;
Begin
Result := '';
Case vRDWTokenType Of
rdwTS,
rdwPersonal : Begin
Result := EncodeStrings(GetHeader{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
End;
rdwJWT : Begin
Result := EncodeStrings(GetHeader{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
End;
End;
Result := EncodeStrings(GetHeader{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF});
End;

Procedure TTokenValue.SetSecrets (Value : String);
Procedure TTokenValue.SetSecrets (Value : String);
Begin
vSecrets := Value;
vSecrets := Value;
End;

Procedure TTokenValue.SetTokenHash(Token : String);
Procedure TTokenValue.SetTokenHash(Token : String);
Begin
vTokenHash := Token;
vCripto.Key := vTokenHash;
Expand Down Expand Up @@ -905,7 +873,7 @@ implementation
Inherited Assign(Source);
End;

Function TRESTDWAuthOptionTokenServer.FromToken(Value : String) : Boolean;
Function TRESTDWAuthOptionTokenServer.FromToken(Value : String) : Boolean;
Var
vHeader,
vBody,
Expand Down Expand Up @@ -1025,7 +993,7 @@ implementation
End;
End;

Function TRESTDWAuthOptionTokenServer.GetToken(aSecrets : String = '') : String;
Function TRESTDWAuthOptionTokenServer.GetToken(aSecrets : String = '') : String;
Var
vTokenValue : TTokenValue;
Begin
Expand Down Expand Up @@ -1115,7 +1083,7 @@ implementation
Inherited Assign(Source);
End;

Function TRESTDWAuthOptionBearerServer.FromToken(Value : String) : Boolean;
Function TRESTDWAuthOptionBearerServer.FromToken(Value : String) : Boolean;
Var
vHeader,
vBody,
Expand Down Expand Up @@ -1232,7 +1200,7 @@ implementation
End;
End;

Function TRESTDWAuthOptionBearerServer.GetToken(aSecrets : String = '') : String;
Function TRESTDWAuthOptionBearerServer.GetToken(aSecrets : String = '') : String;
Var
vTokenValue : TTokenValue;
Begin
Expand All @@ -1258,7 +1226,7 @@ implementation
Inherited;
End;

Procedure TRESTDWServerAuthOptionParams.CopyServerAuthParams(Var Value : TRESTDWAuthOptionParam);
Procedure TRESTDWServerAuthOptionParams.CopyServerAuthParams(Var Value : TRESTDWAuthOptionParam);
Begin
If RDWAuthOptionParam is TRESTDWAuthTokenParam Then
Begin
Expand Down Expand Up @@ -1403,7 +1371,7 @@ implementation
Begin
inherited;
vToken := '';
vRDWTokenType := rdwTS;
vRDWTokenType := rdwJWT;
vTokenRequest := rdwtHeader;
vSecrets := '';
vGetTokenName := 'GetToken';
Expand All @@ -1422,8 +1390,8 @@ implementation
vGetTokenName := 'GetToken';
vTokenName := 'token';
vLifeCycle := 1800;//30 Minutos
vRDWTokenType := rdwTS;
vRDWCryptType := rdwAES256;
vRDWTokenType := rdwJWT;
vRDWCryptType := rdwHSHA256;
vServerSignature := '';
vInitRequest := 0;
vFinalRequest := 0;
Expand All @@ -1449,17 +1417,17 @@ implementation
Inherited Assign(Source);
End;

Destructor TRESTDWAuthTokenParam.Destroy;
Destructor TRESTDWAuthTokenParam.Destroy;
Begin
Inherited;
End;

Procedure TRESTDWAuthTokenParam.SetTokenHash(Token : String);
Procedure TRESTDWAuthTokenParam.SetTokenHash(Token : String);
Begin
vTokenHash := Token;
End;

Function TRESTDWAuthTokenParam.GetTokenType (Value : String) : TRESTDWTokenType;
Function TRESTDWAuthTokenParam.GetTokenType (Value : String) : TRESTDWTokenType;
Begin
Result := rdwTS;
If Lowercase(Value) = 'jwt' Then
Expand All @@ -1468,7 +1436,7 @@ implementation
Result := rdwPersonal;
End;

Function TRESTDWAuthTokenParam.GetCryptType (Value : String) : TRESTDWCryptType;
Function TRESTDWAuthTokenParam.GetCryptType (Value : String) : TRESTDWCryptType;
Begin
Result := rdwAES256;
If Lowercase(Value) = 'hs256' Then
Expand All @@ -1477,12 +1445,12 @@ implementation
Result := rdwRSA;
End;

Procedure TRESTDWAuthTokenParam.SetCryptType (Value : TRESTDWCryptType);
Procedure TRESTDWAuthTokenParam.SetCryptType (Value : TRESTDWCryptType);
Begin
vRDWCryptType := Value;
End;

Procedure TRESTDWAuthTokenParam.SetGetTokenName(Value : String);
Procedure TRESTDWAuthTokenParam.SetGetTokenName(Value : String);
Begin
If Length(Value) > 0 Then
vGetTokenName := Value
Expand Down
Loading

0 comments on commit 0c1cd80

Please sign in to comment.