unit DOtpAuth; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.ImageList, Vcl.ImgList, PngImageList, Vcl.Imaging.pngimage, Vcl.ExtCtrls, WindowAnimator; const DEF_WIDTH = 397; EXT_WIDTH = 237; type TDlgOtpAuth = class(TForm) Label1: TLabel; btnOk: TButton; btnCancel: TButton; edRndCode1: TEdit; edRndCode2: TEdit; edRndCode3: TEdit; edRndCode4: TEdit; edRndCode5: TEdit; edRndCode6: TEdit; Label2: TLabel; edAuthCode1: TEdit; edAuthCode2: TEdit; edAuthCode3: TEdit; edAuthCode4: TEdit; edAuthCode5: TEdit; edAuthCode6: TEdit; procedure btnOkClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); procedure edAuthCode6KeyPress(Sender: TObject; var Key: Char); procedure Label2DblClick(Sender: TObject); procedure edAuthCode1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } sAuth_: String; nAuthFailCnt_: Integer; function GetRandomCode: String; procedure InitCode; procedure ClearAuthEdit; public { Public declarations } Constructor Create(aOwner: TComponent); override; procedure CreateParams(var Params: TCreateParams); override; // 작업표시줄에 표시 end; var DlgOtpAuth: TDlgOtpAuth; implementation uses ManagerService, System.Math, CrmLogger, Tocsg.Strings, GlobalDefine, Tocsg.DateTime; resourcestring RS_InputAuth = '인증키를 입력해주십시오.'; RS_InvalidAuth = '유효하지 않은 인증키 입니다.'; RS_InputCode = '인증코드를 입력해 주십시오.'; RS_ErrorLength = '인증코드 길이 오류입니다.'; RS_Fail3 = '인증을 3회 실패했습니다.'; RS_CodeClear = '인증 및 코드 생성을 초기화 합니다.'; RS_InvalidCode = '유효하지 않은 인증코드입니다. (초기화 : %d)'; {$R *.dfm} Constructor TDlgOtpAuth.Create(aOwner: TComponent); begin Inherited Create(aOwner); sAuth_ := ''; nAuthFailCnt_ := 0; Width := DEF_WIDTH; InitCode; end; procedure TDlgOtpAuth.InitCode; var sCode: String; begin sCode := GetRandomCode; ASSERT(sCode.Length = 6); edRndCode1.Text := sCode[1]; edRndCode2.Text := sCode[2]; edRndCode3.Text := sCode[3]; edRndCode4.Text := sCode[4]; edRndCode5.Text := sCode[5]; edRndCode6.Text := sCode[6]; end; procedure TDlgOtpAuth.Label2DblClick(Sender: TObject); var ShiftState: TShiftState; begin ShiftState := KeyDataToShiftState(0); if GetKeyState(VK_LMENU) < 0 then Include(ShiftState, ssAlt); if (ssShift in ShiftState) and (ssAlt in ShiftState) and (ssCtrl in ShiftState) then begin ShowMessage(sAuth_); end; end; procedure TDlgOtpAuth.ClearAuthEdit; begin edAuthCode1.Text := ''; edAuthCode2.Text := ''; edAuthCode3.Text := ''; edAuthCode4.Text := ''; edAuthCode5.Text := ''; edAuthCode6.Text := ''; end; procedure TDlgOtpAuth.CreateParams(var Params: TCreateParams); begin Inherited CreateParams(Params); Params.ExStyle := WS_EX_APPWINDOW; end; procedure TDlgOtpAuth.edAuthCode1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if (Sender is TEdit) and (TEdit(Sender).Text <> '') then if Key = 8 then begin if (Sender is TEdit) and (TEdit(Sender).Text = '') then begin if Sender = edAuthCode2 then edAuthCode1.SetFocus else if Sender = edAuthCode3 then edAuthCode2.SetFocus else if Sender = edAuthCode4 then edAuthCode3.SetFocus else if Sender = edAuthCode5 then edAuthCode4.SetFocus else if Sender = edAuthCode6 then edAuthCode5.SetFocus; end; end else begin if Sender = edAuthCode1 then edAuthCode2.SetFocus else if Sender = edAuthCode2 then edAuthCode3.SetFocus else if Sender = edAuthCode3 then edAuthCode4.SetFocus else if Sender = edAuthCode4 then edAuthCode5.SetFocus else if Sender = edAuthCode5 then edAuthCode6.SetFocus; end; end; procedure TDlgOtpAuth.edAuthCode6KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; btnOk.Click; end; end; function TDlgOtpAuth.GetRandomCode: String; var i: Integer; sCode, sAuth, sTemp: String; dtNow: TDateTime; Label LB_CreateCode; begin LB_CreateCode : Randomize; for i := 0 to 5 do sCode := sCode + IntToStr(RandomRange(0, 10)); dtNow := ConvLocalToUtc(Now); //{$IFDEF DEBUG} // ShowMessage(FormatDateTime('yyyy-mm-dd hh:ss:nn', dtNow)); //{$ENDIF} sTemp := FormatDateTime('yy', dtNow); sTemp := sTemp[Length(sTemp)]; sTemp := sTemp + FormatDateTime('mmdd', dtNow); sTemp := sCode + sTemp + sTemp; sAuth := EncryptStrToBinStr(sTemp, gMgSvc.EmpNo); sAuth := ExtrNumStr(sAuth); if (sCode.Length < 6) or (gMgSvc.UseOptCodeList.IndexOf(sCode + sAuth) <> -1) then goto LB_CreateCode; SetLength(sAuth, 6); sAuth_ := sAuth; Result := sCode; end; procedure TDlgOtpAuth.btnCancelClick(Sender: TObject); begin Close; end; procedure TDlgOtpAuth.btnOkClick(Sender: TObject); var sAuth: String; ExpFun: TExpFun; begin if edAuthCode1.Text = '' then begin MessageBox(Handle, PChar(RS_InputCode), PChar(Caption), MB_ICONWARNING or MB_OK); edAuthCode1.SetFocus; exit; end; if edAuthCode2.Text = '' then begin MessageBox(Handle, PChar(RS_InputCode), PChar(Caption), MB_ICONWARNING or MB_OK); edAuthCode2.SetFocus; exit; end; if edAuthCode3.Text = '' then begin MessageBox(Handle, PChar(RS_InputCode), PChar(Caption), MB_ICONWARNING or MB_OK); edAuthCode3.SetFocus; exit; end; if edAuthCode4.Text = '' then begin MessageBox(Handle, PChar(RS_InputCode), PChar(Caption), MB_ICONWARNING or MB_OK); edAuthCode4.SetFocus; exit; end; if edAuthCode5.Text = '' then begin MessageBox(Handle, PChar(RS_InputCode), PChar(Caption), MB_ICONWARNING or MB_OK); edAuthCode5.SetFocus; exit; end; if edAuthCode6.Text = '' then begin MessageBox(Handle, PChar(RS_InputCode), PChar(Caption), MB_ICONWARNING or MB_OK); edAuthCode6.SetFocus; exit; end; sAuth := edAuthCode1.Text + edAuthCode2.Text + edAuthCode3.Text + edAuthCode4.Text + edAuthCode5.Text + edAuthCode6.Text; if sAuth.Length <> 6 then begin MessageBox(Handle, PChar(RS_ErrorLength), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; if sAuth <> sAuth_ then begin if nAuthFailCnt_ = 3 then begin nAuthFailCnt_ := 0; MessageBox(Handle, PChar(RS_Fail3+#13+#10+RS_CodeClear), PChar(Caption), MB_ICONWARNING or MB_OK); InitCode; end else begin MessageBox(Handle, PChar(Format(RS_InvalidCode, [3 - nAuthFailCnt_])), PChar(Caption), MB_ICONWARNING or MB_OK); Inc(nAuthFailCnt_); end; ClearAuthEdit; edAuthCode1.SetFocus; exit; end; ModalResult := mrOk; end; end.