BSOne.SFC/eCrmHE/EXE_eCrmHomeEdition/Thread/ThdMgRcver.pas

355 lines
12 KiB
Plaintext

{*******************************************************}
{ }
{ ThdMgRcver }
{ }
{ Copyright (C) 2022 kku }
{ }
{*******************************************************}
unit ThdMgRcver;
interface
uses
Tocsg.Thread, System.Classes, System.SysUtils, Winapi.Windows,
Winapi.Messages, CrmSocketBase, IdContext, ManagerService;
const
WM_RCV_PACKET_8261 = WM_USER + 3958;
type
TThdMgRcver = class(TCrmServerBase)
private
MgSvc_: TManagerService;
protected
procedure _ProcessRcv(AContext: TIdContext; sRcv: String); override;
public
Constructor Create(aMgSvc: TManagerService);
end;
implementation
uses
Tocsg.Exception, IdStack, Tocsg.Trace, Tocsg.Strings, Define, Tocsg.Convert,
Tocsg.Process, Condition, Tocsg.Safe, GlobalDefine;
// 사용 포트 : 8261,8262,8263
// 8261 : 상태값 전송 - mg -> vw (svr)
// TYPE_STATUSUPDATE, TYPE_VPNREGNEXG, TYPE_DISCONNECTRESULT,
// TYPE_CLIPBOARDUSAGE, TYPE_DOMAINMONITOR, TYPE_PATCH, TYPE_ROUTERCHANGE (사용안함)
// 8262 : 리시버 - vw -> mg (svr), 프로세스 차단 요청 등
// 8263 : 리시버리스트? - vw -> mg (svr), 프로세스가 살아 있는지 체크
{ TThdMgRcver }
Constructor TThdMgRcver.Create(aMgSvc: TManagerService);
begin
Inherited Create(8261);
MgSvc_ := aMgSvc;
end;
procedure TThdMgRcver._ProcessRcv(AContext: TIdContext; sRcv: String);
procedure process_TYPE_STATUS;
var
sRes: String;
begin
sRes := '';
with MgSvc_.VulService do
begin
sRes := BooleanToStr(MgSvc_.VulService.IsVpnOn, 't', 'f'); // BooleanToStr(MgSvc_.IsServiceAvailable and (IsSafeMode or MgSvc_.IsTemporaryConn), 't', 'f');
sRes := sRes + 'f'; // BooleanToStr(IsForceDisconnect, 't', 'f'); // HE에서 처리 22_0622 13:41:22 kku
sRes := sRes + 'f'; // BooleanToStr(IsScreenLogo, 't', 'f'); // HE에서 처리 22_0531 09:50:32 kku
sRes := sRes + 'f'; // BooleanToStr(IsPrintBlock, 't', 'f');
sRes := sRes + 'f'; // BooleanToStr(IsDefaultPortBlock, 't', 'f'); // HE에서 처리 22_0516 17:13:54 kku
sRes := sRes + 'f'; // BooleanToStr(IsWatermark, 't', 'f'); // HE에서 처리
sRes := sRes + 'f'; // BooleanToStr(IsFileMonitor, 't', 'f'); // HE에서 처리
sRes := sRes + 'f'; // BooleanToStr(IsFilePrevent, 't', 'f'); // HE에서 처리
sRes := sRes + 'f'; // BooleanToStr(IsFileMasking, 't', 'f'); // HE에서 처리
sRes := sRes + BooleanToStr(MgSvc_.ModePolicy.RouteEnable, 't', 'f');
sRes := sRes + 'f'; // BooleanToStr(MgSvc_.PrefModel.UsbEnable, 't', 'f'); // HE에서 처리
sRes := sRes + 'f'; // BooleanToStr(IsIdleMode, 't', 'f'); // 스크린 세이버 // HE에서 처리
// if IsIdleMode then
// begin
// SetIdleMode(false);
// MgSvc_.HandleConfig.SetIdleTime('0');
// end;
sRes := sRes + 'f'; // ? isIdlePortBlock
sRes := sRes + BooleanToStr(MgSvc_.IsUninstall, 't', 'f');
sRes := sRes + BooleanToStr(IsZoomControl and (GetProcessPidsByName('zCefAgent.exe') > 0), 't', 'f');
sRes := sRes + 'f'; // BooleanToStr(MgSvc_.PrefModel.IsExtraPortEnable, 't', 'f'); // HE에서 처리 22_0516 17:13:54 kku
sRes := sRes + 'f'; // sRes + BooleanToStr(MgSvc_.PrefModel.IsClipboardEnable, 't', 'f');
AContext.Connection.Socket.Write(sRes);
// TYPE_DISCONNECT 처리를 그냥 여기서 해준다 22_0523 13:51:59 kku
// HE에서 직접 처리하게 됨 22_0622 13:42:50 kku
// if IsForceDisconnect then
// SetDisconnect(false, false);
end;
end;
procedure process_TYPE_ROUTECHANGE;
var
Router: TRouter;
DataList: TStringList;
bIsDefRouter: Boolean;
i: Integer;
sRes: String;
begin
with MgSvc_ do
begin
// 임시 접속 시 에도 차단하기 위해 아래처럼 변경 22_0523 16:24:01 kku
if ModePolicy.RouteEnable and
(MgSvc_.VulService <> nil) and
// MgSvc_.VulService.IsVpnOn and
(MgSvc_.RouterDefList.Count > 0 ) then
begin
Guard(DataList, TStringList.Create);
Guard(Router, TRouter.Create);
Router.Update(sRcv);
if Router.DestIp <> '' then
begin
bIsDefRouter := false;
if GetVpnIpList(DataList) > 0 then
begin
for i := 0 to DataList.Count - 1 do
if Router.DestIp.Contains(DataList[i]) then
begin
bIsDefRouter := true;
break;
end;
end;
if not bIsDefRouter and (GetExceptionalRouterList(DataList) > 0) then
begin
for i := 0 to DataList.Count - 1 do
if Router.DestIp.Contains(DataList[i]) then
begin
bIsDefRouter := true;
break;
end;
end;
if not bIsDefRouter then
begin
for i := 0 to MgSvc_.RouterDefList.Count - 1 do
if MgSvc_.RouterDefList[i].DestIp = Router.DestIp then
begin
bIsDefRouter := true;
break;
end;
end;
if not bIsDefRouter then
begin
sRes := 'rtoc;add;' + Router.DestIp + ';';
AContext.Connection.Socket.Write(sRes);
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_ROUTERCHANGE,
Format('- Dest : %s'#13#10'- IP Info : %s (%s)',
[Router.DestIp, Router.NextHop, Router.SubnetMask]));
gMgSvc.SendEventLog(URI_USER_ACTION,
LOGCODE_PREVENT_ROUTE,
Format('Routing table Prevented : %s, %s (%s)',
[Router.DestIp, Router.NextHop, Router.SubnetMask]));
end;
end;
end;
end;
// TTgTrace.T('TYPE_ROUTECHANGE');
end;
procedure process_TYPE_ROUTEDEFAULT;
var
Router: TRouter;
i: Integer;
begin
Router := TRouter.Create;
Router.Update(sRcv);
if Router.DestIp <> '' then
begin
// DestIp 가 중복되는 경우도 있는거 확인 22_0425 08:35:23 kku
// for i := 0 to MgSvc_.RouterDefList.Count - 1 do
// if MgSvc_.RouterDefList[i].DestIp = Router.DestIp then
// begin
// ASSERT(false);
// exit;
// end;
MgSvc_.RouterDefList.Add(Router);
end else Router.Free;
end;
procedure process_TYPE_NETWORKMONITOR;
var
PrevList,
ConnList,
RecvList,
RemoveList: TStringList;
i, n: Integer;
begin
if sRcv = '' then
exit;
if CUSTOMER_TYPE = CUSTOMER_KR then
exit;
if sRcv.Contains(',') then
begin
Guard(PrevList, TStringList.Create);
PrevList.AddStrings(MgSvc_.ActiveConnectList);
Guard(ConnList, TStringList.Create);
SplitString(sRcv, ',', ConnList);
Guard(RecvList, TStringList.Create);
Guard(RemoveList, TStringList.Create);
for i := 0 to ConnList.Count - 1 do
begin
if MgSvc_.ActiveConnectList.IndexOf(ConnList[i]) = -1 then
MgSvc_.ActiveConnectList.Add(ConnList[i]);
RecvList.Add(ConnList[i]);
end;
for i := 0 to MgSvc_.ActiveConnectList.Count - 1 do
if RecvList.IndexOf(MgSvc_.ActiveConnectList[i]) = -1 then
RemoveList.Add(MgSvc_.ActiveConnectList[i]);
for i := 0 to RemoveList.Count - 1 do
begin
n := MgSvc_.ActiveConnectList.IndexOf(RemoveList[i]);
if n <> -1 then
MgSvc_.ActiveConnectList.Delete(n);
end;
end else
if MgSvc_.ActiveConnectList.IndexOf(sRcv) = -1 then
MgSvc_.ActiveConnectList.Add(sRcv);
if IsNetworkMonitor and (MgSvc_.ActiveConnectList.Count > 0) then
begin
if PrevList.Count > 0 then
begin
for i := 0 to MgSvc_.ActiveConnectList.Count - 1 do
begin
if PrevList.IndexOf(MgSvc_.ActiveConnectList[i]) = -1 then
gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_MONITOR_CONNECTION, 'Access : ' + MgSvc_.ActiveConnectList[i]);
end;
end else begin
for i := 0 to MgSvc_.ActiveConnectList.Count - 1 do
begin
gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_MONITOR_CONNECTION, 'Access : ' + MgSvc_.ActiveConnectList[i]);
end;
end;
end;
end;
procedure process_TYPE_DOMAINMONITOR;
begin
if sRcv = '' then
exit;
if not IsNetworkMonitor then
exit;
gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_MONITOR_DOMAIN, 'Domain : ' + sRcv);
end;
procedure process_TYPE_CLIPBOARD;
begin
if sRcv = '' then
exit;
MgSvc_.PopupMessage(TYPE_MSG_PREVENT_CLIPBOARD);
gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_PREVENT_CLIPBOARD, 'Clipboard Blocked');
end;
// procedure process_TYPE_USBDISCONNECTED;
// var
// DataList: TStringList;
// sInfo: String;
// begin
// if sRcv = '' then
// exit;
//
// Guard(DataList, TStringList.Create);
// SplitString(sRcv, '_tocLine_', DataList);
// if DataList.Count > 1 then
// sInfo := Format('Serial :'#13#10'%s', [DataList[1]])
// else sInfo := '';
//
// MgSvc_.PopupMessage(TYPE_MSG_PREVENT_USBDISCONN, sInfo);
// gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_PREVENT_USB,
// Format('USB Blocked : %s, %s', [DataList[0], DataList[1]]));
// end;
// procedure process_TYPE_VPNREGNEXG;
// begin
// MgSvc_.SetNexgVpnRegistered(sRcv = 't');
// end;
procedure process_TYPE_ADDRESSCHANGE;
begin
// 비활성화 되어 있음 22_0425 10:26:22 kku
//try {Thread.sleep(1000);} catch (Exception e2) {}
//ServiceManager.getNicService().updateAddress();
TTgTrace.T('TYPE_ADDRESSCHANGE');
end;
procedure process_TYPE_FILECHANGE;
// var
// StrList: TStringList;
begin
// TTgTrace.T('TYPE_FILECHANGE, Rcv=%s', [sRcv]);
if not sRcv.Contains('_tocLine_') then
exit;
// Guard(StrList, TStringList.Create);
// SplitString(sRcv, '_tocLine_', StrList);
// if StrList.Count <= 2 then
// exit;
// MgSvc_.PushProcFile(sRcv);
// TTgTrace.T('TYPE_FILECHANGE, src="%s", dst="%s"', [StrList[1], StrList[2]]);
end;
var
nType: Integer;
begin
// if hRcvHwnd_ <> 0 then
// SendMessage(hRcvHwnd_, WM_RCV_PACKET_8261, 0, NativeInt(Trim(sRcv)));
// TTgTrace.T(sRcv);
nType := StrToIntDef(GetCapsuleStr(KEY_TYPE, KEY_DATA, sRcv), -1);
if nType <> -1 then
Delete(sRcv, 1, 25)
else exit;
case nType of
//TYPE_PROCESSLIST : ;
TYPE_CONFIG : ; // MgSvc_.HandleConfig.Update(sRcv); // TTgTrace.T('TYPE_CONFIG');
TYPE_SECURITY : ; // 자체 처리 22_0513 11:17:50 kku, MgSvc_.HandleSecurity.Update(sRcv); // TTgTrace.T('TYPE_SECURITY');
TYPE_PATCH : MgSvc_.SetPatchUpdate(sRcv); // TTgTrace.T('TYPE_PATCH - %s', [sRcv]);
TYPE_STATUS : process_TYPE_STATUS; //TTgTrace.T('TYPE_STATUS');
TYPE_DISCONNECT : ; // MgSvc_.VulService.SetDisconnect(false); // TTgTrace.T('TYPE_DISCONNECT');
//TYPE_USERINFO : ;
TYPE_FILECHANGE : ; // process_TYPE_FILECHANGE; // TTgTrace.T('TYPE_FILECHANGE');
//TYPE_KILLPROCESS : ;
TYPE_ROUTECHANGE : process_TYPE_ROUTECHANGE; // TTgTrace.T('TYPE_ROUTECHANGE');
TYPE_ROUTEDEFAULT : process_TYPE_ROUTEDEFAULT; // TTgTrace.T('TYPE_ROUTEDEFAULT');
TYPE_USBDISCONNECTED : ; // process_TYPE_USBDISCONNECTED; // TTgTrace.T('TYPE_USBDISCONNECTED');
TYPE_VPNREGNEXG : ; // process_TYPE_VPNREGNEXG; // TTgTrace.T('TYPE_VPNREGNEXG');
TYPE_ADDRESSCHANGE : process_TYPE_ADDRESSCHANGE; // TTgTrace.T('TYPE_ADDRESSCHANGE');
TYPE_IPMACADDRESS : ; // MgSvc_.NicService.Add(sRcv); // TTgTrace.T('TYPE_IPMACADDRESS');
TYPE_CLIPBOARD : process_TYPE_CLIPBOARD; // TTgTrace.T('TYPE_CLIPBOARD');
TYPE_NETWORKMONITOR : process_TYPE_NETWORKMONITOR; // TTgTrace.T('TYPE_NETWORKMONITOR');
TYPE_DOMAINMONITOR : ; // process_TYPE_DOMAINMONITOR; // TTgTrace.T('TYPE_DOMAINMONITOR');
// else TTgTrace.T('TYPE_UNKNOWN : Type=%d, %s', [nType, sRcv]);
end;
end;
end.