BSOne.SFC/eCrmHE/EXE_eCrmHomeEdition/DeCrmHeMain.pas

9099 lines
286 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit DeCrmHeMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Imaging.pngimage,
PngImageList, System.ImageList, Vcl.ImgList, Vcl.Buttons, Vcl.StdCtrls,
Vcl.Menus, WindowAnimator, System.Actions, Vcl.ActnList,
DDispLogo, IdHTTP, IdSSLOpenSSL, IdIOHandler, KeyMonDLL,
FPolicyView, CttSchDefine, System.Generics.Collections,
Tocsg.Thread, System.Notification, GlobalDefine, DefineHelper,
RecoverService, ManagerService, superobject,
BsKwdSchKvCttSchClient, Tocsg.Win32, OutlookMonClient, ThdExecuteEndNoti,
DWaitProcPrt, ThdSchFileScan, DProgCustomCttSch, Tocsg.Process, Winapi.oleacc,
ThdWebOpenCheck, Tocsg.Clipboard, ThdRcvPolicy, DPrintProg, Bs1FltCtrl;
const
SIZE_DEF_FORM_W = 570;
SIZE_EXTEND_FORM_W = 500;
SIZE_DEF_FORM_H = 740;
SIZE_UP_FORM_H = 800;
//{$DEFINE OLD_CB_MON}
INI_PREVFUN = 'prevfeature.ini';
EXE_BROWSER_SECU = 'browsec.exe';
type
TDlgeCrmHeMain = class(TForm)
pnMain: TPanel;
imgMain: TImage;
imgClose: TImage;
imgHelp: TImage;
imgQA: TImage;
imgMainList: TPngImageCollection;
imgUpBtnList: TPngImageList;
imgEvList: TPngImageList;
imgBtnList: TPngImageList;
popTray: TPopupMenu;
miAgentState: TMenuItem;
miDelAgent: TMenuItem;
imgArrow: TPngImageList;
tMtx: TTimer;
tInit: TTimer;
pnList: TPanel;
imgBack: TImage;
lbOsVerTop: TLabel;
lbOS: TLabel;
imgSetOs: TImage;
lbPW: TLabel;
imgSetAccPass: TImage;
lbScrSav: TLabel;
imgSetScreenSaver: TImage;
lbAntiV: TLabel;
lbAV: TLabel;
imgSetAntiVirus: TImage;
imgAvInfo: TImage;
lbFireW: TLabel;
lbFW: TLabel;
imgSetFW: TImage;
imgFwInfo: TImage;
lbConn: TLabel;
lbIpInfo: TLabel;
lbEmpNo: TLabel;
imgList: TImage;
imgOsInfo: TImage;
lbOsPatch: TLabel;
imgOsVerState: TImage;
imgOsPatchState: TImage;
imgAvState: TImage;
imgPassState: TImage;
imgScrSavState: TImage;
imgFwState: TImage;
imgStateList: TPngImageList;
imgLang: TImage;
lbMode: TLabel;
imgChangeEmpNo: TImage;
lbOsPatchState: TLabel;
lbPassState: TLabel;
lbScrSavState: TLabel;
lbVer: TLabel;
lbPolicyName: TLabel;
lbPolicyState: TLabel;
imgExpend: TImage;
ActionList: TActionList;
acHelp: TAction;
lbWinAccount: TLabel;
tTempConn: TTimer;
imgTrayState: TPngImageList;
N1: TMenuItem;
N2: TMenuItem;
miOpenDrmFile: TMenuItem;
miEncDrmFile: TMenuItem;
OpenDialogDRM: TOpenDialog;
imgCompany: TImage;
imgOsPchInfo: TImage;
miChangeEmpNo: TMenuItem;
N3: TMenuItem;
miScreenLock: TMenuItem;
miViewSchPersonalInfo: TMenuItem;
lbSchProgMsg: TLabel;
tSchTimer: TTimer;
pnPolicyView: TPanel;
miSendSoftInstInfo: TMenuItem;
imgLangList: TPngImageList;
popLang: TPopupMenu;
N5: TMenuItem;
miPolicyDetailView: TMenuItem;
lbQA: TLabel;
lbChangeEmpNo: TLabel;
lbLang: TLabel;
imgCttSch: TImage;
imgCttSchRst: TImage;
lbCttSch: TLabel;
lbCttSchRst: TLabel;
lbCttSchSP: TLabel;
tCttSchTimer: TTimer;
miDecryptDrm: TMenuItem;
lbSchTitle: TLabel;
lbCompanyName: TLabel;
tStatus: TTimer;
lbTagInfo: TLabel;
imgPwDateInfo: TImage;
miOfflineExp: TMenuItem;
miResetPersonalScan: TMenuItem;
miDebugMode: TMenuItem;
miUpdatePolicy: TMenuItem;
btnTest1: TButton;
btnTest2: TButton;
tUpdateLogo: TTimer;
miPiResult: TMenuItem;
miRetryPiScan: TMenuItem;
miFileEncPopup: TMenuItem;
miExportPo: TMenuItem;
N4: TMenuItem;
miPolicyView: TMenuItem;
miShowTagInfo: TMenuItem;
miCttSch: TMenuItem;
miCttSchResult: TMenuItem;
miEncryptDrm: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
miAipTry: TMenuItem;
miReqPrint: TMenuItem;
miAprvReqList: TMenuItem;
miAprvList: TMenuItem;
N10: TMenuItem;
tSnapTag: TTimer;
miAip2Kess: TMenuItem;
miKess2Aip: TMenuItem;
N8: TMenuItem;
miNoWaterApproval: TMenuItem;
miInfo: TMenuItem;
miUsbInfo: TMenuItem;
N9: TMenuItem;
miExportCmPo: TMenuItem;
miAprvFileExport: TMenuItem;
N11: TMenuItem;
miPrintCtrl: TMenuItem;
miBrowserSecu: TMenuItem;
miPcCleanup: TMenuItem;
miSharePcPrintBlock: TMenuItem;
miWSDPortPrintBlock: TMenuItem;
miTcpIpPrintBlock: TMenuItem;
miPrintSavingBlock: TMenuItem;
miPcCleanup_IH: TMenuItem;
miPcCleanup_IC: TMenuItem;
miPcCleanup_CC: TMenuItem;
miPcCleanup_IA: TMenuItem;
miPcCleanup_RF: TMenuItem;
miPcCleanup_MS: TMenuItem;
miFileErase: TMenuItem;
miRecycleDel: TMenuItem;
miTempDel: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
miPcCleanup_All: TMenuItem;
miPcCleanup_OffSafe: TMenuItem;
miFilePerDel: TMenuItem;
miProcessTerminatePrevate: TMenuItem;
procedure imgMainMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imgCloseClick(Sender: TObject);
procedure imgCloseMouseEnter(Sender: TObject);
procedure imgCloseMouseLeave(Sender: TObject);
procedure imgQAMouseEnter(Sender: TObject);
procedure imgQAMouseLeave(Sender: TObject);
procedure imgSetOsMouseEnter(Sender: TObject);
procedure imgSetOsMouseLeave(Sender: TObject);
procedure imgSetOsClick(Sender: TObject);
procedure imgSetScreenSaverClick(Sender: TObject);
procedure imgSetAntiVirusClick(Sender: TObject);
procedure imgSetFWClick(Sender: TObject);
procedure imgSetAccPassClick(Sender: TObject);
procedure imgAvInfoClick(Sender: TObject);
procedure imgFwInfoClick(Sender: TObject);
procedure imgQAClick(Sender: TObject);
procedure miAgentStateClick(Sender: TObject);
procedure tMtxTimer(Sender: TObject);
procedure tInitTimer(Sender: TObject);
procedure miDelAgentClick(Sender: TObject);
procedure imgOsInfoMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imgOsInfoMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure lbOsVerTopMouseEnter(Sender: TObject);
procedure lbOsVerTopMouseLeave(Sender: TObject);
procedure lbOsVerTopMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure lbOsVerTopMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imgExpendClick(Sender: TObject);
procedure imgExpendMouseEnter(Sender: TObject);
procedure imgExpendMouseLeave(Sender: TObject);
procedure imgExpendMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imgExpendMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure acHelpExecute(Sender: TObject);
procedure imgOsInfoClick(Sender: TObject);
procedure tTempConnTimer(Sender: TObject);
procedure imgChangeEmpNoClick(Sender: TObject);
procedure popTrayPopup(Sender: TObject);
procedure miOpenDrmFileClick(Sender: TObject);
procedure miEncDrmFileClick(Sender: TObject);
procedure lbVerDblClick(Sender: TObject);
procedure imgOsPchInfoClick(Sender: TObject);
procedure lbWinAccountDblClick(Sender: TObject);
procedure lbEmpNoDblClick(Sender: TObject);
procedure miScreenLockClick(Sender: TObject);
procedure miViewSchPersonalInfoClick(Sender: TObject);
procedure tSchTimerTimer(Sender: TObject);
procedure miSendSoftInstInfoClick(Sender: TObject);
procedure imgLangMouseEnter(Sender: TObject);
procedure imgLangMouseLeave(Sender: TObject);
procedure imgLangClick(Sender: TObject);
procedure miPolicyDetailViewClick(Sender: TObject);
procedure imgCttSchMouseEnter(Sender: TObject);
procedure imgCttSchMouseLeave(Sender: TObject);
procedure tCttSchTimerTimer(Sender: TObject);
procedure lbCttSchClick(Sender: TObject);
procedure lbCttSchRstClick(Sender: TObject);
procedure miDecryptDrmClick(Sender: TObject);
procedure lbModeDblClick(Sender: TObject);
procedure tStatusTimer(Sender: TObject);
procedure lbTagInfoDblClick(Sender: TObject);
procedure imgPwDateInfoClick(Sender: TObject);
procedure miOfflineExpClick(Sender: TObject);
procedure miResetPersonalScanClick(Sender: TObject);
procedure miDebugModeClick(Sender: TObject);
procedure miUpdatePolicyClick(Sender: TObject);
procedure btnTest1Click(Sender: TObject);
procedure btnTest2Click(Sender: TObject);
procedure tUpdateLogoTimer(Sender: TObject);
procedure miPiResultClick(Sender: TObject);
procedure miRetryPiScanClick(Sender: TObject);
procedure miFileEncPopupClick(Sender: TObject);
procedure miExportPoClick(Sender: TObject);
procedure lbIpInfoDblClick(Sender: TObject);
procedure miPolicyViewClick(Sender: TObject);
procedure miShowTagInfoClick(Sender: TObject);
procedure miCttSchClick(Sender: TObject);
procedure miCttSchResultClick(Sender: TObject);
procedure miEncryptDrmClick(Sender: TObject);
procedure miAipTryClick(Sender: TObject);
procedure miReqPrintClick(Sender: TObject);
procedure miAprvReqListClick(Sender: TObject);
procedure miAprvListClick(Sender: TObject);
procedure tSnapTagTimer(Sender: TObject);
procedure miAip2KessClick(Sender: TObject);
procedure miKess2AipClick(Sender: TObject);
procedure miNoWaterApprovalClick(Sender: TObject);
procedure miInfoClick(Sender: TObject);
procedure miUsbInfoClick(Sender: TObject);
procedure miExportCmPoClick(Sender: TObject);
procedure miAprvFileExportClick(Sender: TObject);
procedure miPrintCtrlClick(Sender: TObject);
procedure miSharePcPrintBlockClick(Sender: TObject);
procedure miBrowserSecuClick(Sender: TObject);
procedure miPcCleanup_AllClick(Sender: TObject);
procedure miFilePerDelClick(Sender: TObject);
procedure miTempDelClick(Sender: TObject);
procedure miRecycleDelClick(Sender: TObject);
procedure miProcessTerminatePrevateClick(Sender: TObject);
private
{ Private declarations }
HTTP_: TIdHTTP;
SSL_: TIdSSLIOHandlerSocketOpenSSL;
LastWS_: TWindowState;
MgSvc_: TManagerService;
WndAni_: TWindowAnimator;
bWndExpend_,
bIgrNextCbNoti_,
bIgrNextCbNotiExcel_: Boolean;
TrayIcon_: TTrayIcon;
DispBlock_,
DispLogos_,
DispLogosST_: TDlgDispLogoList;
KeyMonDll_: TKeyMonDLL;
RecoverSvc_: TRecoverService;
sSysDir_: String;
{$IFDEF OLD_CB_MON}
CbMon_: TDrawClipboard;
{$ELSE}
sOldCbHds_: String;
{$ENDIF}
dtRecentCbPopup_,
dtRecentPrtScrKey_: TDateTime;
dwChkAbMon_: DWORD;
sTrayHint_,
sChkAbMon_,
sCbAbleApps_,
sCbCollectApps_,
sWebAbSigs_,
sWebAbFNames_,
sEtcAbSigs_,
sEtcAbFNames_,
sWebAbExts_,
sEtcAbExts_: String;
CbAbleAppList_,
CbCollectAppList_,
WebAbSigList_,
WebAbFNameList_,
EtcAbSigList_,
EtcAbFNameList_,
WebAbExtList_,
EtcAbExtList_: TStringList;
// bIsDebugMode_: Boolean;
FrmPolicyView_: TFrmPolicyView;
bUsePersonalFun_: Boolean;
// DTagList_: TDlgTagList;
// Client_: TSearchLightClient;
qNoti_: TQueue<String>;
ThdTaskTimer_: TThdTaskTimer;
KwdSchKvCLient_: TBsKwdSchKvCttSchClient;
// MtxScrLogo_: TTgMutex;
OutClient_: TOutlookMonClient; // 아웃룩 정책, 스레드에서 생성하면 안되서 여기서 생성 23_0503 14:36:30 kku
dwBlockInputCTick_: DWORD; // 클립보드 차단 시 입력 시간 제한
bCtrlA_: Boolean; // Ctrl + A 입력 감지, 엑셀에서 클립보드 수집 무시를 위함 23_1107 08:11:30 kku
// bPopChromeSK_: Boolean; // 클립보드 팝업 시 SK하이닉스 크롬에서 두번 뜨는 현상 뭉게기... 23_0511 16:02:03 kku
// 프린트 워터마크 진행상황을 위함
dlgWaterProg_: TDlgWaitExtrProcPrt;
dlgPrtWProg_: TDlgPrintProg;
bPreWinKey_,
bScrCapKey_,
bForceCollectCB_: Boolean;
sRecentBwUrl_,
sRecentBwTitle_: String;
// 프로그램 운용에 관련된 프로세스 감시 24_0703 14:27:59 kku
ProcW_: TThdProcessWatch;
// 파일 차단 중복 처리를 막기 위해 추가 23_1205 13:36:22 kku
sRecentABFile_: String;
dwRecentAB_: DWORD;
// Ctrl + C 시도한 프로세스
// sLastCbAppName_: String;
// 개인정보 수동 검사 24_0521 10:11:48 kku
ThdCustomScanSch_: TThdSchFileScan;
sSchRstPath_: String;
// 원격데스크톱에서 해상도 변경 시 사용
// nScrW_, nScrH_: Integer;
bIsClearCB_: Boolean;
// 브라우저 URL 체크
AccObj_SubTitle_: IAccessible;
varSubTitle_: OleVariant;
hEditWnd_: HWND;
// 브라우저에서 받은 파일 열기 체크
ThdWebOC_: TThdWebOpenCheck;
// 파일 차단 로그 중복 처리 방지
FileAbLogs_: TStringList;
sLastNotExistFile_: String;
procedure UpdateLangName(nLang: Integer);
procedure LockScreen;
procedure ResetTrayIcon;
procedure SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer);
procedure SetStateImage(nIdx: Integer);
procedure SetExtendMainView(bVal: Boolean);
procedure FinishWindowExpend;
procedure RefreshView;
procedure VisibleMainform(bVal: Boolean; bForce: Boolean = false);
function CtrlTagToImage(aSender: TObject): TImage;
procedure InitHttp;
procedure EncFile(sPath: String);
procedure DecFile(sPath: String);
procedure ApprovalFileExport(aList: TStrings);
procedure ApprovalFileDecrypt(OA: ISuperObject);
procedure OnClipboardNotify(Sender: TDrawClipboard);
procedure OnSetLangClick(aSender: TObject);
procedure ShowTrayMsg(brFlag: TBalloonFlags; sTitle, sText: String);
procedure DoAgentUninstall;
procedure UpdateLangRes;
procedure AfterLangChange(Sender: TObject; const LanguageFile: string);
procedure AddFoundCttSchRst(pResult: PSchResult);
procedure TimerNotification(Sender: TObject);
procedure TimerReqCoreInfo(aSender: TObject);
procedure UpdateScreenLogo(bForceUpdate: Boolean = false);
function SetAipLabel(sPath: String; sAipLabelId: String): Boolean;
procedure OnProcNotify(aSender: TThdProcessWatch; pEnt: PPwEnt; aKind: TProcessWatchKind);
public
{ Public declarations }
Constructor Create(aOwner: TComponent); override;
procedure CreateParams(var Params: TCreateParams); override;
Destructor Destroy; override;
procedure UpdateCttSchRstButton;
procedure process_WM_POPUP_MSG(var msg: TMessage); Message WM_POPUP_MSG;
procedure process_WM_POPUP_LICENSE(var msg: TMessage); Message WM_POPUP_LICENSE;
procedure process_WM_POPUP_AFTERREPORT(var msg: TMessage); Message WM_POPUP_AFTERREPORT;
procedure process_WM_POPUP_MSG_SYSTEM(var msg: TMessage); Message WM_POPUP_MSG_SYSTEM;
procedure process_WM_REFRESH_VIEW(var msg: TMessage); Message WM_REFRESH_VIEW;
procedure process_WM_SYSCOMMAND(var msg: TWMSysCommand); Message WM_SYSCOMMAND;
procedure process_WM_SCREENLOCK(var msg: TMessage); Message WM_SCREENLOCK;
procedure process_WM_REFRESH_CLIPBOARDCHAIN(var msg: TMessage); Message WM_REFRESH_CLIPBOARDCHAIN;
procedure process_WM_REQ_AGENT_UNINSTALL(var msg: TMessage); Message WM_REQ_AGENT_UNINSTALL;
// 클립보드 처리
// procedure process_WM_CHANGECBCHAIN(var msg: TMessage); Message WM_CHANGECBCHAIN;
// procedure process_WM_DRAWCLIPBOARD(var msg: TMessage); Message WM_DRAWCLIPBOARD;
procedure process_WM_CTTSCH_INIT(var msg: TMessage); Message WM_CTTSCH_INIT;
procedure process_WM_CTTSCH_REQUEST(var msg: TMessage); Message WM_CTTSCH_REQUEST;
procedure process_WM_COPYDATA(var msg: TMessage); Message WM_COPYDATA;
procedure process_WM_NOTIFY_HOOKDATA(var msg: TMessage); Message WM_NOTIFY_HOOKDATA;
procedure process_WM_INIT_HLEPER(var msg: TMessage); Message WM_INIT_HLEPER;
procedure process_WM_RESPONSE_HLEPER(var msg: TMessage); Message WM_RESPONSE_HLEPER;
procedure process_WM_REQUEST_DRM(var msg: TMessage); Message WM_REQUEST_DRM;
procedure process_WM_REQ_FILETAG_CONTROL(var msg: TMessage); Message WM_REQ_FILETAG_CONTROL;
procedure process_WM_REQ_KWDSCH_CONTROL(var msg: TMessage); Message WM_REQ_KWDSCH_CONTROL;
procedure process_WM_REQ_OUTLOOK_CONTROL(var msg: TMessage); Message WM_REQ_OUTLOOK_CONTROL;
procedure process_WM_UPDATE_SCREENLOGO(var msg: TMessage); Message WM_UPDATE_SCREENLOGO;
procedure process_WM_NOTIEXECUTE_END(var msg: TMessage); Message WM_NOTIEXECUTE_END;
procedure process_WM_POPUP_PRINTWATER_PROGRESS(var msg: TMessage); Message WM_POPUP_PRINTWATER_PROGRESS;
procedure process_WM_POPUP_PRTW_PROGRESS(var msg: TMessage); Message WM_POPUP_PRTW_PROGRESS;
procedure process_WM_CATCHKEY_NOTIFY(var msg: TMessage); Message WM_CATCHKEY_NOTIFY;
procedure process_WM_DISPLAYCHANGE(var msg: TMessage); Message WM_DISPLAYCHANGE;
// procedure process_WM_SETTINGCHANGE(var msg: TMessage); Message WM_SETTINGCHANGE; // WM_WTSSESSION_CHANGE ??
procedure process_WM_SCREEN_CAPTURE_BLOCK(var msg: TMessage); Message WM_SCREEN_CAPTURE_BLOCK;
procedure process_WM_POPUP_MSG2(var msg: TMessage); Message WM_POPUP_MSG2;
procedure process_WM_POPUP_MSG_PI(var msg: TMessage); Message WM_POPUP_MSG_PI;
procedure process_WM_CLOSE_CTTSCH(var msg: TMessage); Message WM_CLOSE_CTTSCH;
procedure process_WM_REQUEST_APPROVAL(var msg: TMessage); Message WM_REQUEST_APPROVAL;
procedure process_WM_DONE_APPROVAL(var msg: TMessage); Message WM_DONE_APPROVAL;
procedure process_WM_NOTI_RCVPOLICY(var msg: TMessage); Message WM_NOTI_RCVPOLICY;
procedure process_WM_ENDSESSION(var msg: TMessage); Message WM_ENDSESSION;
{$IFNDEF OLD_CB_MON}
procedure process_WM_CLIPBOARDUPDATE(var msg: TMessage); Message WM_CLIPBOARDUPDATE;
{$ENDIF}
property KeyMon: TKeyMonDLL read KeyMonDll_;
end;
var
gMain: TDlgeCrmHeMain = nil;
DlgeCrmHeMain: TDlgeCrmHeMain;
implementation
uses
Define, Tocsg.Strings, Tocsg.Trace, Condition, Tocsg.Shell,
DNotice, Tocsg.Safe, License, DLicense, DQnA, DLiteInfo,
Tocsg.Service, Tocsg.Path, Winapi.WinSvc,
ProcessParam, Tocsg.Convert, ManagerModel, DHelp, Tocsg.Exception,
VulnerabilityService, Tocsg.DateTime, DInputEmpNo, Tocsg.WndUtil,
IdMultipartFormData, Tocsg.Files, DAfterReport, System.DateUtils,
System.IniFiles, Tocsg.Registry, DLockScreen, Tocsg.Json,
Tocsg.User32, DReqSchInfoTest, KDL.Localizer, DCustomCttSch,
DViewCttSchResult, Tocsg.Notification, DPolicyView,
DReqDevExcept, DSelPerInfo, ManagerPerInfo, DefineKeyMon,
DDecryptDrm, DSimpleInfo, Tocsg.Packet, DProgCttSchTask,
Tocsg.WTS, AppCtrlDefine, DOfflineExpAuth, CrmLogger, Soap.EncdDecd, DDebugPW,
DUninstallPW, CrmUtil, ProcessServerAPI, Winapi.ShellAPI,
Vcl.Clipbrd, Tocsg.Driver, ManagerCampaign, Tocsg.Keyboard, DOtpAuth,
DSchPiNoti, DNoticeImg, Tocsg.Delete, Tocsg.PCRE, ProcessSoftcampDRM, DCurPolicyView,
DCustomCttSchOpt,
DViewCustomCttSchResult, STLabGuardModule, DEncryptDrm, ThdWebUrl, Winapi.ActiveX, ManagerPrint,
DPrintApproveReq, DReqPrintList, DPrintApproveReqA, DPrintApproveRst, Tocsg.AIP,
DAip2KessDrm, DKess2AipDrm, Tocsg.Hash, BuildInfo, DDeleteCode,
Winapi.AccCtrl, Winapi.AclAPI, DEjectDLL, DUsbInfo, DBs1Log, Tocsg.Printer, DBrowserOpt, DPerfectDel, Tocsg.Disk, DEncryptAip, DDecryptAip, Tocsg.Url;
resourcestring
RS_StateNormal = '상태 양호';
RS_StateVul = '취약상태';
RS_MsgLogoWarningNHL = '중요문서 정보유출 시 법적 제재를 받을 수 있으며, 주의하시기 바랍니다.';
RS_MsgLogoLX = 'LX 한국국토정보공사 화상회의 및 원격근무';
RS_MsgLogoVolvo = 'VOLVO 재택근무';
RS_SecuMode = '보안모드';
RS_HEC_SecuMode = '사내모드';
RS_VulMode = '취약모드';
RS_SleepMode = '수면모드';
RS_HEC_SleepMode = '사외모드';
RS_CheckOff = '점검기능 Off';
RS_FMT_Searching = '[%s] %d/%d (%d%%), 검사중 .. "%s"';
RS_FMT_Scaning = '[%s] "%s"에서 파일을 추출중입니다... Files=%d';
RS_NoDeleteSecuMode1 = '보안모드 중에는 삭제할 수 없습니다.';
RS_NoDeleteSecuMode2 = '먼저 보안모드를 해제 해주십시오.';
RS_Q_DeleteHE1 = '[예]를 선택하면, %s이 삭제됩니다.';
RS_Q_DeleteHE2 = '삭제는 복구 불가능하며 재택근무와 원격 접속에 치명적인';
RS_Q_DeleteHE3 = '오류를 야기할 수 있습니다.';
RS_Q_DeleteHE4 = '삭제를 진행하시겠습니까?';
RS_MsgIsBigFile50MbLow = '파일 크기가 너무 큽니다. 50MB 이하 파일을 선택 해주십시오.';
RS_MsgEncFile = 'DRM 파일 암호화를 완료했습니다.';
RS_MsgDecFile = 'DRM 파일 복호화를 완료했습니다.';
RS_MsgEncInSecuMode = 'DRM 파일 동작은 안전모드에서만 동작합니다. VPN 연결 및 PC 취약점 상태를 확인하세요.';
RS_NoConnectServer = '서버에 연결 되어있지 않습니다.';
RS_WaitRetry = '잠시 후 다시 시도해 주십시오.';
RS_LodingInfo = '정보를 불러오는 중입니다...';
RS_AvInfo = 'Anti-virus 정보';
RS_FwInfo = '방화벽 정보';
RS_RecentDtPatchOS = '최신 OS 패치확인 일시';
RS_RemainOsCheckTime = 'OS 패치확인 남은시간';
RS_OsPatchAble = '최신 OS 패치가 있습니다.';
RS_CheckingOsPatch = '최신 OS 패치를 확인하고 있습니다...';
RS_OsPatchInfo = 'OS 패치 정보';
RS_Q_StopCttSch = '개인정보 검출을 중지하시겠습니까?';
RS_InitWork = '작업을 준비중입니다...';
RS_SendAppInstInfo = '설치된 소프트웨어 정보를 전송했습니다.';
RS_StopCttSch = '개인정보 검출 중지';
RS_StartCttSch = '개인정보 검출 시작';
RS_MsgVpnClosed1 = '업무 환경이 종료되었습니다.';
RS_MsgVpnClosed2 = '%s 은 수면 모드로 변경되며';
RS_MsgVpnClosed3 = '보안 기능은 모두 종료됩니다.';
RS_MsgNetClose1 = '취약한 보안 설정이 감지되어,';
RS_MsgNetClose2 = '네트워크가 잠시 종료됩니다.';
RS_MsgNetClose3 = '모든 연결(VPN포함)은 초기화 됩니다.';
RS_AlreadyCttSchRts1 = '개인정보 검사 결과가 존재합니다.';
RS_AlreadyCttSchRts2 = '삭제 후 다시 검사하시겠습니까?';
RS_PiScanning = '개인정보 검사가 진행되고 있습니다.';
RS_ClosePerInfoResult = '먼저 개인정보 검사 결과창을 닫아 주십시오.';
RS_EncScanning = '파일 암호화가 진행되고 있습니다.';
RS_ConfirmRetry = '완료 후 다시 시도해 주십시오.';
RS_NoScanData = '개인정보 검사 결과가 존재하지 않습니다.';
RS_ScanConfirm1 = '[%s] 일시에';
RS_ScanConfirm2 = '%s개가 추출된 검색 옵션으로';
RS_ScanConfirm3 = '개인정보 검사를 진행합니다.';
RS_ScanConfirm4 = '계속 하시겠습니까?';
RS_ScanConfirm5 = '(예상 시간 : %s)';
RS_FailScanOpt = '개인정보 검사 옵션을 가져올 수 없습니다.';
RS_MsgMain1_ABL = '[취약상태]로 되어 있는 버튼을 클릭하여 설정을 변경하세요.';
RS_MsgMain2_ABL = '자세한 설정 방법은 오른쪽 상단의 [?]를 클릭하여 참고하세요.';
RS_Tray_ABL = 'ABL생명 재택근무PC 보안통제 솔루션';
RS_Q_DRMENC = '선택한 파일을 DRM 적용 하시겠습니까?';
RS_NoAuth = '권한이 없습니다.';
RS_PwLastDate = '암호 설정 일시 : ';
RS_MsgPwChgUntil = '암호 변경일까지 %d일 남았습니다.';
RS_MsgPwChg = '암호 변경일이 초과되었습니다.'#13#10'암호를 변경해 주십시오.';
RS_OFFLINE = '오프라인';
RS_OFFLINEEXP = '예외사용';
RS_UpdatePolicy = '정책을 업데이트 했습니다.';
RS_ErrorUpdatePolicy = '정책을 가져오는 중 오류가 발생했습니다. (%d)';
RS_FailUpdatePolicy = '정책 업데이트를 실패 했습니다.';
RS_MsgDisconnected = '연결이 해제된 상태입니다.';
RS_MsgRcvPolicy = '정책을 가져오는 중입니다.';
RS_CustomCttSching = '컨텐츠 검색이 동작중입니다.';
RS_ExpPrtWater = '프린트 워터마크 예외';
RS_MsgExpPrtWater = '프린트 워터마크 예외 사유를 입력해주세요.';
RS_InputQnA = '문의 내용을 입력해 주십시오.';
RS_QnA = '문의하기';
RS_Cancel = '취소';
RS_OK = '확인';
RS_IDCHANGE = 'ID 변경';
RS_EmpNoC = '사번 : ';
RS_DeptC = '부서 : ';
RS_NameC = '이름 : ';
RS_MsgCopyCB = '클립보드에 복사 되었습니다.';
RS_ExtrSpoolImage = '출력 이미지를 수집 중입니다...';
RS_ExtrImageText = '출력 텍스트를 검출하고 있습니다.';
RS_ExtrWait = '잠시만 기다려 주십시오.';
RS_FMT_ProcPrt = '%d페이지 처리 중...';
RS_PrtInit = '출력 분석';
RS_PrtImgCol = '이미지 수집';
RS_PrtExtrTxt = '텍스트 분석';
RS_PrtReInit = '재출력 준비';
RS_PrtSecu = '보안 출력';
RS_NotFoundFile = '존재하지 않는 파일입니다.';
RS_NoApprovalInfo = '결재자 정보를 가져올 수 없습니다.';
RS_AlreadyApprovFile = '이미 반출 대상 파일입니다.';
RS_CompleteWork1 = '작업을 완료했습니다.';
RS_CompleteWork2 = '(성공 : %d, 실패 : %d)';
RS_FileExpoLimit = '최대 %d개까지 처리할 수 있습니다.';
RS_FileExpReqLimitMsg1 = '결재 요청을 위한 파일 업로드 용량(최소 %dMB, 최대 %dMB)을 ';
RS_FileExpReqLimitMsg2 = '초과하여 파일 업로드를 할 수 없습니다.';
RS_FileExpReqLimitMsg3 = '계속 하시겠습니까?';
RS_CampnWorkin = '현재 캠페인이 진행중입니다.';
RS_NotFoundCampn = '캠페인이 존재하지 않습니다.';
RS_CompleteCampn = '완료한 캠페인 입니다.';
RS_RetryTomorrow = '내일 다시 시도해주십시오.';
RS_Q_CampnWork = '"%s"를 진행하시겠습니까?';
{$R *.dfm}
function GetLogoImg(sId: String): TMemoryStream;
var
res: TResourceStream;
begin
Result := nil;
try
res := TResourceStream.Create(HInstance, sId, 'raw');
if res <> nil then
begin
Result := TMemoryStream.Create;
res.SaveToStream(Result);
res.Free;
Result.Position := 0;
end;
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. GetLogoImg()');
end;
end;
{ TDlgeCrmHeMain }
Constructor TDlgeCrmHeMain.Create(aOwner: TComponent);
var
bExeRecover: Boolean;
procedure InitCtrls;
var
sPath: String;
ini: TIniFile;
ms: TMemoryStream;
i: Integer;
CompModel: TCompanyModel;
begin
dlgWaterProg_ := nil;
dlgPrtWProg_ := nil;
{$IFDEF _MLANG_}
FreeLocalizer.AfterLanguageLoad := AfterLangChange;
imgChangeEmpNo.Left := 269;
imgLang.Left := 353;
imgLang.Top := 19;
imgLang.Visible := true;
{$ELSE}
imgChangeEmpNo.Left := 327;
imgLang.Left := 353;
imgLang.Top := 53;
imgLang.Visible := false;
{$ENDIF}
lbChangeEmpNo.Left := imgChangeEmpNo.Left;
lbChangeEmpNo.Visible := imgChangeEmpNo.Visible;
lbLang.Left := imgLang.Left;
lbLang.Visible := imgLang.Visible;
bPreWinKey_ := false;
bScrCapKey_ := false;
bForceCollectCB_ := false;
ChangeWindowMessageFilter(WM_CLIPBOARDUPDATE, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_CTTSCH_INIT, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_CTTSCH_REQUEST, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_NOTIFY_HOOKDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_INIT_HLEPER, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_RESPONSE_HLEPER, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_REQUEST_DRM, MSGFLT_ADD);
// ChangeWindowMessageFilter(WM_GETOBJECT, MSGFLT_ADD); // msaa
ChangeWindowMessageFilter(WM_CHANGECBCHAIN, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_DRAWCLIPBOARD, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_POPUP_PRTW_PROGRESS, MSGFLT_ADD);
// ChangeWindowMessageFilterEx(Handle, WM_COPYDATA, MSGFLT_ALLOW, nil);
// ChangeWindowMessageFilterEx(Handle, WM_CTTSCH_INIT, MSGFLT_ALLOW, nil);
// ChangeWindowMessageFilterEx(Handle, WM_CTTSCH_REQUEST, MSGFLT_ALLOW, nil);
// 작업폴더 초기화 22_0614 15:23:51 kku
sPath := GetRunExePathDir + 'Task\';
if DirectoryExists(sPath) then
DeleteDir(sPath);
// 저장된 업체 정보 활용 22_0624 08:28:15 kku
{$IFNDEF DEBUG}
Guard(CompModel, TCompanyModel.Create);
CompModel.Load;
if CUSTOMER_TYPE <> CompModel.CustomerType then
begin
CUSTOMER_TYPE := CompModel.CustomerType;
CUSTOMER_SUB_TYPE := CompModel.CustomerSubType;
SetLength(DEST_FORCE, CompModel.SvrDestList.Count);
for i := 0 to CompModel.SvrDestList.Count - 1 do
DEST_FORCE[i] := CompModel.SvrDestList[i];
end;
{$ENDIF}
sPath := GetProgramFilesDir + DIR_TG + INI_FORCEHE;
if FileExists(sPath) then
begin
Guard(ini, TIniFile.Create(sPath));
var SvrList: TStringList;
Guard(SvrList, TStringList.Create);
if SplitString(Trim(ini.ReadString('Force', 'SvrDest', '')), ';', SvrList) > 0 then
begin
SetLength(DEST_FORCE, SvrList.Count);
for i := 0 to SvrList.Count - 1 do
DEST_FORCE[i] := SvrList[i];
end;
CUSTOMER_TYPE := ConvCustomerCodeFromNick(Trim(ini.ReadString('Force', 'Customer', '')));
if ini.ReadBool('Force', 'DebugMode', false) then
begin
// if TTgTrace.SetAllocConsole(true) then
TDlgBs1Log.Create.Show;
begin
if gTrace <> nil then
gTrace.Level := 99;
// bIsDebugMode_ := true;
TTgTrace.T('DebugMode .. ON');
end;
end;
bExeRecover := ini.ReadBool('Force', 'RecoverFile', true);
// ManagerService 에서 처리 25_0402 18:37:03 kku
// i := ini.ReadInteger('Force', 'LogLv', 0);
// if gTrace.Level < i then
// gTrace.Level := i;
InitForceConfig;
end;
// 레지스트리에 버전 정보 추가 22_0801 17:49:10 kku
SetRegValueString(HKEY_LOCAL_MACHINE, REG_HE, 'Version', SdkVersion, true);
if IsBS1Display then
APP_TITLE := 'BSOne V2.0';
Caption := APP_TITLE;
sTrayHint_ := '';
UpdateLangRes;
SetStateImage(0);
// case CUSTOMER_TYPE of
// CUSTOMER_SHSC,
// CUSTOMER_SHCI : DispBlock_ := TDlgDispLogoList.Create;
// else DispBlock_ := nil;
// end;
DispBlock_ := TDlgDispLogoList.Create;
DispLogos_ := TDlgDispLogoList.Create;
DispLogosST_ := TDlgDispLogoList.Create;
LastWS_ := wsNormal;
WndAni_ := TWindowAnimator.Create(Self);
WndAni_.Duration := 300;
bWndExpend_ := false;
bIgrNextCbNoti_ := false;
bIgrNextCbNotiExcel_ := false;
SetImgBtn(imgUpBtnList, imgHelp, imgHelp.Tag);
SetImgBtn(imgUpBtnList, imgClose, imgClose.Tag);
SetImgBtn(imgUpBtnList, imgOsPchInfo, imgOsPchInfo.Tag);
SetImgBtn(imgUpBtnList, imgAvInfo, imgAvInfo.Tag);
SetImgBtn(imgUpBtnList, imgFwInfo, imgFwInfo.Tag);
SetImgBtn(imgUpBtnList, imgPwDateInfo, imgPwDateInfo.Tag);
SetImgBtn(imgEvList, imgQA, 0);
SetImgBtn(imgEvList, imgChangeEmpNo, 0);
SetImgBtn(imgLangList, imgLang, 0);
SetImgBtn(imgBtnList, imgOsInfo, 0);
SetImgBtn(imgBtnList, imgSetOs, 0);
SetImgBtn(imgBtnList, imgSetAccPass, 0);
SetImgBtn(imgBtnList, imgSetScreenSaver, 0);
SetImgBtn(imgBtnList, imgSetAntiVirus, 0);
SetImgBtn(imgBtnList, imgSetFW, 0);
SetImgBtn(imgStateList, imgOsVerState, imgOsVerState.Tag);
SetImgBtn(imgStateList, imgOsPatchState, imgOsPatchState.Tag);
SetImgBtn(imgStateList, imgAvState, imgAvState.Tag);
SetImgBtn(imgStateList, imgPassState, imgPassState.Tag);
SetImgBtn(imgStateList, imgScrSavState, imgScrSavState.Tag);
SetImgBtn(imgStateList, imgFwState, imgFwState.Tag);
lbVer.Caption := 'Tocsg Provided';
Width := imgBack.Width;
if (CUSTOMER_TYPE = CUSTOMER_METLIFE) and
not imgCompany.Visible then
begin
ms := GetLogoImg('RS_MAINIMG_METLIFE');
if ms <> nil then
begin
try
imgCompany.Picture.LoadFromStream(ms);
imgCompany.Visible := true;
except
end;
FreeAndNil(ms);
end;
end;
// nScrW_ := 0;
// nScrH_ := 0;
// DTagList_ := nil;
// Client_ := nil;
ThdCustomScanSch_ := nil;
sSchRstPath_ := '';
{$IFDEF OLD_CB_MON}
CbMon_ := TDrawClipboard.Create;
CbMon_.OnDrawClipboard := OnClipboardNotify;
{$ELSE}
sOldCbHds_ := '';
AddClipboardFormatListener(Handle);
{$ENDIF}
sCbAbleApps_ := '';
sCbCollectApps_ := '';
dtRecentCbPopup_ := 0;
dtRecentPrtScrKey_ := 0;
CbAbleAppList_ := TStringList.Create;
CbAbleAppList_.CaseSensitive := false;
CbCollectAppList_ := TStringList.Create;
CbCollectAppList_.CaseSensitive := false;
sWebAbSigs_ := '';
sWebAbFNames_ := '';
sEtcAbSigs_ := '';
sEtcAbFNames_ := '';
sWebAbExts_ := '';
sEtcAbExts_ := '';
WebAbSigList_ := TStringList.Create;
WebAbFNameList_ := TStringList.Create;
EtcAbSigList_ := TStringList.Create;
EtcAbFNameList_ := TStringList.Create;
WebAbExtList_ := TStringList.Create;
EtcAbExtList_ := TStringList.Create;
KeyMonDll_ := TKeyMonDLL.Create(Handle, MAP_FILENAME_KM, GetRunExePathDir + DLL_KEYMON);
if KeyMonDll_.LastError <> ERROR_SUCCESS then
begin
MessageBox(Handle, PChar(Format('Fail .. Load KM DLL .. Error = %d',
[KeyMonDll_.LastError])), PChar(APP_TITLE), MB_ICONSTOP or MB_OK);
end;
bIsClearCB_ := false;
FrmPolicyView_ := TFrmPolicyView.Create(Self);
FrmPolicyView_.Parent := pnPolicyView;
FrmPolicyView_.Align := alClient;
FrmPolicyView_.Visible := true;
pnPolicyView.Visible := true;
{$IFDEF _MLANG_}
UpdateLangName(StrToIntDef('$' + ExtrNumStr(ExtractFileName(FreeLocalizer.LanguageFile)), 1042));
{$ENDIF}
// {$IFDEF DEBUG}
// btnTest1.Visible := true;
// {$ENDIF}
tInit.Enabled := true;
end;
begin
Inherited Create(aOwner);
ASSERT(gMain = nil);
gMain := Self;
sSysDir_ := GetSystemDir;
// MtxScrLogo_ := nil;
bExeRecover := true;
OutClient_ := nil;
ProcW_ := nil;
lbCompanyName.Caption := '';
{$IFDEF DEBUG}
// DeleteFile('C:\taskToCSG\eCrmHE\OUT_Debug - Win64\conf\pdmsa.prop');
// DeleteFile('C:\taskToCSG\eCrmHE\OUT_Debug - Win64\conf\admsa.prop');
// DeleteFile('C:\taskToCSG\eCrmHE\OUT_Debug - Win64\conf\cdmsa.prop');
// 테스트 방해물? 먼저 제거
TerminateProcessByName('eCrmHeService.exe');
TerminateProcessByName('eCrmHomeEdition.exe', GetCurrentProcessId);
if TerminateProcessByName('javaw.exe') then
Sleep(1000);
// btnTest1.Visible := true;
// btnTest2.Visible := true;
{$ENDIF}
MgSvc_ := nil;
TrayIcon_ := nil;
HTTP_ := nil;
SSL_ := nil;
// Client_ := nil;
AccObj_SubTitle_ := nil;
VariantClear(varSubTitle_);
hEditWnd_ := 0;
dwChkAbMon_ := 0;
sChkAbMon_ := '';
sRecentBwUrl_ := '';
sRecentBwTitle_ := '';
// bIsDebugMode_ := false;
sRecentABFile_ := '';
dwRecentAB_ := 0;
//
FileAbLogs_ := TStringList.Create;
sLastNotExistFile_ := '';
bUsePersonalFun_ := true;
// bPopChromeSK_ := false;
dwBlockInputCTick_ := 0;
bCtrlA_ := false;
TerminateProcessByName(EXE_BROWSER_SECU);
qNoti_ := TQueue<String>.Create;
ThdTaskTimer_ := TThdTaskTimer.Create(500, true);
ThdTaskTimer_.AddTask(TimerNotification, 500, true);
//// ThdTaskTimer_.AddTask(TimerReqCoreInfo, 1000, true);
ThdTaskTimer_.StartTimerThread;
ThdWebOC_ := TThdWebOpenCheck.Create;
ThdWebOC_.StartThread;
{$IFDEF DEBUG}
// CUSTOMER_TYPE := CUSTOMER_DEV;
// CUSTOMER_TYPE := CUSTOMER_SANKYO;
// CUSTOMER_TYPE := CUSTOMER_SOSLAB;
// CUSTOMER_TYPE := CUSTOMER_KORENTAL;
// CUSTOMER_TYPE := CUSTOMER_SOLMIX;
// CUSTOMER_TYPE := CUSTOMER_WELFNI;
CUSTOMER_TYPE := CUSTOMER_WELFND;
// CUSTOMER_TYPE := CUSTOMER_BLUECORNER;
// CUSTOMER_TYPE := CUSTOMER_SHSC;
// CUSTOMER_TYPE := CUSTOMER_SHCI;
// CUSTOMER_TYPE := CUSTOMER_JUVIS;
// CUSTOMER_TYPE := CUSTOMER_WINSTN;
// CUSTOMER_TYPE := CUSTOMER_SOLIDEO;
// CUSTOMER_TYPE := CUSTOMER_LOTTEMART;
// CUSTOMER_TYPE := CUSTOMER_GIORDANO;
// CUSTOMER_TYPE := CUSTOMER_GEC;
// CUSTOMER_TYPE := CUSTOMER_HDENG;
// CUSTOMER_TYPE := CUSTOMER_KOCES;
// CUSTOMER_TYPE := CUSTOMER_KBIZ;
// CUSTOMER_TYPE := CUSTOMER_CJONS;
// CUSTOMER_TYPE := CUSTOMER_KIMCHANG;
// CUSTOMER_TYPE := CUSTOMER_SERVE1;
// CUSTOMER_TYPE := CUSTOMER_UNITUS;
// CUSTOMER_TYPE := CUSTOMER_MOTRAS;
// CUSTOMER_TYPE := CUSTOMER_KDNVN;
// CUSTOMER_TYPE := CUSTOMER_DEMO;
// CUSTOMER_TYPE := CUSTOMER_SKEC;
// CUSTOMER_TYPE := CUSTOMER_SCD;
{$ENDIF}
InitCtrls;
//mgkim 테스트를 위해 주석
RecoverSvc_ := TRecoverService.Create;
// if bExeRecover then
// RecoverSvc_.StartService;
if IsLogSendToWindbg then
begin
ProcW_ := TThdProcessWatch.Create;
ProcW_.OnProcessWatchNotify := OnProcNotify;
end;
end;
procedure TDlgeCrmHeMain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams( Params );
Params.ExStyle := WS_EX_APPWINDOW;
Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;
Destructor TDlgeCrmHeMain.Destroy;
begin
{$IFNDEF DEBUG}
// TTgTrace.T('TDlgeCrmHeMain.Destroy() ..');
// 자연종료 된다면 컴터 꺼지는걸로 판단한다
if MgSvc_ <> nil then
MgSvc_.ProcessEndSession
else
SetRegValueString(HKEY_LOCAL_MACHINE, REG_HE, 'EDT', IntToStr(DelphiToJavaDateTime(Now)), true);
{$ENDIF}
if dlgWaterProg_ <> nil then
FreeAndNil(dlgWaterProg_);
if dlgPrtWProg_ <> nil then
FreeAndNil(dlgPrtWProg_);
tMtx.Enabled := false;
FreeAndNil(FileAbLogs_);
FreeAndNil(RecoverSvc_);
FreeAndNil(ThdWebOC_);
FreeAndNil(KeyMonDll_);
FreeAndNil(CbAbleAppList_);
FreeAndNil(CbCollectAppList_);
FreeAndNil(EtcAbExtList_);
FreeAndNil(WebAbExtList_);
FreeAndNil(EtcAbFNameList_);
FreeAndNil(EtcAbSigList_);
FreeAndNil(WebAbFNameList_);
FreeAndNil(WebAbSigList_);
{$IFDEF OLD_CB_MON}
if CbMon_ <> nil then
FreeAndNil(CbMon_);
{$ENDIF}
FreeAndNil(DispLogosST_);
FreeAndNil(DispLogos_);
if DispBlock_ <> nil then
FreeAndNil(DispBlock_);
FreeAndNil(ThdTaskTimer_);
FreeAndNil(qNoti_);
// if MtxScrLogo_ <> nil then
// FreeAndNil(MtxScrLogo_);
if OutClient_ <> nil then
FreeAndNil(OutClient_);
if HTTP_ <> nil then
FreeAndNil(HTTP_);
if SSL_ <> nil then
FreeAndNil(SSL_);
if KwdSchKvCLient_ <> nil then
FreeAndNil(KwdSchKvCLient_);
// if Client_ <> nil then
// FreeAndNil(Client_);
if ThdCustomScanSch_ <> nil then
FreeAndNil(ThdCustomScanSch_);
if ProcW_ <> nil then
FreeAndNil(ProcW_);
if gTrForm <> nil then
FreeAndNil(gTrForm);
gMain := nil;
Inherited;
if MgSvc_ <> nil then
FreeAndNil(MgSvc_);
end;
procedure TDlgeCrmHeMain.TimerNotification(Sender: TObject);
var
sNoti,
sTitle: String;
nPos: Integer;
begin
if qNoti_.Count = 0 then
exit;
PostMessage(Handle, WM_POPUP_MSG, 1, 0);
// sNoti := qNoti_.Dequeue;
// if sNoti = '' then
// exit;
//
// sTitle := APP_TITLE;
// nPos := Pos(':', sNoti);
// if nPos > 0 then
// begin
// sTitle := Copy(sNoti, 1, nPos - 1);
// Delete(sNoti, 1, nPos);
// end;
//
//
// ShowNotification(sTitle, sNoti);
// TTgTrace.T('TimerNotification() .. ShowNotification()');
end;
procedure TDlgeCrmHeMain.TimerReqCoreInfo(aSender: TObject);
begin
// if (Client_ <> nil) and Client_.Connected then
// begin
// Client_.SendPacket(TTgPacket.Create(SLC_REQUEST_CURRENT_STATUS));
// end;
end;
procedure TDlgeCrmHeMain.UpdateLangRes;
begin
try
if sTrayHint_ = '' then
sTrayHint_ := APP_TITLE;
case CUSTOMER_TYPE of
CUSTOMER_ABL :
begin
sTrayHint_ := RS_Tray_ABL;
lbIpInfo.Font.Size := 9;
lbWinAccount.Font.Size := 9;
lbCompanyName.Caption := RS_Tray_ABL;
lbCompanyName.Visible := (MgSvc_ = nil) or (MgSvc_.HeModeKind <> hmkVulnerability);
end;
else begin
if IsCJ_Affiliates then
begin
lbChangeEmpNo.Caption := RS_IDCHANGE;
miChangeEmpNo.Caption := RS_IDCHANGE;
end;
end;
end;
if TrayIcon_ <> nil then
TrayIcon_.Hint := sTrayHint_;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. UpdateLangRes()');
end;
end;
procedure TDlgeCrmHeMain.AfterLangChange(Sender: TObject; const LanguageFile: string);
begin
Caption := APP_TITLE;
UpdateLangRes;
end;
procedure TDlgeCrmHeMain.btnTest1Click(Sender: TObject);
var
sUrl: String;
begin
// sUrl := gMgSvc.SendApproval(0, pEnt_);
if sUrl = '' then
begin
// gMgSvc.MgPrt.DelPrintInfo(pEnt_.sId);
TTgTrace.T('Fail .. SendApprovalPrint()');
MessageBox(Handle, PChar('결재자 정보를 가져올 수 없습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
end else
ExecutePath(gMgSvc.DestIPort + sUrl);
end;
procedure TDlgeCrmHeMain.btnTest2Click(Sender: TObject);
var
LogInfo: TLogInfo;
DrvInfo: TDriveInfo;
begin
GetDriveDetail('D:\', @DrvInfo, true);
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := MONITOR_EMBEDDEDHARDDISK;
LogInfo.sDevName := DrvInfo.sFriendlyName;
LogInfo.sDevSerial := DrvInfo.sSerial;
LogInfo.sDevClassId := DrvInfo.sClassGuid;
LogInfo.sSummary := '[Remove] Fixed Disk';
LogInfo.sResInfo := IntToStr(DrvInfo.llSize);
LogInfo.sAppPath := DrvInfo.sDrive;
LogInfo.sComment := Format('%s, %s', [DrvInfo.sClass, DrvInfo.sDesc]);
// LogInfo.
MgSvc_.SendEventLogEx(@LogInfo);
// MgSvc_.SendEventLog(URI_USER_ACTION, MODE_SECURITY_END, '[DEBUG..REG] Sleep mode');
// MgSvc_.MgCampn.SendPrintTest;
end;
procedure TDlgeCrmHeMain.InitHttp;
begin
if (HTTP_ = nil) and (SSL_ = nil) then
begin
SSL_ := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSL_.SSLOptions.Method := sslvSSLv23;
SSL_.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1];
HTTP_ := TIdHTTP.Create(nil);
HTTP_.IOHandler := SSL_;
with HTTP_ do
begin
Request.Clear;
Request.UserAgent := 'Mozilla/5.0';
Request.ContentType := 'application/json; charset=utf-8'; //'application/xml';
Request.Accept := 'application/json; charset=utf-8';
Request.Charset := 'utf-8';
// Request.Connection := 'Keep-Alive';
// Request.CustomHeaders.Values['Keep-Alive'] := 'timeout=300, max=100';
Request.Connection := 'close';
HTTPOptions := HTTPOptions - [hoKeepOrigProtocol];
Request.CacheControl := 'no-store';
ConnectTimeout := 2000;
ReadTimeout := 2000;
// HandleRedirects := true;
// Request.Clear;
// Request.UserAgent := 'Mozilla/5.0';
// Request.ContentType := 'application/xml';
//// Request.Accept := 'application/json; charset=utf-8';
//// Request.Charset := 'utf-8';
// Request.AcceptCharSet := 'UTF-8'; //'application/json; charset=utf-8';
//// Request.CacheControl := 'no-store';
// Request.Connection := 'Keep-Alive';
// HTTPOptions := HTTP_.HTTPOptions + [hoForceEncodeParams];
// ConnectTimeout := 2000;
// ReadTimeout := 2000;
end;
end;
end;
procedure TDlgeCrmHeMain.acHelpExecute(Sender: TObject);
var
dlg: TDlgHelp;
begin
if FindWindow('TDlgHelp', nil) <> 0 then
exit;
dlg := TDlgHelp.Create(Self);
dlg.Show;
end;
function TDlgeCrmHeMain.CtrlTagToImage(aSender: TObject): TImage;
begin
Result := nil;
if aSender is TControl then
begin
case TControl(aSender).Tag of
0 : Result := imgOsInfo;
2 : Result := imgSetOs;
5 : Result := imgSetAntiVirus;
7 : Result := imgSetAccPass;
9 : Result := imgSetScreenSaver;
11 : Result := imgSetFW;
else exit;
end;
end;
end;
procedure TDlgeCrmHeMain.VisibleMainform(bVal: Boolean; bForce: Boolean = false);
var
OldFormStyle: TFormStyle;
begin
if bVal then
begin
if not bForce and (MgSvc_ <> nil) and MgSvc_.PrefModel.HideMainUI then
exit;
// 보안모드가 아닐때 취약점 알림 끔 25_0403 11:09:36 kku
// if not Visible and
// (MgSvc_ <> nil) and
// not MgSvc_.IsServiceAvailable and
// not MgSvc_.VulService.IsVpnOn then
// MgSvc_.VulService.CallPopup(true, false);
TTgTrace.T('메인 화면 확인 - ON', 3);
WindowState := LastWS_;
Show;
OldFormStyle := FormStyle;
FormStyle := fsStayOnTop;
FormStyle := OldFormStyle;
SetForegroundWindow(Handle);
RefreshView;
end else begin
LastWS_ := WindowState;
WindowState := wsMinimized;
Hide;
TTgTrace.T('메인 화면 확인 - OFF', 3);
end;
end;
procedure TDlgeCrmHeMain.SetStateImage(nIdx: Integer);
function SetAppIcon(sId: String): Boolean;
var
res: TResourceStream;
ms: TMemoryStream;
begin
Result := false;
try
res := TResourceStream.Create(HInstance, sId, 'raw');
if res <> nil then
begin
Guard(ms, TMemoryStream.Create);
res.SaveToStream(ms);
res.Free;
ms.Position := 0;
Application.Icon.LoadFromStream(ms);
Result := true;
end;
except
on E: Exception do
ETgException.TraceException(E, Format('Fail .. SetAppIcon(), ID="%s"', [sId]));
end;
end;
var
bLoadAppIcon: Boolean;
nIdx2: Integer;
begin
try
if (MgSvc_ <> nil) and MgSvc_.IsSearchingPersonalInfo then
begin
if not MgSvc_.IsNewApi or
( (MgSvc_.ProcCampn <> nil) and
(MgSvc_.ProcCampn.Info.bShowScan) ) then
begin
nIdx := 3;
if not tCttSchTimer.Enabled then
begin
lbCttSchSP.Caption := '....';
lbCttSchSP.Visible := true;
try
if MgSvc_.ThdScanSch.SchTitle <> '' then
begin
lbSchTitle.Caption := MgSvc_.ThdScanSch.SchTitle;
lbSchTitle.Visible := true;
end;
except
// ..
end;
tCttSchTimer.Enabled := true;
end;
end else
if not tCttSchTimer.Enabled then
tCttSchTimer.Enabled := true;
end;
// BSOne, eCrm 혼용 사용
// todo : BSOne로 통일 시 삭제 23_0207 09:35:24 kku
nIdx2 := nIdx;
if IsBS1Display then
begin
case nIdx of
0 : nIdx2 := 11;
1 : nIdx2 := 12;
2 : nIdx2 := 13;
3 : nIdx2 := 14;
end;
end;
// [2022-06-27 13:42:50] TDlgeCrmHeMain :: ETgException .. EInvalidPointer, Msg="Invalid pointer operation" : Info = Fail .. SetStateImage()
// 원인모를 오류 발생
if imgMainList = nil then
TTgTrace.T('SetStateImage() .. imgMainList = nil')
else if imgMainList.Items.Count <= nIdx2 then
TTgTrace.T('SetStateImage() .. imgMainList.Items.Count <= nIdx (%d)', [nIdx2])
else if imgMainList.Items[nIdx2].PngImage = nil then
TTgTrace.T('SetStateImage() .. imgMainList.Items[nIdx].PngImage = nil')
else
imgMain.Picture.Assign(imgMainList.Items[nIdx2].PngImage); // good
if TrayIcon_ <> nil then
begin
case nIdx of
15 : TrayIcon_.IconIndex := 4;
16 : TrayIcon_.IconIndex := 5;
else TrayIcon_.IconIndex := nIdx;
end;
end;
bLoadAppIcon := false;
case nIdx2 of // todo : BSOne로 통일 시 삭제 23_0207 09:35:24 kku
0, 11 : bLoadAppIcon := SetAppIcon('RS_SLEEPICON');
1, 12 : bLoadAppIcon := SetAppIcon('RS_SECUREICON');
2, 13 : bLoadAppIcon := SetAppIcon('RS_WARNINGICON');
3, 14 : bLoadAppIcon := SetAppIcon('RS_MONITORICON');
15 : bLoadAppIcon := SetAppIcon('RS_OFFLINEICON');
16 : bLoadAppIcon := SetAppIcon('RS_OFFLINEEXPICON');
end;
if not bLoadAppIcon then
imgTrayState.GetIcon(nIdx, Application.Icon);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. SetStateImage()');
end;
end;
procedure TDlgeCrmHeMain.UpdateCttSchRstButton;
begin
if GetPersonalInfoResults > 0 then
begin
lbCttSchRst.Font.Color := $00DB6646;
lbCttSchRst.Enabled := true;
imgCttSchRst.Picture.Assign(imgMainList.Items[4].PngImage);
imgCttSchRst.Enabled := true;
end else begin
lbCttSchRst.Font.Color := clGray;
lbCttSchRst.Enabled := false;
imgCttSchRst.Picture.Assign(imgMainList.Items[6].PngImage);
imgCttSchRst.Enabled := false;
end;
end;
procedure TDlgeCrmHeMain.SetExtendMainView(bVal: Boolean);
begin
if (MgSvc_ <> nil) and MgSvc_.IsNewApi then
bVal := false;
if bUsePersonalFun_ = bVal then
exit;
bUsePersonalFun_ := bVal;
if bVal then
begin
imgBack.Picture.Assign(imgMainList.Items[8].PngImage);
imgList.Picture.Assign(imgMainList.Items[10].PngImage);
imgCttSch.Visible := true;
imgCttSchRst.Visible := true;
lbCttSch.Visible := true;
lbCttSchRst.Visible := true;
imgCttSch.Picture.Assign(imgMainList.Items[4].PngImage);
UpdateCttSchRstButton;
imgOsInfo.Top := 388;
lbOsVerTop.Top := 404;
imgOsVerState.Top := 446;
lbOS.Top := 508; // 523;
imgSetOs.Top := 388;
lbOsPatch.Top := 404;
imgOsPatchState.Top := 446;
lbOsPatchState.Top := 523;
imgOsPchInfo.Top := 489;
imgSetAntiVirus.Top := 388;
lbAntiV.Top := 404;
imgAvState.Top := 446;
lbAV.Top := 523;
imgAvInfo.Top := 489;
imgSetAccPass.Top := 576;
lbPW.Top := 595;
imgPassState.Top := 637;
lbPassState.Top := 714;
imgPwDateInfo.Top := 683;
imgSetScreenSaver.Top := 576;
lbScrSav.Top := 595;
imgScrSavState.Top := 637;
lbScrSavState.Top := 714;
imgSetFW.Top := 576;
lbFireW.Top := 595;
imgFwState.Top := 637;
lbFW.Top := 714;
imgFwInfo.Top := 683;
lbVer.Top := 765;
pnMain.Height := 800;
pnPolicyView.Height := 696;
pnList.Height := 800;
Height := 800;
end else begin
imgBack.Picture.Assign(imgMainList.Items[7].PngImage);
imgList.Picture.Assign(imgMainList.Items[9].PngImage);
imgCttSch.Visible := false;
imgCttSchRst.Visible := false;
lbCttSch.Visible := false;
lbCttSchRst.Visible := false;
imgOsInfo.Top := 328;
lbOsVerTop.Top := 344;
imgOsVerState.Top := 386;
lbOS.Top := 448; // 463;
imgSetOs.Top := 328;
lbOsPatch.Top := 344;
imgOsPatchState.Top := 386;
lbOsPatchState.Top := 463;
imgOsPchInfo.Top := 429;
imgSetAntiVirus.Top := 328;
lbAntiV.Top := 344;
imgAvState.Top := 386;
lbAV.Top := 463;
imgAvInfo.Top := 429;
imgSetAccPass.Top := 516;
lbPW.Top := 535;
imgPassState.Top := 577;
lbPassState.Top := 654;
imgPwDateInfo.Top := 623;
imgSetScreenSaver.Top := 516;
lbScrSav.Top := 535;
imgScrSavState.Top := 577;
lbScrSavState.Top := 654;
imgSetFW.Top := 516;
lbFireW.Top := 535;
imgFwState.Top := 577;
lbFW.Top := 654;
imgFwInfo.Top := 623;
lbVer.Top := 705;
pnMain.Height := 740;
pnPolicyView.Height := 637;
pnList.Height := 740;
Height := 740;
end;
end;
procedure TDlgeCrmHeMain.UpdateScreenLogo(bForceUpdate: Boolean = false);
var
ms: TMemoryStream;
sTemp, sTemp2, sTemp3,
sWindowsAccount: String;
O: ISuperObject;
nUpdateMSec, n, nAlpha: Integer;
F: TFont;
PO: TPrefModel;
sOutCode: AnsiString;
procedure SetScreenData;
begin
try
// 커스텀 로고 처리 추가 23_0524 09:12:02 kku
sTemp := StringReplace(O.S['TxStr'], '§', ' ', [rfReplaceAll]);
sTemp := StringReplace(sTemp, '|*|', #13#10, [rfReplaceAll]);
// 예약어 치환 처리
if sTemp.Contains('{IpAddr}') then
sTemp := StringReplace(sTemp, '{IpAddr}', MgSvc_.NicService.GetIP, [rfReplaceAll]);
if sTemp.Contains('{HostName}') then
sTemp := StringReplace(sTemp, '{HostName}', MgSvc_.Domain, [rfReplaceAll]);
if sTemp.Contains('{MacAddr}') then
sTemp := StringReplace(sTemp, '{MacAddr}', MgSvc_.NicService.GetMAC, [rfReplaceAll]);
if sTemp.Contains('{EmpNo}') then
sTemp := StringReplace(sTemp, '{EmpNo}', MgSvc_.EmpNo, [rfReplaceAll]);
if sTemp.Contains('{Dept}') then
sTemp := StringReplace(sTemp, '{Dept}', MgSvc_.DeptName, [rfReplaceAll]);
if sTemp.Contains('{UserName}') then
sTemp := StringReplace(sTemp, '{UserName}', MgSvc_.UName, [rfReplaceAll]);
if O.O['TxFont'] <> nil then
begin
try
F.Name := O.O['TxFont'].S['Name'];
F.Size := O.O['TxFont'].I['Size'];
F.Color := O.O['TxFont'].I['Color'];
F.Style := TTgRtti.Int64ToSetType<TFontStyles>(O.O['TxFont'].I['Style']);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. UpdateScreenLogo() .. LoadFont');
end;
end;
DispLogos_.SetText(sTemp, F, O.I['TxHPos'], O.I['TxVPos'], O.I['TxOri'], O.I['TxOriT'],
TColor(O.I['TxCol']), TColor(O.I['TxColB']), O.S['TxDtFmt'], nUpdateMSec);
if O.S['ImData'] <> '' then
begin
try
Guard(ms, TMemoryStream.Create);
var pBuf: TBytes := DecodeBase64(O.S['ImData']);
ms.Write(pBuf[0], Length(pBuf));
ms.Position := 0;
DispLogos_.SetImageFromStream(ms, O.I['ImHPos'], O.I['ImVPos']);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. UpdateScreenLogo() .. SetImageFromStream()');
end;
end;
nAlpha := O.I['Alpha'];
DispLogos_.SetTaskbarDetect(O.B['TBar']);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. SetScreenData()');
end;
end;
Label
LB_ProcDef;
begin
sOutCode := '';
try
if MgSvc_ = nil then
exit;
if MgSvc_.IsScreenLogo then
begin
PO := MgSvc_.ModePolicy;
if not bForceUpdate and (DispLogos_.Count = Screen.MonitorCount) then // 모니터 추가 연결도 체크 22_0609 09:23:36 kku
begin
exit
end else begin
DispLogos_.Clear;
DispLogosST_.Clear;
end;
sWindowsAccount := MgSvc_.VulService.WindowsAccount;
if sWindowsAccount = '' then // 아직 준비가 되지 않음
exit;
nUpdateMSec := PO.ScreenLogoUpdateMin * 60000;
if nUpdateMSec = 0 then
tSnapTag.Enabled := false;
nAlpha := 25; // 기본 투명도
if PO.ScreenLogoVisible then
begin
O := nil;
DispLogos_.CreateLogos;
// DispLogosST_.CreateLogos;
sTemp := PO.ScreenLogoData;
if sTemp <> '' then
begin
try
O := SO(DecryptStr(sTemp));
except
// ..
end;
end;
Guard(F, TFont.Create);
// F.Assign(pnMain.Font);
F.Name := 'Tahoma';
if O = nil then
begin
ms := nil;
try
case CUSTOMER_TYPE of
CUSTOMER_NHL :
begin
F.Size := 23;
F.Style := F.Style + [fsBold];
DispLogos_.SetText(#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10 +
' ' +
sWindowsAccount + #13#10 +
' ' +
'{DateTime}' + //DateTimeToStr(Now) +
#13#10#13#10#13#10 +
' ' +
RS_MsgLogoWarningNHL, F, 3, 3, 0, 0, clBlack, clLime, '', nUpdateMSec);
end;
CUSTOMER_JB_DEV,
CUSTOMER_JB_MAINTAIN :
begin
F.Size := 75;
DispLogos_.SetText(sWindowsAccount + #13#10 + '{DateTime}', //DateTimeToStr(Now),
F, 3, 3, 0, 0, clBlack, clLime, '', nUpdateMSec);
ms := GetLogoImg('RS_LOGO_JB');
if ms <> nil then
DispLogos_.SetImageFromStream(ms, 3, 1, 200);
end;
CUSTOMER_KFTC :
begin
F.Size := 28;
DispLogos_.SetText(#13#10#13#10#13#10#13#10 +
sWindowsAccount +
' ' + #13#10 +
'{DateTime}' + //DateTimeToStr(Now) +
' ',
F, 2, 1, 0, 0, clBlack, clLime, '', nUpdateMSec);
ms := GetLogoImg('RS_LOGO_KFTC');
if ms <> nil then
DispLogos_.SetImageFromStream(ms, 3, 3);
end;
CUSTOMER_KR :
begin
F.Size := 26;
DispLogos_.SetText(#13#10#13#10 +
// '코리안리재보험 재택근무' +
MgSvc_.AgentModel.Account + ' (' + MgSvc_.NicService.GetIP + ')' +
' ' + #13#10 +
'{DateTime}' + //DateTimeToStr(Now) +
' ',
F, 2, 1, 0, 0, clBlack, clLime, '', nUpdateMSec);
ms := GetLogoImg('RS_LOGO_KR');
if ms <> nil then
DispLogos_.SetImageFromStream(ms, 3, 3);
nAlpha := 15;
end;
CUSTOMER_LX :
begin
F.Size := 28;
DispLogos_.SetText(#13#10#13#10#13#10#13#10 +
RS_MsgLogoLX +
' ',
// +
// #13#10 +
// DateTimeToStr(Now) +
// ' ',
F, 2, 1, 0, 0, clBlack, clLime, '', nUpdateMSec);
ms := GetLogoImg('RS_LOGO_LX');
if ms <> nil then
DispLogos_.SetImageFromStream(ms, 3, 3);
end;
CUSTOMER_VOLVO :
begin
F.Size := 28;
DispLogos_.SetText(#13#10#13#10#13#10#13#10 +
RS_MsgLogoVolvo +
' ' + #13#10 +
'{DateTime}' +// DateTimeToStr(Now) +
' ',
F, 2, 1, 0, 0, clBlack, clLime, '', nUpdateMSec);
ms := GetLogoImg('RS_LOGO_VOLVO');
if ms <> nil then
DispLogos_.SetImageFromStream(ms, 3, 3);
nAlpha := 15;
end;
CUSTOMER_ABL :
begin
F.Size := 16;
F.Style := F.Style + [fsBold];
// sTemp := ExtractFilePath(sWindowsAccount) + MgSvc_.EmpNo;
sTemp := 'ABL생명 ' + MgSvc_.EmpNo;
// var sTemp2: String := '';
// var sTemp3: String := '';
var i, nRepeat: Integer;
if Screen.Width > 1920 then
nRepeat := 12
else
nRepeat := 6;
for i := 0 to nRepeat do
SumString(sTemp2, sTemp, ' ');
sTemp := ' ' + '{DateTime}'; // DateTimeToStr(Now);
for i := 0 to nRepeat do
SumString(sTemp3, sTemp, ' ');
sTemp := sTemp2 + #13#10 + sTemp3;
sTemp2 := '';
if Screen.Height > 1080 then
nRepeat := 22
else
nRepeat := 11;
for i := 0 to nRepeat do
SumString(sTemp2, sTemp, #13#10#13#10#13#10#13#10);
DispLogos_.SetText(sTemp2, F, 3, 3, 180, (Screen.Height - (Screen.Height div 3)) * -1, clBlack, clLime, '', nUpdateMSec);
nAlpha := 17;
end;
CUSTOMER_WELFND,
CUSTOMER_WELFNI :
begin
F.Size := 22;
sTemp := '';
SumString(sTemp, '{DateTime}' {DateTimeToStr(Now)}, ' ');
SumString(sTemp, MgSvc_.EmpNo, ' ');
if MgSvc_.UName <> '' then
SumString(sTemp, MgSvc_.UName, ' ');
DispLogos_.SetTaskbarDetect(true);
// 46도 회전
DispLogos_.SetTextWEL(sTemp, 3, F, 3, 3, 460, clBlack, clSilver, 'yyyy-mm-dd hh:nn:ss', nUpdateMSec);
nAlpha := 20; // 투명도 통일 24_0902 15:17:04 kku
end;
CUSTOMER_DEMO,
CUSTOMER_DEV,
CUSTOMER_LOCAL,
CUSTOMER_SHCI,
CUSTOMER_SOSLAB,
CUSTOMER_WINSTN,
CUSTOMER_GEC,
CUSTOMER_HDENG :
begin
F.Size := 10;
var i, nRepeat: Integer;
sTemp := '';
// 부서 표시
// sTemp := MgSvc_.DeptName;
// if sTemp <> '' then
// sTemp := ExtrLastDelimiterStr(sTemp, ';');
// if MgSvc_.UName <> '' then
// SumString(sTemp, MgSvc_.UName, ' / ');
SumString(sTemp, MgSvc_.EmpNo, ' / ');
SumString(sTemp, MgSvc_.NicService.GetIP, ' / ');
SumString(sTemp, '{DateTime}' {DateTimeToStr(Now)}, ' / ');
DispLogos_.SetTaskbarDetect(true);
DispLogos_.SetTextHEC(sTemp, 3, F, 3, 3, 250, clBlack, clSilver, 'yyyy-mm-dd', nUpdateMSec);
nAlpha := 20; // 투명도 통일 24_0902 15:17:04 kku
end;
CUSTOMER_SOLMIX :
begin
F.Size := 10;
var i, nRepeat: Integer;
sTemp := '';
SumString(sTemp, MgSvc_.EmpNo, ' / ');
SumString(sTemp, FormatDateTime('yyyy-mm-dd', Now), ' / ');
SumString(sTemp, FormatDateTime('hh:nn:ss', Now), ' / ');
DispLogos_.SetTaskbarDetect(true);
DispLogos_.SetTextHEC(sTemp, 3, F, 3, 3, 250, clBlack, clSilver, 'yyyy-mm-dd', nUpdateMSec);
nAlpha := 20; // 투명도 통일 24_0902 15:17:04 kku
end;
CUSTOMER_BLUECORNER :
begin
F.Size := 10;
var i, nRepeat: Integer;
sTemp := '';
SumString(sTemp, '{DateTime}', ' . ');
SumString(sTemp, MgSvc_.EmpNo, ' . ');
if MgSvc_.UName <> '' then
SumString(sTemp, MgSvc_.UName, ' . ');
DispLogos_.SetTaskbarDetect(true);
DispLogos_.SetTextHEC(sTemp, 3, F, 3, 3, 250, clBlack, clSilver, 'yyyy.mm.dd', nUpdateMSec);
nAlpha := 20; // 투명도 통일 24_0902 15:17:04 kku
end;
else
begin
LB_ProcDef :
F.Size := 75;
DispLogos_.SetText(sWindowsAccount + #13#10 + '{DateTime}', // DateTimeToStr(Now),
F, 3, 3, 0, 0, clBlack, clLime, '', nUpdateMSec);
end;
end;
finally
if ms <> nil then
FreeAndNil(ms);
end;
case CUSTOMER_TYPE of
CUSTOMER_WELFND,
CUSTOMER_WELFNI :
begin
var sImgPath: String := GetRunExePathDir + DIR_CONF + 'CI1000.bmp';
if FileExists(sImgPath) then
DispLogos_.SetImage(sImgPath, 3, 3);
end;
CUSTOMER_BLUECORNER,
CUSTOMER_DEMO :
begin
var sImgPath: String := GetRunExePathDir + DIR_CONF + 'CI.png';
if FileExists(sImgPath) then
DispLogos_.SetImage(sImgPath, 3, 3);
end;
end;
end else
SetScreenData;
end;
if IsUseSnaptag and PO.ScreenLogoInvisible then
begin
DispLogosST_.CreateLogos;
// 스냅태그 연동
sTemp := GetRunExePathDir + DIR_CONF + DLL_ST;
if FileExists(sTemp) then
begin
var bSuccess: Boolean := false;
try
sTemp2 := GetRunExePathDir + DIR_CONF + DAT_SNAPTAGKEY_S;
if not FileExists(sTemp2) then
begin
var StrList: TStringList;
Guard(StrList, TStringList.Create);
StrList.Text := ST_Key_S;
StrList.SaveToFile(sTemp2, TEncoding.ANSI);
end;
sTemp3 := GetRunExePathDir + DIR_CONF + PNG_SNAPTAGDATA_LOGO;
n := labGuardPS(sTemp2, sTemp3, 2, 3, 1 {유저코드?},
FormatDateTime('yyyy/mm/dd hh:nn', Now), sOutCode);
if n = 0 then
begin
DispLogosST_.SetImage(sTemp3, -99, -99);
bSuccess := true;
if PO.ScreenLogoAlpha <> 0 then
nAlpha := PO.ScreenLogoAlpha;
DispLogosST_.SetAlpha(nAlpha);
if (nUpdateMSec > 0) and not tSnapTag.Enabled then
begin
tSnapTag.Interval := nUpdateMSec;
tSnapTag.Enabled := true;
end;
end else
TTgTrace.T('Fail .. Snaptag .. code = %d', [n], 1);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. UpdateScreenLogo() .. HCA-ST');
end;
end;
end;
if (DispLogos_.Count + DispLogosST_.Count) > 0 then
begin
if PO.ScreenLogoAlpha <> 0 then
nAlpha := PO.ScreenLogoAlpha;
if MgSvc_.IsScreenLogoBold then
begin
Inc(nAlpha, 40);
if nAlpha < 100 then
nAlpha := 100;
end;
if nAlpha > 255 then
nAlpha := 255;
if DispLogos_.Count > 0 then
DispLogos_.SetAlpha(nAlpha);
// if DispLogosST_.Count > 0 then
// DispLogosST_.SetAlpha(nAlpha);
if sOutCode <> '' then
begin
TTgTrace.T('상시 로고 - ON, ST=%s', [sOutCode], 1);
MgSvc_.SendEventLog(URI_USER_ACTION, PREVENT_SCREENLOGO, Format('ST=%s, ScreenLogo ON', [sOutCode]));
end else begin
TTgTrace.T('상시 로고 - ON', 1);
MgSvc_.SendEventLog(URI_USER_ACTION, PREVENT_SCREENLOGO, 'ScreenLogo ON');
end;
end;
// if MtxScrLogo_ = nil then
// MtxScrLogo_ := TTgMutex.Create(MUTEX_SCREENLOGO);
// DispLogos_.SetTaskbarDetect(true);
end else
if DispLogos_.Count > 0 then
begin
// if MtxScrLogo_ <> nil then
// FreeAndNil(MtxScrLogo_);
DispLogos_.Clear;
if DispLogosST_.Count > 0 then
DispLogosST_.Clear;
TTgTrace.T('상시 로고 - OFF', 1);
MgSvc_.SendEventLog(URI_USER_ACTION, PREVENT_SCREENLOGO, 'ScreenLogo OFF');
end;
except
on E: Exception do
begin
DispLogos_.Clear;
ETgException.TraceException(Self, E, 'Fail .. UpdateScreenLogo()');
end;
end;
end;
procedure TDlgeCrmHeMain.RefreshView;
procedure SetState(aLabel: TLabel; aImg: TImage; bVal: Boolean; sInfo: String = '');
begin
if bVal then
begin
if sInfo <> '' then
aLabel.Caption := sInfo
else
aLabel.Caption := RS_StateNormal;
aLabel.Font.Color := $00635653;
SetImgBtn(imgStateList, aImg, aImg.Tag);
end else begin
if sInfo <> '' then
aLabel.Caption := sInfo
else
aLabel.Caption := RS_StateVul;
aLabel.Font.Color := clRed;
SetImgBtn(imgStateList, aImg, aImg.Tag + 1);
end;
end;
var
sVer, sTemp: String;
PrefModel: TPrefModel;
begin
try
if Application.Terminated then
exit;
if MgSvc_ = nil then
exit;
if MgSvc_.VulService = nil then
exit;
PrefModel := MgSvc_.PrefModel;
TTgTrace.T('메인 화면 새로고침', 3);
with MgSvc_.VulService do
begin
// 상시로고 설정
UpdateScreenLogo;
case MgSvc_.HeModeKind of
hmkSleep :
begin
SetStateImage(0);
// if IsHD then
// lbMode.Caption := RS_HEC_SleepMode
// else
// lbMode.Caption := RS_SleepMode;
end;
hmkSecurity :
begin
SetStateImage(1);
// if IsHD then
// lbMode.Caption := RS_HEC_SecuMode
// else
// lbMode.Caption := RS_SecuMode;
end;
hmkVulnerability :
begin
SetStateImage(2);
// lbMode.Caption := RS_VulMode;
end;
hmkOffline :
begin
SetStateImage(15);
// lbMode.Caption := RS_OFFLINE;
end;
hmkException :
begin
SetStateImage(16);
// lbMode.Caption := RS_OFFLINEEXP;
end;
end;
lbMode.Caption := MgSvc_.
ModeName;
if not tTempConn.Enabled and
(MgSvc_.IsTemporaryConn or MgSvc_.IsOfflineExp) then
begin
lbConn.Font.Color := clYellow;
tTempConn.Enabled := true;
end;
imgOsPchInfo.Visible := (GetOsPatchCheckTerm > 0) and (PrefModel.OsPatchCheck <> opcNone);
imgChangeEmpNo.Visible := (IsChangeAbleEmpNo and PrefModel.IsEmpVerify) or
( (CUSTOMER_TYPE = CUSTOMER_GIORDANO) and not IsJoinAD );
lbChangeEmpNo.Visible := imgChangeEmpNo.Visible;
if imgExpend.Visible <> PrefModel.IsShowPolicy then
begin
imgExpend.Visible := PrefModel.IsShowPolicy;
if bWndExpend_ and not PrefModel.IsShowPolicy then
begin
if Visible then
begin
WndAni_.AnimateWidth(Width - SIZE_EXTEND_FORM_W, nil, FinishWindowExpend);
end else begin
Width := SIZE_DEF_FORM_W;
bWndExpend_ := false;
VisibleMainform(true);
Sleep(100);
VisibleMainform(false);
end;
end;
end;
if lbEmpNo.Visible <> PrefModel.IsShowAInfo then
begin
lbEmpNo.Visible := PrefModel.IsShowAInfo;
lbIpInfo.Visible := lbEmpNo.Visible;
lbWinAccount.Visible := lbEmpNo.Visible;
end;
if MgSvc_.AgentModel <> nil then
begin
sTemp := MgSvc_.AgentModel.EmpNo;
if sTemp = '' then
begin
sTemp := WindowsAccount;
lbEmpNo.Font.Style := lbEmpNo.Font.Style + [fsBold];
end else
lbEmpNo.Font.Style := lbEmpNo.Font.Style - [fsBold];
lbEmpNo.Caption := Format('%s (%s)', [sTemp,
BooleanToStr(MgSvc_.AgentModel.Location = '', 'Unknown', MgSvc_.AgentModel.Location)]);
end;
if not PrefModel.IsEnableCheck then
begin
lbOS.Caption := RS_CheckOff;
lbOS.Font.Color := $00635653;
SetImgBtn(imgStateList, imgOsVerState, 14);
lbOsPatchState.Caption := RS_CheckOff;
lbOsPatchState.Font.Color := $00635653;
SetImgBtn(imgStateList, imgOsPatchState, imgOsPatchState.Tag + 2);
lbAV.Caption := RS_CheckOff;
lbAV.Font.Color := $00635653;
SetImgBtn(imgStateList, imgAvState, 15);
lbPassState.Caption := RS_CheckOff;
lbPassState.Font.Color := $00635653;
SetImgBtn(imgStateList, imgPassState, 13);
lbScrSavState.Caption := RS_CheckOff;
lbScrSavState.Font.Color := $00635653;
SetImgBtn(imgStateList, imgScrSavState, 16);
lbFW.Caption := RS_CheckOff;
lbFW.Font.Color := $00635653;
SetImgBtn(imgStateList, imgFwState, 17);
end else begin
if PrefModel.VulOsVersion then
begin
if (MgSvc_.HandleConfig <> nil) and (MgSvc_.HandleConfig.OsMajorVer <> '') then
SetState(lbOS, imgOsVerState, IsOsSafe, Format('MS Windows %s' + #13#10 + '(%s)',
[OsVersion, MgSvc_.HandleConfig.OsMajorVer]))
else
SetState(lbOS, imgOsVerState, IsOsSafe, Format('MS Windows %s', [OsVersion]));
end else begin
lbOS.Caption := RS_CheckOff;
lbOS.Font.Color := $00635653;
SetImgBtn(imgStateList, imgOsVerState, 14);
end;
if PrefModel.OsPatchCheck = opcNone then
begin
lbOsPatchState.Caption := RS_CheckOff;
lbOsPatchState.Font.Color := $00635653;
SetImgBtn(imgStateList, imgOsPatchState, imgOsPatchState.Tag + 2);
end else
SetState(lbOsPatchState, imgOsPatchState, IsOsPatchUptoDate);
if IsSkipPwd or not PrefModel.VulPassword then
begin
lbPassState.Caption := RS_CheckOff;
lbPassState.Font.Color := $00635653;
SetImgBtn(imgStateList, imgPassState, 13);
end else
SetState(lbPassState, imgPassState, IsPasswordSet and IsPasswordSetTermOk);
imgPwDateInfo.Visible := (PrefModel.PwChkTerm <> pctNone) and (PrefModel.PwChkTermDay > 0);
if IsSkipScreenSaver or not PrefModel.VulScreenSaver then
begin
lbScrSavState.Caption := RS_CheckOff;
lbScrSavState.Font.Color := $00635653;
SetImgBtn(imgStateList, imgScrSavState, 16);
end else
SetState(lbScrSavState, imgScrSavState, IsScreenSaverSet);
if not PrefModel.VulAntiVirus then
begin
lbAV.Caption := RS_CheckOff;
lbAV.Font.Color := $00635653;
SetImgBtn(imgStateList, imgAvState, 15);
end else
SetState(lbAV, imgAvState, IsAntiVirusUpToDate);
if not PrefModel.VulFirewall then
begin
lbFW.Caption := RS_CheckOff;
lbFW.Font.Color := $00635653;
SetImgBtn(imgStateList, imgFwState, 17);
end else
SetState(lbFW, imgFwState, IsFirewallOn);
end;
if CUSTOMER_TYPE = CUSTOMER_ABL then
begin
lbIpInfo.Caption := RS_MsgMain1_ABL;
lbWinAccount.Caption := RS_MsgMain2_ABL;
end else begin
if MgSvc_.NicService <> nil then
lbIpInfo.Caption := MgSvc_.NicService.GetIP
else
lbIpInfo.Caption := 'ip';
if MgSvc_.VulService <> nil then
lbWinAccount.Caption := MgSvc_.VulService.WindowsAccount
else
lbWinAccount.Caption := MgSvc_.Account;
end;
lbConn.Caption := AccessStatus;
if not MgSvc_.IsTemporaryConn and not MgSvc_.IsOfflineExp then
begin
if not IsAllowAccess then
begin
if (MgSvc_.IsServiceAvailable and (not (IsSafeMode and IsWhiteApp)or not IsOsPatchUptoDate)) or
(AvInfo = nil) or (AvInfo.Name = '') then
lbConn.Font.Color := clAqua // 취약상태에서 빨간글씨 안보여서 추가 22_0614 13:58:50 kku
else
lbConn.Font.Color := clRed;
end else
lbConn.Font.Color := clWhite;
end;
sVer := SdkVersion;
if MgSvc_.Connected then
begin
sVer := sVer + ' (Manage Mode)';
lbVer.Font.Color := clBlue;
end else
if MgSvc_.HeModeKind = hmkOffline then
begin
sVer := sVer + ' (Offline Mode)';
lbVer.Font.Color := clGray;
end else
begin
sVer := sVer + ' (Standalone Mode)';
lbVer.Font.Color := clGreen;
end;
lbVer.Caption := sVer + ' @Tocsg Provided' + BooleanToStr(MgSvc_.IsNewApi, ' N', '');
end;
if FrmPolicyView_ <> nil then
FrmPolicyView_.AddModePolicy(MgSvc_.ModePolicy, true);
SetExtendMainView(MgSvc_.IsSchRstVul);
// 폼이 쪼그라드는 경우가 있다? 재현이 안되서 보안코드 추가 22_0623 07:15:12 kku
if Width < SIZE_DEF_FORM_W then
begin
if bWndExpend_ then
Width := SIZE_DEF_FORM_W + SIZE_EXTEND_FORM_W
else
Width := SIZE_DEF_FORM_W;
end else
if (bWndExpend_ and (Width < (SIZE_DEF_FORM_W + SIZE_EXTEND_FORM_W))) or
(Width > (SIZE_DEF_FORM_W + SIZE_EXTEND_FORM_W)) then
Width := SIZE_DEF_FORM_W + SIZE_EXTEND_FORM_W;
// 세로 크기 보정 23_0313 17:20:19 kku
if bUsePersonalFun_ then
begin
if Height <> SIZE_UP_FORM_H then
Height := SIZE_UP_FORM_H;
end else
if Height <> SIZE_DEF_FORM_H then
Height := SIZE_DEF_FORM_H;
sTrayHint_ := Format('%s'+#13#10+'%s', [lbMode.Caption, sVer]);
if CUSTOMER_TYPE = CUSTOMER_LOTTEMART then
begin
if MgSvc_.NicService <> nil then
SumString(sTrayHint_, 'IP :' + MgSvc_.NicService.GetIP, #13#10)
else
SumString(sTrayHint_, 'IP :' + 'ip', #13#10);
SumString(sTrayHint_, RS_EmpNoC + MgSvc_.EmpNo, #13#10);
if MgSvc_.DeptName <> '' then
SumString(sTrayHint_, RS_DeptC + ExtrLastDelimiterStr(MgSvc_.DeptName, ';'), #13#10);
if MgSvc_.UName <> '' then
SumString(sTrayHint_, RS_NameC + MgSvc_.UName, #13#10);
end else begin
SumString(sTrayHint_, lbEmpNo.Caption, #13#10);
if MgSvc_ <> nil then
begin
if MgSvc_.UName <> '' then
SumString(sTrayHint_, MgSvc_.UName, ', ');
if MgSvc_.DeptName <> '' then
SumString(sTrayHint_, MgSvc_.DeptName, ', ');
end;
end;
UpdateLangRes;
Application.ProcessMessages;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. RefreshView()');
end;
end;
procedure TDlgeCrmHeMain.SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer);
begin
try
aImgList.GetIcon(nImgIdx, imgBtn.Picture.Icon);
imgBtn.Repaint
except
// ..
end;
end;
procedure TDlgeCrmHeMain.FinishWindowExpend;
begin
bWndExpend_ := not bWndExpend_;
imgExpendMouseEnter(nil);
imgExpend.Enabled := true;
// 보험
if Width < SIZE_DEF_FORM_W then
Width := SIZE_DEF_FORM_W
else if Width > (SIZE_DEF_FORM_W + SIZE_EXTEND_FORM_W) then
Width := SIZE_DEF_FORM_W + SIZE_EXTEND_FORM_W;
end;
procedure TDlgeCrmHeMain.imgExpendClick(Sender: TObject);
begin
imgExpend.Enabled := false;
if not bWndExpend_ then
WndAni_.AnimateWidth(Width + SIZE_EXTEND_FORM_W, nil, FinishWindowExpend)
else
WndAni_.AnimateWidth(Width - SIZE_EXTEND_FORM_W, nil, FinishWindowExpend);
end;
procedure TDlgeCrmHeMain.imgExpendMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if not bWndExpend_ then
SetImgBtn(imgArrow, imgExpend, 2)
else
SetImgBtn(imgArrow, imgExpend, 5);
end;
procedure TDlgeCrmHeMain.imgExpendMouseEnter(Sender: TObject);
begin
if not bWndExpend_ then
SetImgBtn(imgArrow, imgExpend, 1)
else
SetImgBtn(imgArrow, imgExpend, 4);
end;
procedure TDlgeCrmHeMain.imgExpendMouseLeave(Sender: TObject);
begin
if not bWndExpend_ then
SetImgBtn(imgArrow, imgExpend, 0)
else
SetImgBtn(imgArrow, imgExpend, 3);
end;
procedure TDlgeCrmHeMain.imgExpendMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if not bWndExpend_ then
SetImgBtn(imgArrow, imgExpend, 1)
else
SetImgBtn(imgArrow, imgExpend, 4);
end;
procedure TDlgeCrmHeMain.LockScreen;
begin
{$IFDEF DEBUG}
if DebugHook <> 0 then
exit;
{$ENDIF}
TDlgLockScreen.Create(Self, MgSvc_.PrefModel.ScreenLockPwd).DoLockScreen;
end;
procedure TDlgeCrmHeMain.ResetTrayIcon;
var
sPath: String;
nUpdate: Integer;
begin
TTgTrace.T('ResetTrayIcon()', 1);
if TrayIcon_ <> nil then
FreeAndNil(TrayIcon_);
if (CUSTOMER_TYPE = CUSTOMER_LOTTEMART) and (MgSvc_ <> nil) and MgSvc_.PrefModel.HideMainUI then
exit;
// imgTrayState.GetIcon(0, Icon_);
// if Icon_ <> nil then
// SendMessage(Handle, WM_SETICON, ICON_SMALL, NativeInt(Icon_.Handle));
TrayIcon_ := TTrayIcon.Create(Self);
TrayIcon_.BalloonFlags := bfInfo;
TrayIcon_.Hint := sTrayHint_;
TrayIcon_.PopupMenu := popTray;
TrayIcon_.Icons := imgTrayState;
TrayIcon_.IconIndex := 0;
imgTrayState.GetIcon(0, TrayIcon_.Icon);
TrayIcon_.OnDblClick := miAgentStateClick;
TrayIcon_.Visible := true;
if (MgSvc_ <> nil) and (MgSvc_.PrefModel <> nil) then
begin
// 음.. 여기에 놓는건 보기 않좋지만.. 트레이가 생성 후
// 메시지가 팝업되는게 좋기 때문에 여기서 체크한다. 22_0531 14:16:00 kku
// sPath := GetRunExePathDir + LOG_PATCH;
// if FileExists(sPath) then
nUpdate := GetRegValueAsInteger(HKEY_LOCAL_MACHINE, REG_HE, 'update');
if nUpdate <> 0 then
begin
// DeleteFile(sPath);
SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_HE, 'update', 0, true);
case nUpdate of // 1 = update, 2 = install, 3 = update & LockScreen
1, 3 :
begin
case CUSTOMER_TYPE of
CUSTOMER_GEC,
CUSTOMER_HDENG,
CUSTOMER_KR, // KR은 업데이트 팝업 보이지 않도록 조치 22_0922 10:48:13 kku
CUSTOMER_SANKYO : ;
else begin
if MgSvc_.ModePolicy.IsNotiSystem then
MgSvc_.PopupMessage(TYPE_MSG_UPDATE);
end;
end;
MgSvc_.SendEventLog(URI_USERUPDATE, SYSEVT_AGENT_PATCH, 'Patch Completed : ' + SdkVersion);
// 패치 시 화면잠금 상태였다면 다시 화면 잠금 해줌 22_1018 13:53:19 kku
if (nUpdate = 3) and MgSvc_.PrefModel.IsStartupScreenLock then
LockScreen;
end;
2 :
begin
MgSvc_.SendEventLog(URI_USERUPDATE, SYSEVT_AGENT_INSTALL, 'Agent Installed : ' + SdkVersion);
end;
end;
end else
if MgSvc_.PrefModel.IsStartupScreenLock then
LockScreen;
end;
Application.ProcessMessages;
end;
procedure TDlgeCrmHeMain.tInitTimer(Sender: TObject);
var
ini: TIniFile;
sPath: String;
begin
tInit.Enabled := false;
try
try
sPath := GetRunExePathDir + INI_HE;
Guard(ini, TIniFile.Create(sPath));
ini.WriteString('Config', 'MW', IntToStr(Handle));
ini.WriteInt64('Config', 'CT', CUSTOMER_TYPE);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. tInitTimer() .. ProcIni');
end;
MgSvc_ := TManagerService.Create(Handle);
// if GetProcessPidByName(EXE_MG) <> 0 then
begin
// 앞서 실행되어 있으면 종료해준다. 22_0624 13:15:04 kku
TerminateProcessByName(EXE_MG);
// MgSvc_.ActiveThdreadProcess := true;
end;
SetExtendMainView(false);
// TTgTrace.T('tMtx.Enabled .. off', 1);
tMtx.Enabled := true;
if IsCJ_Affiliates and (MgSvc_.EmpNo = CJ_EMPTY_EMPNO) then
imgChangeEmpNoClick(nil);
{$IFDEF DEBUG}
VisibleMainform(true);
{$ENDIF}
if IsCJ_Affiliates then
begin
lbQA.Visible := false;
imgQA.Visible := false;
miChangeEmpNo.Caption := RS_IDCHANGE;
lbChangeEmpNo.Caption := RS_IDCHANGE;
lbChangeEmpNo.Left := lbQA.Left;
imgChangeEmpNo.Left := imgQA.Left;
end;
if ShowTestFun then
begin
miBrowserSecu.Enabled := true;
miBrowserSecu.Visible := true;
// miPrintCtrl.Enabled := true;
// miPrintCtrl.Visible := true;
miPcCleanup.Enabled := true;
miPcCleanup.Visible := true;
miFileErase.Enabled := true;
miFileErase.Visible := true;
var sIniPrefPath: String := GetRunExePathDir + INI_PREVFUN;
if FileExists(sIniPrefPath) then
begin
Guard(ini, TIniFile.Create(sIniPrefPath));
MgSvc_.SharePcPrintBlock := ini.ReadBool('Feature', 'SharePcPrintBlock', false);
MgSvc_.WSDPortPrintBlock := ini.ReadBool('Feature', 'WSDPortPrintBlock', false);
MgSvc_.TcpIpPrintBlock := ini.ReadBool('Feature', 'TcpIpPrintBlock', false);
MgSvc_.PrintSavingBlock := ini.ReadBool('Feature', 'PrintSavingBlock', false);
if ini.ReadBool('Feature', 'BrowserSecu', false) then
ExecutePath_hide(GetRunExePathDir + DIR_CONF + EXE_BROWSER_SECU);
end else begin
MgSvc_.SharePcPrintBlock := false;
MgSvc_.WSDPortPrintBlock := false;
MgSvc_.TcpIpPrintBlock := false;
MgSvc_.PrintSavingBlock := false;
end;
if not miPrintCtrl.Enabled then
begin
MgSvc_.SharePcPrintBlock := false;
MgSvc_.WSDPortPrintBlock := false;
MgSvc_.TcpIpPrintBlock := false;
MgSvc_.PrintSavingBlock := false;
end;
end;
if IsUsePrintWatermarkExpOnce then
begin
miNoWaterApproval.Enabled := true;
miNoWaterApproval.Visible := true;
end;
miAprvFileExport.Enabled := IsApproveSupport;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. tInitTimer()');
end;
end;
procedure TDlgeCrmHeMain.tMtxTimer(Sender: TObject);
var
sPath: String;
begin
if MutexExists(MUTEX_KILL) then
begin
OutputDebugString(PChar('[MGKIM] tMtxTimer ..in '));
tMtx.Enabled := false;
if RecoverSvc_ <> nil then
RecoverSvc_.StopService;
OutputDebugString(PChar('[MGKIM] tMtxTimer ..RecoverSvc_.StopService in '));
try
if TrayIcon_ <> nil then
TrayIcon_.Visible := false;
if MutexExists(MUTEX_UNINSTALL) then
begin
// 삭제 이벤트는 큐에 넣지말고 직접 보내줘야 한다. 22_0624 09:05:12 kku
// MgSvc_.DirectSendEventLog(URI_USER_ACTION, SYSEVT_AGENT_UNINSTALL, 'Uninstall Agent'); // 이거 동작안해서 동작 실행전으로 변경함 24_0905 10:13:09 kku
end;
// 보안모듈 안전 종료를 위한 처리 추가 23_0331 09:22:44 kku
OutputDebugString(PChar('[MGKIM] tMtxTimer ..MUTEX_UNINSTALL in '));
if MgSvc_ <> nil then
MgSvc_.StopService;
OutputDebugString(PChar('[MGKIM] tMtxTimer ..MgSvc_.StopService in '));
except
// ..
end;
OutputDebugString(PChar('[MGKIM] TerminateProcess ..out '));
TerminateProcess(GetCurrentProcess, 99);
end;
if (KeyMonDll_ <> nil) and (dwBlockInputCTick_ <> 0) and ((GetTickCount - dwBlockInputCTick_) > 1500) then
begin
KeyMonDll_.SetDisableKey_Ctrl(false);
KeyMonDll_.SetDisableKey_Etc(0, 0);
dwBlockInputCTick_ := 0;
end;
// 서비스를 DLL로 구동 시 필요하지 않음 22_0511 13:45:23 kku
if not MutexExists(MUTEX_SERVICE) then
begin
// SetVisibleServce(NAME_SERVICE, true);
if not ServiceExists(NAME_SERVICE) then
begin
if not UseSvcExe and FileExists(sSysDir_ + DLL_SV) then
begin
InstallServiceDll(sSysDir_ + DLL_SV,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START);
end else
if FileExists(sSysDir_ + EXE_SV) then
begin
InstallService(NAME_SERVICE, sSysDir_ + EXE_SV, NAME_SERVICE,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START);
end;
end;
case GetServiceStatus(NAME_SERVICE) of
0, SERVICE_RUNNING,
SERVICE_START_PENDING : ;
else begin
ServiceStart(NAME_SERVICE);
// 서비스를 숨기면 윈도우 메이저 업데이트 시 서비스가 사라지는 문제가 있음 24_0105 08:18:24 kku
// SetVisibleServce(NAME_SERVICE, false);
end;
end;
end;
// 삭제 시 다시 재설치하는 증상이 있어서 일단 막음 25_0818 14:49:23 kku
// if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then
// begin
// case GetServiceStatus('BSonePrintService') of
// SERVICE_RUNNING,
// SERVICE_START_PENDING : ;
// else begin
// var bDoInst: Boolean := true;
// var sXprtDir: String := 'C:\ProgramData\bsoneprint\';
// var O: ISuperObject;
// if LoadJsonObjFromFile(O, sXprtDir + 'bsonelocal.conf') then
// begin
// if O.S['stopPassword'] <> '' then
// bDoInst := false;
// end;
//
// if bDoInst then
// begin
// var sXprtExe: String := sXprtDir + EXE_xPrintSvc;
// if FileExists(sXprtExe) then
// begin
// ExecutePath_hide(sXprtExe, '-install');
// Sleep(2000);
// end;
// end;
// end;
// end;
// end;
if not UseSvcExe then
begin
if GetRegValueAsInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'Start') <> 2 then
SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'Start', 2, true);
if GetRegValueAsInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'Type') <> 16 then
SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'Type', 16, true);
if GetRegValueAsInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'ErrorControl') <> 1 then
SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'ErrorControl', 1, true);
if GetRegValueAsString(HKEY_LOCAL_MACHINE, REG_SVC, 'DisplayName') <> NAME_SERVICE then
SetRegValueString(HKEY_LOCAL_MACHINE, REG_SVC, 'DisplayName', NAME_SERVICE, true);
if GetRegValueAsString(HKEY_LOCAL_MACHINE, REG_SVC, 'ImagePath') <> REG_IMGPATH then
SetRegValueStringEx(HKEY_LOCAL_MACHINE, REG_SVC, 'ImagePath', REG_IMGPATH, true);
if GetRegValueAsString(HKEY_LOCAL_MACHINE, REG_SVC, 'ObjectName') <> 'LocalSystem' then
SetRegValueString(HKEY_LOCAL_MACHINE, REG_SVC, 'ObjectName', 'LocalSystem', true);
sPath := sSysDir_ + DLL_SV;
if FileExists(sPath) then
begin
if not ExistsKey(HKEY_LOCAL_MACHINE, REG_SVC + 'Parameters') then
SetRegValueStringEx(HKEY_LOCAL_MACHINE, REG_SVC + 'Parameters', 'ServiceDll', sPath, true);
if GetRegValueAsString(HKEY_LOCAL_MACHINE, REG_SVC + 'Parameters', 'ServiceDll') <> sPath then
SetRegValueStringEx(HKEY_LOCAL_MACHINE, REG_SVC + 'Parameters', 'ServiceDll', sPath, true);
if GetRegValueAsInteger(HKEY_LOCAL_MACHINE, REG_SVC + 'Parameters', 'ServiceDllUnloadOnStop') <> 1 then
SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_SVC + 'Parameters', 'ServiceDllUnloadOnStop', 1, true);
end;
end;
// 작업표시줄 유무따라 트레이 죽이고 살리기 22_0524 09:31:22 kku
if FindWindow('Shell_TrayWnd', '') <> 0 then
begin
if (CUSTOMER_TYPE = CUSTOMER_LOTTEMART) and (TrayIcon_ <> nil) and (MgSvc_ <> nil) and MgSvc_.PrefModel.HideMainUI then
begin
FreeAndNil(TrayIcon_);
TTgTrace.T('Remove TrayIcon .. 1', 1);
end else
if TrayIcon_ = nil then
ResetTrayIcon;
end else
if TrayIcon_ <> nil then
begin
FreeAndNil(TrayIcon_);
TTgTrace.T('Remove TrayIcon .. 2', 1);
end;
end;
procedure TDlgeCrmHeMain.tSchTimerTimer(Sender: TObject);
var
sProcFile: String;
llTotalTgFileCnt,
llProcTgFileCnt: LONGLONG;
wPercent: WORD;
begin
if (MgSvc_ = nil) or (not MgSvc_.IsSearchingPersonalInfo) then
begin
tSchTimer.Enabled := false;
lbSchProgMsg.Visible := false;
exit;
end;
try
case MgSvc_.ThdScanSch.WorkState of
tsWorking :
begin
sProcFile := MgSvc_.ThdScanSch.ProcSchFile;
if sProcFile <> '' then
begin
llProcTgFileCnt := MgSvc_.ThdScanSch.ProcTgFileCount;
llTotalTgFileCnt := MgSvc_.ThdScanSch.TotalTgFileCount;
if llTotalTgFileCnt > 0 then
wPercent := (llProcTgFileCnt * 100) div llTotalTgFileCnt
else
wPercent := 0;
lbSchProgMsg.Caption := Format(RS_FMT_Searching,
[ConvSecBetweenToProgTime(MgSvc_.ThdScanSch.BeginDT, Now),
llProcTgFileCnt, llTotalTgFileCnt, wPercent, sProcFile]);
end else
lbSchProgMsg.Caption := Format(RS_FMT_Scaning,
[ConvSecBetweenToProgTime(MgSvc_.ThdScanSch.BeginDT, Now),
MgSvc_.ThdScanSch.ProcDir, MgSvc_.ThdScanSch.TotalFileCount]);
end;
tsStop,
tsCompleted,
tsFail :
begin
tSchTimer.Enabled := false;
lbSchProgMsg.Visible := false;
end;
end;
Application.ProcessMessages;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. tSchTimerTimer()');
end;
end;
procedure TDlgeCrmHeMain.tSnapTagTimer(Sender: TObject);
var
sTemp, sTemp2, sTemp3: String;
sOutCode: AnsiString;
n, nAlpha: Integer;
begin
sTemp := GetRunExePathDir + DIR_CONF + DLL_ST;
if FileExists(sTemp) then
begin
try
sTemp2 := GetRunExePathDir + DIR_CONF + DAT_SNAPTAGKEY_S;
if not FileExists(sTemp2) then
begin
var StrList: TStringList;
Guard(StrList, TStringList.Create);
StrList.Text := ST_Key_S;
StrList.SaveToFile(sTemp2, TEncoding.ANSI);
end;
sTemp3 := GetRunExePathDir + DIR_CONF + PNG_SNAPTAGDATA_LOGO;
n := labGuardPS(sTemp2, sTemp3, 2, 3, 1 {유저코드?},
FormatDateTime('yyyy/mm/dd hh:nn', Now), sOutCode);
if n = 0 then
begin
DispLogosST_.SetImage(sTemp3, -99, -99);
nAlpha := 20;
if MgSvc_.PrefModel.ScreenLogoAlpha <> 0 then
nAlpha := MgSvc_.PrefModel.ScreenLogoAlpha;
DispLogosST_.SetAlpha(nAlpha);
if sOutCode <> '' then
begin
TTgTrace.T('상시 로고 - ST_Update, ST=%s', [sOutCode], 1);
MgSvc_.SendEventLog(URI_USER_ACTION, PREVENT_SCREENLOGO, Format('ST=%s, ScreenLogo Update', [sOutCode]));
end;
end else
TTgTrace.T('Fail .. Snaptag .. code = %d', [n], 1);
// F.Size := 75;
// DispLogos_.SetText(sWindowsAccount + #13#10 + '{DateTime}', // DateTimeToStr(Now),
// F, 3, 3, 0, 0, clBlack, clLime, '', nUpdateMSec);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. UpdateScreenLogo() .. HCA-ST');
end;
end;
end;
procedure TDlgeCrmHeMain.tStatusTimer(Sender: TObject);
var
sMsg: String;
begin
(*
if (Client_ <> nil) and Client_.Connected then
begin
case Client_.MgCore.CoreState of
csIdle :
begin
// lbStatus.Caption := Format('폴더 %s개 파일 %s개',
// [InsertPointComma(Client_.MgCore.TotalDir, 3),
// InsertPointComma(Client_.MgCore.TotalFile, 3)]);
sMsg := Client_.MgCore.CoreInfoText;
if lbTagInfo.Caption <> sMsg then
lbTagInfo.Caption := sMsg;
if miShowTagInfo.Checked <> lbTagInfo.Visible then
lbTagInfo.Visible := miShowTagInfo.Checked;
if DTagList_ <> nil then
DTagList_.FrmTagList.RefreshList(Client_.MgCore.TgList);
end;
csExtrFile :
begin
sMsg := Format('[%s]'#13#10'파일 추출 중...'#13#10#13#10'폴더 : %s'#13#10'파일 : %s',
[ConvSecBetweenToProgTime(Client_.MgCore.ScanDT, Now),
// Client_.MgCore.ProcPath,
InsertPointComma(Client_.MgCore.TotalDir, 3),
InsertPointComma(Client_.MgCore.TotalFile, 3)]);
lbTagInfo.Caption := sMsg;
end;
csExtrTxt :
begin
// sMsg := Format('%s'#13#10'태그 수집 중...'#13#10#13#10'%s / %s',
// [ConvSecBetweenToProgTime(Client_.MgCore.ScanDT, Now),
// InsertPointComma(Client_.MgCore.ProcCount, 3),
// InsertPointComma(Client_.MgCore.TotalCount, 3)]);
//// Client_.MgCore.ProcPath]);
sMsg := Format('[%s]'#13#10'태그 수집 중...',
[ConvSecBetweenToProgTime(Client_.MgCore.ScanDT, Now)]);
// Client_.MgCore.ProcPath]);
lbTagInfo.Caption := sMsg;
end;
end;
end;
*)
end;
procedure TDlgeCrmHeMain.tTempConnTimer(Sender: TObject);
var
llTick: LONGLONG;
nTime: Integer;
bIsTempConn, bIsOffExp: Boolean;
begin
if MgSvc_ = nil then
exit;
bIsTempConn := MgSvc_.IsTemporaryConn;
bIsOffExp := MgSvc_.IsOfflineExp;
if not bIsTempConn and not bIsOffExp then
begin
RefreshView;
tTempConn.Enabled := false;
exit;
end;
if bIsTempConn then
begin
llTick := GetTickCount; // Integer Stackoverflow 방지
// nTime := SEC_USE_TEMPCONN - (llTick - MgSvc_.TempConnBegin);
nTime := (MgSvc_.PrefModel.TemporaryConnMin * 60000) - (llTick - MgSvc_.TempConnBegin);
if nTime > 1000 then
nTime := nTime div 1000
else
nTime := 0;
lbConn.Caption := Format('%s - %s', [RS_CONNECTION_TEMP, ConvSecToProgTime(nTime)]);
end else begin
var dt := IncMinute(MgSvc_.ExpPolicyBeginDT, MgSvc_.ExpPolicyUseMin);
nTime := SecondsBetween(Now, dt);
if MgSvc_.ExpPolicyUseMin = 9999 then
lbConn.Caption := Format('%s - %s', [RS_CONNECTION_EXP, RS_CONNECTION_EXP_TODAY])
else
lbConn.Caption := Format('%s - %s', [RS_CONNECTION_EXP, ConvSecToProgTime(nTime)]);
end;
Application.ProcessMessages;
end;
procedure TDlgeCrmHeMain.tUpdateLogoTimer(Sender: TObject);
begin
tUpdateLogo.Enabled := false;
UpdateScreenLogo;
end;
procedure TDlgeCrmHeMain.imgQAClick(Sender: TObject);
var
dlg: TDlgQnA;
begin
if FindWindow('TDlgQnA', nil) <> 0 then
exit;
var sExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
var O: ISuperObject := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_SEND_QnA_MESSAGE;
O.S['WinCap'] := APP_TITLE;
O.S['Desc'] := RS_InputQnA;
O.S['BtnOk'] := RS_QnA;
O.S['BtnCancel'] := RS_Cancel;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
end;
// Guard(dlg, TDlgQnA.Create(Self));
// if dlg.ShowModal = mrOk then
// MgSvc_.SendEventLog(URI_USER_ACTION, REQUEST_QNA, dlg.mmQnA.Text);
end;
procedure TDlgeCrmHeMain.imgQAMouseEnter(Sender: TObject);
var
img: TImage;
begin
if Sender = nil then
exit;
if Sender is TImage then
img := TImage(Sender)
else if Sender = lbQA then
img := imgQA
else
img := imgChangeEmpNo;
if img = imgQA then
lbQA.Font.Color := $00635653
else
lbChangeEmpNo.Font.Color := $00635653;
SetImgBtn(imgEvList, img, img.Tag + 1);
end;
procedure TDlgeCrmHeMain.imgQAMouseLeave(Sender: TObject);
var
img: TImage;
begin
if Sender = nil then
exit;
if Sender is TImage then
img := TImage(Sender)
else if Sender = lbQA then
img := imgQA
else
img := imgChangeEmpNo;
if img = imgQA then
lbQA.Font.Color := clWhite
else
lbChangeEmpNo.Font.Color := clWhite;
SetImgBtn(imgEvList, img, img.Tag);
end;
procedure TDlgeCrmHeMain.imgSetAccPassClick(Sender: TObject);
begin
ExecutePath_hide('cmd.exe', PARAM_GO_SETPASS);
end;
procedure TDlgeCrmHeMain.imgSetAntiVirusClick(Sender: TObject);
begin
ExecutePath_hide('cmd.exe', PARAM_GO_ANTIVIRUS);
end;
procedure TDlgeCrmHeMain.imgSetFWClick(Sender: TObject);
begin
if StrToIntDef(MgSvc_.HandleConfig.OsVersion, 7) >= 10 then
ExecutePath_hide('cmd.exe', PARAM_GO_FIREWALL2)
else
ExecutePath_hide('cmd.exe', PARAM_GO_FIREWALL);
end;
procedure TDlgeCrmHeMain.imgSetOsClick(Sender: TObject);
begin
ExecutePath_hide('cmd.exe', PARAM_GO_WINUPDATE);
MgSvc_.DoCheckOsUpdate;
end;
procedure TDlgeCrmHeMain.imgSetOsMouseEnter(Sender: TObject);
begin
if Sender is TImage then
SetImgBtn(imgBtnList, TImage(Sender), 1);
end;
procedure TDlgeCrmHeMain.imgSetOsMouseLeave(Sender: TObject);
begin
if Sender is TImage then
SetImgBtn(imgBtnList, TImage(Sender), 0);
end;
procedure TDlgeCrmHeMain.imgSetScreenSaverClick(Sender: TObject);
begin
{$IFDEF DEBUG}
ExecutePath_hide('cmd.exe', PARAM_GO_SETSAVER);
{$ELSE}
ExecuteAppAsUser('explorer.exe', 'rundll32.exe', 'shell32.dll,Control_RunDLL desk.cpl,,1', SW_HIDE);
{$ENDIF}
end;
procedure TDlgeCrmHeMain.lbOsVerTopMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
imgOsInfoMouseDown(CtrlTagToImage(Sender), Button, Shift, X, Y);
end;
procedure TDlgeCrmHeMain.lbOsVerTopMouseEnter(Sender: TObject);
begin
imgSetOsMouseEnter(CtrlTagToImage(Sender));
end;
procedure TDlgeCrmHeMain.lbOsVerTopMouseLeave(Sender: TObject);
begin
imgSetOsMouseLeave(CtrlTagToImage(Sender));
end;
procedure TDlgeCrmHeMain.lbOsVerTopMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
imgOsInfoMouseUp(CtrlTagToImage(Sender), Button, Shift, X, Y);
end;
procedure TDlgeCrmHeMain.lbTagInfoDblClick(Sender: TObject);
begin
// if DTagList_ <> nil then
// DTagList_.Show;
end;
procedure TDlgeCrmHeMain.lbVerDblClick(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(GetCustomerName + #13#10 + gMgSvc.DestIPort + #13#10 + BUILD_DT);
end;
end;
procedure TDlgeCrmHeMain.lbWinAccountDblClick(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
if MgSvc_ <> nil then
ShowMessage(MgSvc_.Domain);
end;
end;
procedure TDlgeCrmHeMain.lbCttSchClick(Sender: TObject);
var
PerList: TPerInfoEntList;
dlg: TDlgSelPerInfo;
EntInfo: TPerInfoEnt;
O: ISuperObject;
sPath: String;
ScanOpt: TFileScanOpt;
// sPath: String;
// dlg: TDlgCustomCttSch;
// SchOpt: TFileScanOpt;
begin
if MgSvc_.IsSearchingPersonalInfo then
begin
MessageBox(Handle, PChar(RS_PiScanning+#13+#10+
RS_ConfirmRetry), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
exit;
end;
if FindWindow('TDlgViewCustomCttSchResult', nil) <> 0 then
begin
MessageBox(Handle, PChar(RS_ClosePerInfoResult), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
ZeroMemory(@EntInfo, SizeOf(EntInfo));
Guard(PerList, TPerInfoEntList.Create);
if GetPersonalInfoResults(PerList) = 0 then
begin
MessageBox(Handle, PChar(RS_NoScanData), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
if PerList.Count = 1 then
begin
EntInfo := PerList[0]^;
end else begin
Guard(dlg, TDlgSelPerInfo.Create(Self, PerList));
if dlg.ShowModal = mrOk then
EntInfo := dlg.SelEnt^;
end;
if EntInfo.sScanId <> '' then
begin
if MessageBox(Handle, PChar(Format(RS_ScanConfirm1 + #13#10 +
RS_ScanConfirm2+#13+#10+
RS_ScanConfirm3+#13+#10+#13+#10+
RS_ScanConfirm4 + #13#10 + RS_ScanConfirm5,
[DateTimeToStr(EntInfo.dtBegin), InsertPointComma(EntInfo.dwVulFileCnt, 3), EntInfo.sTime])),
PChar(APP_TITLE), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
sPath := GetRunExePathDir + DIR_CTTSCHRST + EntInfo.sScanId + '.' + DAT_CTTSCHOPT;
if not LoadJsonObjFromEncFile(O, sPath, PASS_STRENC) or (O.S['sScanId'] = '') then
if not LoadJsonObjFromFile(O, sPath) or (O.S['sScanId'] = '') then
begin
MessageBox(Handle, PChar(RS_FailScanOpt), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
ScanOpt := TTgJson.GetDataAsType<TFileScanOpt>(O);
ScanOpt.CttSchOpt.hRcvHwnd := Handle;
MgSvc_.StartPiSchTask(ScanOpt, 0 {최근 스캔일 재활용}, false);
end else
MessageBox(Handle, PChar(RS_FailScanOpt), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// try
// if MgSvc_.IsSearchingPersonalInfo then
// begin
// if MessageBox(Handle, PChar('이미 검사중입니다. 기존 검사를 취소하시겠습니까?'),
// PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
//
// MgSvc_.StopPersonalInfoSearch;
// end;
//
// sPath := GetRunExePathDir + DIR_CTTSCHRST + DAT_CTTSCHRST;
// if FileExists(sPath) then
// begin
// if MessageBox(Handle, PChar(RS_AlreadyCttSchRts1+#13+#10+RS_AlreadyCttSchRts2),
// PChar(APP_TITLE), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
// DeleteDir(ExtractFilePath(sPath));
// end;
// UpdateCttSchRstButton;
//
// Guard(dlg, TDlgCustomCttSch.Create(Self));
// if dlg.ShowModal = mrOk then
// begin
// if FileExists(sPath) then
// DeleteDir(ExtractFilePath(sPath));
//
// if not ForceDirectories(GetRunExePathDir + DIR_CTTSCHRST) then
// begin
// TTgTrace.T('Fail .. CreateDir() .. Path="%s"', [GetRunExePathDir + DIR_CTTSCHRST]);
// MessageBox(Handle, PChar('작업 폴더를 생성하는 중 오류가 발생했습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
// end;
//
// ZeroMemory(@SchOpt, SizeOf(SchOpt));
// SchOpt.sTgDirs := dlg.Paths;
// SchOpt.sScanExt := dlg.mmExt.Text;
// SchOpt.sSchPtrns := dlg.Patterns;
// SchOpt.nLangId := 1;
// SchOpt.nLimitSizeMB := dlg.LimitSizeMB;
// SchOpt.CttSchOpt.hRcvHwnd := Handle;
// SchOpt.CttSchOpt.nWorkPriority := -1;
// SchOpt.CttSchOpt.sKvMdPath := GetRunExePathDir + 'bin\';
// MgSvc_.StartPersonalInfoSearch(SchOpt);
//
// TDlgProgCustomCttSch.Create(nil).Show;
// UpdateCttSchRstButton;
// end;
// except
// on E: Exception do
// ETgException.TraceException(Self, E, 'Fail .. miCttSchClick()');
// end;
end;
procedure TDlgeCrmHeMain.lbCttSchRstClick(Sender: TObject);
var
PerList: TPerInfoEntList;
dlg: TDlgSelPerInfo;
begin
if FindWindow('TDlgViewCustomCttSchResult', nil) <> 0 then
exit;
if MgSvc_.IsSearchingPersonalInfo then
begin
var bEncCamp: Boolean := false;
try
bEncCamp := (MgSvc_.ProcCampn <> nil) and (MgSvc_.ProcCampn.Info.CampnType = ctForceEnc);
except
// ..
end;
// if bEncCamp then
// MessageBox(Handle, PChar(RS_EncScanning+#13+#10+
// RS_ConfirmRetry), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK)
// else
// MessageBox(Handle, PChar(RS_PiScanning+#13+#10+
// RS_ConfirmRetry), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
//
// exit;
// 파일 암호화 캠페인은 검출결과 확인 가능하도록 수정 24_0423 15:50:49 kku
if not bEncCamp then
begin
MessageBox(Handle, PChar(RS_PiScanning+#13+#10+
RS_ConfirmRetry), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
exit;
end;
end;
Guard(PerList, TPerInfoEntList.Create);
if GetPersonalInfoResults(PerList) = 0 then
begin
MessageBox(Handle, PChar(RS_NoScanData), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
if PerList.Count = 1 then
begin
TDlgViewCttSchResult.Create(PerList[0].sScanId).Show;
end else begin
Guard(dlg, TDlgSelPerInfo.Create(Self, PerList));
if dlg.ShowModal = mrOk then
TDlgViewCttSchResult.Create(dlg.SelEnt.sScanId).Show;
end;
end;
procedure TDlgeCrmHeMain.lbEmpNoDblClick(Sender: TObject);
begin
// ShowMessage(GetRegValueAsString(HKEY_CURRENT_USER, 'SOFTWARE\7-Zip', 'Path'));
// MgSvc_.SendEventLog(URI_USER_ACTION, LOGCODE_MONITOR_DOMAIN, 'Domain : www.daum.net');
// MgSvc_.SendEventLog(URI_USER_ACTION, LOGCODE_MONITOR_CONNECTION, 'Domain : www.daum.net');
// MgSvc_.SendEventLog(URI_USER_ACTION, LOGCODE_PREVENT_USB, 'Domain : www.daum.net');
end;
procedure TDlgeCrmHeMain.lbIpInfoDblClick(Sender: TObject);
begin
//SetAipLabel('C:\Users\kku\Desktop\456_label.docx', '');
end;
function ProtectCurrentProcess: Boolean;
var
hProcess: THandle;
pSD: PSECURITY_DESCRIPTOR;
// ea: EXPLICIT_ACCESS;
ea: array[0..2] of EXPLICIT_ACCESS;
pNewDACL, pTempDACL: PACL;
b1, b2: LongBool;
i: Integer;
const
TrusteeNames: array[0..3] of PChar = (
'EVERYONE',
'Administrator',
'KKU-PC\Administrators',
'NT AUTHORITY\SYSTEM'
);
begin
Result := false;
hProcess := OpenProcess(WRITE_DAC, FALSE, GetCurrentProcessId);
if hProcess = 0 then Exit;
for i := 0 to High(ea) do
begin
ZeroMemory(@ea[i], SizeOf(EXPLICIT_ACCESS));
ea[i].grfAccessPermissions := PROCESS_TERMINATE;
ea[i].grfAccessMode := DENY_ACCESS;
ea[i].grfInheritance := NO_INHERITANCE;
ea[i].Trustee.TrusteeForm := TRUSTEE_IS_NAME;
ea[i].Trustee.TrusteeType := TRUSTEE_IS_USER;
ea[i].Trustee.ptstrName := TrusteeNames[i];
end;
// ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS));
// ea.grfAccessPermissions := PROCESS_ALL_ACCESS;
// ea.grfAccessMode := DENY_ACCESS;
// ea.grfInheritance := NO_INHERITANCE;
// ea.Trustee.TrusteeForm := TRUSTEE_IS_NAME;
// ea.Trustee.TrusteeType := TRUSTEE_IS_USER;
// ea.Trustee.ptstrName := 'Administrators';
if SetEntriesInAcl(Length(ea), @ea, nil, pNewDACL) = ERROR_SUCCESS then
begin
pTempDACL := nil;
GetSecurityDescriptorDacl(pSD, b1, pTempDACL, b2);
SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, pNewDACL, nil);
LocalFree(HLOCAL(pNewDACL));
Result := true;
end;
CloseHandle(hProcess);
end;
procedure SetDesktopWallpaper(const sPath: string);
begin
// 1. 레지스트리에 이미지 경로 저장
SetRegValueString(HKEY_CURRENT_USER, 'Control Panel\Desktop', 'Wallpaper', sPath, true);
// 2. 시스템에 배경화면 변경 적용
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(sPath),
SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE);
end;
procedure TDlgeCrmHeMain.lbModeDblClick(Sender: TObject);
//var
// dlg: TDlgSimpleInfo;
// dlg: TDlgEjectDLL;
begin
{$IFDEF DEBUG}
var dlg: TDlgDecryptAip := TDlgDecryptAip.Create(nil);
dlg.Show;
exit;
// var LogInfo: TLogInfo;
// ZeroMemory(@LogInfo, SizeOf(LogInfo));
// LogInfo.sCode := MONITOR_appScreenRec;
// LogInfo.sLogId := StrsReplace(TGUID.NewGuid.ToString, ['{', '}'], '');
//
// var sData: String := MgSvc_.GetPostData(Format('aapi/files/issue?origin=inc.%s&type=appScreenRec', [LogInfo.sLogId]), '');
// if sData = '' then
// begin
// ShowMessage('실패 1');
// exit;
// end;
// var O: ISuperObject := SO(sData);
// var sFid: String := O.S['fileId'];
// var sUpUrl: String := O.S['uploadUrl'];
// var sPath: String := 'C:\Users\kku\Desktop\TEST\_ColTest\1.mp4';
// MgSvc_.SendFile('file', sUpUrl, sPath, 0, 20);
//
// var OA := TSuperObject.Create(stArray);
// OA.AsArray.Add(sFid);
// LogInfo.sThumbIds := OA.AsJSon;
// LogInfo.sSummary := Format('TEST - mp4 Upload, %s', [DateTimeToStr(Now)]);
// MgSvc_.SendEventLogEx(@LogInfo);
{$ENDIF}
//dlg.mmInfo := nil;
//ShowMessage(dlg.mmInfo.Text);
//var msg: String := '';
//msg[234] := 'd';
//{$IFDEF DEBUG}
// MgSvc_.SendEventLog(URI_CONNECT, SYSEVT_AGENT_INSTALL, 'Agent first connected');
//{$ENDIF}
// var sUrl := gMgSvc.SendApprovalPrint('0001', 'DocText', '', 'DocName.txt');
// if sUrl <> '' then
// ExecutePath(gMgSvc.DestIPort + sUrl);
//exit;
//{$IFDEF DEBUG} // TEST_KJ
//UpdateScreenLogo(true);
// MgSvc_.PopupMessage(TYPE_MSG_CTTSCH_COMPLETE, '00:00:00|347');
//exit;
//{$ENDIF}
// var sMsg: String := 'Name : ' + MgSvc_.UName + #13#10 +
// 'Dept : ' + MgSvc_.DeptName + #13#10 +
// 'Email : ' + MgSvc_.Email;
//
// ShowMessage(sMsg);
//
// exit;
// dlg := TDlgSimpleInfo.Create(Self);
// dlg.FillCurrentModeInfo;
// dlg.Show;
end;
procedure TDlgeCrmHeMain.miAgentStateClick(Sender: TObject);
begin
VisibleMainform(true);
end;
procedure TDlgeCrmHeMain.miAip2KessClick(Sender: TObject);
var
dlg: TDlgAip2KessDrm;
begin
Guard(dlg, TDlgAip2KessDrm.Create(Self));
dlg.ShowModal;
end;
procedure TDlgeCrmHeMain.miAipTryClick(Sender: TObject);
begin
MgSvc_.AipFailCnt := 0;
end;
procedure TDlgeCrmHeMain.miAprvListClick(Sender: TObject);
var
sUrl: String;
begin
sUrl := MgSvc_.GetApprovalUrl('1');
if sUrl <> '' then
begin
// ExecutePath(gMgSvc.DestIPort + sUrl);
var sHlpExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sHlpExe) then
begin
var O: ISuperObject := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_EXECUTE_FILE;
O.S['Path'] := gMgSvc.DestIPort + sUrl;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sHlpExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sHlpExe, '', SW_SHOWNORMAL);
{$ENDIF}
end else
ExecutePath(gMgSvc.DestIPort + sUrl);
end;
end;
procedure TDlgeCrmHeMain.miAprvReqListClick(Sender: TObject);
var
sUrl: String;
begin
sUrl := MgSvc_.GetApprovalUrl('3');
if sUrl <> '' then
begin
// ExecutePath(gMgSvc.DestIPort + sUrl);
var sHlpExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sHlpExe) then
begin
var O: ISuperObject := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_EXECUTE_FILE;
O.S['Path'] := gMgSvc.DestIPort + sUrl;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sHlpExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sHlpExe, '', SW_SHOWNORMAL);
{$ENDIF}
end else
ExecutePath(gMgSvc.DestIPort + sUrl);
end;
end;
procedure TDlgeCrmHeMain.miBrowserSecuClick(Sender: TObject);
var
sBrExe: String;
ini: TIniFile;
begin
sBrExe := GetRunExePathDir + DIR_CONF + EXE_BROWSER_SECU;
if not FileExists(sBrExe) then
begin
MessageBox(Handle, '브라우저 보안 모듈이 존재하지 않습니다.', PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
if miBrowserSecu.Checked then
begin
if MessageBox(Handle, '브라우저 보안 기능을 중지하시겠습니까?',
PChar(APP_TITLE), MB_YESNO + MB_ICONQUESTION) = IDNO then exit;
TerminateProcessByName(EXE_BROWSER_SECU);
Guard(ini, TIniFile.Create(GetRunExePathDir + INI_PREVFUN));
ini.WriteBool('Feature', 'BrowserSecu', false);
MessageBox(Handle, '브라우저 보안 기능을 중지했습니다.', PChar(APP_TITLE), MB_OK + MB_ICONINFORMATION);
end else begin
var dlg: TDlgBrowserOpt;
Guard(dlg, TDlgBrowserOpt.Create(Self));
if dlg.ShowModal = mrOk then
begin
Guard(ini, TIniFile.Create(GetRunExePathDir + INI_PREVFUN));
ini.WriteBool('Feature', 'BrowserSecu', true);
ExecutePath_hide(sBrExe);
end;
end;
end;
procedure TDlgeCrmHeMain.miCttSchClick(Sender: TObject);
var
dlg: TDlgCustomCttSchOpt;
Opt: TFileScanOpt;
sInfoDir: String;
begin
if ThdCustomScanSch_ <> nil then
begin
MessageBox(Handle, PChar(RS_CustomCttSching), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
Guard(dlg, TDlgCustomCttSchOpt.Create(Self));
if dlg.ShowModal = mrOk then
begin
ZeroMemory(@Opt, SizeOf(Opt));
Opt.sSchPtrns := '<Empty>'; // 이거 비어 있으면 ptnsch.dat 파일에서 체크된 항목 검사됨
Opt.sSchTitle := 'Custom';
Opt.nLimitSizeMB := StrToIntDef(dlg.edLimitMB.Text, 50);
Opt.nSchTimeoutSec := StrToIntDef(dlg.edTmSec.Text, 30);
Opt.sIgrWordPath := dlg.mmExcept.Text;
Opt.sScanExt := dlg.edTgExts.Text;
Opt.sTgDirs := dlg.mmTarget.Text;
Opt.nLangId := 1;
Opt.CttSchOpt.nUnzipDepth := MgSvc_.ModePolicy.CfZipDepth;
Opt.CttSchOpt.hRcvHwnd := Handle;
Opt.CttSchOpt.nWorkPriority := -1;
Opt.CttSchOpt.sKvMdPath := GetRunExePathDir + 'bin\';
Opt.CttSchOpt.nKvTimeoutSec := Opt.nSchTimeoutSec;
Opt.CttSchOpt.sMK := GetMK(false);
Opt.CttSchOpt.bIncFName := dlg.chIncFName.Checked;
Opt.CttSchOpt.bIncZip := dlg.chIncZip.Checked;
if Opt.CttSchOpt.bIncZip then
begin
Opt.CttSchOpt.sZipExts := Opt.sScanExt;
// Opt.sScanExt := dlg.edTgExts.Text + '|' + COMPRESS_EXTS;
end;
Opt.CttSchOpt.bIncDrm := true;
Opt.CttSchOpt.sCustomKwdPtrn := MgSvc_.MgRule.GetRuleSearchStrFromIds(dlg.UseRule);
// Opt.CttSchOpt.bExtrTxt := ;
sInfoDir := GetRunExePathDir + DIR_CTTSCHRST_CUSTOM;
DeleteDir(sInfoDir);
sSchRstPath_ := sInfoDir + DAT_CTTSCHRSTDATA_CUSTOM;
if not ForceDirectories(sInfoDir) then
TTgTrace.T('Fail .. Create sch workdir ..');
ThdCustomScanSch_ := TThdSchFileScan.Create(Opt.sTgDirs, Opt, 0, true);
// ThdCustomScanSch_.OnScanSearchBegin := OnCampaignTaskBegin;
// ThdCustomScanSch_.OnScanSearchEnd := OnCampaignTaskEnd;
ThdCustomScanSch_.StartThread;
TDlgProgCustomCttSch.Create(Self, ThdCustomScanSch_).Show;
end;
end;
procedure TDlgeCrmHeMain.miCttSchResultClick(Sender: TObject);
begin
TDlgViewCustomCttSchResult.Create(nil).Show;
end;
procedure TDlgeCrmHeMain.AddFoundCttSchRst(pResult: PSchResult);
var
StrList,
RstList,
RNameList: TStringList;
i: Integer;
begin
// if pResult.nHitCnt > 0 then
// begin
ThdCustomScanSch_.IncFoundCount(pResult.nHitCnt);
ThdCustomScanSch_.IncFoundFileCount;
Guard(StrList, TStringList.Create);
SplitString(pResult.sSchName, RESULT_SEPARATOR, StrList);
Guard(RstList, TStringList.Create);
SplitString(pResult.sResultStr, RESULT_SEPARATOR, RstList);
Guard(RNameList, TStringList.Create);
for i := 0 to StrList.Count - 1 do
begin
if (i = 0) and (StrList[i] = '*KWD*') then
begin
// MgFnd_.PushFoundKeyword(RstList[i]);
end else begin
// sTemp := MgRule_.GetRuleNameFromId(StrList[i]);
RNameList.Add(MgSvc_.MgRule.GetRuleNameFromId(StrList[i]));
// MgFnd_.PushFoundPattern(sTemp, GetCountOverlapWordsCount(RstList[i]));
// SumString(pResult.sSchName, ExtractFileName(StrList[i]), ';');
end;
end;
TTgTrace.T('[MGKIM] AddFoundCttSchRst .. sSchRstPath(%s)', [sSchRstPath_], 10);
if sSchRstPath_ <> '' then
with pResult^ do
WriteLnFileEndUTF8(sSchRstPath_,
Format('%s<!>%d<!>%s<!>%s<!>%s<!>%s<!>%s',
[RNameList.CommaText, nHitCnt, sPath, RstList.CommaText, sFName,
pResult.sSchName, pResult.sResultStr]));
// end;
end;
procedure TDlgeCrmHeMain.miDebugModeClick(Sender: TObject);
begin
try
// if bIsDebugMode_ then
if gTrForm <> nil then
begin
if MessageBox(Handle, PChar('디버그 모드를 종료하시겠습니까?'),
PChar(APP_TITLE), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
TTgTrace.T('DebugMode .. OFF');
gTrForm.Close;
// if TTgTrace.SetAllocConsole(false) then
begin
if gTrace <> nil then
begin
if MgSvc_ <> nil then
gTrace.Level := MgSvc_.PrefModel.LogLv
else
gTrace.Level := 99;
end;
// bIsDebugMode_ := false;
end;
end else begin
var dlg: TDlgDebugPW;
Guard(dlg, TDlgDebugPW.Create(Self));
{$IFNDEF DEBUG}
if IsDev or (dlg.ShowModal = mrOk) then
{$ENDIF}
begin
// if TTgTrace.SetAllocConsole(true) then
TDlgBs1Log.Create.Show;
begin
if gTrace <> nil then
gTrace.Level := 99;
// bIsDebugMode_ := true;
TTgTrace.T('DebugMode .. ON');
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. DebugModeClick()');
end;
end;
procedure TDlgeCrmHeMain.miDecryptDrmClick(Sender: TObject);
var
dlg: TDlgDecryptDrm;
sExe, sParam: String;
O: ISuperObject;
PO: TPrefModel;
begin
// if CUSTOMER_TYPE = CUSTOMER_BLUECORNER then
begin
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
PO := MgSvc_.ModePolicy;
O := SO;
O.I['Cmd'] := HPCMD_OPEN_DECRYPT;
O.S['WinCap'] := APP_TITLE;
O.I['RcvWnd'] := Handle;
O.I['CT'] := CUSTOMER_TYPE;
O.S['UName'] := MgSvc_.UName;
O.S['Dept'] := MgSvc_.DeptName;
if O.S['Dept'] = '' then
O.S['Dept'] := PO.DeptName;
O.S['EN'] := MgSvc_.EmpNo;
O.S['PON'] := PO.PolicyName;
O.B['AVAL'] := IsApproveSupport and gMgSvc.ModePolicy.DrmApproval;
sParam := GetRunExePathDir + DIR_CONF + DAT_PARAM;
SaveJsonObjToFile(O, sParam);
{$IFDEF DEBUG}
ExecutePath(sExe, Format('/p "%s"', [sParam]));
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
// DeleteFile(sParam);
end;
end;
// else begin
// dlg := TDlgDecryptDrm.Create(Self);
// dlg.Show;
// end;
end;
procedure TDlgeCrmHeMain.DoAgentUninstall;
var
sDstDir,
sCurPath: String;
O: ISuperObject;
begin
TTgTrace.T('DoAgentUninstall()');
sCurPath := GetRunExePath;
sDstDir := ExtractFilePath(ExcludeTrailingPathDelimiter(ExtractFilePath(sCurPath))) + ExtractFileName(sCurPath);
if CopyFile(PChar(sCurPath), PChar(sDstDir), false) then
begin
Sleep(1000);
O := SO;
O.I['M'] := MODE_DELETE;
O.S['ID'] := ExtractFilePath(sCurPath);
O.B['SD'] := true;
sCurPath := GetRunExePathDir + 'reqprm.json';
if SaveJsonObjToFile(O, sCurPath) then
ExecutePath_hide(sDstDir, Format('-i "%s"', [sCurPath]))
else
DeleteFile(sDstDir);
end;
end;
procedure TDlgeCrmHeMain.miDelAgentClick(Sender: TObject);
begin
// if MgSvc_.VulService.IsVpnOn then
// begin
// MessageBox(Handle, PChar(RS_NoDeleteSecuMode1+#13+#10+RS_NoDeleteSecuMode2), PChar(APP_TITLE), MB_ICONSTOP or MB_OK);
// exit;
// end;
if ( MgSvc_.IsNewApi and
(MgSvc_.PrefModel.UninstKind = uikPassword) and
(MgSvc_.PrefModel.UninstallPW <> '') ) or
( not MgSvc_.IsNewApi and (MgSvc_.PrefModel.UninstallPW <> '')) then
begin
if FindWindow('TDlgUninstallPW', nil) <> 0 then
exit;
var dlg: TDlgUninstallPW;
Guard(dlg, TDlgUninstallPW.Create(Self));
if dlg.ShowModal <> mrOk then
exit;
end else
if MgSvc_.PrefModel.UninstKind = uikOTP then
begin
var dlg: TDlgOtpAuth;
Guard(dlg, TDlgOtpAuth.Create(Self));
if dlg.ShowModal <> mrOk then
exit;
end else
if MgSvc_.PrefModel.UninstKind = uikCode then
begin
var dlg: TDlgDeleteCode;
Guard(dlg, TDlgDeleteCode.Create(Self));
if dlg.ShowModal <> mrOk then
exit;
end;
if MessageBox(Handle, PChar(Format(RS_Q_DeleteHE1, [APP_TITLE])+#13+#10+
RS_Q_DeleteHE2+#13+#10+RS_Q_DeleteHE3+#13+#10+
RS_Q_DeleteHE4), PChar(APP_TITLE), MB_ICONWARNING or MB_YESNO) = IDNO then exit;
if MgSvc_ <> nil then
MgSvc_.DirectSendEventLog(URI_USER_ACTION, SYSEVT_REQ_AGENT_UNINSTALL, '[User] Uninstall Agent');
DoAgentUninstall;
end;
procedure TDlgeCrmHeMain.EncFile(sPath: String);
var
sExt,
sFName: String;
sDestUrl,
sBoundary,
sEncPath: String;
Params: TIdMultiPartFormDataStream;
fsEnc: TFileStream;
begin
if GetFileSize_path(sPath) > 52428800{50MB} then
begin
MessageBox(Handle, PChar(RS_MsgIsBigFile50MbLow),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
sFName := ExtractFileName(sPath);
sExt := GetFileExt(sFName);
if sExt = '' then
sExt := 'unknown';
fsEnc := nil;
sDestUrl := StringReplace(MgSvc_.DestServerUrl, 'agentLogRequest.do', 'drmEncUpload.do', [rfReplaceAll]);
sDestUrl := StringReplace(sDestUrl, 'agentLogRequests.do', 'drmEncUpload.do', [rfReplaceAll]);
InitHttp;
sBoundary := Format('%X', [GetLocalIncUtcMin * 6000]);
HTTP_.Request.ContentType := Format('multipart/form-data; boundary=%s; charset=utf-8', [sBoundary]);
Guard(Params, TIdMultiPartFormDataStream.Create);
with Params.AddFile(sFName, sPath, Format('application/%s', [sExt])) do
begin
ContentTransfer := '';
HeaderEncoding := '8'; //8bit
HeaderCharSet := 'utf-8';
Charset := 'utf-8';
end;
sEncPath := CutFileExt(sPath) + '_enc.' + GetFileExt(sFName);
fsEnc := TFileStream.Create(sEncPath, fmCreate);
try
HTTP_.Post(sDestUrl, Params, fsEnc);
FreeAndNil(fsEnc);
if HTTP_.ResponseCode = 200 then
begin
MessageBox(Handle, PChar(Format(RS_MsgEncFile+#13+#10+'(Path="%s")', [sEncPath])),
PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
finally
if fsEnc <> nil then
FreeAndNil(fsEnc);
end;
end;
procedure TDlgeCrmHeMain.DecFile(sPath: String);
var
sExt,
sFName: String;
sDestUrl,
sBoundary,
sDecPath: String;
Params: TIdMultiPartFormDataStream;
fsDec: TFileStream;
begin
if GetFileSize_path(sPath) > 52428800{50MB} then
begin
MessageBox(Handle, PChar(RS_MsgIsBigFile50MbLow),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
sFName := ExtractFileName(sPath);
sExt := GetFileExt(sFName);
if sExt = '' then
sExt := 'unknown';
fsDec := nil;
sDestUrl := StringReplace(MgSvc_.DestServerUrl, 'agentLogRequest.do', 'drmUpload.do', [rfReplaceAll]);
sDestUrl := StringReplace(sDestUrl, 'agentLogRequests.do', 'drmUpload.do', [rfReplaceAll]);
InitHttp;
sBoundary := Format('%X', [GetLocalIncUtcMin * 6000]);
HTTP_.Request.ContentType := Format('multipart/form-data; boundary=%s; charset=utf-8', [sBoundary]);
Guard(Params, TIdMultiPartFormDataStream.Create);
with Params.AddFile(sFName, sPath, Format('application/%s', [sExt])) do
begin
ContentTransfer := '';
HeaderEncoding := '8'; //8bit
HeaderCharSet := 'utf-8';
Charset := 'utf-8';
end;
sDecPath := CutFileExt(sPath) + '_dec.' + GetFileExt(sFName);
fsDec := TFileStream.Create(sDecPath, fmCreate);
try
HTTP_.Post(sDestUrl, Params, fsDec);
FreeAndNil(fsDec);
if HTTP_.ResponseCode = 200 then
begin
MessageBox(Handle, PChar(Format(RS_MsgDecFile+#13+#10+'(Path="%s")', [sDecPath])),
PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
finally
if fsDec <> nil then
FreeAndNil(fsDec);
end;
end;
procedure TDlgeCrmHeMain.ApprovalFileExport(aList: TStrings);
var
LogInfo: TLogInfo;
ReqDevExceptInfo: TReqDevExceptInfo;
dtCreate, dtModify, dtAccess: TDateTime;
O, OA, ORst: ISuperObject;
sPath, sDestAddr, sUrl, sTemp: String;
i, nExpCnt, nMinMB, nLimitMB: Integer;
bResult, bSendBin, bFileUp: Boolean;
llTotalSize: LONGLONG;
begin
try
if aList.Count = 0 then
begin
MessageBox(Handle, PChar(RS_NotFoundFile), PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
if aList.Count > 5 then
begin
MessageBox(Handle, PChar(Format(RS_FileExpoLimit, [5])), PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
llTotalSize := 0;
OA := TSuperObject.Create(stArray);
for i := 0 to aList.Count - 1 do
begin
sPath := aList[i];
if not FileExists(sPath) then
continue;
if MgSvc_.HasFileExp(sPath) then
begin
MessageBox(Handle, PChar(RS_AlreadyApprovFile), PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
if not GetFileDateTime_Local(sPath, dtCreate, dtModify, dtAccess) then
begin
dtCreate := 0;
dtModify := 0;
dtAccess := 0;
end;
O := SO;
O.S['filePath'] := sPath;
O.S['createDt'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', dtCreate);
O.S['modifyDt'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', dtModify);
O.S['hash'] := GetFileToSha1Str_BS1(sPath);
OA.AsArray.Add(O);
Inc(llTotalSize, GetFileSize_path(sPath));
end;
nMinMB := MgSvc_.ModePolicy.FileExpMinMB;
nLimitMB := MgSvc_.ModePolicy.FileExpMaxMB;
bFileUp := (llTotalSize >= (LONGLONG(nMinMB) * 1048576)) and (llTotalSize <= (LONGLONG(nLimitMB) * 1048576));
if not bFileUp then
begin
if MessageBox(Handle, PChar(Format(RS_FileExpReqLimitMsg1 + #13#10 +
RS_FileExpReqLimitMsg2 + #13#10#13#10 + RS_FileExpReqLimitMsg3,
[nMinMB, nLimitMB])), PChar(APP_TITLE), MB_YESNO + MB_ICONQUESTION) = IDNO then exit;
end;
nExpCnt := OA.AsArray.Length;
if nExpCnt > 0 then
begin
// 기존에 만들어진 형식에 맞춰서 값을 넣어줌 25_1117 13:34:46 kku
ZeroMemory(@ReqDevExceptInfo, SizeOf(ReqDevExceptInfo));
ReqDevExceptInfo.sSerial := OA.AsJSon;
ReqDevExceptInfo.sDevName := Format('File Export Request(%d)', [nExpCnt]);
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := REQUEST_APPROVAL;
LogInfo.sDevName := ReqDevExceptInfo.sDevName;
LogInfo.sDevSerial := ReqDevExceptInfo.sSerial;
if nExpCnt = 1 then
LogInfo.sPath := OA.AsArray.O[0].S['filePath'];
LogInfo.sSummary := Format('Approval Request : File Export(%d)', [nExpCnt]);
sDestAddr := MgSvc_.DestIPort;
sUrl := MgSvc_.SendApproval(9, @ReqDevExceptInfo, BooleanToInt(bFileUp, nExpCnt, 0));
// sUrl := MgSvc_.SendApproval(4, @ReqDevExceptInfo, OA.AsArray.Length);
if sUrl = '' then
begin
TTgTrace.T('Fail .. SendApproval(9)');
MessageBox(Handle, PChar(RS_NoApprovalInfo), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
end else begin
ORst := nil;
if (sUrl <> '') and (sUrl[1] = '{') then
begin
// 구 버전 서버 대비 25_1118 10:57:33 kku
ORst := SO(sUrl);
sUrl := ORst.S['url'];
end;
MgSvc_.SendEventLogEx(@LogInfo, false);
sTemp := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sTemp) then
begin
O := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_EXECUTE_FILE;
O.S['Path'] := sDestAddr + sUrl;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sTemp);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sTemp, '', SW_SHOWNORMAL);
{$ENDIF}
end else
ExecutePath(sDestAddr + sUrl);
if bFileUp and (ORst <> nil) then
begin
for i := 0 to nExpCnt - 1 do
begin
sTemp := OA.AsArray.O[i].S['filePath'];
bSendBin := false;
sUrl := ORst.S['binFileUploadUrl' + IntToStr(i + 1)];
if sUrl = '' then
begin
sUrl := ORst.S['fileUploadUrl' + IntToStr(i + 1)];
if sUrl = '' then
break;
end else begin
sUrl := sUrl + '&fileName=' + UrlEncodeUTF8(ExtractFileName(sTemp));
bSendBin := true;
end;
if sUrl[1] = '/' then
Delete(sUrl, 1, 1);
MgSvc_.SendFileNor(bSendBin, 'file', sUrl, sTemp, nMinMB, nLimitMB);
TTgTrace.T('[사전] 반출 요청 파일 업로드 .. URL=%s', [sUrl], 2);
// TTgTrace.T('반출 요청 파일 업로드 .. %s, %d : %s', [BooleanToStr(bResult, 'OK', 'Fail'), i + 1, sTemp], 2);
TTgTrace.T('[사전] 반출 요청 파일 업로드 .. %d : %s', [i + 1, sTemp], 2);
end;
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. ApprovalFileExport()');
end;
end;
procedure TDlgeCrmHeMain.ApprovalFileDecrypt(OA: ISuperObject);
var
LogInfo: TLogInfo;
ReqDevExceptInfo: TReqDevExceptInfo;
dtCreate, dtModify, dtAccess: TDateTime;
O, ORst: ISuperObject;
sPath, sDestAddr, sUrl, sTemp: String;
i, nExpCnt, nMinMB, nLimitMB: Integer;
bResult, bSendBin, bFileUp: Boolean;
llTotalSize: LONGLONG;
begin
try
if OA.AsArray.Length = 0 then
begin
MessageBox(Handle, PChar(RS_NotFoundFile), PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
if OA.AsArray.Length > 10 then
begin
MessageBox(Handle, PChar(Format(RS_FileExpoLimit, [5])), PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
llTotalSize := 0;
for i := OA.AsArray.Length - 1 downto 0 do
begin
O := OA.AsArray.O[i];
sPath := O.S['filePath'];
if not FileExists(sPath) then
begin
OA.AsArray.Delete(i);
continue;
end;
Inc(llTotalSize, GetFileSize_path(sPath));
end;
nMinMB := MgSvc_.ModePolicy.FileExpMinMB;
nLimitMB := MgSvc_.ModePolicy.FileExpMaxMB;
bFileUp := (llTotalSize >= (LONGLONG(nMinMB) * 1048576)) and (llTotalSize <= (LONGLONG(nLimitMB) * 1048576));
if not bFileUp then
begin
if MessageBox(Handle, PChar(Format(RS_FileExpReqLimitMsg1 + #13#10 +
RS_FileExpReqLimitMsg2 + #13#10#13#10 + RS_FileExpReqLimitMsg3,
[nMinMB, nLimitMB])), PChar(APP_TITLE), MB_YESNO + MB_ICONQUESTION) = IDNO then exit;
end;
nExpCnt := OA.AsArray.Length;
if nExpCnt > 0 then
begin
// 기존에 만들어진 형식에 맞춰서 값을 넣어줌 25_1117 13:34:46 kku
ZeroMemory(@ReqDevExceptInfo, SizeOf(ReqDevExceptInfo));
ReqDevExceptInfo.sSerial := OA.AsJSon;
ReqDevExceptInfo.sDevName := Format('File Decrypt Request(%d)', [nExpCnt]);
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := REQUEST_APPROVAL;
LogInfo.sDevName := ReqDevExceptInfo.sDevName;
LogInfo.sDevSerial := ReqDevExceptInfo.sSerial;
if nExpCnt = 1 then
LogInfo.sPath := OA.AsArray.O[0].S['filePath'];
LogInfo.sSummary := Format('Approval Request : File Decrypt(%d)', [nExpCnt]);
sDestAddr := MgSvc_.DestIPort;
sUrl := MgSvc_.SendApproval(3, OA, BooleanToInt(bFileUp, nExpCnt, 0));
if sUrl = '' then
begin
TTgTrace.T('Fail .. SendApproval(3)');
MessageBox(Handle, PChar(RS_NoApprovalInfo), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
end else begin
ORst := nil;
if (sUrl <> '') and (sUrl[1] = '{') then
begin
// 구 버전 서버 대비 25_1118 10:57:33 kku
ORst := SO(sUrl);
sUrl := ORst.S['url'];
end;
MgSvc_.SendEventLogEx(@LogInfo, false);
sTemp := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sTemp) then
begin
O := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_EXECUTE_FILE;
O.S['Path'] := sDestAddr + sUrl;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sTemp);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sTemp, '', SW_SHOWNORMAL);
{$ENDIF}
end else
ExecutePath(sDestAddr + sUrl);
if bFileUp and (ORst <> nil) then
begin
for i := 0 to nExpCnt - 1 do
begin
sTemp := OA.AsArray.O[i].S['filePath'];
bSendBin := false;
sUrl := ORst.S['binFileUploadUrl' + IntToStr(i + 1)];
if sUrl = '' then
begin
sUrl := ORst.S['fileUploadUrl' + IntToStr(i + 1)];
if sUrl = '' then
break;
end else begin
sUrl := sUrl + '&fileName=' + UrlEncodeUTF8(ExtractFileName(sTemp));
bSendBin := true;
end;
if sUrl[1] = '/' then
Delete(sUrl, 1, 1);
MgSvc_.SendFileNor(bSendBin, 'file', sUrl, sTemp, nMinMB, nLimitMB);
TTgTrace.T('복호화 요청 파일 업로드 .. URL=%s', [sUrl], 2);
TTgTrace.T('복호화 요청 파일 업로드 .. %d : %s', [i + 1, sTemp], 2);
end;
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. ApprovalFileExport()');
end;
end;
function GetCbData(aO: ISuperObject; var sBody: String; var sOcrBody: String; var sImgPath: String): Boolean;
var
CB: TClipboard;
hCb: THandle;
bmp: Vcl.Graphics.TBitmap;
png: TPngImage;
sTemp: String;
nLen: Integer;
arrFName: array [0..MAX_PATH-1] of WideChar;
i: Integer;
bFail,
// bIsExcel,
bExtrImg: Boolean;
nTry: Integer;
Label
LB_TryReadCB;
begin
Result := false;
Guard(CB, TClipboard.Create);
nTry := 0;
// bIsExcel := aO.B['IsExcel2'];
LB_TryReadCB :
bFail := false;
try
bExtrImg := not aO.B['IgrImgCB'];
if CB.HasFormat(CF_UNICODETEXT) then
begin
// if CB.GetSize < 10000 then
// begin
sTemp := Trim(CB.AsText);
// if bIsExcel then
// begin
// nLen := Length(sTemp);
// if nLen > 10000 then
// begin
// bExtrImg := false;
// SetLength(sTemp, 5000);
// sTemp := sTemp + Format(' ... (OrgSize=%d)', [InsertPointComma(nLen, 3)]);
// end;
// end;
if sTemp <> '' then
sBody := sTemp;
// end else
// bExtrImg := false;
end else
if CB.HasFormat(CF_TEXT) then
begin
// if CB.GetSize < 10000 then
// begin
sTemp := Trim(CB.AsText);
// if bIsExcel then
// begin
// nLen := Length(sTemp);
// if nLen > 10000 then
// begin
// bExtrImg := false;
// SetLength(sTemp, 5000);
// sTemp := sTemp + Format(' ... (OrgSize=%d)', [InsertPointComma(nLen, 3)]);
// end;
// end;
if sTemp <> '' then
sBody := sTemp;
// end else
// bExtrImg := false;
end else
if CB.HasFormat(CF_HDROP) then
begin
sTemp := '';
hCb := CB.GetAsHandle(CF_HDROP);
if hCb <> 0 then
begin
GlobalLock(hCb);
try
nLen := DragQueryFile(hCb, DWORD(-1), nil, MAX_PATH);
for i := 0 to nLen - 1 do
begin
if DragQueryFile(hCb, i, arrFName, MAX_PATH) <> 0 then
SumString(sTemp, arrFName, '|');
end;
finally
GlobalUnlock(hCb);
end;
end;
if sTemp <> '' then
sBody := sTemp;
end;
if bExtrImg and CB.HasFormat(CF_BITMAP) then
begin
hCb := CB.GetAsHandle(CF_BITMAP);
if hCb <> 0 then
begin
GlobalLock(hCb);
try
try
Guard(bmp, Vcl.Graphics.TBitmap.Create);
bmp.LoadFromClipboardFormat(CF_BITMAP, hCb, CB.GetAsHandle(CF_PALETTE));
Guard(png, TPngImage.Create);
png.Assign(bmp);
sTemp := 'C:\ProgramData\HE\Task\';
if ForceDirectories(sTemp) then
begin
sTemp := sTemp + FormatDateTime('yyyymmddhhnnss', Now) + '.png';
png.SaveToFile(sTemp);
if FileExists(sTemp) then
begin
sImgPath := sTemp;
if aO.B['DoClipOcr'] then
sOcrBody := ExtrTextFromImage(sImgPath);
end;
end else begin
TTgTrace.T('Fail .. GetCbData() .. creatDir');
exit;
end;
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. GetCbData() .. make image', 2);
end;
finally
GlobalUnlock(hCb);
end;
end;
end;
Result := true;
except
on E: EClipboardException do
bFail := true;
on E: Exception do
ETgException.TraceException(E, 'Fail .. GetCbData()');
end;
if bFail then
begin
if nTry < 5 then
begin
Inc(nTry);
Sleep(500);
goto LB_TryReadCB;
end;
end;
end;
procedure TDlgeCrmHeMain.OnClipboardNotify(Sender: TDrawClipboard);
var
bIsExcel: Boolean;
LogInfo: TLogInfo;
PO: TPrefModel;
hActive: HWND;
procedure ReqCbData;
var
bBlock: Boolean;
begin
var sExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
var O: ISuperObject := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_REQ_CLIPBOARD_DATA;
// O.B['IsExcel'] := bIsExcel;
// O.B['IsExcel2'] := CompareText(sLastCbAppName_, 'excel.exe') = 0;
O.B['IgrImgCB'] := (CUSTOMER_TYPE = CUSTOMER_TMAP) and bIsExcel; // CB 원문 수집 시 이미지 제외 24_0520 11:18:31 kku
O.B['DoClipOcr'] := MgSvc_.ModePolicy.DoClipOcr;
O.S['WndCap'] := LogInfo.sDevName;
O.S['AName'] := LogInfo.sAppName;
O.S['APath'] := LogInfo.sAppPath;
O.I['AWnd'] := hActive;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
end;
end;
var
dtNow: TDateTime;
nTryCnt: Integer;
sMsg, sCttResults,
sPName, sPPath: String;
bBlock,
bCollectAble: Boolean;
begin
if bIsClearCB_ then
exit;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
bIsExcel := false;
sCttResults := '';
bCollectAble := false;
// 클립보드 감시는 스레드로 옮기면 안된다 22_0818 13:22:42 kku
if (MgSvc_ = nil) or (MgSvc_.PrefModel = nil) then
exit;
PO := MgSvc_.ModePolicy;
if PO.ClipBlockKind = cbkNone then
exit;
// 모드 변경 후 1초동안은 무시한다 23_0112 08:12:05 kku
dtNow := Now;
if MilliSecondsBetween(MgSvc_.ChangeModeDT, dtNow) <= 1500 then
exit;
// vdi, 원격 환경에서 Ctrl + C 입력을 연속 두번하면 원격환경 클립보드에 들어가는데
// 이 경우는 차단 할 수 없어서 아래처럼 두번연속 못누르게 보완함 23_0518 14:39:41 kku
if (KeyMonDll_ <> nil) and (CUSTOMER_TYPE = CUSTOMER_TMAP) and (dwBlockInputCTick_ = 0) then
begin
// KeyMonDll_.SetDisableKey_Ctrl(true); // 추가 24_0712 14:47:52 kku
KeyMonDll_.SetDisableKey_Etc(0, 67); // c 키 연속으로 못누르게 막음 23_0518 14:21:05 kku
dwBlockInputCTick_ := GetTickCount;
end;
// 이렇게 비었지는 판단하면 엑셀에서 크러쉬 나서 뒤짐 22_0714 09:17:31 kku
// 그리고 대량으로 클립보드에 복사 시 문제될 여지가 큼
// if Sender.AsText > 0 then
begin
// sPPath := GetProcessPathFromWndHandle(GetForegroundWindow); // 이거 때문에 느려지는 PC가 있다... TYM 24_0521 15:42:30 kku
// sPName := ExtractFileName(sPPath);
// sPPath := ExtractFilePath(sPPath);
hActive := GetForegroundWindow;
sPName := GetProcessNameFromWndHandle(hActive);
if sPName = '' then
sPName := 'Windows System'; // 빈값 채우기... 추가 24_0704 10:25:05 kku
sPPath := '';
// if sPName = EXE_HE then // 에이전트 예외 제거 23_1228 13:34:12 kku
// exit;
bIsExcel := CompareText(sPName, 'excel.exe') = 0;
LogInfo.sDevName := GetWindowCaption(hActive);
LogInfo.sAppName := sPName;
LogInfo.sAppPath := sPPath;
if sCbAbleApps_ <> PO.ClipboardExceptApp then
begin
sCbAbleApps_ := PO.ClipboardExceptApp;
SplitString(sCbAbleApps_, ';', CbAbleAppList_);
end;
if sCbCollectApps_ <> PO.CBCollectApp then
begin
sCbCollectApps_ := PO.CBCollectApp;
SplitString(sCbCollectApps_, ';', CbCollectAppList_);
end;
if PO.IsClipboardExcept and (CbAbleAppList_.Count > 0) then
begin
if (sPName <> '') and (CbAbleAppList_.IndexOf(sPName) <> -1) then
begin
// 엑셀에서 먹통되는 현상이 생겨서 아래처럼 처리 22_1017 14:47:16 kku
bIgrNextCbNoti_ := true;
MgSvc_.DoClipboardUpdate;
// Sender.Reset;
exit;
end;
end;
// 허용 이후에 미허용 앱에 포커스가 가면 무조건 차단 팝업이 뜨는 문제가 있어서 보완 22_1017 15:09:22 kku
bIgrNextCbNotiExcel_ := bIgrNextCbNotiExcel_ and bIsExcel;
if bIgrNextCbNoti_ or bIgrNextCbNotiExcel_ then
begin
bIgrNextCbNoti_ := false;
bIgrNextCbNotiExcel_ := false;
dtRecentCbPopup_ := dtNow;
exit;
end;
bCollectAble := PO.CbCF.bActive or
( PO.IsCBCollect and
((CbCollectAppList_.IndexOf(sPName) <> -1) or bForceCollectCB_) );
if bCollectAble then
begin
if bIsExcel and bCtrlA_ then // 엑셀에서 대량의 셀 복사시 프리징 현상 보완을 위함 23_1107 08:16:30 kku
begin
// 전체 해제 풀어주기
// var pt: TPoint;
// // 마우스 포인터 위치 가져오기
// GetCursorPos(pt);
// // 활성화된 창의 클라이언트 좌표로 변환
// WinAPi.Windows.ScreenToClient(hActive, pt);
// // 마우스 왼쪽 버튼 누름 이벤트 전달
// PostMessage(hActive, WM_LBUTTONDOWN, MK_LBUTTON, (pt.y shl 16) or pt.x);
// // 마우스 왼쪽 버튼 뗌 이벤트 전달
// PostMessage(hActive, WM_LBUTTONUP, 0, (pt.y shl 16) or pt.x);
// bCtrlA_ := false;
LogInfo.sBody := 'Ctrl + A 후 클립보드 복사 감지됨';
// 이유는 모르겠지만 엑셀에서 키 입력할때 클립보드 감지가 한번더 발생한다...
bIgrNextCbNotiExcel_ := true;
end else begin
// KeyMonDll_.SetDisableKey_Ctrl(true); // 추가 24_0712 14:47:52 kku
if (CUSTOMER_TYPE = CUSTOMER_WINSTN) then
// (CompareText('Photos.exe', sPName) = 0) then
begin
KeyMonDll_.SetDisableKey_Etc(0, 86); // 바로 붙혀넣기 안되게 막음 23_0912 16:07:52 kku
dwBlockInputCTick_ := GetTickCount;
end;
// KeyMonDll_.SetDisableKey_Etc(0, 67); // 바로 복사 안되게 막음 24_0712 14:42:33 kku
// dwBlockInputCTick_ := GetTickCount;
ReqCbData;
exit;
end;
end;
// 스크린캡처키 눌린뒤 2번째 이벤트 무시하기 위해 처리 23_1228 13:49:14 kku
if (dtRecentPrtScrKey_ > 0) and
(MilliSecondsBetween(dtRecentPrtScrKey_, dtNow) < 1000) then exit;
bBlock := PO.ClipBlockKind = cbkBlock;
if bScrCapKey_ and PO.IsIgrScrCapKeyCB then
begin
bBlock := false;
if not bForceCollectCB_ then
begin
bScrCapKey_ := false;
dtRecentPrtScrKey_ := Now;
end;
end;
if bBlock then
begin
// if bIsExcel then
// begin
// // 엑셀이면 셀 선택 해제 24_0716 16:12:46 kku
// keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
//// PressKey(VK_ESCAPE);
// PostMessage(hActive, WM_KEYDOWN, VK_ESCAPE, 0);
// PostMessage(hActive, WM_KEYUP, VK_ESCAPE, 0);
// end;
// 클립보드가 열리지 않는 경우가 있다.
// 4초간 시도 해보는걸로 보완 22_0715 09:03:33 kku
nTryCnt := 0;
bIsClearCB_ := true;
try
while not ClearClipboard(MgSvc_.ModePolicy.CbImgBlock) do
begin
Inc(nTryCnt);
if nTryCnt > 20 then
begin
// TTgTrace.T('Fail .. ClearClipboard()');
exit;
end;
Sleep(200);
end;
finally
bIsClearCB_ := false;
end;
end;
// 최대 1초에 한번만 뜨게 함 22_0714 09:12:57 kku
// 클립보드 사용 이벤트 후 클리어 하면 두번 연속으로 떠서 이렇게 보완함
if (MilliSecondsBetween(dtRecentCbPopup_, dtNow) > 1000) then
begin
// 차단 시 두번째 오는거 걸러준다 23_0828 17:38:24 kku
// if MgSvc_.IsNewApi and bCollectAble then
// begin
// if (LogInfo.sBody = '') and (LogInfo.sOcrBody = '') then
// exit;
// end;
// if MgSvc_.IsNewApi and PO.CbCF.bActive and (sCttResults = '') then
// exit;
dtRecentCbPopup_ := dtNow;
// if CUSTOMER_TYPE = CUSTOMER_DEMO then // SK 하이닉스에서 크롬만 두번 뜨는문제 뭉게기 23_0511 16:07:22 kku
// begin
// if CompareText(sPName, 'chrome.exe') = 0 then
// begin
// if bPopChromeSK_ then
// begin
// bPopChromeSK_ := false;
// exit;
// end else
// bPopChromeSK_ := true;
// end;
// end;
if tUpdateLogo.Enabled then
begin
// 상시로고 업데이트 대기 상태면 바로 업데이트 되도록 조치 24_0411 14:46:28 kku
tUpdateLogo.Enabled := false;
UpdateScreenLogo;
end;
if bBlock then
begin
if Po.CbPopup then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_CLIPBOARD, sPName + '|' + sCttResults);
if sPName <> '' then
sMsg := Format('Clipboard Blocked : %s', [sPName])
else
sMsg := 'Clipboard Blocked';
LogInfo.sCode := LOGCODE_PREVENT_CLIPBOARD;
end else begin
if Po.CbPopup and (PO.ClipBlockKind <> cbkBlock) then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_CLIPBOARD, sPName + '|M' + '|' + sCttResults);
if sPName <> '' then
sMsg := Format('Clipboard : %s', [sPName])
else
sMsg := 'Clipboard';
LogInfo.sCode := MONITOR_CLIPBOARD;
end;
if MgSvc_.IsNewApi then
begin
LogInfo.sSummary := sMsg;
MgSvc_.SendEventLogEx(@LogInfo, false);
end else
MgSvc_.SendEventLog(URI_USER_ACTION, LogInfo.sCode, sMsg);
end;
// Remotecall 에서 원격 "시작하기" 누르면 클립보드 체인이 꼬인다..
// 그래서 계속 Draw 메시지가 발동하고 결국 먹통이 되는 현상이 있는데...
// 아래 처리 추가해서 해결했다.. 찝찝하긴 하지만 일단 잘되니까 놔둠... 22_0718 15:56:23 kku
if (Sender <> nil) and not (bIsExcel and bCtrlA_) then
Sender.Reset;
// MgSvc_.DoClipboardUpdate;
end;
end;
procedure TDlgeCrmHeMain.miEncDrmFileClick(Sender: TObject);
var
sExe: String;
O: ISuperObject;
ProcInfo: TProcessInformation;
Label
LB_Direct;
begin
if not MgSvc_.VulService.IsVpnOn then
begin
MessageBox(Handle, PChar(RS_MsgEncInSecuMode),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
if not MgSvc_.Connected then
begin
MessageBox(Handle, PChar(RS_NoConnectServer+#13+#10+RS_WaitRetry),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
try
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
O := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_SELECT_FILE;
O.I['Ctrl'] := 1;
O.S['Filter'] := 'All files|*.*';
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
ProcInfo := ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
if ProcInfo.dwProcessId = 0 then
goto LB_Direct;
end else begin
LB_Direct :
OpenDialogDRM.FileName := '';
if MgSvc_.Domain <> '' then
begin
var sPath: String := 'C:\Users\' + ExtractFileName(MgSvc_.Domain) + '\Desktop';
if DirectoryExists(sPath) then
OpenDialogDRM.InitialDir := sPath;
end;
OpenDialogDRM.Filter := 'All files|*.*';
if OpenDialogDRM.Execute(Handle) then
begin
EncFile(OpenDialogDRM.FileName);
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. miEncDrmFileClick()');
end;
end;
procedure TDlgeCrmHeMain.miOfflineExpClick(Sender: TObject);
var
dlg: TDlgOfflineAuth;
begin
if FindWindow('TDlgOfflineAuth', nil) <> 0 then
exit;
dlg := TDlgOfflineAuth.Create(nil);
dlg.Show;
end;
procedure TDlgeCrmHeMain.miOpenDrmFileClick(Sender: TObject);
var
sExe: String;
O: ISuperObject;
ProcInfo: TProcessInformation;
Label
LB_Direct;
begin
if not MgSvc_.VulService.IsVpnOn then
begin
MessageBox(Handle, PChar(RS_MsgEncInSecuMode),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
if not MgSvc_.Connected then
begin
MessageBox(Handle, PChar(RS_NoConnectServer+#13+#10+RS_WaitRetry),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
try
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
O := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_SELECT_FILE;
O.I['Ctrl'] := 2;
O.S['Filter'] := 'All files|*.*';
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
ProcInfo := ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
if ProcInfo.dwProcessId = 0 then
goto LB_Direct;
end else begin
LB_Direct :
OpenDialogDRM.FileName := '';
if MgSvc_.Domain <> '' then
begin
var sPath: String := 'C:\Users\' + ExtractFileName(MgSvc_.Domain) + '\Desktop';
if DirectoryExists(sPath) then
OpenDialogDRM.InitialDir := sPath;
end;
OpenDialogDRM.Filter := 'All files|*.*';
if OpenDialogDRM.Execute(Handle) then
begin
DecFile(OpenDialogDRM.FileName);
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. miEncDrmFileClick()');
end;
end;
procedure TDlgeCrmHeMain.imgAvInfoClick(Sender: TObject);
var
StrList: TStringList;
i: Integer;
dlg: TDlgLiteInfo;
pt: TPoint;
begin
Guard(StrList, TStringList.Create);
if MgSvc_.VulService.AvList <> nil then
begin
with MgSvc_.VulService do
begin
for i := 0 to AvList.Count - 1 do
StrList.Add(Format('%s ( %s :: %s )'#13#10, [AvList[i].Name, AvList[i].Status, AvList[i].AppType]));
end;
if StrList.Text = '' then
StrList.Text := '(none)';
end else
StrList.Text := RS_LodingInfo;
dlg := TDlgLiteInfo.Create(Self);
dlg.SetInfo(RS_AvInfo, StrList);
pt.X := imgAvInfo.Left;
pt.Y := imgAvInfo.Top;
pt := pnMain.ClientToScreen(pt);
dlg.Left := pt.X - dlg.Width;
dlg.Top := pt.Y - dlg.Height;
dlg.Show;
end;
procedure TDlgeCrmHeMain.imgChangeEmpNoClick(Sender: TObject);
var
dlg: TDlgInputEmpNo;
begin
if FindWindow('TDlgInputEmpNo', nil) <> 0 then
exit;
InitHttp;
dlg := TDlgInputEmpNo.Create(Self, HTTP_);
dlg.Show;
end;
procedure TDlgeCrmHeMain.imgCloseClick(Sender: TObject);
begin
{$IFDEF DEBUG}
if DebugHook <> 0 then
begin
Close;
Application.MainForm.Close;
end else
{$ENDIF}
VisibleMainform(false);
end;
procedure TDlgeCrmHeMain.imgCloseMouseEnter(Sender: TObject);
begin
if Sender is TImage then
SetImgBtn(imgUpBtnList, TImage(Sender), TImage(Sender).Tag + 1);
end;
procedure TDlgeCrmHeMain.imgCloseMouseLeave(Sender: TObject);
begin
if Sender is TImage then
SetImgBtn(imgUpBtnList, TImage(Sender), TImage(Sender).Tag);
end;
function TDlgeCrmHeMain.SetAipLabel(sPath: String; sAipLabelId: String): Boolean;
var
h: HWND;
n: Integer;
begin
// _Trace('SetAipLabel() .. Path=%s', [sPath]);
Result := false;
h := MgSvc_.FindAipMdWnd;
if h <> 0 then
begin
var sEncPath: String := ConvAipEncExt(GetRunExePathDir + 'Data\' + Format('%d-dc_%s', [GetTickCount, ExtractFileName(sPath)]));
// var sEncPath: String:= CttSchOpt_.sTaskDir + ExtractFileName(sPath);
var O: ISuperObject := SO;
O.S['src'] := sPath;
O.S['dst'] := sEncPath;
if sAipLabelId = '' then
sAipLabelId := '9877e059-3e04-4eba-ad87-888eb0c7e9ba'; // HEC 대외비 개인정보
O.S['lid'] := sAipLabelId;
if (MgSvc_ <> nil) and (MgSvc_.Email <> '') then
O.S['mail'] := gMgSvc.Email;
// 0 : 레이블 추출, 1 : 암호화, 2 : 복호화, 3 : 암호화 확인, 4 : 레이블 확인, 5 : 레이블 설정
n := SendData(h, 5, O.AsString);
if (n = 10) and FileExists(sEncPath) then
begin
if DeleteFileForce(sPath) then
begin
var sCpPath: String := sPath;
if CheckMsPfileExt(sPath) then
begin
if CheckAipEncSign(sEncPath) then
sCpPath := sCpPath + '.pfile';
end else
sCpPath := CutFileExt(sCpPath) + '.' + GetFileExt(sEncPath);
if CopyFile(PChar(sEncPath), PChar(sCpPath), false) then // 이거 실패 대비를 해야 할까... 23_1024 09:04:08 kku
Result := true;
end;
end;
// else
// if (SendData(h, 1, O.AsString) = 10) and FileExists(sEncPath) then
// begin
// // 레이블 설정 실패하면 암호화 하도록 추가 23_1028 23:31:13 kku
// if DeleteFileForce(sPath) then
// begin
// if CopyFile(PChar(sEncPath), PChar(sPath), false) then // 이거 실패 대비를 해야 할까... 23_1024 09:04:08 kku
// Result := true;
// end;
// end;
DeleteFile(PChar(sEncPath));
if MgSvc_.PrefModel.AipEncMSec > 0 then
Sleep(MgSvc_.PrefModel.AipEncMSec);
end;
end;
procedure TDlgeCrmHeMain.imgCttSchMouseEnter(Sender: TObject);
var
img: TImage;
begin
if Sender = nil then
exit;
if Sender is TImage then
img := TImage(Sender)
else if Sender = lbCttSch then
img := imgCttSch
else
img := imgCttSchRst;
if img.Enabled then
begin
if img = imgCttSch then
lbCttSch.Font.Color := clBlack
else
lbCttSchRst.Font.Color := clBlack;
img.Picture.Assign(imgMainList.Items[5].PngImage);
end;
end;
procedure TDlgeCrmHeMain.imgCttSchMouseLeave(Sender: TObject);
var
img: TImage;
begin
if Sender = nil then
exit;
if Sender is TImage then
img := TImage(Sender)
else if Sender = lbCttSch then
img := imgCttSch
else
img := imgCttSchRst;
if img.Enabled then
begin
if img = imgCttSch then
lbCttSch.Font.Color := $00DB6646
else
lbCttSchRst.Font.Color := $00DB6646;
img.Picture.Assign(imgMainList.Items[4].PngImage);
end;
end;
procedure TDlgeCrmHeMain.imgFwInfoClick(Sender: TObject);
var
StrList: TStringList;
i: Integer;
dlg: TDlgLiteInfo;
pt: TPoint;
begin
Guard(StrList, TStringList.Create);
if MgSvc_.VulService.FwList <> nil then
begin
with MgSvc_.VulService do
begin
for i := 0 to FwList.Count - 1 do
StrList.Add(Format('%s ( %s :: %s )'#13#10, [FwList[i].Name, FwList[i].Status, FwList[i].AppType]));
end;
if StrList.Text = '' then
StrList.Text := '(none)';
end else
StrList.Text := RS_LodingInfo;
dlg := TDlgLiteInfo.Create(Self);
dlg.SetInfo(RS_FwInfo, StrList);
pt.X := imgFwInfo.Left;
pt.Y := imgFwInfo.Top;
pt := pnMain.ClientToScreen(pt);
dlg.Left := pt.X - dlg.Width;
dlg.Top := pt.Y - dlg.Height;
dlg.Show;
end;
procedure TDlgeCrmHeMain.UpdateLangName(nLang: Integer);
begin
case nLang of
$0412 : lbLang.Caption := 'KOR';
$0409 : lbLang.Caption := 'ENG';
$0411 : lbLang.Caption := 'JPN';
$0804 : lbLang.Caption := 'CHN'; // 간체, 중국 본토(중국 대륙)에서 사용하는 간체자
$0404 : lbLang.Caption := 'CHT'; // 번체, 대만, 홍콩, 마카오 등에서 사용하는 번체자
$0419 : lbLang.Caption := 'RUS';
$0443 : lbLang.Caption := 'UZB';
end;
end;
procedure TDlgeCrmHeMain.OnSetLangClick(aSender: TObject);
var
item: TMenuItem;
ini: TIniFile;
begin
if aSender is TMenuItem then
begin
item := TMenuItem(aSender);
if item.Checked then
exit;
FreeLocalizer.LanguageFile := Format(FILE_LANG_FMT, [item.Tag]);
UpdateLangName(item.Tag);
Guard(ini, TIniFile.Create(GetRunExePathDir + INI_HE));
ini.WriteInteger('Lang', 'SetLang', item.Tag);
RefreshView;
end;
end;
procedure TDlgeCrmHeMain.imgLangClick(Sender: TObject);
var
sLangDir,
sCurrLangFile: String;
pt: TPoint;
procedure AddLangItem(dwLangId: DWORD; sLangName: String);
var
sFName: String;
item: TMenuItem;
begin
sFName := Format(FILE_LANG_FMT, [dwLangId]);
if FileExists(sLangDir + sFName) then
begin
item := TMenuItem.Create(popLang);
item.Caption := sLangName;
item.Tag := dwLangId;
item.Checked := CompareText(sCurrLangFile, sFName) = 0;
item.OnClick := OnSetLangClick;
popLang.Items.Add(item);
end;
end;
begin
popLang.Items.Clear;
sLangDir := IncludeTrailingPathDelimiter(FreeLocalizer.LanguageDir);
if not DirectoryExists(sLangDir) then
exit;
sCurrLangFile := ExtractFileName(FreeLocalizer.LanguageFile);
if IsCJ_Affiliates then
begin
AddLangItem($0412, 'KOR');
AddLangItem($0409, 'ENG');
AddLangItem($0411, 'JPN');
AddLangItem($0804, 'CHN');
AddLangItem($0404, 'CHT');
AddLangItem($0419, 'RUS');
AddLangItem($0443, 'UZB');
end else begin
AddLangItem($0412, '한국어');
AddLangItem($0409, 'English');
AddLangItem($0411, '日本語');
AddLangItem($0804, '中国人');
AddLangItem($0404, '中國人');
AddLangItem($0419, 'Русский язык');
AddLangItem($0443, 'Oʻzbek tili');
end;
pt.X := imgLang.Left;
pt.Y := imgLang.Top + imgLang.Height;
pt := pnMain.ClientToScreen(pt);
popLang.Popup(pt.X, pt.Y);
end;
procedure TDlgeCrmHeMain.imgLangMouseEnter(Sender: TObject);
begin
lbLang.Font.Color := $00635653;
SetImgBtn(imgLangList, imgLang, 1);
end;
procedure TDlgeCrmHeMain.imgLangMouseLeave(Sender: TObject);
begin
lbLang.Font.Color := clWhite;
SetImgBtn(imgLangList, imgLang, 0);
end;
procedure TDlgeCrmHeMain.imgMainMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if imgExpend.Enabled then
begin
ReleaseCapture;
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
end;
end;
procedure TDlgeCrmHeMain.imgOsInfoClick(Sender: TObject);
begin
ExecutePath_hide('cmd.exe', PARAM_GO_SYSTEMINFO);
end;
procedure TDlgeCrmHeMain.imgOsInfoMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Sender is TImage then
SetImgBtn(imgBtnList, TImage(Sender), 2);
end;
procedure TDlgeCrmHeMain.imgOsInfoMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Sender is TImage then
SetImgBtn(imgBtnList, TImage(Sender), 1);
end;
procedure TDlgeCrmHeMain.imgOsPchInfoClick(Sender: TObject);
var
StrList: TStringList;
i: Integer;
dlg: TDlgLiteInfo;
pt: TPoint;
begin
i := GetOsPatchCheckTerm;
if i = 0 then
exit;
Guard(StrList, TStringList.Create);
if MgSvc_.AgentModel.LastOsPatchDT <> 0 then
begin
StrList.Add(Format('%s : %s', [RS_RecentDtPatchOS, DateTimeToStr(MgSvc_.AgentModel.LastOsPatchDT)]));
if DaysBetween(MgSvc_.AgentModel.LastOsPatchDT, Now) < i then
begin
StrList.Add(Format('%s : %s', [RS_RemainOsCheckTime, ConvSecBetweenToProgTime(Now, IncDay(MgSvc_.AgentModel.LastOsPatchDT, i))]))
end else begin
if not MgSvc_.IsPatchUptoDate then
StrList.Add(RS_OsPatchAble)
else
StrList.Add(RS_CheckingOsPatch);
end;
end else begin
StrList.Add(Format('%s : (none)', [RS_RecentDtPatchOS]));
if not MgSvc_.IsPatchUptoDate then
StrList.Add(RS_OsPatchAble)
else
StrList.Add(RS_CheckingOsPatch);
end;
dlg := TDlgLiteInfo.Create(Self);
dlg.SetInfo(RS_OsPatchInfo, StrList);
pt.X := imgOsPchInfo.Left;
pt.Y := imgOsPchInfo.Top;
pt := pnMain.ClientToScreen(pt);
dlg.Left := pt.X - dlg.Width;
dlg.Top := pt.Y - dlg.Height;
dlg.Show;
end;
procedure TDlgeCrmHeMain.imgPwDateInfoClick(Sender: TObject);
var
StrList: TStringList;
i: Integer;
dlg: TDlgLiteInfo;
pt: TPoint;
dtLast: TDateTime;
begin
if (MgSvc_ = nil) or (MgSvc_.ComName = '') then
exit;
dtLast := GetLastChangePasswordDT(MgSvc_.ComName, ExtractFileName(MgSvc_.Domain));
if dtLast = 0 then
exit;
Guard(StrList, TStringList.Create);
StrList.Add(RS_PwLastDate + DateTimeToStr(dtLast));
i := DaysBetween(Now, dtLast);
if MgSvc_.PrefModel.PwChkTermDay > i then
StrList.Add(Format(RS_MsgPwChgUntil, [MgSvc_.PrefModel.PwChkTermDay - i]))
else
StrList.Add(RS_MsgPwChg);
dlg := TDlgLiteInfo.Create(Self);
dlg.SetInfo(lbPW.Caption, StrList);
pt.X := imgPwDateInfo.Left;
pt.Y := imgPwDateInfo.Top;
pt := pnMain.ClientToScreen(pt);
dlg.Left := pt.X - dlg.Width;
dlg.Top := pt.Y - dlg.Height;
dlg.Show;
end;
procedure TDlgeCrmHeMain.miScreenLockClick(Sender: TObject);
begin
LockScreen;
end;
procedure TDlgeCrmHeMain.miViewSchPersonalInfoClick(Sender: TObject);
begin
if MgSvc_ = nil then
exit;
if not MgSvc_.IsSearchingPersonalInfo then
exit;
if tSchTimer.Enabled then
begin
tSchTimer.Enabled := false;
lbSchProgMsg.Visible := false;
end else begin
lbSchProgMsg.Caption := RS_InitWork;
tSchTimer.Enabled := true;
lbSchProgMsg.Visible := true;
end;
Application.ProcessMessages;
end;
procedure TDlgeCrmHeMain.miSendSoftInstInfoClick(Sender: TObject);
begin
MgSvc_.SendAppInstInfo;
MessageBox(Handle, PChar(RS_SendAppInstInfo),
PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
procedure TDlgeCrmHeMain.miSharePcPrintBlockClick(Sender: TObject);
var
ini: TIniFile;
begin
if Sender is TMenuItem then
begin
Guard(ini, TIniFile.Create(GetRunExePathDir + INI_PREVFUN));
case TMenuItem(Sender).Tag of
1 :
begin
MgSvc_.SharePcPrintBlock := not TMenuItem(Sender).Checked;
ini.WriteBool('Feature', 'SharePcPrintBlock', MgSvc_.SharePcPrintBlock);
end;
2 :
begin
MgSvc_.WSDPortPrintBlock := not TMenuItem(Sender).Checked;
ini.WriteBool('Feature', 'WSDPortPrintBlock', MgSvc_.WSDPortPrintBlock);
end;
3 :
begin
MgSvc_.TcpIpPrintBlock := not TMenuItem(Sender).Checked;
ini.WriteBool('Feature', 'TcpIpPrintBlock', MgSvc_.TcpIpPrintBlock);
end;
4 :
begin
MgSvc_.PrintSavingBlock := not TMenuItem(Sender).Checked;
ini.WriteBool('Feature', 'PrintSavingBlock', MgSvc_.PrintSavingBlock);
end;
end;
end;
end;
procedure TDlgeCrmHeMain.miShowTagInfoClick(Sender: TObject);
begin
miShowTagInfo.Checked := not miShowTagInfo.Checked;
lbTagInfo.Visible := miShowTagInfo.Checked;
end;
procedure TDlgeCrmHeMain.miTempDelClick(Sender: TObject);
var
sWinDir, sUsersDir, sDir, sPath: String;
UserList, FileList, DirList: TStringList;
i, nCnt, nFail: Integer;
EntList: TRstEntList;
pEnt: PRstEnt;
dlg: TDlgProgCttSchTask;
begin
if FindWindow('TDlgProgCttSchTask', nil) <> 0 then
begin
MessageBox(Handle, '현재 작업중인 창을 닫고 다시 시도해주십시오.', PChar(APP_TITLE), MB_OK +
MB_ICONWARNING);
exit;
end;
if MessageBox(Handle, '임시 폴더를 완전 삭제 하시겠습니까?',
PChar(APP_TITLE), MB_YESNO + MB_ICONQUESTION) = IDNO then exit;
sWinDir := GetWindowsDir;
if sWinDir = '' then
exit;
sUsersDir := sWinDir[1] + ':\Users\';
if not DirectoryExists(sUsersDir) then
exit;
Guard(UserList, TStringList.Create);
Guard(FileList, TStringList.Create);
Guard(DirList, TStringList.Create);
// 사용자 임시 폴더들
ExtrDirFromDir(sUsersDir, UserList);
for i := 0 to UserList.Count - 1 do
begin
sDir := Format('%s\AppData\Local\Temp\', [sUsersDir + UserList[i]]);
if DirectoryExists(sDir) then
begin
DirList.Add(sDir);
ExtrFilesPathFromDir(sDir, FileList, true);
end;
sDir := Format('%s\AppData\Local\Microsoft\Windows\INetCache\', [sUsersDir + UserList[i]]);
if DirectoryExists(sDir) then
begin
DirList.Add(sDir);
ExtrFilesPathFromDir(sDir, FileList, true);
end;
end;
// 윈도우 임시 폴더들
DirList.Add(sWinDir + 'Temp\');
ExtrFilesPathFromDir(sWinDir + 'Temp\', FileList, true);
Guard(EntList, TRstEntList.Create);
for i := 0 to FileList.Count - 1 do
begin
sPath := FileList[i];
New(pEnt);
ZeroMemory(pEnt, SizeOf(TRstEnt));
pEnt.sDir := ExtractFilePath(sPath);
pEnt.sFName := ExtractFileName(sPath);
EntList.Add(pEnt);
end;
if EntList.Count > 0 then
begin
Guard(dlg, TDlgProgCttSchTask.Create(Self, cstkPerDelete, EntList));
dlg.ShowModal;
nCnt := 0;
nFail := 0;
for i := 0 to EntList.Count - 1 do
begin
pEnt := EntList[i];
if pEnt.State = resDel then
Inc(nCnt)
else
Inc(nFail);
end;
end;
for i := 0 to DirList.Count - 1 do
DeleteDirSub(DirList[i], true, false, nil, true);
MessageBox(Handle, PChar(Format(RS_CompleteWork1+#13+#10+RS_CompleteWork2,
[nCnt, nFail])), PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
procedure TDlgeCrmHeMain.miUpdatePolicyClick(Sender: TObject);
begin
if MgSvc_ = nil then
exit;
// 서버 연결 상태 무시,
// 정책 확인 주기가 길 경우 오랫동안 접속 확인이 불가하기 때문에 이렇게 무시하는걸로 변경함 25_0616 16:25:02 kku
// if not MgSvc_.Connected then
// begin
// MessageBox(Handle, PChar(RS_MsgDisconnected), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
// end;
if MutexExists(MTX_NAME_RCVPOLICY) then
begin
MessageBox(Handle, PChar(RS_MsgRcvPolicy), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
TThdRcvPolicy.Create(Handle);
// if ProcessRcvPolicy(rpkAll) then
// MessageBox(Handle, PChar(RS_UpdatePolicy), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK)
// else
// MessageBox(Handle, PChar(RS_FailUpdatePolicy), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
end;
procedure TDlgeCrmHeMain.miUsbInfoClick(Sender: TObject);
begin
if FindWindow('TDlgUsbInfo', nil) <> 0 then
exit;
TDlgUsbInfo.Create(nil).Show;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_MSG(var msg: TMessage);
var
sMsg: String;
O: ISuperObject;
Label
LB_Dopopup;
begin
// 프로그램 시작 후 트레이 만들어지기 전까지는 무시...
// 메시지 먼저 뜨면 트레이가 씹힌다. 22_0524 09:08:45 kku
if TrayIcon_ = nil then
exit;
try
sMsg := String(msg.LParam);
O := SO(sMsg);
if O.B['A'] then // 결재 요청, 승인은 무조건 팝업으로 표시 25_0915 16:35:47 kku
goto LB_Dopopup;
if msg.WParam = 1 then
begin
var sNoti: String := qNoti_.Dequeue;
if sNoti = '' then
exit;
var sTitle: String := APP_TITLE;
var brFlag: TBalloonFlags := bfInfo;
var nPos: Integer := Pos(':', sNoti);
if nPos > 0 then
begin
sTitle := Copy(sNoti, 1, nPos - 1);
if sTitle = RS_Vul then
brFlag := bfError
else if sTitle = RS_SecuViol then
brFlag := bfWarning;
Delete(sNoti, 1, nPos);
end;
ShowTrayMsg(brFlag, sTitle, sNoti);
end else begin
LB_Dopopup :
if sMsg <> '' then
begin
var dlg: TDlgNotice := TDlgNotice.Create(nil);
dlg.PopupMessage(sMsg);
if MgSvc_.ModePolicy.NotifyType = nftACenter then
begin
qNoti_.Enqueue(dlg.NotiCenterMsg);
dlg.Free;
end else
dlg.Show;
end;
end;
Application.ProcessMessages;
if IsCJ_Affiliates and (MgSvc_ <> nil) and
(MgSvc_.HeModeKind = hmkOffline) then imgChangeEmpNoClick(nil);
except
on E: Exception do
ETgException.TraceException(Self, E, Format('Fail .. process_WM_POPUP_MSG(), WP = %d', [msg.WParam]));
end;
end;
procedure TDlgeCrmHeMain.popTrayPopup(Sender: TObject);
var
ShiftState: TShiftState;
bShowHideFun: Boolean;
bDrmDec: Boolean;
begin
if MgSvc_ = nil then
exit;
miAgentState.Enabled := not MgSvc_.PrefModel.HideMainUI;
miAgentState.Visible := miAgentState.Enabled;
miOpenDrmFile.Enabled := IsUseDRM;
miOpenDrmFile.Visible := miOpenDrmFile.Enabled;
miOfflineExp.Enabled := MgSvc_.PrefModel.UseExpPo; // MgSvc_.PrefModel.ExpPoMin > 0;
miOfflineExp.Visible := miOfflineExp.Enabled;
miEncDrmFile.Enabled := miOpenDrmFile.Enabled;
miEncDrmFile.Visible := miOpenDrmFile.Enabled;
// 모드 상관없이 보이도록 24_0430 10:30:16 kku
miDelAgent.Enabled := MgSvc_.PrefModel.IsUninstallAble;
miDelAgent.Visible := miDelAgent.Enabled;
miChangeEmpNo.Enabled := IsChangeAbleEmpNo and MgSvc_.PrefModel.IsEmpVerify;
miChangeEmpNo.Visible := miChangeEmpNo.Enabled;
miScreenLock.Enabled := IsUseCustomScreenLock;
miScreenLock.Visible := miScreenLock.Enabled;
miUsbInfo.Visible := miUsbInfo.Enabled;
bDrmDec := MgSvc_.ModePolicy.IsDrmDecrypt or (IsApproveSupport and MgSvc_.ModePolicy.DrmApproval);
if CUSTOMER_TYPE = CUSTOMER_SCD then
miEncryptDrm.Visible := false
else
miEncryptDrm.Visible := miEncryptDrm.Enabled and ( (CUSTOMER_TYPE = CUSTOMER_DEV) or (not IsUseEncOnlyAIP and not NotUseDRM) );
miDecryptDrm.Visible := miDecryptDrm.Enabled and ( ((CUSTOMER_TYPE = CUSTOMER_DEV) and bDrmDec) or
(not IsUseEncOnlyAIP and bDrmDec and not NotUseDRM) );
miPiResult.Enabled := GetPersonalInfoResults > 0;
miPiResult.Visible := miPiResult.Enabled;
miFileEncPopup.Enabled := (MgSvc_ <> nil) and (MgSvc_.DlgEncCampn <> nil);
miFileEncPopup.Visible := miFileEncPopup.Enabled;
miAipTry.Visible := IsSupportAIP and (MgSvc_.AipFailCnt >= 3);
ShiftState := KeyDataToShiftState(0);
// if GetKeyState(VK_LMENU) < 0 then
// Include(ShiftState, ssAlt);
if ShowTestFun then
miBrowserSecu.Checked := GetProcessPidByName(EXE_BROWSER_SECU) <> 0;
miPolicyView.Visible := MgSvc_.PrefModel.IsShowPolicy;
miUpdatePolicy.Enabled := MgSvc_.IsNewApi;
miUpdatePolicy.Visible := miUpdatePolicy.Enabled; //miUpdatePolicy.Enabled and bShowHideFun;
miAprvReqList.Visible := IsApproveSupport;
miAprvList.Visible := IsApproveSupport and (MgSvc_.UserRole <> 0);
miAprvFileExport.Visible := miAprvFileExport.Enabled and (MgSvc_.ModePolicy.ExFApproval);
miAip2Kess.Visible := miAip2Kess.Enabled and (CUSTOMER_TYPE = CUSTOMER_KDNVN) and MgSvc_.ModePolicy.IsDrmDecrypt;
miKess2Aip.Visible := miKess2Aip.Enabled and (CUSTOMER_TYPE = CUSTOMER_KDNVN) and MgSvc_.ModePolicy.IsDrmDecrypt;
miDebugMode.Visible := miDebugMode.Enabled and (ssShift in ShiftState) and (ssCtrl in ShiftState);
miDebugMode.Checked := gTrForm <> nil; // bIsDebugMode_;
bShowHideFun := (ssShift in ShiftState) and
// (ssAlt in ShiftState) and // Alt 누르면 팝업 안됨 22_0714 16:56:21 kku
(ssCtrl in ShiftState) and
( FileExists(GetProgramFilesDir + 'Tocsg\' + INI_FORCEHE) or miDebugMode.Checked); // 파일 있을때, 디버그 모드일때 히든 메뉴 나오도록 보완 25_0819 13:40:41 kku
miPolicyDetailView.Visible := bShowHideFun;
miCttSch.Visible := IsUseCustomCttSch and miCttSch.Enabled; // and bShowHideFun;
miCttSchResult.Visible := miCttSch.Visible and miCttSchResult.Enabled; // (CUSTOMER_TYPE = CUSTOMER_ALADIN) or (IsUseCustomCttSch and miCttSchResult.Enabled and bShowHideFun);
miResetPersonalScan.Visible := miResetPersonalScan.Enabled and bShowHideFun;
miRetryPiScan.Visible := miRetryPiScan.Enabled and bShowHideFun;
miReqPrint.Visible := IsApproveSupport and bShowHideFun;
miSendSoftInstInfo.Visible := miSendSoftInstInfo.Enabled and bShowHideFun;
miExportPo.Visible := miExportPo.Enabled and bShowHideFun;
miExportCmPo.Visible := miExportCmPo.Enabled and bShowHideFun;
miProcessTerminatePrevate.Visible := miProcessTerminatePrevate.Enabled and bShowHideFun;
miViewSchPersonalInfo.Visible := false;
miShowTagInfo.Visible := bShowHideFun and IsUsingFileTag;
if bShowHideFun then
begin
if (MgSvc_ <> nil) and MgSvc_.IsSearchingPersonalInfo then
miViewSchPersonalInfo.Visible := true;
end;
end;
procedure TDlgeCrmHeMain.miExportCmPoClick(Sender: TObject);
var
sPath: String;
begin
if MgSvc_ = nil then
exit;
sPath := 'C:\Bs1CmPo.json';
if MgSvc_.MgCampn.SaveToFile(sPath) then
MessageBox(Handle, PChar(Format('"%s" 경로에 파일이 생성되었습니다.', [sPath])), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK)
else
MessageBox(Handle, PChar('파일을 생성하는 중 오류가 발생했습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
end;
procedure TDlgeCrmHeMain.miExportPoClick(Sender: TObject);
var
sPath: String;
begin
if MgSvc_ = nil then
exit;
sPath := 'C:\Bs1Po.json';
if SaveJsonObjToFile(MgSvc_.ModePolicy.GetPolicyToJsonObj, sPath, nil, true) then
MessageBox(Handle, PChar(Format('"%s" 경로에 파일이 생성되었습니다.', [sPath])), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK)
else
MessageBox(Handle, PChar('파일을 생성하는 중 오류가 발생했습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
end;
procedure TDlgeCrmHeMain.miFileEncPopupClick(Sender: TObject);
begin
try
if (MgSvc_ <> nil) and (MgSvc_.DlgEncCampn <> nil) then
begin
MgSvc_.DlgEncCampn.Show;
if MgSvc_.DlgEncCampn.WindowState = wsMinimized then
MgSvc_.DlgEncCampn.WindowState := wsNormal;
end;
except
on E: Exception do
begin
ETgException.TraceException(Self, E, 'Fail .. miFileEncPopupClick()');
MgSvc_.DlgEncCampn := nil;
end;
end;
end;
procedure TDlgeCrmHeMain.miFilePerDelClick(Sender: TObject);
begin
TDlgPerfectDel.Create(Self).Show;
end;
procedure TDlgeCrmHeMain.miInfoClick(Sender: TObject);
var
dlg: TDlgSimpleInfo;
begin
dlg := TDlgSimpleInfo.Create(Self);
dlg.FillCurrentModeInfo;
dlg.Show;
end;
procedure TDlgeCrmHeMain.miKess2AipClick(Sender: TObject);
var
dlg: TDlgKess2AipDrm;
begin
Guard(dlg, TDlgKess2AipDrm.Create(Self));
dlg.ShowModal;
end;
procedure TDlgeCrmHeMain.miNoWaterApprovalClick(Sender: TObject);
var
sUrl: String;
begin
if not IsApproveSupport then
exit;
sUrl := MgSvc_.SendApproval(8, nil);
if sUrl <> '' then
begin
// ExecutePath(gMgSvc.DestIPort + sUrl);
var sHlpExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sHlpExe) then
begin
var O: ISuperObject := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_EXECUTE_FILE;
O.S['Path'] := gMgSvc.DestIPort + sUrl;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sHlpExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sHlpExe, '', SW_SHOWNORMAL);
{$ENDIF}
end else
ExecutePath(gMgSvc.DestIPort + sUrl);
end;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_LICENSE(var msg: TMessage);
var
sContent: String;
begin
sContent := String(msg.LParam);
// if CUSTOMER_TYPE = CUSTOMER_KFTC then
// begin
// var sExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
// if FileExists(sExe) then
// begin
// var O: ISuperObject := SO;
// O.I['RcvWnd'] := Handle;
// O.I['Cmd'] := HPCMD_LICENSE_AGREE;
// O.I['CT'] := CUSTOMER_TYPE;
// O.B['Count'] := IsLicenseCount;
// O.B['NoExit'] := gMgSvc.IsSafeExitImpossible;
// O.S['Msg'] := sContent;
// SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
// {$IFDEF DEBUG}
// ExecutePath(sExe);
// {$ELSE}
// ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
// {$ENDIF}
// end;
// end else
begin
with TDlgLicense.Create(nil) do
PopupLicense(sContent);
end;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_AFTERREPORT(var msg: TMessage);
begin
if FindWindow('TDlgAfterReport', nil) <> 0 then
exit;
var sExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
var O: ISuperObject := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_SEND_AFTER_REPORT;
O.S['WinCap'] := APP_TITLE;
O.S['UserName'] := MgSvc_.UserName;
O.D['AfterRptDT'] := MgSvc_.AgentModel.AfterRptDT;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
end;
// TDlgAfterReport.Create(nil).Show;
end;
procedure TDlgeCrmHeMain.ShowTrayMsg(brFlag: TBalloonFlags; sTitle, sText: String);
begin
if TrayIcon_ = nil then
exit;
TrayIcon_.BalloonFlags := brFlag;
TrayIcon_.BalloonTitle := sTitle;
TrayIcon_.BalloonHint := sText;
TrayIcon_.ShowBalloonHint;
end;
procedure TDlgeCrmHeMain.tCttSchTimerTimer(Sender: TObject);
var
sProcFile: String;
llTotalTgFileCnt,
llProcTgFileCnt: LONGLONG;
wPercent: WORD;
begin
if (MgSvc_ = nil) or (not MgSvc_.IsSearchingPersonalInfo) then
begin
tCttSchTimer.Enabled := false;
lbCttSchSP.Visible := false;
lbSchTitle.Visible := false;
Application.ProcessMessages;
exit;
end;
try
case MgSvc_.ThdScanSch.WorkState of
tsWorking :
begin
sProcFile := MgSvc_.ThdScanSch.ProcSchFile;
if sProcFile <> '' then
begin
llProcTgFileCnt := MgSvc_.ThdScanSch.ProcTgFileCount;
llTotalTgFileCnt := MgSvc_.ThdScanSch.TotalTgFileCount;
if llTotalTgFileCnt > 0 then
wPercent := (llProcTgFileCnt * 100) div llTotalTgFileCnt
else
wPercent := 0;
if lbCttSchSP.Visible then
lbCttSchSP.Caption := Format('%d%%', [wPercent]);
end else begin
if lbCttSchSP.Visible then
begin
if lbCttSchSP.Caption = '?...' then
lbCttSchSP.Caption := '.?..'
else if lbCttSchSP.Caption = '.?..' then
lbCttSchSP.Caption := '..?.'
else if lbCttSchSP.Caption = '..?.' then
lbCttSchSP.Caption := '...?'
else
lbCttSchSP.Caption := '?...';
end;
end;
end;
tsStop,
tsCompleted,
tsFail :
begin
tCttSchTimer.Enabled := false;
lbCttSchSP.Visible := false;
lbSchTitle.Visible := false;
end;
end;
Application.ProcessMessages;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. tCttSchTimer()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_MSG_SYSTEM(var msg: TMessage);
begin
try
if not gMgSvc.ModePolicy.IsNotiSystem then
exit;
if TrayIcon_ <> nil then
begin
case msg.WParam of
TYPE_MSG_SYSTEM_VPNCLOSED :
begin
ShowTrayMsg(bfInfo, TrayIcon_.Hint,
RS_MsgVpnClosed1 + #13#10 +
Format(RS_MsgVpnClosed2, [APP_TITLE]) + #13#10 +
RS_MsgVpnClosed3);
end;
TYPE_MSG_SYSTEM_NETWORKCLOSE :
begin
ShowTrayMsg(bfWarning, TrayIcon_.Hint,
RS_MsgNetClose1 + #13#10 +
RS_MsgNetClose2 + #13#10 +
RS_MsgNetClose3);
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_POPUP_MSG_SYSTEM()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_REFRESH_VIEW(var msg: TMessage);
begin
if msg.WParam = 1 then
VisibleMainform(false)
else
RefreshView;
end;
procedure TDlgeCrmHeMain.process_WM_SYSCOMMAND(var msg: TWMSysCommand);
begin
if msg.CmdType = SC_CLOSE then
begin
imgCloseClick(nil);
exit;
end;
Inherited;
end;
procedure TDlgeCrmHeMain.process_WM_SCREENLOCK(var msg: TMessage);
begin
LockScreen;
end;
procedure TDlgeCrmHeMain.process_WM_REFRESH_CLIPBOARDCHAIN(var msg: TMessage);
begin
{$IFDEF OLD_CB_MON}
CbMon_.Reset;
{$ENDIF}
end;
procedure TDlgeCrmHeMain.process_WM_CTTSCH_INIT(var msg: TMessage);
begin
try
TThdSchFileScan(msg.LParam).SetKvCttSchHandle(msg.WParam);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_CTTSCH_INIT()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_CTTSCH_REQUEST(var msg: TMessage);
var
ThdSch: TThdSchFileScan;
sData: String;
CpData: TCopyDataStruct;
begin
try
if msg.LParam = 0 then
exit;
ThdSch := TThdSchFileScan(msg.LParam);
ZeroMemory(@CpData, SizeOf(CpData));
case msg.WParam of
KV_REQUEST_SEARCH_PATH :
begin
sData := ThdSch.NextSchPath;
if sData = '' then
exit;
TTgTrace.T('process_WM_CTTSCH_REQUEST sData: %s', [sData]);
CpData.dwData := KV_RESPONSE_SEARCH_PATH;
end;
end;
CpData.cbData := (Length(sData)+1)*2;
CpData.lpData := PChar(sData);
SendMessage(ThdSch.KvCttSchWnd, WM_COPYDATA, 0, NativeInt(@CpData));
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_CTTSCH_REQUEST()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_COPYDATA(var msg: TMessage);
var
dwData: DWORD;
pCpData: PCopyDataStruct;
O: ISuperObject;
sTemp, sPath: String;
i, n: Integer;
begin
msg.Result := 0;
dwData := 0;
pCpData := PCopyDataStruct(msg.LParam);
try
if MgSvc_ = nil then
exit;
dwData := pCpData.dwData;
case dwData of
HPCMD_APPROVAL_FILE : // 파일 반출 체크
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
// if CompareText(GetFileToSha1Str(sTemp), '48f8f7b5b3ae11988568a213cd5c7d4bf33194b7') = 0 then
if MgSvc_.HasFileExp(sTemp) then
msg.Result := 300;
end;
HPCMD_EXISTS_FILE : // 파일 유무 체크, 다운로드인지 확인을 위해 추가
begin
var PO: TPrefModel := MgSvc_.ModePolicy;
if pCpData.lpData = nil then
begin
TTgTrace.T('Fail .. HPCMD_EXISTS_FILE() .. Data is null', 10);
exit;
end;
if pCpData.cbData = 0 then
begin
TTgTrace.T('Fail .. HPCMD_EXISTS_FILE() .. Data is 0', 10);
exit;
end;
try
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
except
on E: Exception do
begin
ETgException.TraceException(Self, E, 'Fail .. HPCMD_EXISTS_FILE() .. GetData()');
exit;
end;
end;
O := nil;
if sTemp <> '' then
begin
if sTemp[1] = '{' then
begin
O := SO(sTemp);
if O <> nil then
sPath := O.S['P'];
end else
sPath := sTemp;
end else exit;
if FileExists(sPath) then
begin
msg.Result := 300;
if O <> nil then
begin
{$IFDEF DEBUG}
TTgTrace.T('파일 존재함. D=%d, S=%d, F=%d Path=%s, Size=%d', [O.I['D'], O.I['S'], O.I['F'], sPath, GetFileSize_path(sPath)], 10);
{$ELSE}
TTgTrace.T('파일 존재함. D=0x%x, S=0x%x, F=0x%x Path=%s', [DWORD(O.I['D']), DWORD(O.I['S']), DWORD(O.I['F']), sPath], 10);
{$ENDIF}
end else
TTgTrace.T('파일 존재함. Path=%s', [sPath], 10);
// 파일 이름, 시그니처 조건 25_0429 19:40:54 kku
var sFName: String := ExtractFileName(sPath).ToUpper;
case TCurAppType(O.I['T']) of
catOutlook : exit;
catWebb :
begin
sTemp := MgSvc_.PrefModel.WebAbExts;
if sTemp <> '' then
begin
// 파일 차단 대상 확장자 체크 25_0512 13:21:41 kku
if sWebAbExts_ <> sTemp then
begin
sWebAbExts_ := sTemp;
SplitString(UpperCase(sWebAbExts_), '|', WebAbExtList_);
end;
if WebAbExtList_.IndexOf(GetFileExt(sFName)) = -1 then
begin
msg.Result := 100;
exit;
end;
end;
sTemp := PO.WebAbFNames;
if sTemp <> '' then
begin
msg.Result := 100;
if sWebAbFNames_ <> sTemp then
begin
sWebAbFNames_ := sTemp;
SplitString(UpperCase(sWebAbFNames_), '|', WebAbFNameList_);
end;
for i := 0 to WebAbFNameList_.Count - 1 do
if Pos(WebAbFNameList_[i], sFName) > 0 then
begin
msg.Result := 300;
exit;
end;
end;
sTemp := PO.WebAbSigs;
if sTemp <> '' then
begin
msg.Result := 100;
if sWebAbSigs_ <> sTemp then
begin
sWebAbSigs_ := sTemp;
SplitString(sWebAbSigs_, '|', WebAbSigList_);
end;
if CheckSignFromList(sPath, WebAbSigList_) then
begin
msg.Result := 300;
exit;
end;
end;
end;
else begin
sTemp := MgSvc_.PrefModel.EtcAbExts;
if sTemp <> '' then
begin
// 파일 차단 대상 확장자 체크 25_0512 13:21:41 kku
if sEtcAbExts_ <> sTemp then
begin
sEtcAbExts_ := sTemp;
SplitString(UpperCase(sEtcAbExts_), '|', EtcAbExtList_);
end;
if EtcAbExtList_.IndexOf(GetFileExt(sFName)) = -1 then
begin
msg.Result := 100;
exit;
end;
end;
sTemp := PO.EtcAbFNames;
if sTemp <> '' then
begin
msg.Result := 100;
if sEtcAbFNames_ <> sTemp then
begin
sEtcAbFNames_ := sTemp;
SplitString(UpperCase(sEtcAbFNames_), '|', EtcAbFNameList_);
end;
for i := 0 to EtcAbFNameList_.Count - 1 do
if Pos(EtcAbFNameList_[i], sFName) > 0 then
begin
msg.Result := 300;
exit;
end;
end;
sTemp := PO.EtcAbSigs;
if sTemp <> '' then
begin
msg.Result := 100;
if sEtcAbSigs_ <> sTemp then
begin
sEtcAbSigs_ := sTemp;
SplitString(sEtcAbSigs_, '|', EtcAbSigList_);
end;
if CheckSignFromList(sPath, EtcAbSigList_) then
begin
msg.Result := 300;
exit;
end;
end;
end;
end;
end else
if DirectoryExists(sPath) then
begin
msg.Result := 100;
TTgTrace.T('디렉토리 감지. Path=%s', [sPath], 10);
end else begin
sLastNotExistFile_ := sPath;
TTgTrace.T('파일 없음. Path=%s', [sPath], 10);
end;
end;
HPCMD_CHECK_URL : // URL 체크
begin
// TTgTrace.T('process_WM_COPYDATA > HPCMD_CHECK_URL ..');
if (MgSvc_ <> nil) and (MgSvc_.ThdWebUrl <> nil) then
begin
// 위젯 사용 시 파일 차단 25_0224 15:11:08 kku
if (MgSvc_.ThdWebUrl <> nil) and MgSvc_.ThdWebUrl.WidgetOn then
exit;
var PO: TPrefModel := MgSvc_.ModePolicy;
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
O := SO(sTemp);
// var h: HWND := GetWndHandleFromPID(O.I['pid']);
// TTgTrace.T('PID=%d, PName=%s', [O.I['pid'], GetProcessNameByPid(O.I['pid'])], 1);
// TTgTrace.T('HWND=%d, PName=%s', [h, GetProcessNameFromWndHandle(h)], 1);
// TTgTrace.T('Title=%s', [GetWindowCaption(h)], 1);
// TTgTrace.T('URL1=%s', [GetWebUrl2(h)], 1);
// TTgTrace.T('URL2=%s', [GetWebUrl2(O.I['hwnd'])], 1);
// TTgTrace.T('URL3=%s', [GetWebUrl2(MgSvc_.ThdWebUrl.LastHwnd)], 1);
sTemp := PO.WebABUrlList;
if (sTemp <> '') and (MgSvc_.ThdWebUrl <> nil) then
begin
try
sRecentBwUrl_ := MgSvc_.ThdWebUrl.LastUrl;
sRecentBwTitle_ := MgSvc_.ThdWebUrl.LastTitle;
except
// ..
end;
// URL이 비었을 때 차단 (sRecentBwUrl_ = '')
// URL 검색 없을 때 차단 (sRecentBwUrl_ = EMPTY_URL_MSG)
if PO.BlockNoUrlAB and
((sRecentBwUrl_ = '') or (sRecentBwUrl_ = EMPTY_URL_MSG)) then
exit;
// TTgTrace.T('process_WM_COPYDATA > HPCMD_CHECK_URL .. URL=%s', [sUrl]);
// 브라우저에서 PDF등 파일 열기는 허용해준다 24_0814 10:20:55 kku
// if Pos(':/', sRecentBwUrl_) = 2 then
// begin
// msg.Result := 300;
// exit;
// end;
if sRecentBwUrl_ <> '' then
begin
var StrList: TStringList;
Guard(StrList, TStringList.Create);
SplitString(UpperCase(sTemp), '|', StrList);
var UrlList: TStringList;
Guard(UrlList, TStringList.Create);
try
if MgSvc_.ThdWebUrl <> nil then
MgSvc_.ThdWebUrl.GetUrlListFromWbTitle(sRecentBwTitle_, UrlList);
except
end;
for i := 0 to StrList.Count - 1 do
begin
if MgSvc_.ThdWebUrl.MatchTarget(StrList[i], sRecentBwUrl_, sRecentBwTitle_, tkBlock) then
begin
if (PO.WebbAB.Kind = abkUrlAllow) then
begin
// TTgTrace.T('process_WM_COPYDATA > HPCMD_CHECK_URL .. Detect Allow');
msg.Result := 300;
end;
exit;
end;
if UrlList.Count > 1 then
begin
for n := 0 to UrlList.Count - 1 do
begin
if (Pos(StrList[i], UpperCase(UrlList[n])) > 0) then
begin
sRecentBwUrl_ := UrlList[n];
if (PO.WebbAB.Kind = abkUrlAllow) then
msg.Result := 300;
exit;
end;
end;
end;
end;
end;
if PO.WebbAB.Kind = abkUrlBlock then
begin
// TTgTrace.T('process_WM_COPYDATA > HPCMD_CHECK_URL .. No Block');
msg.Result := 300;
end;
end else
if (sTemp = '') and (PO.WebbAB.Kind = abkUrlBlock) then
msg.Result := 300;
end;
end;
HPCMD_CHECK_CONTENT :
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
O := SO(sTemp);
msg.Result := 0;
if MgSvc_.HasContentInfo(O.S['MName'], O.S['Path'], TCurAppType(O.I['Type'])) then
msg.Result := 300;
end;
HPCMD_CHECK_SIZE :
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
O := SO(sTemp);
msg.Result := 0;
sPath := O.S['Path'];
var nBlockMB: Integer := 0;
case TCurAppType(O.I['Type']) of
catWebb : nBlockMB := MgSvc_.ModePolicy.WebFileBlockMB;
catOutlook : nBlockMB := MgSvc_.ModePolicy.OutFileBlockMB;
else nBlockMB := MgSvc_.ModePolicy.AppFileBlockMB;
end;
if nBlockMB > 0 then
begin
var ullLimitSize: ULONGLONG := nBlockMB * 1048576;
if GetFileSize_path(sPath) >= ullLimitSize then
msg.Result := 300;
end;
end;
HPCMD_REG_IGNORE_DETECT_PATH :
begin
if (MgSvc_ <> nil) and (MgSvc_.FileService <> nil) then
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
O := SO(sTemp);
MgSvc_.FileService.AddIgr1Path(O.S['P'], O.I['S']);
end;
end;
HPCMD_PRINT_DOCNAME :
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
TTgTrace.T('HPCMD_PRINT_DOCNAME ... %s', [sTemp], 1);
if (sTemp <> '') and (sTemp[1] = '{') then
begin
O := SO(sTemp);
MgSvc_.AddPrtHookJob(O);
MgSvc_.SetRecentPrintDocName(O.S['DocName']);
if MgSvc_.SharePcPrintBlock then
begin
var sPrtName: String := O.S['PrtName'];
TTgTrace.T('HPCMD_PRINT_DOCNAME ... Check .. SharePcPrintBlock, PrtName=%s', [sPrtName], 2);
if sPrtName.StartsWith('\\') then
begin
msg.Result := 300;
TTgTrace.T('HPCMD_PRINT_DOCNAME ... Block, PrtName=%s', [sPrtName], 2);
MgSvc_.SendEventLog(URI_USER_ACTION, LOGCODE_PREVENT_PRINTER,
Format('Printer : %s, Document : %s, SharePC Print', [sPrtName, O.S['DocName']]));
var sLog: String := sPrtName + '|' + O.S['DocName'] + '|PV|SHARE';
if MgSvc_.ModePolicy.Print.bPopup then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_PRINTER, sLog);
end;
end;
end else
MgSvc_.SetRecentPrintDocName(sTemp);
end;
HPCMD_SELECT_FILE :
begin
// 일반권한으로 실행해서 안 지워진다.. 그래서 후처리 추가 22_0614 12:40:00 kku
sTemp := GetRunExePathDir + DIR_CONF + DAT_PARAM;
if FileExists(sTemp) then
DeleteFile(sTemp);
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
sPath := O.S['Path'];
case O.I['Ctrl'] of
1 : EncFile(sPath);
2 : DecFile(sPath);
3 :
begin
var FileList: TStringList;
Guard(FileList, TStringList.Create);
if (O.O['List'] <> nil) and (O.O['List'].DataType = stArray) then
begin
for i := 0 to O.A['List'].Length - 1 do
FileList.Add(O.A['List'].S[i]);
end else
FileList.Add(sPath);
ApprovalFileExport(FileList);
end;
end;
end;
HPCMD_CHECK_PRINTWATER_EXCEPT :
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
TTgTrace.T('프린트 워터마크 예외 확인 ... Path=%s', [sTemp]);
if MgSvc_.MgPwe.HasFileHash(sTemp) then
msg.Result := 300;
if MgSvc_.ThdPrintWork <> nil then
MgSvc_.ThdPrintWork.PrtWaterExp := msg.Result = 300;
end;
HPCMD_CHECK_PRINTWATER_EXCEPT_EX :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
var bIgrWT: Boolean := MgSvc_.IsPrtWaterExcept;
var PO: TPrefModel := MgSvc_.ModePolicy;
var PP: TPrintPolicy := PO.Print;
if PP.PrintWater <> pwNone then
begin
var StrList: TStringList;
Guard(StrList, TStringList.Create);
var sChk: String;
var sPName: String := O.S['AppName'];
if not bIgrWT and (PO.PrtWtExpUrl <> '') then
begin
SplitString(UpperCase(PO.PrtWtExpUrl), '|', StrList);
if (sPName <> '') and (Pos(LowerCase(sPName), BROWSER_LIST) > 0) and (gMgSvc.ThdWebUrl <> nil) then
begin
try
sChk := UpperCase(gMgSvc.ThdWebUrl.LastUrl);
except
// ..
end;
for i := 0 to StrList.Count - 1 do
if Pos(StrList[i], sChk) > 0 then
begin
TTgTrace.T('프린트 워터마크 예외 확인EX (URL) ... KW=%s, URL=%s', [StrList[i], sChk]);
bIgrWT := true;
break;
end;
end;
end;
if not bIgrWT and (PO.PrtWtExpDocName <> '') then
begin
SplitString(UpperCase(PO.PrtWtExpDocName), '|', StrList);
sChk := UpperCase(O.S['DocName']);
for i := 0 to StrList.Count - 1 do
if Pos(StrList[i], sChk) > 0 then
begin
TTgTrace.T('프린트 워터마크 예외 확인EX (Doc) ... KW=%s, Doc=%s', [StrList[i], sChk]);
bIgrWT := true;
break;
end;
end;
if not bIgrWT and (PO.PrtWtExpPrtName <> '') then
begin
SplitString(UpperCase(PO.PrtWtExpPrtName), '|', StrList);
sChk := UpperCase(O.S['PrtName']);
for i := 0 to StrList.Count - 1 do
if Pos(StrList[i], sChk) > 0 then
begin
TTgTrace.T('프린트 워터마크 예외 확인EX (Prt) ... KW=%s, Doc=%s', [StrList[i], sChk]);
bIgrWT := true;
break;
end;
end;
if not bIgrWT and (PO.PrtWtExpProcName <> '') then
begin
SplitString(UpperCase(PO.PrtWtExpProcName), '|', StrList);
sChk := UpperCase(sPName);
for i := 0 to StrList.Count - 1 do
if Pos(StrList[i], sChk) > 0 then
begin
TTgTrace.T('프린트 워터마크 예외 확인EX (App) ... KW=%s, Doc=%s', [StrList[i], sChk]);
bIgrWT := true;
break;
end;
end;
end else bIgrWT := true;
if bIgrWT then
begin
msg.Result := 300;
if MgSvc_.IsPrtWaterExcept then
MgSvc_.IsPrtWaterExcept := false;
end;
if MgSvc_.ThdPrintWork <> nil then
MgSvc_.ThdPrintWork.PrtWaterExp := msg.Result = 300;
end;
HPCMD_PRINT_ENDDOC_INFO :
begin
// 현재는 winword.exe만 결과가 날라옴 25_0813 14:50:25 kku
// 부수 카운트 계산을 위함
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
{$IFDEF DEBUG}
TTgTrace.T('PRINT_ENDDOC_INFO .. MdPath=%s, PrtName=%s, DrvName=%s, DevName=%s, DocName=%s, PageCnt=%d',
[O.S['MdPath'], O.S['PrtName'], O.S['DrvName'], O.S['DevName'], O.S['DocName'], O.I['PageCnt']], 10);
{$ENDIF}
if (MgSvc_ <> nil) and (MgSvc_.ThdPrintWork <> nil) then
MgSvc_.ThdPrintWork.WordPrtPage := O.I['PageCnt'];
end;
KV_SEARCH_RESULT :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
var SchResult: TSchResult := TTgJson.GetDataAsType<TSchResult>(O);
TTgTrace.T('KV_SEARCH_RESULT .. WParam = %d, nHitCnt=%d, sPath=%s, sResultStr=%s',
[msg.WParam, SchResult.nHitCnt, SchResult.sPath, SchResult.sResultStr], 10);
if (MgSvc_.ThdScanSch <> nil) and (WPARAM(MgSvc_.ThdScanSch) = msg.WParam) then
begin
if MgSvc_.ProcCampn <> nil then
begin
TTgTrace.T('KV_SEARCH_RESULT .. ProcessCampnFound', 10);
MgSvc_.ProcessCampnFound(@SchResult);
end
else
begin
TTgTrace.T('KV_SEARCH_RESULT .. ProcessPiSchFound', 10);
MgSvc_.ProcessPiSchFound(@SchResult);
end;
end else
if WPARAM(ThdCustomScanSch_) = msg.WParam then
AddFoundCttSchRst(@SchResult);
end;
KV_HOOK_PRINT :
begin
var dwPid: DWORD := StrToIntDef(Copy(PChar(pCpData.lpData), 1, pCpData.cbData), 0);
if dwPid <> 0 then
begin
if InjectModule(dwPid, GetRunExePathDir + DIR_CONF + DLL_HOOK) > 0 then
msg.Result := 200
else
msg.Result := 100
end else
msg.Result := 99;
end;
HPCMD_INSTALL_OUTLOOK_ADDIN :
begin
TTgTrace.T('Install - Outlook SecureModule');
if not IsHD and (MgSvc_ <> nil) then
MgSvc_.PopupMessage(TYPE_MSG_OUTLOOK_ADDIN_OK);
end;
HPCMD_LICENSE_AGREE :
begin
if MgSvc_ <> nil then
MgSvc_.SendAgreeInfo;
end;
HPCMD_LICENSE_DISCONN :
begin
if MgSvc_ <> nil then
MgSvc_.VulService.SetDisconnect(true, true);
end;
HPCMD_SEND_QnA_MESSAGE :
begin
if MgSvc_ <> nil then
begin
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
if sTemp <> '' then
MgSvc_.SendEventLog(URI_USER_ACTION, REQUEST_QNA, sTemp);
end;
end;
HPCMD_SEND_AFTER_REPORT :
begin
if MgSvc_ <> nil then
begin
MgSvc_.AgentModel.AfterRptDT := 0;
MgSvc_.AgentModel.Save;
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
MgSvc_.SendEventLog(URI_USER_ACTION, SYSEVT_WORKREPORT, sTemp);
end;
end;
HPCMD_REQ_CLIPBOARD_DATA :
begin
bForceCollectCB_ := false;
// bScrCapKey_ := false;
if MgSvc_ = nil then
exit;
var PO: TPrefModel := MgSvc_.ModePolicy;
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
O := SO(sTemp);
// if (O.S['Body'] = '') and (O.S['OcrBody'] = '') then
// exit;
if tUpdateLogo.Enabled then
begin
// 상시로고 업데이트 대기 상태면 바로 업데이트 되도록 조치 24_0411 14:46:28 kku
tUpdateLogo.Enabled := false;
UpdateScreenLogo;
end;
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sDevName := O.S['WinCap'];
LogInfo.sAppName := O.S['AName'];
LogInfo.sAppPath := O.S['APath'];
LogInfo.sBody := O.S['Body'];
LogInfo.sOcrBody := O.S['OcrBody'];
var hActive: HWND := O.I['AWnd'];
var sImgPath: String := O.S['ImgPath'];
var sCttResults: String := '';
var bBlock: Boolean := PO.ClipBlockKind = cbkBlock;
if FileExists(sImgPath) then
begin
if GetFileSize_path(sImgPath) <= (LONGLONG(20) * 1048576) then
begin
var sCompId: String := MgSvc_.MakeComponentId(ExtractFileName(sImgPath));
MgSvc_.SendFileNor(false, sCompId, 'printLogCollect.do', sImgPath, 0, 20, crtDelete);
LogInfo.sThumbIds := sCompId;
end;
end;
if PO.CbCF.bActive then
begin
if LogInfo.sBody <> '' then
LogInfo.OVio := MgSvc_.GetCbFoundContentToJsonObj(LogInfo.sBody, sCttResults)
else if LogInfo.sOcrBody <> '' then
LogInfo.OVio := MgSvc_.GetCbFoundContentToJsonObj(LogInfo.sOcrBody, sCttResults);
if (PO.ClipBlockKind = cbkBlock) and (LogInfo.OVio = nil) then
bBlock := false; // 검출된거 없으면 차단 안함
end;
var sMsg: String := '';
if bScrCapKey_ and PO.IsIgrScrCapKeyCB then
begin
bBlock := false;
bScrCapKey_ := false;
end;
if bBlock then
begin
if (hActive <> 0) and (CompareText('excel.exe', GetProcessNameFromWndHandle(hActive)) = 0) then
begin
// 엑셀이면 셀 선택 해제 24_0716 16:12:46 kku
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
// PressKey(VK_ESCAPE);
PostMessage(hActive, WM_KEYDOWN, VK_ESCAPE, 0);
PostMessage(hActive, WM_KEYUP, VK_ESCAPE, 0);
end;
// 클립보드가 열리지 않는 경우가 있다.
// 4초간 시도 해보는걸로 보완 22_0715 09:03:33 kku
var nTryCnt: Integer := 0;
bIsClearCB_ := true;
try
while not ClearClipboard(MgSvc_.ModePolicy.CbImgBlock) do
begin
Inc(nTryCnt);
if nTryCnt > 20 then
begin
// TTgTrace.T('Fail .. ClearClipboard()');
exit;
end;
Sleep(200);
end;
finally
bIsClearCB_ := false;
end;
end;
var dtNow: TDateTime := Now;
if (MilliSecondsBetween(dtRecentCbPopup_, dtNow) <= 1000) then
exit;
dtRecentCbPopup_ := dtNow;
if bBlock then
begin
if MgSvc_.ModePolicy.CbPopup then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_CLIPBOARD, LogInfo.sAppName + '|' + sCttResults);
if LogInfo.sAppName <> '' then
sMsg := Format('Clipboard Blocked : %s', [LogInfo.sAppName])
else
sMsg := 'Clipboard Blocked';
LogInfo.sCode := LOGCODE_PREVENT_CLIPBOARD;
end else begin
if MgSvc_.ModePolicy.CbPopup and (PO.ClipBlockKind <> cbkBlock) then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_CLIPBOARD, LogInfo.sAppName + '|M' + '|' + sCttResults);
if LogInfo.sAppName <> '' then
sMsg := Format('Clipboard : %s', [LogInfo.sAppName])
else
sMsg := 'Clipboard';
LogInfo.sCode := MONITOR_CLIPBOARD;
end;
if MgSvc_.IsNewApi then
begin
LogInfo.sSummary := sMsg;
MgSvc_.SendEventLogEx(@LogInfo);
end else
MgSvc_.SendEventLog(URI_USER_ACTION, LogInfo.sCode, sMsg);
dwBlockInputCTick_ := 0;
if KeyMonDll_ <> nil then
begin
KeyMonDll_.SetDisableKey_Ctrl(false);
KeyMonDll_.SetDisableKey_Etc(0, 0);
end;
end;
HPCMD_INPUT_EXCEPT_REASON :
begin
// 프린트 워터마크 예외 신청
sPath := GetRunExePath;
if sPath = '' then
exit;
sPath := sPath[1] + ':\ProgramData\HE\Task\bs1.$shl';
sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
if sTemp <> '' then
begin
if LoadJsonObjFromFile(O, sPath) then
begin
O.S['Reason'] := sTemp;
SaveJsonObjToFile(O, sPath);
PostMessage(Handle, WM_REQUEST_DRM, 0, 0);
end;
end else
if FileExists(sPath) then
DeleteFile(sPath);
end;
HPCMD_REQ_DEVICE_EXCEPT :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
if O.O['ReqInfo'] <> nil then
begin
var RegInfo: TReqDevExceptInfo := TTgJson.GetDataAsType<TReqDevExceptInfo>(O.O['ReqInfo']);
if MgSvc_.IsNewApi then
MgSvc_.SendRequest(LOGCODE_EVENT_USB_REQUEST, RegInfo, O.S['R'],
FormatDateTime('yyyy-mm-dd', O.D['BDT']),
FormatDateTime('yyyy-mm-dd', O.D['DT']), O.I['T'], O.S['D'])
else
MgSvc_.SendEventLog(URI_USER_ACTION, LOGCODE_EVENT_USB_REQUEST, O.S['D']);
end;
end;
HPCMD_REP_NETDIR_PROGRESS :
begin
// 네트워크 위치 파일 스캔 - 진행사항
try
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
if O.I['TKR'] = 0 then
exit;
var ThdScan: TThdSchFileScan := TThdSchFileScan(O.I['TKR']);
ThdScan.IncTotalDir(O.I['InD']);
ThdScan.IncTotalFile(O.I['InF']);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_COPYDATA(), HPCMD_REP_NETDIR_PROGRESS');
end;
end;
HPCMD_REP_NETDIR_SCANPATH :
begin
// 네트워크 위치 파일 스캔 - 대상 파일 전달
try
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
if O.I['TKR'] = 0 then
exit;
var ThdScan: TThdSchFileScan := TThdSchFileScan(O.I['TKR']);
ThdScan.AddNetFileEnt(O.S['Path']);
// TTgTrace.T('HPCMD_REP_NETDIR_SCANPATH = Path=%s', [O.S['Path']], 1);
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_COPYDATA(), HPCMD_REP_NETDIR_SCANPATH');
end;
end;
HPCMD_OPEN_ENCRYPT,
HPCMD_OPEN_DECRYPT :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
if O.B['IsEnc'] then
LogInfo.sCode := PREVENT_DRM_ENCRYPT
else
LogInfo.sCode := PREVENT_DRM_DECRYPT;
if (O.O['List'] <> nil) and (O.O['List'].DataType = stArray) then
begin
for i := 0 to O.A['List'].Length - 1 do
begin
sTemp := O.A['List'].S[i];
LogInfo.sPath := sTemp;
LogInfo.sSummary := ExtractFileName(sTemp);
gMgSvc.SendEventLogEx(@LogInfo, false);
end;
end;
end;
HPCMD_REQ_DECRYPT :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
if (O = nil) or (O.DataType <> stArray) then
begin
TTgTrace.T('Fail .. HPCMD_REQ_DECRYPT .. Invalid fileList');
exit;
end;
ApprovalFileDecrypt(O);
end;
HPCMD_HOOK_NOTI :
begin
// pipe 통신 너무 느려서 이렇게 변경, 나중에 정리 필요 25_0324 17:48:36 kku
var Rcv: IRcvPacket := TTgPacket.Create(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
case Rcv.Command of
ACC_NOTI_MSG :
begin
var m: TMessage;
ZeroMemory(@m, SizeOf(m));
m.LParam := NativeInt(Rcv);
process_WM_NOTIFY_HOOKDATA(m);
end;
end;
end;
HPCMD_FILE_OPERATION_NOTI :
begin
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
// TTgTrace.T('[HPCMD_FILE_OPERATION_NOTI] Src=%s, Dst=%s, Evt=%d, Block=%s',
// [O.S['S'], O.S['D'], O.I['E'], BooleanToStr(O.B['B'], 'Y', 'N')], 1);
// TTgTrace.T('[HPCMD_FILE_OPERATION_NOTI] Dst=%s, Evt=%d, Block=%s',
// [O.S['D'], O.I['E'], BooleanToStr(O.B['B'], 'Y', 'N')], 1);
if O.B['N'] then
begin
if O.B['B'] then
begin
LogInfo.sCode := PREVENT_NETFOLDER_FILE;
LogInfo.sSummary := '[NetFolder] Block : ';
if MgSvc_.ModePolicy.ShFileCrMon.bBlkNoti then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_FILEOPER, O.AsJSon);
end else begin
LogInfo.sCode := MONITOR_NETFOLDER_FILE;
LogInfo.sSummary := '[NetFolder] Monitor : ';
if MgSvc_.ModePolicy.ShFileCrMon.bMonNoti then
MgSvc_.PopupMessage(TYPE_MSG_MONITOR_FILEOPER, O.AsJSon);
end;
end
else
begin
var deviceType: DWORD;
deviceType:= O.I['T'];
case deviceType of
DRIVE_CDROM:
begin
if O.B['B'] then
begin
LogInfo.sCode := PREVENT_NETFOLDER_FILE;
LogInfo.sSummary := '[CDROM] Block : ';
if MgSvc_.ModePolicy.ShFileCrMon.bBlkNoti then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_FILEOPER, O.AsJSon);
end else begin
LogInfo.sCode := MONITOR_NETFOLDER_FILE;
LogInfo.sSummary := '[CDROM] Monitor : ';
if MgSvc_.ModePolicy.ShFileCrMon.bMonNoti then
MgSvc_.PopupMessage(TYPE_MSG_MONITOR_FILEOPER, O.AsJSon);
end;
end;
DRIVE_REMOVABLE:
begin
if O.B['B'] then
begin
LogInfo.sCode := PREVENT_NETFOLDER_FILE;
LogInfo.sSummary := '[REMOVABLE] Block : ';
if MgSvc_.ModePolicy.ShFileCrMon.bBlkNoti then
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_FILEOPER, O.AsJSon);
end else begin
LogInfo.sCode := MONITOR_NETFOLDER_FILE;
LogInfo.sSummary := '[REMOVABLE] Monitor : ';
if MgSvc_.ModePolicy.ShFileCrMon.bMonNoti then
MgSvc_.PopupMessage(TYPE_MSG_MONITOR_FILEOPER, O.AsJSon);
end;
end;
end;
end;
LogInfo.sSummary := LogInfo.sSummary + ExtractFileName(O.S['D']);
LogInfo.sAppName := 'explorer.exe';
LogInfo.sPath := O.S['D'];
MgSvc_.SendEventLogEx(@LogInfo, O.B['B']);
end;
HPCMD_REQ_ENCRYPT :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
MgSvc_.ThdReact.AddEnt(crtDRM, O.S['S'], O.I['D'], false, true);
end;
HPCMD_START_SCREEN_RECORD :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
TTgTrace.T('화면 녹화 시작 : %s 사용 감지됨', [O.S['RS']], 2);
if MgSvc_.ModePolicy.AppRcdNoti then
MgSvc_.PopupMessage(TYPE_MSG_APP_SCREEN_RECORD, O.S['RS']);
end;
HPCMD_STOP_SCREEN_RECORD :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
TTgTrace.T('화면 녹화 끝 : MSec=%d', [O.I['MS']], 2);
MgSvc_.SendScreenRecord(O.S['RS'], O.S['OD'], O.I['MS']);
end;
// KV_PRTWM_PROGRESS :
// begin
// sTemp := Copy(PChar(pCpData.lpData), 1, pCpData.cbData);
// var m: TMessage;
// ZeroMemory(@m, SizeOf(m));
// if sTemp = 'next' then
// begin
// m.WParam := 2;
// process_WM_POPUP_PRTW_PROGRESS(m);
// end else begin
// m.LParam := StrToIntDef(sTemp, -1);
// if m.LParam <> -1 then
// process_WM_POPUP_PRTW_PROGRESS(m);
// end;
// end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, Format('Fail .. process_WM_COPYDATA(), dwData=%d', [dwData]));
end;
end;
procedure TDlgeCrmHeMain.miPcCleanup_AllClick(Sender: TObject);
var
sDir,
sExe,
sParam: String;
begin
if Sender is TMenuItem then
begin
if MessageBox(Handle, PChar(Format('[%s] 기능을 수행하시겠습니까?',
[TMenuItem(Sender).Caption])), PChar(APP_TITLE), MB_YESNO + MB_ICONQUESTION) = IDNO then exit;
sDir := GetRunExePathDir + DIR_CONF;
case TMenuItem(Sender).Tag of
0 :
begin
end;
1 :
begin
sExe := 'BrowserDeletePermanentlyProj.exe';
sParam := '-silent -allbrowsers -history';
end;
2 :
begin
sExe := 'BrowserDeletePermanentlyProj.exe';
sParam := '-silent -allbrowsers -cache';
end;
3 :
begin
sExe := 'BrowserDeletePermanentlyProj.exe';
sParam := '-silent -allbrowsers -cookies';
end;
4 :
begin
sExe := 'BrowserAutoFormDataCleanProj.exe';
sParam := '/silent';
end;
5 :
begin
sExe := 'RecentOpenFileDeleteProj.exe';
sParam := '/silent /registerreboot';
end;
6 :
begin
sExe := 'MsOfficeAutoSavedFileDelProj.exe';
sParam := '/silent /runnow';
end;
7 :
begin
sExe := 'SafeBootBlockerProj.exe';
sParam := '/silent';
end;
end;
if FileExists(sDir + sExe) then
begin
ExecutePath_hide(sDir + sExe, sParam);
MessageBox(Handle, PChar(Format('[%s] 기능을 수행했습니다.', [TMenuItem(Sender).Caption])), PChar(APP_TITLE), MB_OK + MB_ICONINFORMATION);
end else
MessageBox(Handle, '모듈이 존재하지 않습니다.', PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
end;
end;
procedure TDlgeCrmHeMain.miPiResultClick(Sender: TObject);
begin
lbCttSchRstClick(nil);
end;
procedure TDlgeCrmHeMain.miPolicyDetailViewClick(Sender: TObject);
begin
TDlgPolicyView.Create(nil).Show;
end;
procedure TDlgeCrmHeMain.miPolicyViewClick(Sender: TObject);
begin
TDlgCurPolicyView.Create(nil).Show;
end;
procedure TDlgeCrmHeMain.miPrintCtrlClick(Sender: TObject);
begin
miSharePcPrintBlock.Checked := MgSvc_.SharePcPrintBlock;
miWSDPortPrintBlock.Checked := MgSvc_.WSDPortPrintBlock;
miTcpIpPrintBlock.Checked := MgSvc_.TcpIpPrintBlock;
miPrintSavingBlock.Checked := MgSvc_.PrintSavingBlock;
end;
procedure TDlgeCrmHeMain.miProcessTerminatePrevateClick(Sender: TObject);
begin
TTgTrace.T('miProcessTerminatePrevateClick!!');
if gBs1FltControl <> nil then
gBs1FltControl.ProcessProtect(0);
end;
procedure TDlgeCrmHeMain.miAprvFileExportClick(Sender: TObject);
var
sExe: String;
O: ISuperObject;
ProcInfo: TProcessInformation;
Label
LB_Direct;
begin
if not IsApproveSupport then
exit;
if not MgSvc_.ModePolicy.ExFApproval then
exit;
if not MgSvc_.Connected then
begin
MessageBox(Handle, PChar(RS_NoConnectServer+#13+#10+RS_WaitRetry),
PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
try
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
O := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_SELECT_FILE;
O.I['Ctrl'] := 3;
O.S['Filter'] := 'All files|*.*';
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
ProcInfo := ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
if ProcInfo.dwProcessId = 0 then
goto LB_Direct;
end else begin
LB_Direct :
OpenDialogDRM.FileName := '';
if MgSvc_.Domain <> '' then
begin
var sPath: String := 'C:\Users\' + ExtractFileName(MgSvc_.Domain) + '\Desktop';
if DirectoryExists(sPath) then
OpenDialogDRM.InitialDir := sPath;
end;
OpenDialogDRM.Filter := 'All files|*.*';
if OpenDialogDRM.Execute(Handle) then
begin
ApprovalFileExport(OpenDialogDRM.Files);
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. miEncDrmFileClick()');
end;
end;
procedure TDlgeCrmHeMain.miRecycleDelClick(Sender: TObject);
var
sWinDir, sUsersDir,
sDir, sPath, sFName: String;
DrvList, FileList, DirList, SubDirList: TStringList;
i, c, nCnt, nFail: Integer;
EntList: TRstEntList;
pEnt: PRstEnt;
dlg: TDlgProgCttSchTask;
begin
if FindWindow('TDlgProgCttSchTask', nil) <> 0 then
begin
MessageBox(Handle, '현재 작업중인 창을 닫고 다시 시도해주십시오.', PChar(APP_TITLE), MB_OK +
MB_ICONWARNING);
exit;
end;
if MessageBox(Handle, '휴지통을 완전 삭제 하시겠습니까?',
PChar(APP_TITLE), MB_YESNO + MB_ICONQUESTION) = IDNO then exit;
sWinDir := GetWindowsDir;
if sWinDir = '' then
begin
ASSERT(false);
exit;
end;
Guard(DirList, TStringList.Create);
Guard(DrvList, TStringList.Create);
Guard(SubDirList, TStringList.Create);
Guard(FileList, TStringList.Create);
sDir := GetDrivesFromMask(GetLogicalDrives);
SplitString(sDir, ',', DrvList);
for i := 0 to DrvList.Count - 1 do
begin
sDir := DrvList[i] + '$Recycle.Bin\';
if DirectoryExists(sDir) then
begin
SubDirList.Clear;
ExtrDirFromDir(sDir, SubDirList);
for c := 0 to SubDirList.Count - 1 do
begin
if DirectoryExists(sDir + SubDirList[c]) then
begin
DirList.Add(sDir + SubDirList[c]);
ExtrFilesPathFromDir(sDir + SubDirList[c], FileList, true);
end;
end;
end;
end;
if DirList.Count = 0 then
begin
MessageBox(Handle, '삭제할 휴지통 경로를 찾을 수 없습니다.', PChar(APP_TITLE), MB_OK + MB_ICONWARNING);
exit;
end;
Guard(EntList, TRstEntList.Create);
for i := 0 to FileList.Count - 1 do
begin
sPath := FileList[i];
sFName := ExtractFileName(sPath);
if CompareText(sFName, 'desktop.ini') = 0 then
continue;
New(pEnt);
ZeroMemory(pEnt, SizeOf(TRstEnt));
pEnt.sDir := ExtractFilePath(sPath);
pEnt.sFName := sFName;
EntList.Add(pEnt);
end;
if EntList.Count > 0 then
begin
Guard(dlg, TDlgProgCttSchTask.Create(Self, cstkPerDelete, EntList));
dlg.ShowModal;
nCnt := 0;
nFail := 0;
for i := 0 to EntList.Count - 1 do
begin
pEnt := EntList[i];
if pEnt.State = resDel then
Inc(nCnt)
else
Inc(nFail);
end;
end;
for i := 0 to DirList.Count - 1 do
DeleteDirSub(DirList[i], true, false, nil, true);
MessageBox(Handle, PChar(Format(RS_CompleteWork1+#13+#10+RS_CompleteWork2,
[nCnt, nFail])), PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
procedure TDlgeCrmHeMain.miReqPrintClick(Sender: TObject);
var
dlg: TDlgReqPrintList;
begin
if FindWindow('TDlgReqPrintList', nil) <> 0 then
exit;
dlg := TDlgReqPrintList.Create(nil);
dlg.Show;
end;
procedure TDlgeCrmHeMain.miResetPersonalScanClick(Sender: TObject);
begin
if MgSvc_.IsSearchingPersonalInfo then
begin
MessageBox(Handle, PChar('개인정보 검사가 진행중입니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
if MessageBox(Handle, PChar('개인정보 검사 결과를 초기화 하시겠습니까?'),
PChar(APP_TITLE), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
MgSvc_.ResetPersonalScan;
end;
procedure TDlgeCrmHeMain.miRetryPiScanClick(Sender: TObject);
begin
if not MgSvc_.IsSearchingPersonalInfo then
MgSvc_.RetryPersonalScan;
end;
procedure TDlgeCrmHeMain.process_WM_NOTIFY_HOOKDATA(var msg: TMessage);
var
sPath: String;
function GetVioInfo: ISuperObject;
var
EntList, InfoList: TStringList;
i: Integer;
REnt: TRecentFnd;
begin
Result := nil;
try
if MgSvc_.GetRecentFnd(sPath, REnt) then
begin
Guard(EntList, TStringList.Create);
SplitString(REnt.sFoundsC, RESULT_SEPARATOR, EntList);
Result := TSuperObject.Create(stArray);
var O: ISuperObject;
Guard(InfoList, TStringList.Create);
for i := 0 to EntList.Count - 1 do
begin
SplitString(EntList[i], '|', InfoList);
if InfoList.Count = 0 then
Continue;
if InfoList.Count > 2 then
begin
TTgTrace.T('[MGKIM] RULE_ID(%s), TEXT(%s), CNT(%s)', [InfoList[0], RemoveOverlapWords(InfoList[1]), InfoList[2]]);
// OutputDebugString(PChar(Format('[MGKIM] RULE_ID(%s), TEXT(%s), CNT(%s)', [InfoList[0], RemoveOverlapWords(InfoList[1]), InfoList[2]])));
O := SO;
O.S['RULE_ID'] := InfoList[0];
O.S['TEXT'] := RemoveOverlapWords(InfoList[1]);
O.S['CNT'] := InfoList[2];
Result.AsArray.Add(O);
// end
// else
// begin
// // [2] '|' 가 없거나 부족한 경우 (예: "단일텍스트" 만 들어온 경우)
// // InfoList[0]만 안전하게 사용합니다.
// TTgTrace.T('[MGKIM] NO_DELIMITER TEXT(%s)', [InfoList[0]]);
// O.S['RULE_ID'] := '휴대폰번호'; // 기본값
// O.S['TEXT'] := InfoList[0]; // 원본 텍스트 전체를 TEXT로 취급
// O.S['CNT'] := '1'; // 카운트는 빈 값
// Result.AsArray.Add(O);
end;
end;
end;
except
// ..
end;
end;
function GetFileExtractResultInfo: string;
var
REnt: TRecentFnd;
begin
Result := '';
try
if MgSvc_.GetRecentFnd(sPath, REnt) then
begin
if Pos(RESULT_SEPARATOR, REnt.sFoundsC) = 0 then
begin
TTgTrace.T('[MGKIM] GetFileExtractResultInfo.. sFoundsC(%s)', [REnt.sFoundsC]);
Result:= REnt.sFoundsC;
end;
end;
except
// ..
end;
end;
var
dwType, dwPid: DWORD;
O: ISuperObject;
sPName,
sWebTitle, sTemp,
sMsg, sCode: String;
bPrevent, bLog,
bPopup, bCollectTxt, bCollectFile: Boolean;
Rcv: IRcvPacket;
PO: TPrefModel;
nMinMB, nLimitMB, nFType: Integer;
llSize: LONGLONG;
i: Integer;
FDeviceName: string;
begin
try
// TTgTrace.T('process_WM_NOTIFY_HOOKDATA .. 1');
Rcv := IRcvPacket(msg.LParam);
sPName := Rcv.S['MdName'];
sPath := Rcv.S['FPath'];
nFType := Rcv.I['FType']; // 0 : 없는 파일, 1: 존재 파일, 2 : 네트워크 파일, 3 : 특수 경로 파일
dwPid := Rcv.I['PID'];
FDeviceName := Rcv.S['FDeviceName'];
// WebEx에서는 첨부 파일 접근이 지속적으로 반복되서 로그가 중복되는 현상이 있다.
// 아래처럼 방지 처리
if FileAbLogs_.Count > 0 then
begin
for i := FileAbLogs_.Count - 1 downto 0 do
begin
if (GetTickCount - DWORD(FileAbLogs_.Objects[i])) > 5000 then
FileAbLogs_.Delete(i);
end;
end;
if CompareText(sPName, 'CiscoCollabHost.exe') = 0 then
begin
for i := 0 to FileAbLogs_.Count - 1 do
begin
if (CompareText(FileAbLogs_[i], sPath) = 0) and
((GetTickCount - DWORD(FileAbLogs_.Objects[i])) <= 5000) then exit;
end;
FileAbLogs_.AddObject(sPath, TObject(GetTickCount));
end;
// -----------------------------------------------------------------------------
if CompareText(sPName, 'msedgewebview2.exe') = 0 then
begin
// 부모 프로세스 이름도 포함
var dwPPid: DWORD := GetProcessPPidByPid(dwPid);
if dwPPid <> 0 then
begin
var sPPName: String := GetProcessNameByPid(dwPPid);
if sPPName <> '' then
sPName := Format('%s > %s', [sPPName, sPName]);
end;
end;
// TTgTrace.T('process_WM_NOTIFY_HOOKDATA .. 2');
// 연속으로 처리되는 현상 개선 23_1205 13:39:04 kku
if sPath = sRecentABFile_ then
begin
if (GetTickCount - dwRecentAB_) < 15000 then
exit;
dwRecentAB_ := GetTickCount;
end else begin
sRecentABFile_ := sPath;
dwRecentAB_ := GetTickCount;
end;
O := SO;
O.S['PName'] := sPName;
O.S['Path'] := sPath;
if MutexExists('Global\' + StringReplace(sPName + '|' + sPath, '\', '', [rfReplaceAll])) then
exit;
// TTgTrace.T('process_WM_NOTIFY_HOOKDATA .. 3');
sMsg := '';
sCode := '';
sWebTitle := '';
bPrevent := false;
bLog := true;
bPopup := false;
bCollectTxt := false;
bCollectFile := false;
try
PO := MgSvc_.ModePolicy;
if (sLastNotExistFile_ <> '') and (CompareText(sLastNotExistFile_, sPath) = 0) then
begin
// 최근 체크한 파일이 없는 파일이고, 지금 처리하려는 파일명과 동일하고, 다운로드 차단이 OFF 면무시
// WebEx (CiscoCollabHost.exe)에서 다운로드 동작 시 이렇게 동작해서 무시하기 위해 추가 25_0508 15:30:16 kku
case TCurAppType(Rcv.I['Info']) of
catOutlook : if not PO.OutlookAB.bWriteBlock then exit;
catWebb : if not PO.WebbAB.bWriteBlock then exit;
else if not PO.EtcAB.bWriteBlock then exit;
end;
end;
if TCurAppType(Rcv.I['Info']) = catWebb then
begin
if CUSTOMER_TYPE = CUSTOMER_WINSTN then
begin
// 특정 PC에서 c:\.png 이런 형식의 오탐 무시 (5512) 25_1209 16:22:05 kku
sTemp := ExtractFileName(sPath);
if (sTemp <> '') and (sTemp[1] = '.') and (ExtractFileName(sPath).Length < 5) then
exit;
end;
if Rcv.I['Noti'] = NOTI_HOOK_BLOCK_ATTACH then
begin
var sTmName: String := ExtractFileName(sPath.ToLower);
if (sTmName = 'zone.identifier') or sTmName.EndsWith(':zone.identifier') then // ADS 파일로 인식되는건 무시
exit;
// 브라우저 파일 차단에서 exe 실행 시 첨부 차단으로 팝업되는 현상 확인, 무시 (5546) 25_1215 15:19:33 kku
// if sTmName.StartsWith('mxxod') and sTmName.EndsWith('.exe') then
if sTmName.EndsWith('.exe') then
exit;
end;
end;
nMinMB := 0;
nLimitMB := 20;
case Rcv.I['Noti'] of
// NOTI_HOOK_MONITOR_PRINT_WATER : dwType := TYPE_MSG_EVENT_PRINTWATER; // 사용하지 않음 22_1025 18:01:15 kku
NOTI_HOOK_MONITOR_ATTACH :
begin
case TCurAppType(Rcv.I['Info']) of
catOutlook :
begin
nMinMB := PO.OutABMinMB;
nLimitMB := PO.OutABLimitMB;
if PO.OutlookAB.bPopup then
begin
O.B['M'] := true;
// bPopup := true;
bPopup := PO.OutlookAB.Kind = abkLog; // true; // 차단만 알림 팝업되도록 기능 수정 24_0820 14:32:50 kku
end;
bCollectTxt := PO.OutlookAB.bCollectTxt;
bCollectFile := PO.OutlookAB.bCollectFile;
sCode := MONITOR_OUTLOOK_ATTACH;
sMsg := Format('Process : %s, Path : %s', [sPName, sPath]);
end;
catWebb :
begin
nMinMB := PO.WebABMinMB;
nLimitMB := PO.WebABLimitMB;
var sUrl: String := '';
if (MgSvc_ <> nil) and (MgSvc_.ThdWebUrl <> nil) then
begin
sUrl := MgSvc_.ThdWebUrl.LastUrl;
sWebTitle := MgSvc_.ThdWebUrl.LastTitle;
end;
if (Length(sUrl) < 2) or (sUrl[2] = ':') then
exit;
// todo : "PO.WebbAB.bLogOnly" 알림 세부 정책 추가 시 삭제해야함 23_0403 13:59:37 kku
if IsDivPopup then
begin
// 공통 적용 전까지 이렇게 사용 25_0701 15:38:26 kku
if PO.WebAAllowNoti then
begin
O.B['M'] := true;
bPopup := true;
end;
end else begin
if PO.WebbAB.bPopup then
begin
O.B['M'] := true;
// bPopup := true;
bPopup := PO.WebbAB.Kind = abkLog; // true; // 차단만 알림 팝업되도록 기능 수정 24_0820 14:32:50 kku
end;
end;
case nFType of
0 :
if PO.WebbAB.bWriteBlock then
begin
bLog := PO.WebbAB.bDlAllowLog;
bCollectTxt := PO.WebbAB.bDlColAllowTxt;
bCollectFile := PO.WebbAB.bDlColAllowFile;
sCode := MONITOR_WEB_DOWNLOAD;
end;
1 :
if PO.WebbAB.bReadBlock then
begin
bLog := PO.WebbAB.bUpAllowLog;
bCollectTxt := PO.WebbAB.bUpColAllowTxt;
bCollectFile := PO.WebbAB.bUpColAllowFile;
sCode := MONITOR_WEB_ATTACH;
end;
2 :
begin
bLog := PO.WebbAB.bUpBlockLog;
if FileExists(sPath) then
sCode := MONITOR_WEB_ATTACH
else
sCode := MONITOR_WEB_DOWNLOAD;
end;
else
begin
TTgTrace.T('process_WM_NOTIFY_HOOKDATA() .. FType=%d, Path=%s', [nFType, sPath]);
exit;
end;
end;
if not bLog then
begin
sTemp := PO.WebABLogUrlList;
if sTemp <> '' then
begin
// 허용 로그 남겨야 하는 URL인지 체크 25_0529 15:54:16 kku
var sChk: String := UpperCase(sUrl);
var ExpList: TStringList;
Guard(ExpList, TStringList.Create);
SplitString(UpperCase(sTemp), '|', ExpList);
for i := 0 to ExpList.Count - 1 do
begin
if Pos(ExpList[i], sChk) > 0 then
begin
bLog := true;
break;
end;
end;
end;
end;
// sCode := MONITOR_WEB_ATTACH_UPDOWN;
if sRecentBwUrl_ = '' then
sRecentBwUrl_ := MgSvc_.ThdWebUrl.LastUrl;
if sRecentBwUrl_ <> '' then
sMsg := Format('Process : %s, Path : %s, URL : %s', [sPName, sPath, sRecentBwUrl_])
else
sMsg := Format('Process : %s, Path : %s', [sPName, sPath]);
end;
else begin
// if (PO.EtcAB.Kind <> abkLog) and not PO.IsAllowLogAppAB then
// exit;
nMinMB := PO.AppABMinMB;
nLimitMB := PO.AppABLimitMB;
if IsDivPopup then
begin
// 공통 적용 전까지 이렇게 사용 25_0701 15:38:26 kku
if PO.AppAAllowNoti then
begin
O.B['M'] := true;
bPopup := true;
end;
end else begin
if PO.EtcAB.bPopup then
begin
O.B['M'] := true;
// bPopup := true;
bPopup := PO.EtcAB.Kind = abkLog; // true; // 차단만 알림 팝업되도록 기능 수정 24_0820 14:32:50 kku
end;
end;
if (Pos('>', sPName) > 0) or (GetFileExt(sPath).ToUpper = 'CRSWAP') then
begin
// new 아웃룩 다운로드 시도 감지 25_0923 14:19:40 kku
if FileExists(CutFileExt(sPath)) then
nFType := 0;
end;
case nFType of
0 :
if PO.EtcAB.bWriteBlock then
begin
bLog := PO.EtcAB.bDlAllowLog;
bCollectTxt := PO.EtcAB.bDlColAllowTxt;
bCollectFile := PO.EtcAB.bDlColAllowFile;
sCode := MONITOR_PROCESS_DOWNLOAD;
end;
1 :
if PO.EtcAB.bReadBlock then
begin
bLog := PO.EtcAB.bUpAllowLog;
bCollectTxt := PO.EtcAB.bUpColAllowTxt;
bCollectFile := PO.EtcAB.bUpColAllowFile;
sCode := MONITOR_PROCESS_ATTACH;
end;
2 :
begin
bLog := PO.EtcAB.bUpBlockLog;
if FileExists(sPath) then
sCode := MONITOR_PROCESS_ATTACH
else
sCode := MONITOR_PROCESS_DOWNLOAD;
end;
else
begin
TTgTrace.T('process_WM_NOTIFY_HOOKDATA() .. FType=%d, Path=%s', [nFType, sPath]);
exit;
end;
end;
if not bLog then
begin
sTemp := PO.EtcAbLogList;
if sTemp <> '' then
begin
// 허용 로그 남겨야 하는 URL인지 체크 25_0529 15:54:16 kku
var sChk: String := UpperCase(sPName);
var ExpList: TStringList;
Guard(ExpList, TStringList.Create);
SplitString(UpperCase(sTemp), '|', ExpList);
for i := 0 to ExpList.Count - 1 do
begin
if Pos(ExpList[i], sChk) > 0 then
begin
bLog := true;
break;
end;
end;
end;
end;
// sCode := MONITOR_PROCESS_ATTACH_UPDOWN;
if FDeviceName <> '' then
sMsg := Format('[%s] Process : %s, Path : %s', [FDeviceName, sPName, sPath])
else
sMsg := Format('Process : %s, Path : %s', [sPName, sPath]);
end;
end;
if MgSvc_.IsNewApi then
begin
var LogInfo: TLogInfo;
var FileExtractResultInfo: string;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
FileExtractResultInfo := GetFileExtractResultInfo;
LogInfo.sCode := sCode;
if FileExtractResultInfo <> '' then
LogInfo.sSummary := LogInfo.sSummary + sMsg + ' ErrorCode : ' + FileExtractResultInfo
else
LogInfo.sSummary := sMsg;
LogInfo.sAppName := sPName;
LogInfo.sPath := sPath;
LogInfo.OVio := GetVioInfo;
if sWebTitle <> '' then
LogInfo.sDevName := sWebTitle;
if bCollectTxt then
LogInfo.sBody := ExtrTextFromFile(sPath);
if (TCurAppType(Rcv.I['Info']) = catWebb) and (sRecentBwUrl_ <> '') then
begin
LogInfo.sDestIpUrl := sRecentBwUrl_;
O.S['URL'] := LogInfo.sDestIpUrl;
sRecentBwUrl_ := '';
end;
// 열기 감지 조건이 추가되면 지연 팝업 사용할 필요 없음 25_0228 10:13:00 kku
if not MgSvc_.PrefModel.OpenDetect then
begin
if (TCurAppType(Rcv.I['Info']) = catWebb) and
ThdWebOC_.AddEnt(@LogInfo, bPrevent, bLog, bPopup, bCollectTxt, bCollectFile, nMinMB, nLimitMB, O.AsJSon) then exit;
end;
if bCollectFile then
begin
llSize := GetFileSize_path(sPath);
if (llSize >= (LONGLONG(nMinMB) * 1048576)) and (llSize <= (LONGLONG(nLimitMB) * 1048576)) then
begin
LogInfo.sFileCompId := MgSvc_.MakeComponentId(sPath);
MgSvc_.SendFile(LogInfo, 'quarantineLogCollect.do', sPath, nMinMB, nLimitMB);
end;
end;
if bLog then
MgSvc_.SendEventLogEx(@LogInfo, bPrevent);
// 첨부 후 대상 파일 암호화... 막음 24_0710 10:39:05 kku
// if CUSTOMER_TYPE = CUSTOMER_TMAP then
// MgSvc_.ThdResp.AddEnt(crtDRM, sPath);
end else
MgSvc_.SendEventLog(URI_USER_ACTION, sCode, sMsg, bPrevent);
dwType := TYPE_MSG_PREVENT_ATTACHFILE;
end;
NOTI_HOOK_BLOCK_ATTACH :
begin
// 파일 모니터링의 경우 연속적으로 사용이 발생할 수 있어서
// 1.5초 동안 같은 파일은 거른다 22_1031 13:24:37 kku
if (sChkAbMon_ = Rcv.S['FPath']) and
((GetTickCount - dwChkAbMon_) < 1500) then exit;
dwChkAbMon_ := GetTickCount;
sChkAbMon_ := Rcv.S['FPath'];
bPrevent := true;
nLimitMB := 20;
case TCurAppType(Rcv.I['Info']) of
catOutlook :
begin
nMinMB := PO.OutABMinMB;
nLimitMB := PO.OutABLimitMB;
sCode := PREVENT_OUTLOOK_ATTACH;
sMsg := Format('Process : %s, Path : %s', [sPName, sPath]);
bCollectTxt := PO.OutlookAB.bCollectTxt;
bCollectFile := PO.OutlookAB.bCollectFile;
bPopup := true;
end;
catWebb :
begin
nMinMB := PO.WebABMinMB;
nLimitMB := PO.WebABLimitMB;
// sCode := PREVENT_WEB_ATTACH_UPDOWN;
if PO.WebbAB.bReadBlock and not PO.WebbAB.bWriteBlock then
begin
var sChk: String := sPath.ToUpper;
var sExt: String := GetFileExt(sChk);
var sFName: String := ExtractFileName(sChk);
// 브라우저에서 다운로드 할때 .crdownload 파일 읽기차단 되는거 로그/팝업 거르기 24_0123 08:59:30 kku
if GetFileExt(sChk) = 'CRDOWNLOAD' then
exit;
if (sExt = 'TMP') and (CountStr(sFName, '-') = 4) then
exit;
end;
var sUrl: String := '';
if (MgSvc_ <> nil) and (MgSvc_.ThdWebUrl <> nil) then
begin
sUrl := MgSvc_.ThdWebUrl.LastUrl;
sWebTitle := MgSvc_.ThdWebUrl.LastTitle;
end;
if (sRecentBwUrl_ = '') and (sUrl <> '') then
sRecentBwUrl_ := MgSvc_.ThdWebUrl.LastUrl;
if sRecentBwUrl_ <> '' then
sMsg := Format('Process : %s, Path : %s, URL : %s', [sPName, sPath, sRecentBwUrl_])
else
sMsg := Format('Process : %s, Path : %s', [sPName, sPath]);
case nFType of
0 :
if PO.WebbAB.bWriteBlock then
begin
bLog := PO.WebbAB.bDlBlockLog;
bCollectTxt := false;
bCollectFile := false;
sCode := PREVENT_WEB_DOWNLOAD;
end;
1 :
if PO.WebbAB.bReadBlock then
begin
bLog := PO.WebbAB.bUpBlockLog;
bCollectTxt := PO.WebbAB.bUpColBlockTxt;
bCollectFile := PO.WebbAB.bUpColBlockFile;
sCode := PREVENT_WEB_ATTACH;
end;
2 :
begin
bLog := PO.WebbAB.bUpBlockLog;
if FileExists(sPath) then
sCode := PREVENT_WEB_ATTACH
else
sCode := PREVENT_WEB_DOWNLOAD;
end;
else
begin
TTgTrace.T('process_WM_NOTIFY_HOOKDATA() .. FType=%d, Path=%s', [nFType, sPath]);
exit;
end;
end;
// bCollectTxt := PO.WebbAB.bCollectTxt;
// bCollectFile := PO.WebbAB.bCollectFile and not PO.IsIgrCollectCutWebAB;
bPopup := PO.WebbAB.bPopup;
end;
else begin
if CompareText('wechat.exe', sPName) = 0 then
begin
// 위챗은 첨부 시 전송 다열로그가 뜨는데 훅으로 차단을 해도 이 다열로그를 통해서 전송이 된다.
// 다열로그 찾아서 닫도록 보완 25_0409 15:07:35 kku
var h: HWND := FindWindow('DragAttachWnd', nil);
if h <> 0 then
PostMessage(h, WM_CLOSE, 0, 0);
end;
nMinMB := PO.AppABMinMB;
nLimitMB := PO.AppABLimitMB;
// sCode := PREVENT_PROCESS_ATTACH_UPDOWN;
if FDeviceName <> '' then
sMsg := Format('[%s] Process : %s, Path : %s', [FDeviceName, sPName, sPath])
else
sMsg := Format('Process : %s, Path : %s', [sPName, sPath]);
if (Pos('>', sPName) > 0) or (GetFileExt(sPath).ToUpper = 'CRSWAP') then
begin
// new 아웃룩 다운로드 시도 감지 25_0923 14:19:40 kku
if FileExists(CutFileExt(sPath)) then
nFType := 0;
end;
case nFType of
0 :
if PO.EtcAB.bWriteBlock then
begin
bLog := PO.EtcAB.bDlBlockLog;
bCollectTxt := false;
bCollectFile := false;
sCode := PREVENT_PROCESS_DOWNLOAD;
end;
1 :
if PO.EtcAB.bReadBlock then
begin
bLog := PO.EtcAB.bUpBlockLog;
bCollectTxt := PO.EtcAB.bUpColBlockTxt;
bCollectFile := PO.EtcAB.bUpColBlockFile;
sCode := PREVENT_PROCESS_ATTACH;
end;
2 :
begin
bLog := PO.EtcAB.bUpBlockLog;
if FileExists(sPath) then
sCode := PREVENT_PROCESS_ATTACH
else
sCode := PREVENT_PROCESS_DOWNLOAD;
end;
else
begin
TTgTrace.T('process_WM_NOTIFY_HOOKDATA() .. FType=%d, Path=%s', [nFType, sPath]);
exit;
end;
end;
// bCollectTxt := PO.EtcAB.bCollectTxt;
// bCollectFile := PO.EtcAB.bCollectFile and not PO.IsIgrCollectCutAppAB;
bPopup := PO.EtcAB.bPopup;
end;
end;
if MgSvc_.IsNewApi then
begin
var LogInfo: TLogInfo;
var FileExtractResultInfo: string;
FileExtractResultInfo := GetFileExtractResultInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := sCode;
if FileExtractResultInfo <> '' then
LogInfo.sSummary := LogInfo.sSummary + sMsg + ' Error:' + FileExtractResultInfo
else
LogInfo.sSummary := sMsg;
LogInfo.sAppName := sPName;
LogInfo.sPath := sPath;
LogInfo.OVio := GetVioInfo;
if sWebTitle <> '' then
LogInfo.sDevName := sWebTitle;
if (TCurAppType(Rcv.I['Info']) = catWebb) and (sRecentBwUrl_ <> '') then
begin
LogInfo.sDestIpUrl := sRecentBwUrl_;
O.S['URL'] := LogInfo.sDestIpUrl;
sRecentBwUrl_ := '';
end;
// 열기 감지 조건이 추가되면 지연 팝업 사용할 필요 없음 25_0228 10:13:00 kku
if not MgSvc_.PrefModel.OpenDetect then
begin
if (TCurAppType(Rcv.I['Info']) = catWebb) and
ThdWebOC_.AddEnt(@LogInfo, bPrevent, bLog, bPopup, bCollectTxt, bCollectFile, nMinMB, nLimitMB, O.AsJSon) then exit;
end;
if bCollectTxt then
begin
if Pos(GetFileExt(sPath).ToUpper, OCR_IMG_EXTS) > 0 then
LogInfo.sOcrBody := ExtrTextFromFile(sPath)
else
LogInfo.sBody := ExtrTextFromFile(sPath);
end;
if bCollectFile then
begin
llSize := GetFileSize_path(sPath);
if (llSize >= (LONGLONG(nMinMB) * 1048576)) and (llSize <= (LONGLONG(nLimitMB) * 1048576)) then
begin
LogInfo.sFileCompId := MgSvc_.MakeComponentId(sPath);
MgSvc_.SendFile(LogInfo, 'quarantineLogCollect.do', sPath, nMinMB, nLimitMB);
end;
end;
if bLog then
MgSvc_.SendEventLogEx(@LogInfo, bPrevent);
end else
MgSvc_.SendEventLog(URI_USER_ACTION, sCode, sMsg, bPrevent);
dwType := TYPE_MSG_PREVENT_ATTACHFILE;
end;
NOTI_HOOK_OPEN_DRM :
begin
dwType := TYPE_MSG_EVENT_DRM_OPEN;
bPopup := IsDrmOpenPopup and not gMgSvc.PrefModel.DrmPopupNo;
var sChk: String := sPath.ToUpper;
if (Pos('\CONTENT.MSO\', sChk) > 0) or
(Pos('\TEMP\HNC\LOCALFILE\', sChk) > 0) then // MS, hwp 파일을 공유 폴더에서 열기 하면 여기에 임시 파일을 생성함 25_0226 09:22:53 kku
bPopup := false
else begin
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := MONITOR_DRM_OPEN;
LogInfo.sSummary := Format('Process : %s, DocName : %s', [sPName, sPath]);
LogInfo.sAppName := sPName;
LogInfo.sPath := sPath;
if gMgSvc.IsNewApi then
gMgSvc.SendEventLogEx(@LogInfo, false)
else
gMgSvc.SendEventLog(URI_USER_ACTION, MONITOR_DRM_OPEN, Format('Process : %s, DocName : %s', [sPName, sPath]), false)
end;
end;
NOTI_HOOK_OPEN_DOC :
begin
// 열람 감지 변경으로 일단 사용하지 않음 25_1216 09:57:31 kku
TTgTrace.T('문서 열람 감지 : Process=%s, Doc=%s', [sPName, sPath], 1);
PO := MgSvc_.ModePolicy;
if (PO.FileMon.Kind <> fmkNone) and PO.FileOpenMon then
begin
if (Pos(GetFileExt(sPath).ToUpper, UpperCase(PO.FileMon.sExts)) > 0) and
MgSvc_.AddOpenDoc(dwPid, sPath) then
begin
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := LOGCODE_PREVENT_FILEMONITOR;
LogInfo.sSummary := Format('[Open] %s', [sPath]);
LogInfo.sAppName := sPName;
LogInfo.sPath := sPath;
if gMgSvc.IsNewApi then
gMgSvc.SendEventLogEx(@LogInfo, false);
if MgSvc_.ModePolicy.FileMon.IsNoti then
gMgSvc.PopupMessage(TYPE_MSG_PREVENT_FILECHANGE, LogInfo.sSummary);
end;
end;
end;
// NOTI_HOOK_PRINT_API_START_INIT :
// begin
// TTgTrace.T('PrintAPI-Init .. PID=%d', [dwPid], 1);
// end;
NOTI_HOOK_OPEN_DRM_NO_MODIFY :
begin
dwType := TYPE_MSG_EVENT_DRM_OPEN_NO_MODIFY;
bPopup := IsDrmOpenPopup and not gMgSvc.PrefModel.DrmPopupNo;
var sChk: String := sPath.ToUpper;
if (Pos('\CONTENT.MSO\', sChk) > 0) or
(Pos('\TEMP\HNC\LOCALFILE\', sChk) > 0) then // MS, hwp 파일을 공유 폴더에서 열기 하면 여기에 임시 파일을 생성함 25_0226 09:22:53 kku
bPopup := false
else begin
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := MONITOR_DRM_OPEN;
LogInfo.sSummary := Format('Process : %s, DocName : %s', [sPName, sPath]);
LogInfo.sAppName := sPName;
LogInfo.sPath := sPath;
if gMgSvc.IsNewApi then
gMgSvc.SendEventLogEx(@LogInfo, false)
else
gMgSvc.SendEventLog(URI_USER_ACTION, MONITOR_DRM_OPEN, Format('Process : %s, DocName : %s', [sPName, sPath]), false)
end;
end;
NOTI_HOOK_BLOCK_DRM :
begin
dwType := TYPE_MSG_EVENT_DRM_BLOCK;
bPopup := true;
end;
NOTI_HOOK_BLOCK_DRM_CT :
begin
dwType := TYPE_MSG_EVENT_DRM_BLOCK_CT;
bPopup := true;
end;
NOTI_HOOK_BLOCK_MTP_WRITE :
begin
var LogInfo: TLogInfo;
ZeroMemory(@LogInfo, SizeOf(LogInfo));
LogInfo.sCode := LOGCODE_PREVENT_MTP;
LogInfo.sSummary := 'MTP - Block file writes';
LogInfo.sAppName := sPName;
// LogInfo.sPath := sPath;
LogInfo.sDevSerial := sPath;
MgSvc_.SendEventLogEx(@LogInfo, bPrevent);
dwType := TYPE_MSG_MTP_WRITE_BLOCK;
bPopup := false; // MgSvc_.ModePolicy.MTPPopup;
end;
else
begin
TTgTrace.T('process_WM_NOTIFY_HOOKDATA() .. Unknown=%d', [msg.WParam]);
exit;
end;
end;
if bPopup then
MgSvc_.PopupMessage(dwType, O.AsJSon);
finally
sLastNotExistFile_ := '';
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_NOTIFY_HOOKDATA()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_REQ_AGENT_UNINSTALL(var msg: TMessage);
begin
DoAgentUninstall;
end;
procedure TDlgeCrmHeMain.process_WM_INIT_HLEPER(var msg: TMessage);
begin
try
case msg.WParam of
HLP_ROLE_WINDOWS_UPDATE_SCAN :
begin
if MgSvc_.ThdOsUpdateScan <> nil then
MgSvc_.ThdOsUpdateScan.RcvWnd := msg.LParam
end;
HPCMD_REQ_NETDIR_SCAN :
begin
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_INIT_HLEPER()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_RESPONSE_HLEPER(var msg: TMessage);
begin
try
case msg.WParam of
HLP_ROLE_WINDOWS_UPDATE_SCAN : MgSvc_.SetPatchUpdate(msg.LParam = 0);
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_RESPONSE_HLEPER()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_REQUEST_DRM(var msg: TMessage);
var
sPath, sExe, sParam: String;
O: ISuperObject;
i: Integer;
PO: TPrefModel;
begin
try
TTgTrace.T('process_WM_REQUEST_DRM() ..');
sPath := GetRunExePath;
if sPath = '' then
exit;
sPath := sPath[1] + ':\ProgramData\HE\Task\bs1.$shl';
if LoadJsonObjFromFile(O, sPath) then
begin
DeleteFile(sPath);
if (O.O['Files'] = nil) or (O.O['Files'].DataType <> stArray) then
begin
TTgTrace.T('process_WM_REQUEST_DRM() .. Invalid Files ..');
exit;
end;
if O.A['Files'].Length = 0 then
begin
TTgTrace.T('process_WM_REQUEST_DRM() .. Empty ..');
exit;
end;
case O.I['Cmd'] of
1 :
begin
TTgTrace.T('process_WM_REQUEST_DRM() .. Encrypt ..');
if NotUseDRM then
exit;
if CUSTOMER_TYPE = CUSTOMER_BLUECORNER then
begin
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
PO := MgSvc_.ModePolicy;
var OA: ISuperObject := O.O['Files'];
O := SO;
O.I['Cmd'] := HPCMD_OPEN_ENCRYPT;
O.S['WinCap'] := APP_TITLE;
O.I['RcvWnd'] := Handle;
O.I['CT'] := CUSTOMER_TYPE;
O.S['UName'] := MgSvc_.UName;
O.S['Dept'] := MgSvc_.DeptName;
if O.S['Dept'] = '' then
O.S['Dept'] := PO.DeptName;
O.S['EN'] := MgSvc_.EmpNo;
O.S['PON'] := PO.PolicyName;
O.O['Files'] := OA;
sParam := GetRunExePathDir + DIR_CONF + DAT_PARAM;
SaveJsonObjToFile(O, sParam);
{$IFDEF DEBUG}
ExecutePath(sExe, Format('/p "%s"', [sParam]));
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
// DeleteFile(sParam);
end;
end else begin
if MessageBox(0, PChar(RS_Q_DRMENC),
PChar(APP_TITLE), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
var pEnt: PRstEnt;
var TgFList: TRstEntList;
Guard(TgFList, TRstEntList.Create);
for i := 0 to O.A['Files'].Length - 1 do
begin
New(pEnt);
pEnt.sFName := ExtractFileName(O.A['Files'].S[i]);
pEnt.sDir := ExtractFilePath(O.A['Files'].S[i]);
TgFList.Add(pEnt);
end;
var dlg: TDlgProgCttSchTask;
Guard(dlg, TDlgProgCttSchTask.Create(nil, cstkEnc, TgFList));
dlg.ShowModal;
end;
end;
2 :
begin
if NotUseDRM then
exit;
if not MgSvc_.ModePolicy.IsDrmDecrypt then
begin
MessageBox(0, PChar(RS_NoAuth), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
TTgTrace.T('process_WM_REQUEST_DRM() .. Decrypt ..');
// if CUSTOMER_TYPE = CUSTOMER_BLUECORNER then
begin
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
PO := MgSvc_.ModePolicy;
var OA: ISuperObject := O.O['Files'];
O := SO;
O.I['Cmd'] := HPCMD_OPEN_DECRYPT;
O.S['WinCap'] := APP_TITLE;
O.I['RcvWnd'] := Handle;
O.I['CT'] := CUSTOMER_TYPE;
O.S['UName'] := MgSvc_.UName;
O.S['Dept'] := MgSvc_.DeptName;
if O.S['Dept'] = '' then
O.S['Dept'] := PO.DeptName;
O.S['EN'] := MgSvc_.EmpNo;
O.S['PON'] := PO.PolicyName;
O.B['AVAL'] := IsApproveSupport and gMgSvc.ModePolicy.DrmApproval;
O.O['Files'] := OA;
sParam := GetRunExePathDir + DIR_CONF + DAT_PARAM;
SaveJsonObjToFile(O, sParam);
{$IFDEF DEBUG}
ExecutePath(sExe, Format('/p "%s"', [sParam]));
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
// DeleteFile(sParam);
end;
end;
// else begin
// var DrmList: TStringList;
// Guard(DrmList, TStringList.Create);
// for i := 0 to O.A['Files'].Length - 1 do
// DrmList.Add(O.A['Files'].S[i]);
//
// var dlg: TDlgDecryptDrm := TDlgDecryptDrm.Create(nil);
// dlg.AddFiles(DrmList);
// dlg.Show;
// end;
end;
3 :
begin
if O.S['Reason'] = '' then
begin
TTgTrace.T('process_WM_REQUEST_DRM() .. ReqExcept PrintWater .. 1');
SaveJsonObjToFile(O, sPath);
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
O := SO;
O.I['RcvWnd'] := Handle;
O.I['Cmd'] := HPCMD_INPUT_EXCEPT_REASON;
O.S['WinCap'] := APP_TITLE;
O.S['Title'] := RS_ExpPrtWater;
O.S['Desc'] := RS_MsgExpPrtWater;
O.S['BtnOk'] := RS_OK;
SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM);
{$IFDEF DEBUG}
ExecutePath(sExe);
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
end;
exit;
end else begin
TTgTrace.T('process_WM_REQUEST_DRM() .. ReqExcept PrintWater .. 2');
var dtCreate, dtModify, dtAccess: TDateTime;
var OA: ISuperObject := TSuperObject.Create(stArray);
var OFile: ISuperObject;
for i := 0 to O.A['Files'].Length - 1 do
begin
sPath := O.A['Files'].S[i];
TTgTrace.T('프린트 워터마크 예외 등록중 .. Path=%s', [sPath], 3);
if MgSvc_.MgPwe.AddFileHash(sPath) then
begin
TTgTrace.T('프린트 워터마크 예외 등록 성공 .. Path=%s', [sPath], 3);
OFile := SO;
OFile.S['DOCNAME'] := ExtractFileName(sPath);
OFile.S['DOCPATH'] := ExtractFilePath(sPath);
OFile.S['DOCSIZE'] := IntToStr(GetFileSize_path(sPath));
if GetFileDateTime_Local(sPath, dtCreate, dtModify, dtAccess) then
OFile.S['DOCDATE'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', dtModify)
else
OFile.S['DOCDATE'] := '2000-12-31 12:00:00';
OA.AsArray.Add(OFile)
end else
TTgTrace.T('프린트 워터마크 예외 등록 실패 .. Path=%s, Count=%d', [sPath, MgSvc_.MgPwe.CountHash], 3);
end;
MgSvc_.MgPwe.Save;
if OA.AsArray.Length > 0 then
begin
var ExptInfo: TReqDevExceptInfo;
ZeroMemory(@ExptInfo, SizeOf(ExptInfo));
ExptInfo.ReqDevType := rdtPrintWater;
ExptInfo.sDevName := OA.AsString;
gMgSvc.SendRequest('', ExptInfo, O.S['Reason'], '', '', 0, 'Request PrintWater Except.');
MessageBox(Handle, PChar(Format('%d개의 파일이 예외 등록되었습니다.',
[OA.AsArray.Length])), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
end;
end;
end;
4 : // SC DRM -> AIP
begin
if O.A['Files'].Length = 0 then
exit;
sPath := O.A['Files'].S[0];
if not FileExists(sPath) then
exit;
case DSCheckDSAgent of
0 :
begin
MessageBox(Handle, PChar('소프트캠프 클라이언트가 실행되어 있지 않습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
end;
1 :
begin
MessageBox(Handle, PChar('소프트캠프 클라이언트가 로그인 되어 있지 않습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
end;
end;
var sScDecPath: String := 'C:\ProgramData\HE\Task\';
var sEncPath: String := 'C:\ProgramData\HE\Task\';
if not ForceDirectories(sScDecPath) then
begin
MessageBox(Handle, PChar('암호화를 준비하는 중 오류가 발생했습니다..1'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
sScDecPath := sScDecPath + Format('%d-sc_%s', [GetTickCount, ExtractFileName(sPath)]);
if DSCSIsEncryptedFile(sPath) = 1 then
begin
if DSCSDecryptFile(sPath, sScDecPath) = 1 then
begin
end else begin
MessageBox(Handle, PChar('소프트캠프 DRM 복호화를 실패했습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
end else begin
// for TEST
if not FileExists(sScDecPath) then
begin
CopyFile(PChar(sPath), PChar(sScDecPath), false);
end;
MessageBox(Handle, PChar('소프트캠프 DRM 파일이 아닙니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
end;
var h: HWND := MgSvc_.FindAipMdWnd;
if h <> 0 then
begin
if not ForceDirectories(sEncPath) then
begin
MessageBox(Handle, PChar('암호화를 준비하는 중 오류가 발생했습니다..2'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
sEncPath := ConvAipEncExt(sEncPath + Format('%d-dc_%s', [GetTickCount, ExtractFileName(sPath)]));
// var sAipPath := MgSvc_.GetAipPath;
// if not FileExists(sAipPath) then
// begin
// MessageBox(Handle, PChar('AIP 모듈을 찾을 수 없습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
// end;
//
// ExecuteAppWaitUntilTerminate(sAipPath, Format('-l "%s" "%s" "a5b98469-3cf3-4f5e-ad43-b098cf00ed03"', [sScDecPath, sEncPath]), SW_HIDE);
// if FileExists(sEncPath) then
// begin
// if DeleteFileForce(sPath) then
// begin
// if CopyFile(PChar(sEncPath), PChar(sPath), false) then // 이거 실패 대비를 해야 할까... 23_1024 09:04:08 kku
// begin
// DeleteFile_wait(sEncPath);
// MessageBox(Handle, PChar('AIP 암호화가 완료되었습니다.'), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
// end;
// end;
// end else begin
// DeleteFile_wait(sEncPath);
// end;
O := SO;
O.S['src'] := sScDecPath;
O.S['dst'] := sEncPath;
O.S['lid'] := 'a5b98469-3cf3-4f5e-ad43-b098cf00ed03';
if (MgSvc_ <> nil) and (MgSvc_.Email <> '') then
O.S['mail'] := gMgSvc.Email;
var nResult: Integer := SendData(h, 5, O.AsString);
// _Trace('SetAipLabel() .. Result=%d, Path=%s, EncPath=%s', [nResult, sPath, sEncPath]);
// 0 : 레이블 추출, 1 : 암호화, 2 : 복호화, 3 : 암호화 확인, 4 : 레이블 확인, 5 : 레이블 설정
if (nResult = 10) and FileExists(sEncPath) then
begin
if DeleteFileForce(sPath) then
begin
var sCpPath: String := sPath;
if CheckMsPfileExt(sPath) then
begin
if CheckAipEncSign(sEncPath) then
sCpPath := sCpPath + '.pfile';
end else
sCpPath := CutFileExt(sCpPath) + '.' + GetFileExt(sEncPath);
if CopyFile(PChar(sEncPath), PChar(sCpPath), false) then // 이거 실패 대비를 해야 할까... 23_1024 09:04:08 kku
begin
DeleteFile_wait(sEncPath);
MessageBox(Handle, PChar('AIP 암호화가 완료되었습니다.'), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
end;
end;
end else begin
ShowMessage(IntToStr(nResult));
DeleteFile_wait(sEncPath);
end;
end;
DeleteFile_wait(sScDecPath);
end;
5 : // AIP -> SC DRM
begin
if O.A['Files'].Length = 0 then
exit;
sPath := O.A['Files'].S[0];
if not FileExists(sPath) then
exit;
case DSCheckDSAgent of
0 :
begin
MessageBox(Handle, PChar('소프트캠프 클라이언트가 실행되어 있지 않습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
end;
1 :
begin
MessageBox(Handle, PChar('소프트캠프 클라이언트가 로그인 되어 있지 않습니다.'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
// exit;
end;
end;
var sDecPath: String := 'C:\ProgramData\HE\Task\';
if not ForceDirectories(sDecPath) then
begin
MessageBox(Handle, PChar('암호화를 준비하는 중 오류가 발생했습니다.3'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
exit;
end;
sDecPath := sDecPath + Format('%d-dc_%s', [GetTickCount, ExtractFileName(sPath)]);
var h: HWND := MgSvc_.FindAipMdWnd;
if h <> 0 then
begin
O := SO;
O.S['src'] := sPath;
O.S['dst'] := sDecPath;
O.S['lid'] := 'f0060d82-8c13-4667-8f41-3eac58da9617';
if (MgSvc_ <> nil) and (MgSvc_.Email <> '') then
O.S['mail'] := gMgSvc.Email;
var nResult: Integer := SendData(h, 5, O.AsString);
// 0 : 레이블 추출, 1 : 암호화, 2 : 복호화, 3 : 암호화 확인, 4 : 레이블 확인, 5 : 레이블 설정
if (nResult = 10) and FileExists(sDecPath) then
begin
end;
if not FileExists(sDecPath) then
CopyFile(PChar(sPath), PChar(sDecPath), false);
if DSCSGradeEncryptFile(sDecPath, 'sm03230') = 1 then
begin
if DeleteFileForce(sPath) then
begin
if CopyFile(PChar(sDecPath), PChar(sPath), false) then
begin
MessageBox(Handle, PChar('SC-DRM 암호화가 완료되었습니다.'), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
end;
end;
end else
begin
MessageBox(Handle, PChar('SC-DRM 암호화에 실패했습니다.'), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
// for TEST
if DeleteFileForce(sPath) then
begin
if CopyFile(PChar(sDecPath), PChar(sPath), false) then
begin
end;
end;
end;
DeleteFile(sDecPath);
end;
end;
6 : // AIP 적용
begin
TTgTrace.T('process_WM_REQUEST_DRM() .. AIP Encrypt ..');
var TgFileList: TStringList;
Guard(TgFileList, TStringList.Create);
for i := 0 to O.A['Files'].Length - 1 do
TgFileList.Add(O.A['Files'].S[i]);
var dlg: TDlgEncryptAip := TDlgEncryptAip.Create(nil);
dlg.AddFiles(TgFileList);
dlg.Show;
end;
7 : // AIP 해제
begin
TTgTrace.T('process_WM_REQUEST_DRM() .. AIP Decrypt ..');
var TgFileList: TStringList;
Guard(TgFileList, TStringList.Create);
for i := 0 to O.A['Files'].Length - 1 do
TgFileList.Add(O.A['Files'].S[i]);
var dlg: TDlgDecryptAip := TDlgDecryptAip.Create(nil);
dlg.AddFiles(TgFileList);
dlg.Show;
end;
else TTgTrace.T('process_WM_REQUEST_DRM() .. Unknown Cmd ..');
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_REQUEST_DRM()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_REQ_FILETAG_CONTROL(var msg: TMessage);
procedure ClearData;
var
FList: TStringList;
i: Integer;
sName,
sDataDir: String;
begin
try
sDataDir := GetRunExePathDir + 'Data\';
Guard(FList, TStringList.Create);
ExtrFilesFromDir(sDataDir, FList);
for i := 0 to FList.Count - 1 do
begin
sName := UpperCase(FList[i]);
if (Pos('SLT@', sName) = 1) and (ExtractFileExt(sName) = '.DAT') then
DeleteFile_wait(sDataDir + sName);
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_REQ_FILETAG_CONTROL() > ClearData()');
end;
end;
var
sPath: String;
begin
(*
try
if msg.WParam = 0 then
begin
tStatus.Enabled := false;
lbTagInfo.Visible := false;
if DTagList_ <> nil then
FreeAndNil(DTagList_);
if Client_ <> nil then
begin
FreeAndNil(Client_);
TerminateProcessByName(EXE_SLCore);
ClearData;
end;
end else begin
sPath := GetRunExePathDir + EXE_SLCore;
if IsUsingFileTag {$IFNDEF DEBUG} and FileExists(sPath) {$ENDIF} then
begin
if DTagList_ = nil then
DTagList_ := TDlgTagList.Create(Self);
if Client_ = nil then
begin
Client_ := TSearchLightClient.Create;
if Client_.ActiveW2W then
tStatus.Enabled := true;
end;
lbTagInfo.Visible := true;
end;
end;
Application.ProcessMessages;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_REQ_FILETAG_CONTROL()');
end;
*)
end;
procedure TDlgeCrmHeMain.process_WM_REQ_KWDSCH_CONTROL(var msg: TMessage);
begin
try
if msg.WParam = 0 then
begin
if KwdSchKvCLient_ <> nil then
FreeAndNil(KwdSchKvCLient_);
end else begin
if KwdSchKvCLient_ = nil then
begin
var FileScanOpt: TFileScanOpt;
ZeroMemory(@FileScanOpt, SizeOf(FileScanOpt));
FileScanOpt.CttSchOpt.nWorkPriority := -1;
FileScanOpt.CttSchOpt.sKvMdPath := GetRunExePathDir + 'bin\';
FileScanOpt.CttSchOpt.bIncZip := true;
FileScanOpt.CttSchOpt.bIncDrm := (CUSTOMER_TYPE = CUSTOMER_WELFNI) or (CUSTOMER_TYPE = CUSTOMER_WELFND);
if FileScanOpt.CttSchOpt.bIncDrm then
FileScanOpt.CttSchOpt.sMK := GetMK(false);
FileScanOpt.nLimitSizeMB := MgSvc_.ModePolicy.CfLimitMB;
FileScanOpt.nSchTimeoutSec := MgSvc_.ModePolicy.CfTimeoutSec;
FileScanOpt.CttSchOpt.nUnzipDepth := MgSvc_.ModePolicy.CfZipDepth;
KwdSchKvCLient_ := TBsKwdSchKvCttSchClient.Create(FileScanOpt);
KwdSchKvCLient_.ActiveW2W;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_REQ_KWDSCH_CONTROL()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_REQ_OUTLOOK_CONTROL(var msg: TMessage);
begin
try
if msg.WParam = 0 then
begin
if OutClient_ <> nil then
FreeAndNil(OutClient_);
end else begin
if OutClient_ = nil then
begin
OutClient_ := TOutlookMonClient.Create;
if OutClient_.ActiveW2W then
begin
var sSid: String := GetRegRecentUserSid;
if sSid <> '' then
SetRegValueString(HKEY_USERS, sSid + '\Software\BS1Addin', 'OutMon', IntToStr(OutClient_.GetSelfWnd), true);
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_REQ_OUTLOOK_CONTROL()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_UPDATE_SCREENLOGO(var msg: TMessage);
begin
UpdateScreenLogo(msg.WParam = 1);
end;
procedure TDlgeCrmHeMain.process_WM_NOTIEXECUTE_END(var msg: TMessage);
var
Thd: TThdExecuteEndNoti;
pWEnt: PPrtWaterEnt;
pEnt: PPrtEnt;
sEmfDir: String;
begin
if dlgWaterProg_ <> nil then
FreeAndNil(dlgWaterProg_);
try
Thd := TThdExecuteEndNoti(msg.LParam);
if Thd.PrtEnt <> nil then
sEmfDir := MgSvc_.MgPrt.DataDir + Thd.PrtEnt.sId + '\';
if FileExists(Thd.DestPath) or
FileExists(Format('%s_%.4d.png', [CutFileExt(Thd.DestPath), 1])) or
DirectoryExists(sEmfDir) then
begin
New(pWEnt);
ZeroMemory(pWEnt, SizeOf(TPrtWaterEnt));
if Thd.PrtEnt = nil then
begin
pWEnt.sPtrName := Thd.PrtInfo.sPtrName;
pWEnt.sDocName := Thd.PrtInfo.sDocName;
pWEnt.sImgPath := Thd.DestPath;
// pWEnt.dwPageSizeT := Thd.PrtInfo.dwPaperSizeT;
pWEnt.DevMode := TTgRtti.SetTypeToStr<TDeviceMode>(Thd.PrtInfo.DevMode);
pWEnt.dwCopy := Thd.PrtInfo.dwCopyCount;
pWEnt.dwTotalPage := Thd.PrtInfo.dwTotalPage;
pWEnt.bPaperV := Thd.PrtInfo.bPaperV;
pWEnt.bColor := Thd.PrtInfo.bColor;
pWEnt.sPaperInfo := Thd.PrtInfo.sPaperInfo;
pWEnt.sPrtIp := PrinterDriverToIP(Thd.PrtInfo.sDrvName);
pWEnt.LogJson := Thd.OLog.AsJSon;
pWEnt.bUseWM := Thd.UseWM;
pWEnt.sPrtDocId := Thd.PrtDocId;
if (Thd.PortInfo <> '') and
FileExists(Thd.PortInfo) and
(GetFileExt(Thd.PortInfo).ToUpper = 'PDF') then
pWEnt.sPdfPath := Thd.PortInfo;
end else begin
pWEnt^ := Thd.PrtEnt.WInfo;
pWEnt.sImgPath := Thd.DestPath;
if Thd.PrtEnt.bPostApv then
pWEnt.sPostApvId := Thd.PrtEnt.sId;
if pWEnt.sImgPath = '' then
begin
var EmfList: TStringList;
Guard(EmfList, TStringList.Create);
if DirectoryExists(sEmfDir) then
begin
ExtrFilesFromDir(sEmfDir, EmfList, false, 'em1');
if EmfList.Count > 0 then
pWEnt.sImgPath := sEmfDir + EmfList[0];
end;
end;
end;
if Thd.OLog <> nil then
begin
// 결재 후 출력 시 로그 남기기 위해 추가
// 기존 ProcessPrintWaterEnt() 로그남기는거 중복되지 않도록 아래 내용은 비워 준다... 25_0319 15:38:40 kku
// todo : 스냅태그 OutCode 처리 필요
pWEnt.LogJson := '';
TTgTrace.T('SendPrintLog2 > Code=%s, Msg=%s', [LOGCODE_EVENT_PRINTER, Thd.OLog.S['KEY_SUMMARY']], 3);
gMgSvc.EventLog.Push(Thd.OLog.AsJSon);
end;
MgSvc_.AddPrintWaterEnt(pWEnt);
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_NOTIEXECUTE_END()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_PRINTWATER_PROGRESS(var msg: TMessage);
begin
try
if IsAdvancePrtProg then
exit;
if IsHidePrtProgPopup or MgSvc_.PrefModel.PrtPopupNo then
exit;
case msg.WParam of
3, 6 : ;
else begin
if dlgWaterProg_ <> nil then
FreeAndNil(dlgWaterProg_);
end;
end;
case msg.WParam of
1 : // 스풀 추출
begin
var StrList: TStringList;
Guard(StrList, TStringList.Create);
SplitString(PChar(msg.LParam), '|', StrList);
if StrList.Count < 3 then
begin
TTgTrace.T('Fail .. process_WM_POPUP_PRINTWATER_PROGRESS() .. Invalid Param... Cmd=1');
exit;
end;
dlgWaterProg_ := TDlgWaitExtrProcPrt.Create(Self, StrToIntDef(StrList[0], 0), StrList[1], StrList[2]);
dlgWaterProg_.Show;
end;
2 : // 보안 출력
begin
dlgWaterProg_ := TDlgWaitExtrProcPrt.Create(Self, msg.LParam);
dlgWaterProg_.Show;
TTgTrace.T('프린터 출력 감지 .. 워터마크 적용 후 보안출력 시작', 2);
end;
3 : // 진행사항 업데이트
begin
if dlgWaterProg_ <> nil then
begin
dlgWaterProg_.SetPagePos(msg.LParam);
TTgTrace.T('프린터 출력 감지 .. 워터마크 적용 후 보안출력 시작 .. %d', [msg.LParam], 2);
end;
end;
4 : // 스풀에서 이미지 추출
begin
dlgWaterProg_ := TDlgWaitExtrProcPrt.Create(Self, msg.LParam);
dlgWaterProg_.lbMsg.Caption := RS_ExtrSpoolImage + #13#10 + RS_ExtrWait;
dlgWaterProg_.Show;
TTgTrace.T('프린터 출력 감지 .. 스풀에서 출력물 추출', 2);
end;
5 : // 스풀 이미지에서 텍스트 추출
begin
dlgWaterProg_ := TDlgWaitExtrProcPrt.Create(Self, msg.LParam);
dlgWaterProg_.lbMsg.Caption := RS_ExtrImageText + #13#10 + RS_ExtrWait;
dlgWaterProg_.Show;
TTgTrace.T('프린터 출력 감지 .. 출력 이미지에서 텍스트 추출', 2);
end;
6 : // 스풀 이미지에서 텍스트 추출 Progress
begin
if dlgWaterProg_ <> nil then
begin
dlgWaterProg_.SetPagePos(msg.LParam);
TTgTrace.T('프린터 출력 감지 .. 출력 이미지에서 텍스트 추출 .. %d', [msg.LParam], 2);
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_POPUP_PRINTWATER_PROGRESS()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_PRTW_PROGRESS(var msg: TMessage);
begin
try
if not IsAdvancePrtProg then
exit;
if IsHidePrtProgPopup or MgSvc_.PrefModel.PrtPopupNo then
exit;
case msg.WParam of
0 :
begin
// 처리
dlgPrtWProg_.SetMsg(Format(RS_FMT_ProcPrt, [msg.LParam]));
end;
1 :
begin
// 생성
if dlgPrtWProg_ <> nil then
FreeAndNil(dlgPrtWProg_);
dlgPrtWProg_ := TDlgPrintProg.Create(nil);
if MgSvc_.ModePolicy.IsPrtCollectThum then
begin
if MgSvc_.ModePolicy.Print.bCollectOutput then
dlgPrtWProg_.SetProg([RS_PrtInit, RS_PrtImgCol, RS_PrtExtrTxt, RS_PrtReInit, RS_PrtSecu])
else
dlgPrtWProg_.SetProg([RS_PrtInit, RS_PrtImgCol, RS_PrtReInit, RS_PrtSecu]);
end else
dlgPrtWProg_.SetProg([RS_PrtInit, RS_PrtReInit, RS_PrtSecu]);
dlgPrtWProg_.Show;
end;
2 :
begin
// 다음
if dlgPrtWProg_ <> nil then
dlgPrtWProg_.NextStep;
end;
3 :
begin
// 종료
if dlgPrtWProg_ <> nil then
FreeAndNil(dlgPrtWProg_);
end;
4 :
begin
// 승인 후 출력, 재출력
if dlgPrtWProg_ <> nil then
FreeAndNil(dlgPrtWProg_);
dlgPrtWProg_.SetProg([RS_PrtInit, RS_PrtReInit, RS_PrtSecu]);
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_POPUP_PRTW_PROGRESS()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_CATCHKEY_NOTIFY(var msg: TMessage);
var
ShiftState: TShiftState;
sTemp: String;
PO: TPrefModel;
begin
// if not IsHD then
// exit;
try
if MgSvc_ = nil then
exit;
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
if msg.WParam = 79 then // O
begin
bPreWinKey_ := true;
bScrCapKey_ := false;
VisibleMainform(true, true);
exit;
end;
end;
// if (ssCtrl in ShiftState) and (msg.WParam = 67) then
// begin
// sTemp := GetProcessPathFromWndHandle(GetForegroundWindow);
// if sTemp <> '' then
// sLastCbAppName_ := ExtractFileName(sTemp);
// end;
if not bScrCapKey_ and (msg.WParam = 44) then // 프린트스크린
begin
bScrCapKey_ := true;
PO := MgSvc_.ModePolicy;
if PO = nil then
exit;
bForceCollectCB_ := (PO.ClipBlockKind <> cbkNone) and
PO.IsCBCollect and
(CbCollectAppList_.IndexOf('PrntScrKey') <> -1);
if PO.IsIgrScrCapKeyCB then
begin
if PO.WinCapScrLogoOff and (DispLogos_.Count > 0) then
begin
DispLogos_.Clear;
tUpdateLogo.Enabled := true;
PressKeys(#44);
end;
end;
exit;
end;
// else
// if bScrCapKey_ then
// bScrCapKey_ := false;
// if not PO.WinCapScrLogoOff then
// exit;
//
// if DispLogos_.Count = 0 then
// exit;
case msg.WParam of
65 : // A 키
begin
bPreWinKey_ := false;
bCtrlA_ := (CUSTOMER_TYPE = CUSTOMER_HDENG) and (ssCtrl in ShiftState);
end;
67 : // C 키
begin
bPreWinKey_ := false;
bCtrlA_ := bCtrlA_ and (ssCtrl in ShiftState);
{$IFDEF OLD_CB_MON}
if ssCtrl in ShiftState then
begin
// TTgTrace.T('Ctrl + C 감지 .. 1');
var bInitCB: Boolean := true;
try
if (MgSvc_ <> nil) and (MgSvc_.ModePolicy.ClipBlockKind = cbkNone) then
bInitCB := false;
// TTgTrace.T('Ctrl + C 감지 .. 2');
except
// ...
// TTgTrace.T('Ctrl + C 감지 .. ?');
end;
if bInitCB then
begin
// dtRecentCbPopup_ := Now;
// Sleep(200);
CBMon_.Reset;
// TTgTrace.T('Ctrl + C 감지 .. 3');
end;
end;
{$ENDIF}
end;
83 : // S 키
begin
bCtrlA_ := false;
if bPreWinKey_ then
begin
// ShiftState := KeyDataToShiftState(0);
if ssShift in ShiftState then
begin
bPreWinKey_ := false;
PO := MgSvc_.ModePolicy;
if PO = nil then
exit;
bForceCollectCB_ := (PO.ClipBlockKind <> cbkNone) and
PO.IsCBCollect and
(CbCollectAppList_.IndexOf('PrntScrKey') <> -1);
// if DispLogos_.Count > 0 then
if MgSvc_.ModePolicy.WinCapScrLogoOff and (DispLogos_.Count > 0) then
begin
DispLogos_.Clear;
tUpdateLogo.Enabled := true;
MgSvc_.SendEventLog(URI_USER_ACTION, PREVENT_SCREENLOGO_WINCAP_EXCEPT, 'WinCap : ScreenLogo Exception');
end;
end;
end;
end;
86 : // V 키
begin
if ssCtrl in ShiftState then
begin
// TTgTrace.T('Ctrl + V 감지 .. 1', 10);
var bInitCB: Boolean := true;
try
if (MgSvc_ <> nil) and (MgSvc_.ModePolicy.ClipBlockKind = cbkNone) then
bInitCB := false;
except
// ...
end;
if bInitCB then
begin
if (KeyMonDll_ <> nil) and (CUSTOMER_TYPE = CUSTOMER_TMAP) then
begin
// KeyMonDll_.SetDisableKey_Ctrl(true); // 추가 24_0712 14:47:52 kku
KeyMonDll_.SetDisableKey_Etc(0, 67); // c 키 연속으로 못누르게 막음 23_0518 14:21:05 kku
dwBlockInputCTick_ := GetTickCount;
end;
dtRecentCbPopup_ := Now;
{$IFDEF OLD_CB_MON}
CBMon_.Reset;
{$ENDIF}
end;
end else
if IsWinKeyDown then
begin
if MgSvc_.ModePolicy.ClipBlockKind = cbkBlock then
begin
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_RWIN, 0, KEYEVENTF_KEYUP, 0);
Sleep(100);
keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
Sleep(100);
keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
end;
end;
end;
91 : // 윈도우 키
begin
bPreWinKey_ := true;
bCtrlA_ := false;
exit;
end;
else begin
bPreWinKey_ := false;
bCtrlA_ := false;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_CATCHKEY_NOTIFY()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_DISPLAYCHANGE(var msg: TMessage);
begin
UpdateScreenLogo(true);
end;
procedure TDlgeCrmHeMain.process_WM_SCREEN_CAPTURE_BLOCK(var msg: TMessage);
begin
if DispBlock_ <> nil then
begin
if msg.WParam = 1 then
begin
if DispBlock_.Count = 0 then
begin
DispBlock_.CreateLogos;
DispBlock_.SetText('', nil, 2, 2, 0, 0, clSilver, clSilver, '', 0);
DispBlock_.SetAlpha(-1);
// DispBlock_.SetTaskbarDetect(true);
DispBlock_.SetCaptureBlock(true);
end;
end else
if DispBlock_.Count > 0 then
DispBlock_.Clear;
end;
end;
//procedure TDlgeCrmHeMain.process_WM_SETTINGCHANGE(var msg: TMessage);
//begin
// if (Screen.Width <> nScrW_) or (Screen.Height <> nScrH_) then
// begin
// nScrW_ := Screen.Width;
// nScrH_ := Screen.Height;
// UpdateScreenLogo(true);
// end;
//end;
procedure TDlgeCrmHeMain.process_WM_POPUP_MSG2(var msg: TMessage);
begin
TDlgNoticeImg.Create(nil, String(msg.LParam)).Show;
end;
procedure TDlgeCrmHeMain.process_WM_POPUP_MSG_PI(var msg: TMessage);
begin
TDlgSchPiNoti.Create(nil, String(msg.LParam)).Show;
end;
procedure TDlgeCrmHeMain.process_WM_CLOSE_CTTSCH(var msg: TMessage);
begin
if ThdCustomScanSch_ <> nil then
begin
if ThdCustomScanSch_.WorkState = tsCompleted then
miCttSchResult.Click;
FreeAndNil(ThdCustomScanSch_);
sSchRstPath_ := '';
end;
end;
procedure TDlgeCrmHeMain.miEncryptDrmClick(Sender: TObject);
var
dlg: TDlgEncryptDrm;
sExe, sParam: String;
O: ISuperObject;
PO: TPrefModel;
begin
// if CUSTOMER_TYPE = CUSTOMER_BLUECORNER then
begin
sExe := GetRunExePathDir + DIR_CONF + EXE_HLP;
if FileExists(sExe) then
begin
PO := MgSvc_.ModePolicy;
O := SO;
O.I['Cmd'] := HPCMD_OPEN_ENCRYPT;
O.S['WinCap'] := APP_TITLE;
O.I['RcvWnd'] := Handle;
O.I['CT'] := CUSTOMER_TYPE;
O.S['UName'] := MgSvc_.UName;
O.S['Dept'] := MgSvc_.DeptName;
if O.S['Dept'] = '' then
O.S['Dept'] := PO.DeptName;
O.S['EN'] := MgSvc_.EmpNo;
O.S['PON'] := PO.PolicyName;
sParam := GetRunExePathDir + DIR_CONF + DAT_PARAM;
SaveJsonObjToFile(O, sParam);
{$IFDEF DEBUG}
ExecutePath(sExe, Format('/p "%s"', [sParam]));
{$ELSE}
ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL);
{$ENDIF}
// DeleteFile(sParam);
end;
end;
// else begin
// dlg := TDlgEncryptDrm.Create(Self);
// dlg.Show;
// end;
end;
procedure TDlgeCrmHeMain.OnProcNotify(aSender: TThdProcessWatch; pEnt: PPwEnt; aKind: TProcessWatchKind);
begin
case aKind of
pwkInit,
pwkExecute :
begin
{$IFNDEF DEBUG}
if (gTrForm = nil) and IsLogSendToWindbg and
( (CompareText('DbgX.Shell.exe', pEnt.sPName) = 0) or
(CompareText('windbg.exe', pEnt.sPName) = 0) ) then
begin
if gTrace.Level = 0 then
gTrace.Level := 1;
end;
{$ENDIF}
end;
pwkTerminated :
begin
{$IFNDEF DEBUG}
if (gTrForm = nil) and IsLogSendToWindbg and
( (CompareText('DbgX.Shell.exe', pEnt.sPName) = 0) or
(CompareText('windbg.exe', pEnt.sPName) = 0) ) then
begin
if (GetProcessPidsByName('DbgX.Shell.exe') = 0) and
(GetProcessPidsByName('windbg.exe') = 0) and
(gTrace.Level = 1) then
gTrace.Level := 0;
end;
{$ENDIF}
end;
end;
end;
procedure TDlgeCrmHeMain.process_WM_REQUEST_APPROVAL(var msg: TMessage);
var
pEnt: PPrtEnt;
dlg: TDlgPrintApproveReq;
dlgA: TDlgPrintApproveReqA;
dlgR: TDlgPrintApproveRst;
begin
try
case msg.WParam of
0 : // 사용자 출력 요청
begin
pEnt := PPrtEnt(msg.LParam);
if (pEnt = nil) or (pEnt.dtReg = 0) then
exit;
dlg := TDlgPrintApproveReq.Create(nil, pEnt);
dlg.Show;
end;
else
begin
if MgSvc_ <> nil then
MgSvc_.PopupMessage(TYPE_REQ_APPROVAL, IntToStr(msg.WParam) + '|' + String(msg.LParam));
// dlgA := TDlgPrintApproveReqA.Create(nil, msg.WParam, String(msg.LParam));
// dlgA.Show;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_REQUEST_APPROVAL()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_DONE_APPROVAL(var msg: TMessage);
var
dlgR: TDlgPrintApproveRst;
O: ISuperObject;
begin
try
// 잘못된 응담 사전에 걸름 25_0218 10:56:00 kku
O := nil;
try
O := SO(String(msg.LParam));
except
exit;
end;
if O = nil then
exit;
if msg.WParam = 1 then
begin
// 프린트 응답은 한번더 점검
if gMgSvc.MgPrt.GetPrintInfo(O.S['taskId']) = nil then
exit;
end;
if MgSvc_ <> nil then
MgSvc_.PopupMessage(TYPE_RES_APPROVAL, IntToStr(msg.WParam) + '|' + String(msg.LParam));
// dlgR := TDlgPrintApproveRst.Create(nil, msg.WParam, String(msg.LParam));
// dlgR.Show;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_DONE_APPROVAL()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_NOTI_RCVPOLICY(var msg: TMessage);
begin
try
case msg.WParam of
0 : MessageBox(Handle, PChar(RS_FailUpdatePolicy), PChar(APP_TITLE), MB_ICONWARNING or MB_OK);
1 : MessageBox(Handle, PChar(RS_UpdatePolicy), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
else MessageBox(Handle, PChar(Format(RS_ErrorUpdatePolicy, [msg.WParam])), PChar(APP_TITLE), MB_ICONINFORMATION or MB_OK);
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_NOTI_RCVPOLICY()');
end;
end;
procedure TDlgeCrmHeMain.process_WM_ENDSESSION(var msg: TMessage);
begin
try
if MgSvc_ <> nil then
MgSvc_.ProcessEndSession;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_ENDSESSION()');
end;
WriteLnFileEndUTF8(GetRunExePathDir + BYE_ENDSESSION, 'bye');
// TerminateProcess(GetCurrentProcess, 100);
end;
{$IFNDEF OLD_CB_MON}
procedure TDlgeCrmHeMain.process_WM_CLIPBOARDUPDATE(var msg: TMessage);
var
sCbHds: String;
begin
if MgSvc_ = nil then
exit;
// sCbHds := GetClipboardHandles;
// if (sCbHds = '') or (sCbHds = sOldCbHds_) then
// exit;
// sOldCbHds_ := sCbHds;
if IsClipboardFormatAvailable(CF_BS1Empty) then
exit;
if (MgSvc_.ModePolicy <> nil) and MgSvc_.ModePolicy.CbImgBlock then
begin
if not IsClipboardFormatAvailable(CF_BITMAP) and
not IsClipboardFormatAvailable(CF_DIB) and
not IsClipboardFormatAvailable(CF_DIBV5) then exit;
end;
OnClipboardNotify(nil);
end;
{$ENDIF}
end.