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, BsKwdSchKvCttSchClient, Tocsg.Win32, OutlookMonClient, ThdExecuteEndNoti, DWaitProcPrt, ThdSchFileScan, DProgCustomCttSch, Tocsg.Process, Winapi.oleacc, ThdWebOpenCheck, Tocsg.Clipboard, ThdRcvPolicy, DPrintProg; 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; 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); 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; 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(sPath: String); 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, superobject, 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)'; {$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.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; 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(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 tMtx.Enabled := false; RecoverSvc_.StopService; 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 if MgSvc_ <> nil then MgSvc_.StopService; except // .. end; 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 sPath := sSysDir_ + DLL_SV; if FileExists(sPath) then begin InstallServiceDll(sPath, 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 ExistsKey(HKEY_LOCAL_MACHINE, REG_SVC) then begin SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_SVC, 'Start', 2, true); // sPath := sSysDir_ + DLL_SV; // if FileExists(sPath) then // begin // InstallServiceDll(sPath, // SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START); // end; end; 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 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); // 작업표시줄 유무따라 트레이 죽이고 살리기 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(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 := ''; // 이거 비어 있으면 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; 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(sPath: String); var LogInfo: TLogInfo; ReqDevExceptInfo: TReqDevExceptInfo; dtCreate, dtModify, dtAccess: TDateTime; O, OA, ORst: ISuperObject; sDestAddr, sUrl, sTemp: String; i: Integer; bResult, bSendBin: Boolean; begin try if not FileExists(sPath) then begin MessageBox(Handle, PChar(RS_NotFoundFile), PChar(APP_TITLE), MB_OK + MB_ICONWARNING); exit; end; 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; // todo : 여러 파일 업로드 기능 추가 필요 25_1117 17:24:23 kku OA := TSuperObject.Create(stArray); 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(sPath); OA.AsArray.Add(O); // 기존에 만들어진 형식에 맞춰서 값을 넣어줌 25_1117 13:34:46 kku ZeroMemory(@ReqDevExceptInfo, SizeOf(ReqDevExceptInfo)); ReqDevExceptInfo.sSerial := OA.AsJSon; ReqDevExceptInfo.sDevName := 'File Export Request'; ZeroMemory(@LogInfo, SizeOf(LogInfo)); LogInfo.sCode := REQUEST_APPROVAL; LogInfo.sDevName := ReqDevExceptInfo.sDevName; LogInfo.sDevSerial := ReqDevExceptInfo.sSerial; LogInfo.sPath := sPath; LogInfo.sSummary := 'Approval Request : File Export'; sDestAddr := MgSvc_.DestIPort; sUrl := MgSvc_.SendApproval(9, @ReqDevExceptInfo, OA.AsArray.Length); // sUrl := MgSvc_.SendApproval(4, @ReqDevExceptInfo, OA.AsArray.Length); if sUrl = '' then begin TTgTrace.T('Fail .. SendApproval(1)'); 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 ORst <> nil then begin for i := 0 to OA.AsArray.Length - 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, MgSvc_.ModePolicy.AppABMinMB, MgSvc_.ModePolicy.AppABLimitMB); 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; 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)); 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.Enabled := (CUSTOMER_TYPE <> CUSTOMER_SHCI) and (CUSTOMER_TYPE <> CUSTOMER_SHSC); 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; 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; 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=%d, S=%d, F=%d Path=%s', [O.I['D'], O.I['S'], 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_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 : ApprovalFileExport(sPath); 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(O); if (MgSvc_.ThdScanSch <> nil) and (WPARAM(MgSvc_.ThdScanSch) = msg.WParam) then begin if MgSvc_.ProcCampn <> nil then MgSvc_.ProcessCampnFound(@SchResult) else MgSvc_.ProcessPiSchFound(@SchResult); 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(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)); var sUrl: String := gMgSvc.SendApproval(3, O); if sUrl = '' then begin TTgTrace.T('Fail .. SendApproval(1)'); MessageBox(Handle, PChar('Unable to retrieve approver information'), PChar(APP_TITLE), MB_ICONWARNING or MB_OK); end else begin var LogInfo: TLogInfo; ZeroMemory(@LogInfo, SizeOf(LogInfo)); LogInfo.sCode := REQUEST_APPROVAL; if (O <> nil) and (O.DataType = stArray) then begin LogInfo.sSummary := Format('Approval Request : File Decrypt (%d)', [O.AsArray.Length]); if O.AsArray.Length = 1 then LogInfo.sPath := O.AsArray[0].S['filePath']; end else LogInfo.sSummary := 'Approval Request : File Decrypt'; MgSvc_.SendEventLogEx(@LogInfo, false); var sHlpExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP; if FileExists(sHlpExe) then begin O := 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; 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 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 var LogInfo: TLogInfo; ZeroMemory(@LogInfo, SizeOf(LogInfo)); 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; LogInfo.sSummary := LogInfo.sSummary + ExtractFileName(O.S['D']); LogInfo.sAppName := 'explorer.exe'; LogInfo.sPath := O.S['D']; MgSvc_.SendEventLogEx(@LogInfo, O.B['B']); end; 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.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.FileName); 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 > 2 then begin O := SO; O.S['RULE_ID'] := InfoList[0]; O.S['TEXT'] := RemoveOverlapWords(InfoList[1]); O.S['CNT'] := InfoList[2]; Result.AsArray.Add(O); end; 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; 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']; // 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; sMsg := Format('Process : %s, Path : %s', [sPName, sPath]); end; end; if MgSvc_.IsNewApi then begin var LogInfo: TLogInfo; ZeroMemory(@LogInfo, SizeOf(LogInfo)); LogInfo.sCode := sCode; 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; 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; ZeroMemory(@LogInfo, SizeOf(LogInfo)); LogInfo.sCode := sCode; 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 = fmkIncExt then // begin // if Pos(GetFileExt(sPath).ToUpper, UpperCase(PO.FileMon.sExts)) > 0 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_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(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.