Jump to content

ThomasVoelker

uniGUI Subscriber
  • Posts

    1
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

ThomasVoelker's Achievements

Newbie

Newbie (1/4)

0

Reputation

  1. After I authenticated in a login form, a new instance of the mainform seems to be created. Interesting though that the Mainform created before the loginform is shown is displayed topmost. Verified this by casting TObject to Pointer to Cardinal and showing on the form together with a database session token (if available). I'll work around this by removing the login form, but I want to ask whether this behaviour is intended. unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIRegClasses, uniGUIForm,Generics.Collections, uniGUIBaseClasses, uniLabel; const cSQLArrayMax=0; type TFieldNamesID = (fnAuthenticated=0,fnSessionToken=1); TFieldNamesArray = array[0..1]of String; TSQLArray = array[0..cSQLArrayMax]of String; TMainForm = class(TUniForm) UniLabel1: TUniLabel; procedure UniFormShow(Sender: TObject); private const cFieldNames:TFieldNamesArray=( 'Authenticated' ,'SessionToken' ); cSQLIdents:TSQLArray=( 'Authenticate' ); cSQLDefaults:TSQLArray=( 'EXEC EXT.[Authenticate-User] @UserName=''%0:s'',@PasswordSHA256Base64=''%1:s''' ); class var FLock:TmultiReadExclusiveWriteSynchronizer; FSQLDict:TDictionary<string,string>; var FSessionToken:String; class Constructor Create; class Destructor Destroy; class function getSQL(Ident:String):String; class function getFieldName(Ident:TFieldNamesID):String; public { Public declarations } function Authenticate(UserName,Password:String):Boolean; end; function MainForm: TMainForm; implementation {$R *.dfm} uses uniGUIVars, MainModule, uniGUIApplication,DB ,DebugHelper ,DatabaseHelper ,ResourceHelper ,ConfigFile ; function MainForm: TMainForm; begin Result := TMainForm(UniMainModule.GetFormInstance(TMainForm)); end; { TMainForm } function TMainForm.Authenticate(UserName, Password: String): Boolean; var sPWBase64:String; aPWSha256:TBytes; sSQL:String; ds:TDataset; fST:TField; iCallID:UInt64; begin iCallID:=Log.MethodEnter(Self.ClassType,'Authenticate',[UserName,Password]); aPWSha256:=Resources.SHA256(Password); sPWBAse64:=Resources.EncodeBase64(@aPWSha256[0],32); sSQL:=GetSQL('Authenticate'); try try sSQL:=Format(sSQL,[UserName,sPWBAse64]); ds:=DBHElper.MakeDataset(sSQL,'',Self); ds.Active:=True; Log.Event(iCallID,88); fST:=ds.FindField(getFieldName(fnSessionToken)); if not fST.IsNull then Begin FSessionToken:=fST.AsString; Result:=True; End Else Begin FSessionToken:=''; Result:=False; End; finally FreeAndNil(ds); end; except on e:exception do begin Log.Error(iCallID,e); Result:=False; end; end; Log.MethodExit(iCallID); end; class Constructor TMainForm.Create; var sKey,sVal:String; i:LongInt; iCallID:UInt64; Begin Log.MethodEnter(TMainForm,'Create(class)',[]); FLock:=TMultiReadExclusiveWriteSynchronizer.Create; FLock.BeginWrite; try FSQLDict:=TDictionary<string,string>.Create; for i := 0 to cSQLArrayMax do BEgin sKey:=cSQLIDents[i]; sVal:=cSQLDefaults[i]; sVal:=Config.GetValue('BASESQL',sKEy,sVal); FSQLDict.Add(UpperCase(sKey),sVal); End; finally FLock.EndWrite; end; Log.MethodExit(iCallID); End; class destructor TMainForm.Destroy; var iCallID:UInt64; begin Log.MethodEnter(TMainForm,'Destroy(class)',[]); FreeAndNil(FLock); FreeAndNil(FSQLDict); Log.MethodExit(iCallID); end; class function TMainForm.getFieldName(Ident: TFieldNamesID): String; begin Result:=cFieldNames[Ord(Ident)]; end; class function TMainForm.GetSQL(Ident: string):String; var iCallID:UInt64; begin iCallID:=Log.MethodEnter(TMainForm,'GetSQL',[Ident]); FLock.BeginRead; if not FSQLDict.TryGetValue(UpperCase(Ident),Result) then Result:=''; FLock.EndRead; Log.MethodExit(iCallID); end; procedure TMainForm.UniFormShow(Sender: TObject); begin UniLabel1.Caption:=IntToStr(Cardinal(Pointer(Self)))+#13#10+FSessionToken; end; initialization RegisterAppFormClass(TMainForm); end. unit dLogin; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIRegClasses, uniGUIForm, uniFieldSet, uniPanel, uniButton, uniLabel, uniGUIBaseClasses, uniEdit; type TfrmLogin = class(TUniLoginForm) edtUserName: TUniEdit; edtPassword: TUniEdit; btnLogin: TUniButton; btnCancel: TUniButton; UniFieldSet1: TUniFieldSet; UniContainerPanel1: TUniContainerPanel; UniFieldContainer1: TUniFieldContainer; procedure btnLoginClick(Sender: TObject); private { Private declarations } public { Public declarations } end; function frmLogin: TfrmLogin; implementation {$R *.dfm} uses uniGUIVars, MainModule, uniGUIApplication,Main; function frmLogin: TfrmLogin; begin Result := TfrmLogin(UniMainModule.GetFormInstance(TfrmLogin)); end; procedure TfrmLogin.btnLoginClick(Sender: TObject); begin if MainForm.Authenticate(edtUserName.Text,edtPassword.Text) then ModalResult:=mrOK Else ShowMessage('Ungültige Anmeldung'); end; initialization RegisterAppFormClass(TfrmLogin); end.
×
×
  • Create New...