355 lines
12 KiB
Plaintext
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.
|