{*******************************************************} { } { ProcessServerAPI } { } { Copyright (C) 2023 kku } { } {*******************************************************} unit ProcessServerAPI; interface uses System.SysUtils, System.Classes, Winapi.Windows, IdHTTP; type TReqPoKind = (rpkId, rpkAll, rpkMng, rpkSelPo, npkSelPoCate, npkSelPoKey); function ProcessSignal(bFailChangeDestUrl: Boolean = true): Boolean; function ProcessRcvPolicy(aKind: TReqPoKind; sPoId: String = ''; sPoAddInfo: String = ''; aHTTP: TIdHTTP = nil): Boolean; //function CheckAip14Module: Boolean; implementation uses ManagerService, superobject, Tocsg.Trace, SecureApp, Tocsg.WinInfo, System.DateUtils, ManagerModel, Tocsg.Network, Condition, Tocsg.Convert, Tocsg.Path, GlobalDefine, License, CrmUtil, Winapi.Messages, Tocsg.Exception, Tocsg.Safe, AbUnzper, AbArcTyp, Tocsg.Strings, System.Zip, Tocsg.Files, Tocsg.Process, Define, Tocsg.Registry, DeCrmHeMain, IdExceptionCore, Tocsg.Win32, Tocsg.Cert, ProcessUninstall, Tocsg.Shell, System.IniFiles, ProcessPrint; const MAX_EXP = 12; MAX_EXP_D = 13; var _dwSpoolDL_Tick: DWORD = 0; _dwAip14DL_Tick: DWORD = 0; _dwAip17DL_Tick: DWORD = 0; _dwKeyviewDL_Tick: DWORD = 0; // _sChkVal1: String = ''; // 결재요청 중복 확인을 위함 // _sChkVal2: String = ''; // 결재결과 중복 확인을 위함 // _sChkVal3: String = ''; // _sChkVal4: String = ''; // _sChkVal5: String = ''; // _sChkVal6: String = ''; _arrUpdReq: array [1..MAX_EXP] of String = ( 'upd_printRequestUrlList', 'upd_usbRequestUrlList', 'upd_brConnRequestUrlList', 'upd_drmDecRequestUrlList', 'upd_fileExportRequestUrlList', 'upd_mtpRequestUrlList', 'upd_btRequestUrlList', 'upd_cdDvdRequestUrlList', 'upd_watermarkRequestUrlList', 'upd_captureAppRequestUrlList', 'upd_preFileExportRequestUrlList', 'upd_printPostRequestUrlList' ); _arrUpdDone: array [1..MAX_EXP_D] of String = ( 'upd_printDoneList', 'upd_usbDoneList', 'upd_brConnDoneList', 'upd_drmDecDoneList', 'upd_fileExportDoneList', 'upd_mtpDoneList', 'upd_btDoneList', 'upd_cdDvdDoneList', 'upd_watermarkDoneList', 'upd_captureAppDoneList', 'upd_preFileExportDoneList', 'upd_printPostDoneList', 'upd_printPostRequestDoneList' ); _arrChkReqVal: array [1..MAX_EXP] of String; _arrChkDoneVal: array [1..MAX_EXP_D] of String; _NewAgentInfo: TCheckAgentInfo; function HttpPost(aHTTP: TIdHTTP; sDest, sRqType, sParam: String): String; var ss: TStringStream; begin Result := ''; try ss := TStringStream.Create(sParam, TEncoding.UTF8); try aHTTP.Request.CustomHeaders.Values['requestType'] := sRqType; Result := aHTTP.Post(sDest, ss); if (Result = '') and (aHTTP.ResponseCode = 200) then Result := 'true'; finally ss.Free; end; except on E: EIdReadTimeout do begin TTgTrace.T('HttpPost() .. ReadTimeout ..'); Result := POST_TIMEOUT; exit; end; on E: Exception do begin {$IFDEF TRACE1} ETgException.TraceException(Self, E, Format('Fail .. HttpPost(), RqType=%s', [sRqType])); {$ENDIF} end; end; end; function ProcessRcvPolicy(aKind: TReqPoKind; sPoId: String = ''; sPoAddInfo: String = ''; aHTTP: TIdHTTP = nil): Boolean; var O, OP: ISuperObject; sReqCmd, sReqType, sRes: String; bCodePo: Boolean; begin Result := false; try O := SO; O.S['KEY_AGENTID'] := gMgSvc.AgentId; O.S['KEY_EMPNO'] := gMgSvc.EmpNo; O.S['KEY_HOSTNAME'] := gMgSvc.UserName; if gMgSvc.HandleConfig <> nil then begin if gMgSvc.HandleConfig.OsMajorVer <> '' then O.S['KEY_OSVER'] := Format('%s (%s)', [gMgSvc.HandleConfig.OsVersion, gMgSvc.HandleConfig.OsMajorVer]) else O.S['KEY_OSVER'] := gMgSvc.HandleConfig.OsVersion; end else O.S['KEY_OSVER'] := 'test'; case aKind of rpkId : sReqType := '0'; rpkAll : sReqType := '1'; rpkMng : sReqType := '2'; rpkSelPo : begin sReqType := '3'; if sPoId = '' then begin TTgTrace.T('ProcessRcvPolicy() .. rpkSelPo .. EmptyID'); exit; end; O.S['KEY_POLICYID'] := sPoId; end; npkSelPoCate : begin sReqType := '4'; if sPoId = '' then begin TTgTrace.T('ProcessRcvPolicy() .. rpkSelPo .. EmptyID'); exit; end; if sPoAddInfo = '' then begin TTgTrace.T('ProcessRcvPolicy() .. npkSelPoCate .. EmptyCate'); exit; end; O.S['KEY_POLICYID'] := sPoId; O.S['KEY_CATEGORY'] := sPoAddInfo; end; npkSelPoKey : begin sReqType := '5'; if sPoId = '' then begin TTgTrace.T('ProcessRcvPolicy() .. rpkSelPo .. EmptyID'); exit; end; if sPoAddInfo = '' then begin TTgTrace.T('ProcessRcvPolicy() .. npkSelPoKey .. EmptyKey'); exit; end; O.S['KEY_POLICYID'] := sPoId; O.S['KEY_POLICYKEY'] := sPoAddInfo; end; end; // {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\pa.json'); {$ENDIF} bCodePo := gMgSvc.PrefModel.CodePo and gMgSvc.PrefModel.IsAbleCodePo; if bCodePo then sReqCmd := 'policyRequest.do?idType=n' else sReqCmd := 'policyRequest.do'; if aHTTP <> nil then sRes := HttpPost(aHTTP, gMgSvc.DestIPort + sReqCmd, sReqType, O.AsString) else sRes := gMgSvc.HttpPost(gMgSvc.DestIPort + sReqCmd, sReqType, O.AsString); if sRes = '' then begin TTgTrace.T('ProcessRcvPolicy() .. Empty .. Msg="%s", Code=%d', [gMgSvc.HttpErrorMsg, gMgSvc.HttpErrorCode]); exit; end else if sRes = POST_TIMEOUT then begin TTgTrace.T('ProcessRcvPolicy() .. timeout .. Msg="%s", Code=%d', [gMgSvc.HttpErrorMsg, gMgSvc.HttpErrorCode]); exit; end; {$IFDEF DEBUG} SaveJsonObjToFile(SO(sRes), 'c:\pd.json'); {$ENDIF} OP := SO(sRes); if OP = nil then begin TTgTrace.T('ProcessRcvPolicy() .. Invalid policy'); exit; end; case aKind of rpkId : ; rpkAll : begin var sGrpName: String := OP.S['GROUP_NAME']; if gMgSvc.AgentModel.Location <> sGrpName then begin gMgSvc.AgentModel.Location := sGrpName; gMgSvc.AgentModel.Save; end; gMgSvc.PrefModel.PolicyGroup := sGrpName; gMgSvc.PrefModel.PolicyId := OP.S['SECUMODE']; gMgSvc.SleepPolicy.PolicyGroup := sGrpName; gMgSvc.SleepPolicy.PolicyId := OP.S['SLEEPMODE']; gMgSvc.VulPolicy.PolicyGroup := sGrpName; gMgSvc.VulPolicy.PolicyId := OP.S['VULMODE']; gMgSvc.OffPolicy.PolicyGroup := sGrpName; gMgSvc.OffPolicy.PolicyId := OP.S['OFFLINEMODE']; gMgSvc.ExpPolicy.PolicyGroup := sGrpName; gMgSvc.ExpPolicy.PolicyId := OP.S['EXCEPTMODE']; var nOldScreenOld: Integer := gMgSvc.ModePolicy.ScreenLogoAlpha; if OP.O['POL_SET'] <> nil then gMgSvc.PrefModel.SetSetPolicy(OP.O['POL_SET'], bCodePo); if OP.O['POL_MNG'] <> nil then begin gMgSvc.PrefModel.SetMngPolicy(OP.O['POL_MNG'], bCodePo); if gMgSvc.PrefModel.HideMainUI and gMain.Showing then PostMessage(gMgSvc.RcvHwnd, WM_REFRESH_VIEW, 1, 0); end; if (OP.S['SECUMODE'] <> '') and (OP.S['SECUMODE'].ToLower <> 'false') and (OP.O['POL_SEC'] <> nil) then gMgSvc.PrefModel.SetPolicy(OP.S['SECUMODE'], OP.O['POL_SEC'], bCodePo); if (OP.S['SLEEPMODE'] <> '') and (OP.S['SLEEPMODE'].ToLower <> 'false') and (OP.O['POL_SLP'] <> nil) then gMgSvc.SleepPolicy.SetPolicy(OP.S['SLEEPMODE'], OP.O['POL_SLP'], bCodePo) else gMgSvc.SleepPolicy.Clear(true, true); if (OP.S['VULMODE'] <> '') and (OP.S['VULMODE'].ToLower <> 'false') and (OP.O['POL_VUL'] <> nil) then gMgSvc.VulPolicy.SetPolicy(OP.S['VULMODE'], OP.O['POL_VUL'], bCodePo) else gMgSvc.VulPolicy.Clear(true, true); if (OP.S['OFFLINEMODE'] <> '') and (OP.S['OFFLINEMODE'].ToLower <> 'false') and (OP.O['POL_OFF'] <> nil) then gMgSvc.OffPolicy.SetPolicy(OP.S['OFFLINEMODE'], OP.O['POL_OFF'], bCodePo) else gMgSvc.OffPolicy.Clear(true, true); if (OP.S['EXCEPTMODE'] <> '') and (OP.S['EXCEPTMODE'].ToLower <> 'false') and (OP.O['POL_EXC'] <> nil) then begin gMgSvc.ExpPolicy.SetPolicy(OP.S['EXCEPTMODE'], OP.O['POL_EXC'], bCodePo); end else if gMgSvc.IsOfflineExp then begin if (gMgSvc.ExpPolicy.InternalPoId <> 'TEMP') and (gMgSvc.ExpPolicy.InternalPoId <> 'false') then // 정책 할당안된 예외모드가 아니라면 begin gMgSvc.ClearExpPolicy; gMgSvc.ExpPolicy.Clear(true, true); end; end else gMgSvc.ExpPolicy.Clear(true, true); if nOldScreenOld <> gMgSvc.ModePolicy.ScreenLogoAlpha then gMgSvc.UpdateScreenLogo(true); end; rpkMng : ; rpkSelPo : ; npkSelPoCate : ; npkSelPoKey : ; end; gMgSvc.RefreshView; {$IFDEF DEBUG} SaveJsonObjToFile(OP, 'c:\ps.json'); {$ENDIF} Result := true; except on E: Exception do ETgException.TraceException(E, 'Fail .. ProcessRcvPolicy()'); end; end; procedure ProcessDownloadModules; var sCurDir, sChkPath: String; ms: TMemoryStream; function ExtrZip(sDestDir: String; bIgrErr: Boolean = false): Boolean; var zip: TAbUnZipper; begin if ms.Size = 0 then exit; Result := bIgrErr; if not ForceDirectories(sDestDir) then exit; try Guard(zip, TAbUnzipper.Create(nil)); zip.Stream := ms; // zip.FileName := sResPath; zip.ExtractOptions := [eoCreateDirs, eoRestorePath]; zip.BaseDirectory := sDestDir; // zip.OnArchiveProgress := ; // zip.OnNeedPassword := ; zip.ExtractFiles('*.*'); Result := true; except on E: Exception do ETgException.TraceException(E, Format('Fail .. ExtrZip(), ExtrDir="%s"', [sDestDir])); end; end; var bSuccess: Boolean; begin try {$IFDEF DEBUG} exit; {$ENDIF} if not gMgSvc.Connected then exit; Guard(ms, TMemoryStream.Create); sCurDir := GetRunExePathDir; if not gMgSvc.IsWin7Ver and IsSupportAIP then begin try // 1.17 버전 다운로드, 확인 if FileExists(sCurDir + DIR_CONF + EXE_AIP17) and not FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll') and ((_dwAip17DL_Tick = 0) or ((GetTickCount - _dwAip17DL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도 begin TTgTrace.T('ProcessDownloadModules .. AIP17 ..'); _dwAip17DL_Tick := 0; bSuccess := false; ms.Clear; try gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'aapi/static-comps/hec-aip17', ms); except _dwAip17DL_Tick := GetTickCount; end; if ms.Size > 0 then begin bSuccess := ExtrZip(sCurDir + DIR_AIP17); bSuccess := bSuccess and FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll'); end; if not bSuccess then begin TTgTrace.T('ProcessDownloadModules .. AIP17 .. Fail'); end else begin TTgTrace.T('ProcessDownloadModules .. AIP17 .. OK'); _dwAip17DL_Tick := GetTickCount; end; end; // 1.14 버전 다운로드, 확인 if not FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll') and not FileExists(sCurDir + DIR_AIP14 + 'Microsoft.InformationProtection.dll') and FileExists(sCurDir + DIR_CONF + EXE_AIP14) and ((_dwAip14DL_Tick = 0) or ((GetTickCount - _dwAip14DL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도 begin TTgTrace.T('ProcessDownloadModules .. AIP14 ..'); _dwAip14DL_Tick := 0; bSuccess := false; ms.Clear; try gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'agentDownloadReq/' + DOWNLOAD_TYPE_AIP14, ms); except _dwAip14DL_Tick := GetTickCount; end; if ms.Size > 0 then begin bSuccess := ExtrZip(sCurDir + DIR_AIP14); bSuccess := bSuccess and FileExists(sCurDir + DIR_AIP14 + 'Microsoft.InformationProtection.dll'); end; if not bSuccess then begin // _dwAip14DL_Tick := GetTickCount; TTgTrace.T('ProcessDownloadModules .. AIP14 .. Fail'); end else begin TTgTrace.T('ProcessDownloadModules .. AIP14 .. OK'); _dwAip14DL_Tick := GetTickCount; end; end; except on E: Exception do begin ETgException.TraceException(E, 'Fail .. ProcessDownloadModules() - AIP'); _dwAip14DL_Tick := GetTickCount; _dwAip17DL_Tick := _dwAip14DL_Tick; end; end; if FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll') then begin if FileExists(sCurDir + DAT_AIPUP17) then begin if not FileExists(sCurDir + DIR_AIP17 + EXE_AIP) then DeleteFile(PChar(sCurDir + DAT_AIPUP17)); end else begin TerminateProcessByName(EXE_AIP); // Sleep(1000); if DeleteFile_wait(sCurDir + DIR_AIP17 + EXE_AIP) and FileExists(sCurDir + DIR_CONF + EXE_AIP17) and CopyFile(PChar(sCurDir + DIR_CONF + EXE_AIP17), PChar(sCurDir + DIR_AIP17 + EXE_AIP), false) then begin WriteLnFileEndUTF8(sCurDir + DAT_AIPUP17, DateTimeToStr(Now)); // DeleteFile(PChar(sCurDir + DIR_CONF + EXE_AIP14)); end; // 이게 왜 사라지는지 모르겠지만... 보완 처리 23_1204 09:55:26 kku if not FileExists(sCurDir + DIR_AIP17 + 'Newtonsoft.Json.dll') then CopyFile(PChar(sCurDir + DIR_CONF + 'Newtonsoft.Json.dll'), PChar(sCurDir + DIR_AIP17 + 'Newtonsoft.Json.dll'), false); Sleep(1000); if not FileExists(sCurDir + DIR_AIP17 + EXE_AIP) or (GetFileSize_path(sCurDir + DIR_AIP17 + EXE_AIP) = 0) then begin // 파일 구성이 잘못되었다면 다시 처리할 수 있도록 지움 24_0221 15:09:34 kku DeleteFile(PChar(sCurDir + DAT_AIPUP17)); DeleteDir(sCurDir + DIR_AIP17); end else begin DeleteFile(PChar(sCurDir + DAT_AIPUP)); DeleteDir(sCurDir + DIR_AIP14); end; end; end else if FileExists(sCurDir + DIR_AIP14 + 'Microsoft.InformationProtection.dll') then begin if FileExists(sCurDir + DAT_AIPUP) then begin if not FileExists(sCurDir + DIR_AIP14 + EXE_AIP) then DeleteFile(PChar(sCurDir + DAT_AIPUP)); end else begin TerminateProcessByName(EXE_AIP); // Sleep(1000); if DeleteFile_wait(sCurDir + DIR_AIP14 + EXE_AIP) and FileExists(sCurDir + DIR_CONF + EXE_AIP14) and CopyFile(PChar(sCurDir + DIR_CONF + EXE_AIP14), PChar(sCurDir + DIR_AIP14 + EXE_AIP), false) then begin WriteLnFileEndUTF8(sCurDir + DAT_AIPUP, DateTimeToStr(Now)); // DeleteFile(PChar(sCurDir + DIR_CONF + EXE_AIP14)); end; // 이게 왜 사라지는지 모르겠지만... 보완 처리 23_1204 09:55:26 kku if not FileExists(sCurDir + DIR_AIP14 + 'Newtonsoft.Json.dll') then CopyFile(PChar(sCurDir + DIR_CONF + 'Newtonsoft.Json.dll'), PChar(sCurDir + DIR_AIP14 + 'Newtonsoft.Json.dll'), false); Sleep(1000); if not FileExists(sCurDir + DIR_AIP14 + EXE_AIP) or (GetFileSize_path(sCurDir + DIR_AIP14 + EXE_AIP) = 0) then begin // 파일 구성이 잘못되었다면 다시 처리할 수 있도록 지움 24_0221 15:09:34 kku DeleteFile(PChar(sCurDir + DAT_AIPUP)); DeleteDir(sCurDir + DIR_AIP14); end; end; end; end; // if not IsPrintWaterHook and if (not FileExists(sCurDir + DIR_CONF + EXE_SPL) or not FileExists(sCurDir + DIR_CONF + 'spl2pdf_lib\xps.dll')) and ((_dwSpoolDL_Tick = 0) or ((GetTickCount - _dwSpoolDL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도 begin try TTgTrace.T('ProcessDownloadModules .. SPOOL ..'); _dwSpoolDL_Tick := 0; bSuccess := false; ms.Clear; try gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'agentDownloadReq/' + DOWNLOAD_TYPE_SPOOL, ms); except _dwSpoolDL_Tick := GetTickCount; end; if ms.Size > 0 then begin bSuccess := ExtrZip(sCurDir + DIR_CONF); bSuccess := bSuccess and FileExists(sCurDir + DIR_CONF + 'spl2pdf_lib\xps.dll'); end; if not bSuccess then begin // _dwSpoolDL_Tick := GetTickCount; TTgTrace.T('ProcessDownloadModules .. SPOOL .. Fail'); end else begin TTgTrace.T('ProcessDownloadModules .. SPOOL .. OK'); _dwSpoolDL_Tick := GetTickCount; end; except on E: Exception do begin ETgException.TraceException(E, 'Fail .. ProcessDownloadModules() - SPOOL'); _dwSpoolDL_Tick := GetTickCount; end; end; end; if not FileExists(sCurDir + 'bin\' + EXE_KV) and ((_dwKeyviewDL_Tick = 0) or ((GetTickCount - _dwKeyviewDL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도 begin try TTgTrace.T('ProcessDownloadModules .. KV ..'); _dwKeyviewDL_Tick := 0; bSuccess := false; ms.Clear; try gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'agentDownloadReq/' + DOWNLOAD_TYPE_KEYVIEW, ms); except _dwKeyviewDL_Tick := GetTickCount; end; if ms.Size > 0 then begin bSuccess := ExtrZip(sCurDir + 'bin\'); bSuccess := bSuccess and FileExists(sCurDir + 'bin\' + EXE_KV); end; if not bSuccess then begin // _dwKeyviewDL_Tick := GetTickCount; TTgTrace.T('ProcessDownloadModules .. KV .. Fail'); end else begin TTgTrace.T('ProcessDownloadModules .. KV .. OK'); _dwKeyviewDL_Tick := GetTickCount; end; except on E: Exception do begin ETgException.TraceException(E, 'Fail .. ProcessDownloadModules() - CTT'); _dwKeyviewDL_Tick := GetTickCount; end; end; end; except on E: Exception do begin ETgException.TraceException(E, 'Fail .. ProcessDownloadModules()'); end; end; end; function ProcessSignal(bFailChangeDestUrl: Boolean = true): Boolean; function CheckUpdateAble: Boolean; var sNewVer, sCurVer: String; NewVers, CurVers: TStringList; ullNew, ullCur: ULONGLONG; i: Integer; begin Result := false; try if not gMgSvc.PrefModel.IsAgentUpdateExist then exit; if gMgSvc.UpdateTick <> 0 then exit; sNewVer := gMgSvc.PrefModel.AgentPatchVersion; if sNewVer = '' then exit; sCurVer := SdkVersion; if sNewVer = sCurVer then exit; if gMgSvc.PrefModel.IsFixedVerUpdate then begin // 서버에 있는 에이전트로 강제 업데이트 추가 24_0123 09:13:15 kku Result := true; end else begin Guard(NewVers, TStringList.Create); Guard(CurVers, TStringList.Create); if SplitString(sNewVer, '.', NewVers) = 0 then exit; if SplitString(sCurVer, '.', CurVers) = 0 then begin Result := StrToIntDef(NewVers[0], 0) > StrToIntDef(sCurVer, 0); exit; end; for i := 0 to NewVers.Count - 1 do begin if i >= CurVers.Count then begin Result := true; exit; end; if StrToIntDef(NewVers[i], 0) < StrToIntDef(CurVers[i], 0) then exit; if StrToIntDef(NewVers[i], 0) > StrToIntDef(CurVers[i], 0) then begin Result := true; exit; end; end; end; except on E: Exception do ETgException.TraceException(E, 'Fail .. CheckUpdateAble()'); end; end; procedure ProcessUpdate; var sUrl, sNewVer, sPtPath: String; fs: TFileStream; nOldTO: Integer; begin try sNewVer := gMgSvc.PrefModel.AgentPatchVersion; sUrl := gMgSvc.DestIPort + 'agentDownReq/' + DOWNLOAD_TYPE_PATCH; nOldTO := gMgSvc.HTTP.ReadTimeout; gMgSvc.HTTP.ReadTimeout := 120000; sPtPath := GetProgramFilesDir + DIR_TG; fs := TFileStream.Create(sPtPath + ZIP_PT, fmCreate); try gMgSvc.HTTP.Get(sUrl, fs); Sleep(500); if FileExists(sPtPath + ZIP_PT) then begin FreeAndNil(fs); if GetFileSize_path(sPtPath + ZIP_PT) = 0 then begin DeleteFile(PChar(sPtPath + ZIP_PT)); exit; end; TZipFile.ExtractZipFile(sPtPath + ZIP_PT, sPtPath); DeleteFile(PChar(sPtPath + ZIP_PT)); if FileExists(sPtPath + EXE_PT) then begin DelRegValue(HKEY_LOCAL_MACHINE, REG_HE, 'LP'); gMgSvc.SendEventLog(URI_USERUPDATE, SYSEVT_AGENT_PATCH, 'Patch Downloaded : ' + sNewVer); gMgSvc.UpdateTick := GetTickCount; if not IsFileSigned(sPtPath + EXE_PT) then begin // 다음 정책 받을때까지 업데이트 시도 되지 않도록 조치 25_0414 10:23:33 kku gMgSvc.PrefModel.AgentPatchVersion := ''; DeleteFile(PChar(sPtPath + EXE_PT)); TTgTrace.T('Fail .. ProcessUpdate() .. Unsigned installation file. FName=%s', [EXE_PT]); gMgSvc.SendEventLogEx(AUDIT_AGENT_PATCH_FAIL, Format('Patch Fail : %s, Unsigned installation file.', [sNewVer])); end else ExecuteApp(sPtPath + EXE_PT, '', SW_HIDE); end; end; finally if fs <> nil then FreeAndNil(fs); gMgSvc.HTTP.ReadTimeout := nOldTO; end; except on E: Exception do ETgException.TraceException(E, 'Fail .. ProcessUpdate()'); end; end; var sReqType, sEulaCon, sHostName, sAvInfo, sAsInfo, sFwInfo, sRes: String; O: ISuperObject; bChangedPolicy: Boolean; // NewAgentInfo: TCheckAgentInfo; bChangeAgentInfo: Boolean; function IsChangeAgentInfo: Boolean; begin Result := true; with gMgSvc.AgentInfo do begin if sAgentId <> _NewAgentInfo.sAgentId then exit; if sIp <> _NewAgentInfo.sIp then exit; if sIps <> _NewAgentInfo.sIps then exit; if sMAC <> _NewAgentInfo.sMAC then exit; if sAccount <> _NewAgentInfo.sAccount then exit; if sHostName <> _NewAgentInfo.sHostName then exit; if sEulaCon <> _NewAgentInfo.sEulaCon then exit; if sLocation <> _NewAgentInfo.sLocation then exit; if sPwSet <> _NewAgentInfo.sPwSet then exit; if sPwSetTermOk <> _NewAgentInfo.sPwSetTermOk then exit; if sScrnLock <> _NewAgentInfo.sScrnLock then exit; if sOsVer <> _NewAgentInfo.sOsVer then exit; if sAvInfo <> _NewAgentInfo.sAvInfo then exit; if sFwInfo <> _NewAgentInfo.sFwInfo then exit; if sOsSafe <> _NewAgentInfo.sOsSafe then exit; if sPatchExist <> _NewAgentInfo.sPatchExist then exit; if sAvSafe <> _NewAgentInfo.sAvSafe then exit; if sAvUptodate <> _NewAgentInfo.sAvUptodate then exit; if sFwSafe <> _NewAgentInfo.sFwSafe then exit; if sPiSafe <> _NewAgentInfo.sPiSafe then exit; if sEmpNo <> _NewAgentInfo.sEmpNo then exit; // if bSafePcSHCD <> _NewAgentInfo.bSafePcSHCD then exit; if bJoinAD <> _NewAgentInfo.bJoinAD then exit; if sModeName <> _NewAgentInfo.sModeName then exit; end; Result := false; end; var bUpdate, bConnected, bPrevConnected: Boolean; SecuApp: TSecureApp; wURole: WORD; i: Integer; sKName: String; Label LB_SignalComplete; begin Result := false; try if gMgSvc.EmpNo = '' then begin TTgTrace.T('ProcessSignal() .. Init .. Empty EmpNo ..'); Sleep(3000); exit; end; // TTgTrace.T('ProcessSignal() .. exit'); // exit; sHostName := gMgSvc.UserName; if sHostName = '' then begin TTgTrace.T('ProcessSignal() .. Init .. Empty HostName?? .. GetComAct=%s', [GetComName + '\' + GetAccount]); Sleep(5000); exit; end; if gMgSvc.IsOfflineMode then goto LB_SignalComplete; if gMgSvc.HandleSecurity <> nil then begin SecuApp := gMgSvc.HandleSecurity.GetMainAv; if (SecuApp <> nil) and (SecuApp.Name <> '') then begin sAvInfo := SecuApp.Name + MODEL_SEPARATOR + // MODEL_SEPARATOR + SecuApp.Path + MODEL_SEPARATOR + SecuApp.Timestamp; end else sAvInfo := 'null'; SecuApp := gMgSvc.HandleSecurity.GetMainAs; if (SecuApp <> nil) and (SecuApp.Name <> '') then begin sAsInfo := SecuApp.Name + MODEL_SEPARATOR + SecuApp.Path + MODEL_SEPARATOR + SecuApp.Timestamp; end else sAsInfo := 'null'; SecuApp := gMgSvc.HandleSecurity.GetMainFw; if (SecuApp <> nil) and (SecuApp.Name <> '') then begin sFwInfo := SecuApp.Name + MODEL_SEPARATOR + SecuApp.Path + MODEL_SEPARATOR + SecuApp.Timestamp; end else sFwInfo := 'null'; end else begin sAvInfo := 'null'; sAsInfo := 'null'; sFwInfo := 'null'; end; sEulaCon := 'disagree'; if gMgSvc.AgentModel.EulaDT <> 0 then sEulaCon := FormatDateTime('yyyy-mm-dd hh:nn:ss', gMgSvc.AgentModel.EulaDT); _NewAgentInfo.sAgentId := gMgSvc.AgentId; if gMgSvc.NicService <> nil then begin _NewAgentInfo.sIp := gMgSvc.NicService.GetIP; _NewAgentInfo.sIps := gMgSvc.NicService.IpAll; _NewAgentInfo.sMAC := gMgSvc.NicService.GetMAC; end else begin _NewAgentInfo.sIp := 'ip'; _NewAgentInfo.sIps := 'ips'; _NewAgentInfo.sMAC := 'mac'; end; _NewAgentInfo.sAccount := gMgSvc.Account; if IsUseHostNameOnly then _NewAgentInfo.sHostName := gMgSvc.ComName else _NewAgentInfo.sHostName := sHostName; _NewAgentInfo.sEulaCon := sEulaCon; if gMgSvc.PrefModel.PolicyGroup <> '' then _NewAgentInfo.sLocation := gMgSvc.PrefModel.PolicyGroup else _NewAgentInfo.sLocation := gMgSvc.PrefModel.PolicyName; if gMgSvc.VulService <> nil then begin _NewAgentInfo.sPwSet := BooleanToStr(gMgSvc.VulService.IsPasswordSet, 'true', 'false'); _NewAgentInfo.sPwSetTermOk := BooleanToStr(gMgSvc.VulService.IsPasswordSetTermOk, 'true', 'false'); _NewAgentInfo.sScrnLock := BooleanToStr(gMgSvc.VulService.IsScreenSaverSet, 'true', 'false'); end else begin _NewAgentInfo.sPwSet := 'true'; _NewAgentInfo.sPwSetTermOk := 'true'; _NewAgentInfo.sScrnLock := 'true'; end; if gMgSvc.HandleConfig <> nil then begin if gMgSvc.HandleConfig.OsMajorVer <> '' then _NewAgentInfo.sOsVer := Format('%s (%s)', [gMgSvc.HandleConfig.OsVersion, gMgSvc.HandleConfig.OsMajorVer]) // gMgSvc.VulService.OsVersion; else _NewAgentInfo.sOsVer := gMgSvc.HandleConfig.OsVersion; end else _NewAgentInfo.sOsVer := 'test2'; _NewAgentInfo.sAvInfo := sAvInfo; _NewAgentInfo.sFwInfo := sFwInfo; if gMgSvc.VulService <> nil then begin _NewAgentInfo.sOsSafe := BooleanToStr(gMgSvc.VulService.IsOsSafe, 'true', 'false'); _NewAgentInfo.sPatchExist := BooleanToStr(gMgSvc.VulService.IsOsPatchUptoDate, 'true', 'false'); _NewAgentInfo.sAvUptodate := BooleanToStr(gMgSvc.VulService.IsAntiVirusUpToDate, 'true', 'false'); _NewAgentInfo.sAvSafe := BooleanToStr(gMgSvc.VulService.IsAvOn, 'true', 'false'); _NewAgentInfo.sFwSafe := BooleanToStr(gMgSvc.VulService.IsFirewallOn, 'true', 'false'); end else begin _NewAgentInfo.sOsSafe := 'true'; _NewAgentInfo.sPatchExist := 'true'; _NewAgentInfo.sAvUptodate := 'true'; _NewAgentInfo.sAvSafe := 'true'; _NewAgentInfo.sFwSafe := 'true'; end; _NewAgentInfo.sPiSafe := BooleanToStr(gMgSvc.IsSchRstVul, 'false', 'true'); case gMgSvc.HeModeKind of hmkSleep : _NewAgentInfo.sModeName := 'Sleep'; hmkSecurity : _NewAgentInfo.sModeName := 'Secu'; hmkVulnerability : _NewAgentInfo.sModeName := 'Vul'; hmkOffline : _NewAgentInfo.sModeName := 'Offline'; hmkException : _NewAgentInfo.sModeName := 'Exption'; end; _NewAgentInfo.sEmpNo := gMgSvc.EmpNo; // _NewAgentInfo.bSafePcSHCD := (CUSTOMER_TYPE = CUSTOMER_SHCD) and FileExists(GetRunExePathDir + EXE_SafePCUninst); _NewAgentInfo.bJoinAD := IsJoinAD; O := SO; bPrevConnected := gMgSvc.Connected; bChangeAgentInfo := IsChangeAgentInfo; // 공통 O.S['KEY_AGENTID'] := _NewAgentInfo.sAgentId; O.S['KEY_EMPNO'] := _NewAgentInfo.sEmpNo; O.S['KEY_HOSTNAME'] := _NewAgentInfo.sHostName; O.S['KEY_MODE'] := _NewAgentInfo.sModeName; O.S['VUL_OSVER'] := _NewAgentInfo.sOsVer; // 시그널 패킷에도 OS정보 추가 23_1214 15:48:03 kku O.S['KEY_LASTPOLICY'] := gMgSvc.LastPolicy; // 빈값을 넣으면 응답도 빈값으로 온다... 23_0802 11:06:47 kku // O.S['KEY_LASTPUSH'] := ''; //'2024-10-10 11:11:11';//gMgSvc.LastPolicy; // 빈값을 넣으면 응답도 빈값으로 온다... 23_0802 11:06:47 kku if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then O.S['key_xPrintVer'] := gMgSvc.xPrintVer; sReqType := '0'; if not bPrevConnected or bChangeAgentInfo then begin sReqType := '1'; O.S['KEY_IP'] := _NewAgentInfo.sIp; O.S['KEY_IPS'] := _NewAgentInfo.sIps; O.S['KEY_MAC'] := _NewAgentInfo.sMAC; O.S['KEY_ACCOUNT'] := _NewAgentInfo.sAccount; O.S['KEY_GROUPNAME'] := _NewAgentInfo.sLocation; O.S['KEY_AGENTTYPE'] := BooleanToStr(IsVDI, 'VDI', 'PC'); O.S['KEY_COLLASTCONN'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now); O.S['KEY_COLVERSION'] := SdkVersion; O.S['VUL_PWDSET'] := _NewAgentInfo.sPwSet; if _NewAgentInfo.sPwSetTermOk <> 'true' then begin var nOver: Integer := DaysBetween(Now, gMgSvc.LastChangePwDT); if (nOver > 0) and (nOver > gMgSvc.PrefModel.PwChkTermDay) then begin O.S['VUL_PWDEXPIRED'] := 'true'; O.S['VUL_PWDLASTDAYS'] := IntToStr(nOver - gMgSvc.PrefModel.PwChkTermDay); end else O.S['VUL_PWDEXPIRED'] := 'false'; end else O.S['VUL_PWDEXPIRED'] := 'false'; O.S['VUL_SCRNLOCK'] := _NewAgentInfo.sScrnLock; O.S['VUL_OSSAFEPATCH'] := _NewAgentInfo.sOsSafe; O.S['VUL_AV'] := _NewAgentInfo.sAvInfo; O.S['VUL_AVENABLE'] := _NewAgentInfo.sAvSafe; O.S['VUL_AVSAFEPATCH'] := _NewAgentInfo.sAvUptodate; O.S['VUL_FW'] := _NewAgentInfo.sFwInfo; O.S['VUL_FWENABLE'] := _NewAgentInfo.sFwSafe; O.S['VUL_PI'] := _NewAgentInfo.sPiSafe; O.S['VUL_AD'] := BooleanToStr(_NewAgentInfo.bJoinAD, 'true', 'false'); end; // {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\pa.json'); {$ENDIF} sRes := gMgSvc.HttpPost(gMgSvc.DestIPort + 'statusRequest.do', sReqType, O.AsString); // 접속 상태 처리를 TimerCheckConnect()에서 여기로 옮김 23_0324 12:04:45 kku try if sRes = 'true' then TTgTrace.T('Status Response .. Empty'); bConnected := (sRes = POST_TIMEOUT) or ( (sRes <> '') and (sRes <> '404') and (sRes <> 'true') and sRes.Contains('SERVERTIME') ); if not bConnected then begin if not bPrevConnected then begin if bFailChangeDestUrl then gMgSvc.ChangeDestinationUrl; end else gMgSvc.SetConnected(false, false); end else if not bPrevConnected then begin if sRes = POST_TIMEOUT then begin bConnected := false; if bFailChangeDestUrl then gMgSvc.ChangeDestinationUrl; // 음... 타임아웃 되도 이전 접속이 false라면 접속 정보 변경 시도해준다 23_0608 13:49:09 kku end else begin gMgSvc.SetConnected(true, true); // 접속 시 CJ 사번 인증 24_1218 14:45:10 kku // 나중에 부하 발생 시 문제가 생길거 같아서 봉인... // if CUSTOMER_TYPE = CUSTOMER_CJOV_GLOBAL then // gMgSvc.DoEmpNoCheck := IsCheckEmpNo and gMgSvc.PrefModel.IsEmpVerify; end; end; if bConnected then begin // if CUSTOMER_TYPE = CUSTOMER_CJOV_GLOBAL then // 일단 봉인 24_1218 14:49:38 kku // begin // // CJ 사번 미인증 체크 24_1218 14:40:44 kku // if gMgSvc.DoEmpNoCheck then // begin // gMgSvc.IsEmpNoOk := VerifyEmpNo(gMgSvc.DestServerUrl, gMgSvc.HTTP, gMgSvc.EmpNo); // gMgSvc.DoEmpNoCheck := false; // end; // end else if (gMgSvc.HeModeKind = hmkSecurity) and gMgSvc.DoEmpNoCheck then begin // 사번검증을 통해 미검증 시 보안모드 진입을 막을 예정이었으나... // 일단 그렇게까지 동작하지 않도록 함 22_0531 16:04:58 kku gMgSvc.IsEmpNoOk := VerifyEmpNo(gMgSvc.DestServerUrl, gMgSvc.HTTP, gMgSvc.EmpNo); gMgSvc.DoEmpNoCheck := false; if not gMgSvc.IsEmpNoOk then begin gMgSvc.PopupMessage(TYPE_MSG_VUL_EMPNO); if CUSTOMER_TYPE = CUSTOMER_KFTC then begin // 금융결제원의 경우 사번이 유효하지 않은 경우 (인사연동 안된 사번) // 보안모드 차단 되도록 기능 추가 23_0425 12:52:05 kku if gMgSvc.VulService <> nil then gMgSvc.VulService.SetDisconnect(true); end; end; end else gMgSvc.IsEmpNoOk := true; end; except TTgTrace.T('ProcessSignal() .. Fail .. ConnectionCheck'); end; if not bConnected or (sRes = POST_TIMEOUT) then goto LB_SignalComplete; // 접속 상태 처리 끝 --------------------------------------------------------- try O := SO(sRes); if O = nil then begin // SaveStrToFile('c:\ttttt.txt', sRes, TEncoding.UTF8); TTgTrace.T('ProcessSignal() .. Invalid Response ... 2'); exit; end; except TTgTrace.T('ProcessSignal() .. Invalid Response ... 1'); exit; end; // {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\ss.json'); {$ENDIF} // if ((O.S['UPD_TYPE'] <> '') and (O.S['UPD_TYPE'].ToLower <> 'false')) or // ((O.S['UPD_MODE'] <> '') and (O.S['UPD_MODE'].ToLower <> 'false')) or // ((O.S['UPD_CAMPAIGN'] <> '') and (O.S['UPD_CAMPAIGN'].ToLower <> 'false')) or // ((O.S['UPD_RULE'] <> '') and (O.S['UPD_RULE'].ToLower <> 'false')) then // begin // O.S['1'] := ''; // end; if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then begin end; bUpdate := false; if O.S['KEY_DEPT'] <> gMgSvc.DeptName then begin gMgSvc.AgentModel.DeptName := O.S['KEY_DEPT']; bUpdate := true; end; if O.S['KEY_USERNAME'] <> gMgSvc.UName then begin gMgSvc.AgentModel.UName := O.S['KEY_USERNAME']; bUpdate := true; end; if O.S['KEY_USEREMAIL'] <> gMgSvc.Email then begin gMgSvc.AgentModel.Email := O.S['KEY_USEREMAIL']; bUpdate := true; end; if (O.S['changedEmpId'] <> '') and (O.S['changedEmpId'] <> gMgSvc.EmpNo) then begin TTgTrace.T('[09] 사번 변경, %s > %s', [gMgSvc.AgentModel.EmpNo, O.S['changedEmpId']]); gMgSvc.SendEventLogEx(LOG_CHANGE_EMPNO, Format('[Server] EmpId Changed. (%s > %s)', [gMgSvc.AgentModel.EmpNo, O.S['changedEmpId']]), false); gMgSvc.AgentModel.EmpNo := O.S['changedEmpId']; bUpdate := true; end; // {$IFNDEF DEBUG} // TTgTrace.T('key_approval = %s', [O.S['key_approval']], 9); if gMgSvc.UseApproval <> (O.S['key_approval'] = 'true') then begin gMgSvc.UseApproval := not gMgSvc.UseApproval; bUpdate := true; end; // {$ENDIF} // TTgTrace.T('KEY_USERNAME : %s, KEY_USEREMAIL : %s', [O.S['KEY_USERNAME'], O.S['KEY_USEREMAIL']], 2); wURole := StrToIntDef(O.S['KEY_ROLE'], 0); if wURole <> gMgSvc.UserRole then begin gMgSvc.UserRole := wURole; bUpdate := true; end; {$IFNDEF DEBUG} if not gMgSvc.RcvRemoveAgent and (Trim(O.S['KEY_FORCEUNINSTALL']).ToLower = 'true') then begin TTgTrace.T('Req .. AgentUninstall ..'); gMgSvc.RcvRemoveAgent := true; gMgSvc.DirectSendEventLog(URI_USER_ACTION, SYSEVT_REQ_AGENT_UNINSTALL, '[Req] Uninstall Agent'); if gMgSvc.RcvHwnd <> 0 then PostMessage(gMgSvc.RcvHwnd, WM_REQ_AGENT_UNINSTALL, 0, 0); end; {$ENDIF} if bUpdate then begin gMgSvc.AgentModel.Save; gMgSvc.UpdateAgentInfo; end; if CUSTOMER_TYPE = CUSTOMER_LOTTEMART then begin case CUSTOMER_SUB_TYPE of 1, 2 : if gMgSvc.AgentModel.UName = '' then begin // 이름이 없으면 인사 정보가 없는걸로 판단 25_0402 14:00:42 kku if not MutexExists('Global\EPI_250412') then gMgSvc.PopupMessage(TYPE_EMPTY_PERSONAL_INFO); end; end; end; // 결재 처리 시작 -------------------------------------------------------------- // 결재요청 알림 for i := Low(_arrUpdReq) to High(_arrUpdReq) do begin sKName := _arrUpdReq[i]; if (O.O[sKName] <> nil) and (O.O[sKName].DataType = stArray) and (O.A[sKName].Length > 0) then begin var sData: String := O.O[sKName].AsJSon; if _arrChkReqVal[i] <> sData then begin _arrChkReqVal[i] := sData; if CUSTOMER_TYPE = CUSTOMER_DEV then TTgTrace.T('%s = %s', [sKName, O.O[sKName].AsJSon]); // {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\ss1.json'); {$ENDIF} var q: Integer := 0; for q := 0 to O.A[sKName].Length - 1 do SendMessage(gMgSvc.RcvHwnd, WM_REQUEST_APPROVAL, i, NativeInt(O.A[sKName].S[q])); bUpdate := true; end; end; end; // 결재완료 알림 for i := Low(_arrUpdDone) to High(_arrUpdDone) do begin sKName := _arrUpdDone[i]; if (O.O[sKName] <> nil) and (O.O[sKName].DataType = stArray) and (O.A[sKName].Length > 0) then begin var sData: String := O.O[sKName].AsJSon; if _arrChkDoneVal[i] <> sData then begin _arrChkDoneVal[i] := sData; if CUSTOMER_TYPE = CUSTOMER_DEV then TTgTrace.T('%s = %s', [sKName, O.O[sKName].AsJSon]); // {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\ss2.json'); {$ENDIF} var q: Integer := 0; for q := 0 to O.A[sKName].Length - 1 do SendMessage(gMgSvc.RcvHwnd, WM_DONE_APPROVAL, i, NativeInt(O.A[sKName].O[q].AsJSon)); bUpdate := true; end; end; end; // 결재 처리 끝 ==-------------------------------------------------------------- if (O.S['UPD_RULE'] <> '') and (O.S['UPD_RULE'].ToLower <> 'false') then begin gMgSvc.MgRule.UpdateRuleEnts(O.O['UPD_RULE']); bUpdate := true; end; if // not bPrevConnected or ((O.S['UPD_TYPE'] <> '') and (O.S['UPD_TYPE'].ToLower <> 'false')) or (O.S['KEY_GROUPNAME'] <> gMgSvc.PrefModel.PolicyGroup) then begin ProcessRcvPolicy(rpkAll); // TTgTrace.T('정책 업데이트됨', 1); // gMgSvc.RefreshView; bUpdate := true; end; if bChangeAgentInfo then gMgSvc.AgentInfo := _NewAgentInfo; if (O.S['UPD_CAMPAIGN'] <> '') and (O.S['UPD_CAMPAIGN'].ToLower <> 'false') then begin gMgSvc.MgCampn.UpdateCampnEnts(O.O['UPD_CAMPAIGN']); bUpdate := true; end; if bUpdate then begin // {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\uss.json'); {$ENDIF} gMgSvc.LastPolicy := O.S['SERVERTIME']; // FormatDateTime('yyyy-mm-dd hh:nn:ss', Now); end; if gMgSvc.UpdateTick <> 0 then begin // 10분간 업데이트 시도가 끝나지 않으면 // 다시 시도 하기 위해 초기화 해준다 23_0830 13:41:36 kku if (GetTickCount - gMgSvc.UpdateTick) >= 600000 then gMgSvc.UpdateTick := 0; end; if CheckUpdateAble then ProcessUpdate; if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then CheckAndUpdate_xPrint; ProcessDownloadModules; LB_SignalComplete : gMgSvc.UpdateInternalInfo; Result := true; except on E: Exception do ETgException.TraceException(E, 'Fail .. ProcessSignal()'); end; end; initialization ZeroMemory(@_NewAgentInfo, SizeOf(_NewAgentInfo)); finalization Finalize(_NewAgentInfo); end.