BSOne.SFC/eCrmHE/EXE_eCrmHomeEdition/Messages/DOtpAuth.pas

286 lines
6.9 KiB
Plaintext

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.