1
0
mirror of https://github.com/Ylianst/MeshCommander synced 2025-12-06 06:03:20 +00:00
Files
MeshCommander/index_ko.html
2024-12-18 09:01:21 -05:00

14350 lines
890 KiB
HTML

<!DOCTYPE html><!-- ###BEGIN###{EventSubscriptions} --><!-- ###END###{EventSubscriptions} --><!-- ###BEGIN###{Desktop-Settings} --><!-- ###END###{Desktop-Settings} --><!-- ###BEGIN###{Desktop-Multi} --><!-- ###END###{Desktop-Multi} --><!-- ###BEGIN###{ComputerSelectorNoImages} --><!-- ###END###{ComputerSelectorNoImages} --><!-- ###BEGIN###{ComputerSelector-Local-ScriptOnly} --><!-- ###END###{ComputerSelector-Local-ScriptOnly} --><html lang="ko" style="height:100%"><head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta name="format-detection" content="telephone=no">
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo="> <!-- Stop favicon.ico from loading -->
<!-- ###BEGIN###{Look-Commander} -->
<!-- ###BEGIN###{ComputerSelector} -->
<link type="text/css" href="styles-commander-node.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{ComputerSelector} -->
<!-- ###BEGIN###{!ComputerSelector} -->
<link type="text/css" href="styles-commander.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{!ComputerSelector} -->
<!-- ###END###{Look-Commander} -->
<!-- ###BEGIN###{Look-Branded} -->
<link type="text/css" href="styles-branded.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{Look-Branded} -->
<!-- ###BEGIN###{Look-ISDU} -->
<link type="text/css" href="styles-isdu.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{Look-ISDU} -->
<!-- ###BEGIN###{Look-BrandedCommander} -->
<link type="text/css" href="styles-brandedcommander.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{Look-BrandedCommander} -->
<!-- ###BEGIN###{Look-Unite} -->
<link type="text/css" href="styles-unite.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{Look-Unite} -->
<!-- ###BEGIN###{Look-MeshCentral} -->
<link type="text/css" href="styles-mesh.css" media="screen" rel="stylesheet" title="CSS">
<!-- ###END###{Look-MeshCentral} -->
<script type="text/javascript" src="common-0.0.1.js"></script>
<!-- ###BEGIN###{Mode-LMS} -->
<script type="text/javascript" src="amt-lms-0.0.1.js"></script>
<script type="text/javascript" src="amt-wsman-ws-0.2.0.js"></script>
<!-- ###END###{Mode-LMS} -->
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<script type="text/javascript" src="amt-wsman-node-0.2.0.js"></script>
<script type="text/javascript" src="amt-redir-node-0.1.0.js"></script>
<script type="text/javascript" src="amt-scanner-0.1.0.js"></script>
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{Mode-WebSite} -->
<script type="text/javascript" src="amt-wsman-ws-0.2.0.js"></script>
<script type="text/javascript" src="amt-redir-ws-0.1.0.js"></script>
<!-- ###END###{Mode-WebSite} -->
<!-- ###BEGIN###{Mode-Firmware} -->
<script type="text/javascript" src="amt-wsman-ajax-0.2.0.js"></script>
<script type="text/javascript" src="amt-redir-ws-0.1.0.js"></script>
<!-- ###END###{Mode-Firmware} -->
<!-- ###BEGIN###{IDER} -->
<script type="text/javascript" src="amt-ider-ws-0.0.1.js"></script>
<!-- ###BEGIN###{IDER-IMRSDK} -->
<script type="text/javascript" src="amt-ider-node-0.0.1.js"></script>
<!-- ###END###{IDER-IMRSDK} -->
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<script type="text/javascript" src="amt-ider-server-ws-0.0.1.js"></script>
<!-- ###END###{Mode-MeshCentral2} -->
<!-- ###END###{IDER} -->
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<script type="text/javascript" src="amt-wsman-ws-0.2.0.js"></script>
<script type="text/javascript" src="amt-redir-ws-0.1.0.js"></script>
<!-- ###END###{Mode-MeshCentral2} -->
<script type="text/javascript" src="amt-wsman-0.2.0.js"></script>
<script type="text/javascript" src="amt-0.2.0.js"></script>
<!-- ###BEGIN###{Certificates} -->
<script type="text/javascript" src="forge.js/forge.bundle.js"></script>
<script type="text/javascript" src="amt-certificates-0.0.1.js"></script>
<!-- ###END###{Certificates} -->
<!-- ###BEGIN###{Scripting} -->
<script type="text/javascript" src="amt-script-0.2.0.js"></script>
<!-- ###END###{Scripting} -->
<!-- ###BEGIN###{Desktop} -->
<script type="text/javascript" src="amt-desktop-0.0.2.js"></script>
<style type="text/css">
.rb { cursor: pointer; border: none; float: right; font-size: 130%; margin-right: 4px; }
</style>
<!-- ###END###{Desktop} -->
<!-- ###BEGIN###{DesktopInband} -->
<script type="text/javascript" src="agent-desktop-0.0.2.js"></script>
<script type="text/javascript" src="agent-redir-rtc-0.1.0.js"></script>
<!-- ###END###{DesktopInband} -->
<!-- ###BEGIN###{Terminal} -->
<script type="text/javascript" src="amt-terminal-0.0.2.js"></script>
<!-- ###END###{Terminal} -->
<!-- ###BEGIN###{PowerControl-Advanced} -->
<!-- ###BEGIN###{PowerControl-OneClick} -->
<script type="text/javascript" src="webserver-0.0.1.js"></script>
<!-- ###END###{PowerControl-Advanced} -->
<!-- ###END###{PowerControl-OneClick} -->
<!-- ###BEGIN###{Inflate} -->
<script type="text/javascript" src="zlib.js"></script>
<script type="text/javascript" src="zlib-inflate.js"></script>
<script type="text/javascript" src="zlib-adler32.js"></script>
<script type="text/javascript" src="zlib-crc32.js"></script>
<!-- ###END###{Inflate} -->
<!-- ###BEGIN###{USBSetup} -->
<script type="text/javascript" src="amt-setupbin-0.1.0.js"></script>
<!-- ###END###{USBSetup} -->
<!-- ###BEGIN###{FileSaver} -->
<script type="text/javascript" src="filesaver.1.1.20151003.js"></script>
<!-- ###END###{FileSaver} -->
<!-- ###BEGIN###{MeshServerConnect} -->
<script type="text/javascript" src="meshcentral-server-0.2.0.js"></script>
<script type="text/javascript" src="websocket-wrapper-0.2.0.js"></script>
<!-- ###END###{MeshServerConnect} -->
<!-- ###BEGIN###{Mode-LMS} -->
<style type="text/css">
.menuitem { cursor: pointer; border: none; padding:5px; }
.menuitem:hover { background-color: #6b9dc7; }
</style>
<!-- ###END###{Mode-LMS} -->
<!-- ###BEGIN###{ComputerSelector} -->
<style type="text/css">
.menuitem { cursor: pointer; border: none; padding:5px; }
.menuitem:hover { background-color: #6b9dc7; }
</style>
<!-- ###END###{ComputerSelector} -->
<!-- ###BEGIN###{ContextMenus} -->
<style>
.contextMenu {
background: #F9F9F9;
box-shadow: 0 0 12px rgba( 0, 0, 0, .3 );
border: 1px solid #ccc;
/*border-radius: 4px;*/
position: absolute;
top: 0;
left: 0;
list-style: none;
margin: 0;
padding: 5px;
min-width: 100px;
max-width: 150px;
z-index: 500;
}
.cmtext {
color: #444;
display: inline-block;
padding-left: 8px;
padding-right: 8px;
padding-top: 5px;
padding-bottom: 5px;
text-decoration: none;
width: 85%;
cursor: default;
overflow: hidden;
position: relative;
}
.cmtext:hover {
color: #f9f9f9;
background: #999;
}
</style>
<!-- ###END###{ContextMenus} -->
<!-- ###BEGIN###{DesktopInbandFiles} -->
<style>
.fileIcon1 {
background: url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb49Y2Sj9LT2f///yH5BAEAAAMALAAAAAAQABAAAAImnI+py+1vhJwyUYAzHTL4D3qdlJWaIFJqmKod607sDKIiDUP63hQAOw==);
height: 16px;
width: 16px;
cursor: pointer;
border: none;
float: left;
margin-top: 1px;
}
.fileIcon2 {
background: url(data:image/gif;base64,R0lGODlhEAAQAJEDAM2xV/Xur+XPgP///yH5BAEAAAMALAAAAAAQABAAAAJD3ISZIGHWUGihznesYDYATFVM+D2hJ4lgN1olxALAtAlmPCJvuMmJd6PJckDYwicrHhTD5o7plJmg0Uc0asNMkphHAQA7);
height: 16px;
width: 16px;
cursor: pointer;
border: none;
float: left;
margin-top: 1px;
}
.fileIcon3 {
background: url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb19IGBgbq6uv///yH5BAEAAAMALAAAAAAQABAAAAIy3ISpxgcPH2ouQgFEw1YmxnUXKEaaEZZnVWZk66JwzKpvuwZzwOgwb/C1gIOA8Yg8DgoAOw==);
height: 16px;
width: 16px;
cursor: pointer;
border: none;
float: left;
margin-top: 1px;
}
.filelist {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
cursor: default;
-khtml-user-drag: element;
background-color: white;
clear: both;
}
.fsize {
float: right;
text-align: right;
width: 180px;
}
</style>
<!-- ###END###{DesktopInbandFiles} -->
<!-- ###BEGIN###{SessionRecording} -->
<style>
.cameraIcon {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHdSURBVDhPxZLPTxpREMe/+yKgxF13xbJKBHvBBBuLRkvkCqTBXrhAbz0CiR41oX9AL7019doDSf+OEuFI1CgkShN6IhHwQBrCFlsCr++tTxB/nP0kk/fmOzO7k3mDZ0cS5xgLLleme939MBgMTJ+wNELI91ar9dkU7iBFt6NKpVL51O/3ZyORyJfm1dV0Lpf7wYqJyDEhkkTD4fBbp9P5m/uUWafT+SVpmvbT6P5ZNkVKIUmPNjVElmUoioJ6vQ673X5JLFbrstvths/nGyv2eDxIJZNIp9J4ubQkVODg6wGq1SpCoRB6vZ6LUFbj9XoRCAREChCLxZDP57G6+hqvVlZweJhHIp4wY5mPGQSDQRQKBd4y4JzXafTdNk2mU9Q6aaOOF3O00WzSzcAb0+e2tr5O640G1Rfmhxo3WZEp4cO4y+bGBsrlMkqlklCA84tznJ6djnV5C7k/MsMwMKtpN2MWqKoKdUblUxfKiAlxDjk+OcGExYKd3R2Uz0rw+/1wOBxQZhQUi0WRNeLBB9g+IPE+gWw2i/29fVC2TPzJ4vE4n7rIGiHpuk6v//2Fhf213W4LmQXYk7oXF/kFtVrN3JH72Gw28EX61jGMrcfW57bkqdjU1OTRjfd8AP8BU66nHfOXwycAAAAASUVORK5CYII=);
height: 16px;
width: 16px;
cursor: pointer;
border: none;
margin-top:2px;
margin-right:4px;
cursor:pointer;
float:right;
}
.videoIcon {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADaSURBVDhPxdKrEgFRAMbxRWMUJBIZRSRIqiBIXkHwBqLmAcx4Bt2MzowsoAiCQHdZ/2/tcZsda1bwzfz27J5z9uy5rPVrIm6pFNFFATOcoTTRgfouVOGVGHawXT0oNZi6C8p4SdgtM0jdbp1oNs+lEoJm5xk1jqEvndCAkoWZ2RZpvEQvKmqIo4INVjBJoIQpDlD7Eff0Ydb5jSXMcnO6aDSvjp+0UMcenh38zKFTsbUHqggcc4yB87cBBtBxOlnjfZP8VJHESJuYRxtR+EU7P8HQeXr8iEFjWVe3r1ZV/X1h0wAAAABJRU5ErkJggg==);
height: 16px;
width: 16px;
cursor: pointer;
border: none;
margin-top:2px;
margin-right:4px;
cursor:pointer;
float:right;
}
.videoIconRed {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAEPSURBVDhPxZOxTsJQFIZvDZPGhTjhQpzBYFwccOUV2HgABxl9BwfCA5jAwkhMCIsDYXJx8QGIsYSFgcG4EQL4/ff0ApsUB//ky3/uac/f9rZ1f1WUuFvn85fYHYyhEcXxPOlXsQr06T2rtysfwEknWAxnWqNHTn6gr8EXa7k13NJ/taXpKPFzCMOS7mbXJV2saOVWIWAEAyvdEp6sdF2YWemm0LNyq/AIOewUyjCBDwjKwjW8wRdMeIwF7hUx3MTrttxLCr8hZMbshQKUlvGH9lcNvqGtAO1uWr1DCaKwiWl1BX7/Dg3Y6N8C9J3odfuATxUp1QHtQ09voUBxD8fwm1Yw5BtoacHs5mc8UM79ANr0QFg91nqAAAAAAElFTkSuQmCC);
height: 16px;
width: 16px;
cursor: pointer;
border: none;
margin-top:2px;
margin-right:4px;
cursor:pointer;
float:right;
}
</style>
<!-- ###END###{SessionRecording} -->
<!-- ###BEGIN###{Look-Commander} -->
<!-- ###BEGIN###{!ComputerSelector-Local-ScriptOnly} -->
<!-- ###BEGIN###{!Mode-LMS} -->
<title>MeshCommander</title>
<!-- ###END###{!Mode-LMS} -->
<!-- ###BEGIN###{Mode-LMS} -->
<title>LMS MeshCommander</title>
<!-- ###END###{Mode-LMS} -->
<!-- ###END###{!ComputerSelector-Local-ScriptOnly} -->
<!-- ###BEGIN###{ComputerSelector-Local-ScriptOnly} -->
<title>ScriptCommander</title>
<!-- ###END###{ComputerSelector-Local-ScriptOnly} -->
<!-- ###END###{Look-Commander} -->
<!-- ###BEGIN###{Look-Branded} -->
<title>Intel® Active Management Technology</title>
<!-- ###END###{Look-Branded} -->
<!-- ###BEGIN###{Look-ISDU} -->
<title>Intel® System Defense Utility</title>
<!-- ###END###{Look-ISDU} -->
<!-- ###BEGIN###{Look-BrandedCommander} -->
<title>Intel® Manageability Commander</title>
<!-- ###END###{Look-BrandedCommander} -->
<!-- ###BEGIN###{Look-Unite} -->
<title>Intel® Unite - Hardware Management</title>
<!-- ###END###{Look-Unite} -->
</head>
<!-- ###BEGIN###{!ContextMenus} -->
<body onunload="cleanup()" oncontextmenu="handleContextMenu(event)">
<!-- ###END###{!ContextMenus} -->
<!-- ###BEGIN###{ContextMenus} -->
<!-- ###END###{ContextMenus} -->
<div id="id_topheader" class="header">
<!-- ###BEGIN###{!Look-MeshCentral} -->
<!-- ###BEGIN###{Look-Unite} -->
<table style="width:100%;height:55px">
<tbody><tr>
<td valign="top" nowrap="nowrap">
<p class="top1">인텔<sup style="font-size:10px">®</sup>&nbsp;Active Management Technology</p>
<p class="top2" id="id_computername"></p>
</td>
<td valign="top">
<img width="165" height="42" align="right" style="border:0;margin-top:10px;margin-right:12px" src="images-unite/title.png">
</td>
</tr>
</tbody></table>
<!-- ###END###{Look-Unite} -->
<!-- ###BEGIN###{Look-ISDU} -->
<div>
<div style="background-image:url(images-isdu/LogoWhite42.png);width:63px;height:42px;float:right;margin-top:14px;margin-right:20px;padding:0"></div>
<div style="width:425px;height:69px"><div style="background-image:url(images-isdu/ISDUTitle.png);position:relative;top:26px;left:20px;width:282px;height:20px"></div></div>
<p id="id_computername" style="display:none"></p>
</div>
<!-- ###END###{Look-ISDU} -->
<!-- ###BEGIN###{Look-BrandedCommander} -->
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<div>
<div style="background-image:url(images-brandedcommander/LogoWhite42.png);width:63px;height:42px;float:right;margin-top:14px;margin-right:20px;padding:0"></div>
<div style="width:425px;height:69px"><div style="background-image:url(images-brandedcommander/CommanderTitle.png);position:relative;top:21px;left:20px;width:443px;height:33px"></div></div>
<p id="id_computername" style="display:none"></p>
</div>
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<table style="width:100%;height:55px">
<tbody><tr>
<td valign="top" nowrap="nowrap">
<p class="top1">인텔<sup style="font-size:10px">®</sup>&nbsp;Manageability Commander</p>
<p class="top2" id="id_computername"></p>
</td>
<td valign="top">
<img width="73" height="53" align="right" style="border:0" src="images-branded/logo.gif">
</td>
</tr>
</tbody></table>
<!-- ###END###{!Mode-NodeWebkit} -->
<!-- ###END###{Look-BrandedCommander} -->
<!-- ###BEGIN###{!Look-ISDU} -->
<!-- ###BEGIN###{!Look-BrandedCommander} -->
<table class="topCell" style="width:100%;height:55px">
<tbody><tr>
<td valign="top" nowrap="nowrap">
<!-- ###BEGIN###{Look-Commander} -->
<!-- ###BEGIN###{Switchbox} -->
<p class="top1">Manageability Switchbox</p>
<!-- ###END###{Switchbox} -->
<!-- ###BEGIN###{!Switchbox} -->
<!-- ###BEGIN###{!ComputerSelector-Local-ScriptOnly} -->
<!-- ###BEGIN###{!Mode-LMS} -->
<p class="top1">메시 커맨더</p>
<!-- ###END###{!Mode-LMS} -->
<!-- ###BEGIN###{Mode-LMS} -->
<p class="top1">LMS MeshCommander</p>
<!-- ###END###{Mode-LMS} -->
<!-- ###END###{!ComputerSelector-Local-ScriptOnly} -->
<!-- ###BEGIN###{ComputerSelector-Local-ScriptOnly} -->
<p class="top1">ScriptCommander</p>
<!-- ###END###{ComputerSelector-Local-ScriptOnly} -->
<!-- ###END###{!Switchbox} -->
<!-- ###END###{Look-Commander} -->
<!-- ###BEGIN###{Look-Intel-AMT} -->
<p class="top1">인텔<sup style="font-size:10px">®</sup>&nbsp;Active Management Technology</p>
<!-- ###END###{Look-Intel-AMT} -->
<!-- ###BEGIN###{Look-Intel-SM} -->
<p class="top1">인텔<sup style="font-size:10px">®</sup>&nbsp;Standard Manageability</p>
<!-- ###END###{Look-Intel-SM} -->
<!-- ###BEGIN###{Look-Intel-SBT} -->
<p class="top1">인텔<sup style="font-size:10px">®</sup>&nbsp;Small Buisness Technology</p>
<!-- ###END###{Look-Intel-SBT} -->
<p class="top2" id="id_computername"></p>
</td>
<td valign="top">
<!-- ###BEGIN###{!Mode-LMS} -->
<!-- ###BEGIN###{!Mode-Firmware} -->
<!-- ###BEGIN###{Look-Commander} -->
<img width="166" height="64" align="right" style="border:0" src="images-commander/logo.png">
<!-- ###END###{Look-Commander} -->
<!-- ###END###{!Mode-Firmware} -->
<!-- ###END###{!Mode-LMS} -->
<!-- ###BEGIN###{Look-Branded} -->
<img width="73" height="53" align="right" style="border:0" src="images-branded/logo.gif">
<!-- ###END###{Look-Branded} -->
</td>
</tr>
</tbody></table>
<!-- ###END###{!Look-BrandedCommander} -->
<!-- ###END###{!Look-ISDU} -->
<!-- ###END###{!Look-MeshCentral} -->
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<table id="id_KVMTable" cellpadding="0" cellspacing="0" style="width: 100%; padding: 0px; padding: 0px; margin-top: 0px">
<tbody><tr>
<td id="id_normalScreenToolbar" class="style6">
<div>
&nbsp;<input type="button" class="connectbutton" id="xconnectbutton1" value="잇다" onclick="connectButtonfunction(event, false)" onkeypress="return false" onkeydown="return false">
&nbsp;<span id="constatus"></span>
</div>
</td>
</tr>
</tbody></table>
<!-- ###END###{Mode-MeshCentral2} -->
<div class="progressbar">
<!-- ###BEGIN###{Look-MeshCentral} -->
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
<!-- ###END###{Look-MeshCentral} -->
<!-- ###BEGIN###{Look-Commander} -->
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
<!-- ###END###{Look-Commander} -->
<!-- ###BEGIN###{Look-Branded} -->
<div id="id_progressbar" style="height:2px;width:0%;background-color:orange"></div>
<!-- ###END###{Look-Branded} -->
<!-- ###BEGIN###{Look-ISDU} -->
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
<!-- ###END###{Look-ISDU} -->
<!-- ###BEGIN###{Look-BrandedCommander} -->
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
<!-- ###END###{Look-BrandedCommander} -->
<!-- ###BEGIN###{Look-Unite} -->
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
<!-- ###END###{Look-Unite} -->
</div>
</div>
<div id="id_messageview" class="fullcell" style="text-align:center;padding-top:100px;font-size:20px">
<!-- ###BEGIN###{Look-MeshCentral} -->
<span id="id_messageviewstr">연결 해제</span>
<!-- ###END###{Look-MeshCentral} -->
<!-- ###BEGIN###{!Look-MeshCentral} -->
<span id="id_messageviewstr">불러오는 중 ...</span>
<!-- ###END###{!Look-MeshCentral} -->
<!-- ###BEGIN###{ComputerSelector} -->
<br><br><input id="id_messageviewbutton" type="button" value="닫기" onclick="disconnect()">
<!-- ###END###{ComputerSelector} -->
<!-- ###BEGIN###{Mode-LMS} -->
<br><br><input type="button" value="닫기" onclick="disconnect()">
<!-- ###END###{Mode-LMS} -->
</div>
<!-- ###BEGIN###{Mode-LMS} -->
<div id="id_lmsMainPanel" class="fullcell" style="display:none">
<div style="background-color:lightgray;height:24px;margin-bottom:6px;padding-top:2px">
<div id="id_lmsToolBarContent" style="display:none">
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<div style="float:left;height:26px;width:26px;cursor:pointer" onclick="toolmenuclick(0)">
<span style="font-size:16px">&nbsp;</span>
</div>
<!-- ###END###{!Mode-NodeWebkit} -->
<div>
<input type="button" value="새롭게 하다" onclick="lmsRefresh()">
<input id="id_lmsActivateButton" type="button" value="Activate..." style="display:none" onclick="lmsActivate()">
<input id="id_lmsDeactivateButton" type="button" value="Deactivate..." style="display:none" onclick="lmsDeactivate()">
<input id="id_lmsLoginButton" type="button" value="Login..." style="display:none" onclick="lmsLogin()">
<input id="id_lmsConfigureButton" type="button" value="Intel® AMT Login..." style="display:none" onclick="lmsConfigure()">
</div>
</div>
</div>
<div id="id_lmsData" style="margin:10px"></div>
<div id="id_lmsData2" style="margin:10px"></div>
</div>
<!-- ###END###{Mode-LMS} -->
<!-- ###BEGIN###{PowerControl-OneClick} -->
<div id="TransferNotification" style="display:none;background-color:lightgrey;position:absolute;left:10px;bottom:10px;border-radius:5px;padding:4px;z-index:1000;box-shadow:0px 0px 10px #333"></div>
<!-- ###END###{PowerControl-OneClick} -->
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<div id="LeftSideToolBar" style="position:absolute;left:0px;bottom:0px;width:52px;top:69px;background:#113962;background:linear-gradient(to bottom, #104893 0%,#113962 100%);color:white;display:none">
<div style="height:23px"></div>
<div id="LeftMenuMyDevices" class="lbbutton lbbuttonsel2" title="컴퓨터 관리" onclick="go(101)">
<div class="lb1" style="position:absolute;top:6px;left:6px"></div>
</div>
<div id="LeftMenuMyCerts" class="lbbutton" title="인증서 관리자" onclick="go(103)">
<div class="lb2" style="position:absolute;top:6px;left:6px"></div>
</div>
<div id="LeftMenuMyUsb" class="lbbutton" title="Setup.bin 관리자" onclick="go(102)">
<div class="lb3" style="position:absolute;top:6px;left:6px"></div>
</div>
<!-- ###BEGIN###{SessionRecording} -->
<div id="LeftMenuPlayer" class="lbbutton" title="세션 플레이어" onclick="go(104)">
<div class="lb4" style="position:absolute;top:6px;left:6px"></div>
</div>
<!-- ###END###{SessionRecording} -->
</div>
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{ComputerSelector} -->
<div id="id_computerSelector" class="fullcell" style="display:none">
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<div id="UpdateNotification" style="display:none;background-color:lightgrey;position:absolute;left:10px;bottom:10px;border-radius:5px;padding:10px;z-index:1000;box-shadow: 0px 0px 20px #888888">
<a style="cursor:pointer;color:blue" onclick="NW_PerformUpdate()"><u id="UpdateNotificationText"></u></a> &nbsp; <span onclick="NW_HideUpdateNotification()" style="cursor:pointer;font-size:15px"></span>
</div>
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{ComputerSelectorToolbar} -->
<table style="background-color:#808080;width:100%">
<tbody><tr>
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<td id="toolmenuicondiv" style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
<span style="font-size:16px">&nbsp;</span>
</td>
<!-- ###END###{!Mode-NodeWebkit} -->
<!-- ###BEGIN###{MeshServerConnect} -->
<td id="idx_disconnectMeshCentralButton" style="display:none">
<input type="button" value="분리" onclick="meshCentralDisconnect()">
</td>
<!-- ###END###{MeshServerConnect} -->
<td>
<span id="id_noScriptButtons">
<!-- ###BEGIN###{ComputerSelector-Remote} -->
<input type="button" value="새롭게 하다" onclick="loadServerComputerList()">
<!-- ###END###{ComputerSelector-Remote} -->
<!-- ###BEGIN###{ComputerSelector-Local} -->
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<input type="button" value="새로운..." onclick="newComputerList()">
<input type="button" value="열다..." onclick="openComputerList()">
<!-- ###BEGIN###{FileSaver} -->
<input id="saveComputersButton" type="button" value="저장..." onclick="saveComputerList()">
<!-- ###END###{FileSaver} -->
<!-- ###END###{!Mode-NodeWebkit} -->
<input type="button" value="컴퓨터 추가 ..." onclick="addComputer()">
<!-- ###END###{ComputerSelector-Local} -->
<!-- ###BEGIN###{ComputerSelectorScanner} -->
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<input type="button" value="주사..." onclick="showScanDialog()">
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###END###{ComputerSelectorScanner} -->
</span>
<!-- ###BEGIN###{Scripting} -->
<!-- ###BEGIN###{!Look-BrandedCommander} -->
<input id="idx_runScriptOnComputersButton" type="button" value="스크립트 실행 ..." onclick="mscript_runScriptDlg()">
<!-- ###END###{!Look-BrandedCommander} -->
<!-- ###BEGIN###{Look-BrandedCommander} -->
<input id="idx_runScriptOnComputersButton" type="button" value="스크립트 실행 ..." onclick="mscript_runScriptDlg()" style="display:none">
<!-- ###END###{Look-BrandedCommander} -->
<!-- ###END###{Scripting} -->
</td>
<td style="text-align:right">
<!-- ###BEGIN###{!Look-BrandedCommander} -->
<input id="computerFilter" placeholder="필터" onkeyup="computerFilterFunc()" autocomplete="off" onfocus="onFilterFocus(true)" onblur="onFilterFocus(false)">
<!-- ###END###{!Look-BrandedCommander} -->
</td>
</tr>
</tbody></table>
<!-- ###BEGIN###{ComputerSelector-Local} -->
<div id="id_computerListParent" style="position:fixed;top:96px;left:0;right:300px;bottom:0;overflow-y:scroll" cm="Add&nbsp;Computer...#addComputer()">
<!-- ###END###{ComputerSelector-Local} -->
<!-- ###BEGIN###{!ComputerSelector-Local} -->
<div id="id_computerListParent" style="position:fixed;top:96px;left:0;right:300px;bottom:0;overflow-y:scroll">
<!-- ###END###{!ComputerSelector-Local} -->
<div id="id_noKnownComputers" style="text-align:center;margin-top:36px;color:gray">
<span style="font-size:20px">알려진 컴퓨터가 없습니다</span>
<!-- ###BEGIN###{ComputerSelector-Local} -->
<div style="margin:4px">시작하기 <a onclick="addComputer()" style="cursor:pointer"><u>첨가</u></a> 컴퓨터 또는 드래그 앤 드롭<br>이 창의 컴퓨터 목록 파일</div>
<!-- ###END###{ComputerSelector-Local} -->
</div>
<div id="id_computerList" style="font-size:20px"></div>
</div>
<div id="id_computerDetailsParent" style="position:fixed;top:96px;width:300px;right:0;bottom:0">
<div id="id_computerDetails" style="font-size:16px;margin:4px"></div>
</div>
<!-- ###END###{ComputerSelectorToolbar} -->
<!-- ###BEGIN###{!ComputerSelectorToolbar} -->
<div id="id_computerListParent" style="position:fixed;top:69px;left:0;right:300px;bottom:0;overflow-y:scroll" cm="Add&nbsp;Computer...#addComputer()">
<div id="id_noKnownComputers" style="text-align:center;margin-top:36px;color:gray">
<span style="font-size:20px">알려진 컴퓨터가 없습니다</span>
<!-- ###BEGIN###{ComputerSelector-Local} -->
<div style="margin:4px">시작하기 <a onclick="addComputer()" style="cursor:pointer"><u>첨가</u></a> 컴퓨터 또는 드래그 앤 드롭<br>이 창의 컴퓨터 목록 파일</div>
<!-- ###END###{ComputerSelector-Local} -->
</div>
<div id="id_computerList" style="font-size:20px"></div>
</div>
<div id="id_computerDetailsParent" style="position:fixed;top:69px;width:300px;right:0;bottom:0;background-color:white">
<div id="id_computerDetails" style="font-size:16px;margin:8px"></div>
</div>
<!-- ###END###{!ComputerSelectorToolbar} -->
</div>
<div id="id_computerSelectorMenu" style="background-color:#EEEEEE;display:none;position:absolute;left:0;top:94px;width:200px;padding:3px;z-index:1000;box-shadow:5px 5px 5px #888888;border:1px solid gray">
<div class="menuitem" onclick="toolmenuclick(101)"><span id="id_menuitem1"></span>컴퓨터 관리</div>
<!-- ###BEGIN###{CertificateManager} -->
<div class="menuitem" onclick="toolmenuclick(103)"><span id="id_menuitem3" style="display:none"></span>인증서 관리자</div>
<!-- ###END###{CertificateManager} -->
<!-- ###BEGIN###{USBSetup} -->
<div class="menuitem" onclick="toolmenuclick(102)"><span id="id_menuitem2" style="display:none"></span>USB Setup.bin 편집기</div>
<!-- ###END###{USBSetup} -->
<!-- ###BEGIN###{SessionRecording} -->
<div class="menuitem" onclick="toolmenuclick(104)"><span id="id_menuitem4" style="display:none"></span>세션 플레이어</div>
<!-- ###END###{SessionRecording} -->
</div>
<!-- ###END###{ComputerSelector} -->
<!-- ###BEGIN###{Mode-LMS} -->
<div id="id_computerSelectorMenu" style="background-color:#EEEEEE;display:none;position:absolute;left:0;top:94px;width:200px;padding:3px;z-index:1000;box-shadow:5px 5px 5px #888888;border:1px solid gray">
<div class="menuitem" onclick="toolmenuclick(101)"><span id="id_menuitem1"></span>Computer Configuration</div>
<!-- ###BEGIN###{USBSetup} -->
<div class="menuitem" onclick="toolmenuclick(102)"><span id="id_menuitem2" style="display:none"></span>USB Setup.bin 편집기</div>
<!-- ###END###{USBSetup} -->
</div>
<!-- ###END###{Mode-LMS} -->
<!-- ###BEGIN###{USBSetup} -->
<div id="id_usbSetupPanel" class="fullcell" style="display:none">
<!-- ###BEGIN###{ComputerSelectorToolbar} -->
<table style="background-color:#808080;width:100%">
<tbody><tr>
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<td style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
<span style="font-size:16px">&nbsp;</span>
</td>
<!-- ###END###{!Mode-NodeWebkit} -->
<td>
<input type="button" value="새로운..." onclick="usb_newSetupBin()">
<input type="button" value="열다..." onclick="usb_openSetupBin()">
<!-- ###BEGIN###{FileSaver} -->
<input id="id_saveSetupBin" type="button" value="저장..." onclick="usb_saveSetupBin()">
<!-- ###END###{FileSaver} -->
</td>
</tr>
</tbody></table>
<div id="id_usbSetupPanel2" style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:96px">
<div id="id_StartupScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
<span style="font-size:20px">인텔<sup style="font-size:10px">®</sup> AMT USB Setup.bin 관리자</span>
<div style="margin:4px">시작하기 <a onclick="usb_newSetupBin()" style="cursor:pointer"><u>창조</u></a> 새로운 파일 <a onclick="usb_openSetupBin()" style="cursor:pointer"><u>열리는</u></a> 기존의 것<br>또는이 창에서 setup.bin 파일을 끌어다 놓으십시오.</div>
</div>
<div id="id_SetupBinArea" style="margin:10px"></div>
</div>
<!-- ###END###{ComputerSelectorToolbar} -->
<!-- ###BEGIN###{!ComputerSelectorToolbar} -->
<div style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:69px">
<div id="id_StartupScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
<span style="font-size:20px">인텔<sup style="font-size:10px">®</sup> AMT USB Setup.bin 관리자</span>
<div style="margin:4px">시작하기 <a onclick="usb_newSetupBin()" style="cursor:pointer"><u>창조</u></a> 새로운 파일 <a onclick="usb_openSetupBin()" style="cursor:pointer"><u>열리는</u></a> 기존의 것<br>또는이 창에서 setup.bin 파일을 끌어다 놓으십시오.</div>
</div>
<div id="id_SetupBinArea" style="margin:10px"></div>
</div>
<!-- ###END###{!ComputerSelectorToolbar} -->
</div>
<!-- ###END###{USBSetup} -->
<!-- ###BEGIN###{CertificateManager} -->
<div id="id_certManagerPanel" class="fullcell" style="display:none">
<!-- ###BEGIN###{ComputerSelectorToolbar} -->
<table style="background-color:#808080;width:100%">
<tbody><tr>
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<td style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
<span style="font-size:16px">&nbsp;</span>
</td>
<!-- ###END###{!Mode-NodeWebkit} -->
<td>
<input type="button" value="루트 인증서 생성 ..." onclick="cert_createNew()">
<input id="IssueCertButton" type="button" value="인증서 발급 ..." onclick="cert_issueNew()">
<input type="button" value="인증서 가져 오기 ..." onclick="cert_importCert()">
</td>
</tr>
</tbody></table>
<div id="id_certManagerPanel2" style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:96px">
<div id="id_certStartScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
<span style="font-size:20px">인증서 관리자</span>
<div style="margin:4px">인증서는 모든 종류의 인텔 ® AMT 보안 작업에서 중요한 역할을합니다. TLS 네트워크 인증,<br>CIRA 구성, 감사 로그 서명 등 이 패널을 사용하여 콘솔 인증서를 작성하고 관리하십시오.</div>
</div>
<div id="id_certManagerMainArea" style="font-size:20px"></div>
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<input id="certOpenFile" type="file" style="display:none" accept=".cer;*.pfx;*.p12;*.pem;*.crt">
<!-- ###END###{Mode-NodeWebkit} -->
</div>
<!-- ###END###{ComputerSelectorToolbar} -->
<!-- ###BEGIN###{!ComputerSelectorToolbar} -->
<div style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:95px">
<div id="id_certStartScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
<span style="font-size:20px">인증서 관리자</span>
<div style="margin:4px">인증서는 모든 종류의 인텔 ® AMT 보안 작업에서 중요한 역할을합니다. TLS 네트워크 인증,<br>CIRA 구성, 감사 로그 서명 등 이 패널을 사용하여 콘솔 인증서를 작성하고 관리하십시오.</div>
</div>
<div id="id_certManagerMainArea" style="margin:10px"></div>
</div>
<!-- ###END###{!ComputerSelectorToolbar} -->
</div>
<!-- ###END###{CertificateManager} -->
<!-- ###BEGIN###{SessionRecording} -->
<div id="id_sessionPlayerPanel" class="fullcell" style="display:none">
<table style="background-color:#808080;width:100%">
<tbody><tr>
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<td style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
<span style="font-size:16px">&nbsp;</span>
</td>
<!-- ###END###{!Mode-NodeWebkit} -->
<td>
<div style="float:right">
<input id="srec_toggleviewmode" type="button" value="보기 모드 전환" style="display:none" onclick="srec_toggleAspectRatio(1)">
</div>
<input type="button" id="srec_OpenFileButton" value="파일 열기 ..." onclick="srec_openfile()">
<span id="srec_deskstatus" style="margin-left:4px"></span>
</td>
</tr>
</tbody></table>
<div style="overflow:hidden">
<div id="srec_deskarea0">
<div id="srec_deskarea2" style="height:2px">
<div style="background-color:gray"><div id="srec_progressbar" style="height:2px;width:0%;background-color:red"></div></div>
</div>
<div id="srec_deskarea3x" style="position:relative;max-height:calc(100vh - 123px);height:calc(100vh - 123px)" onclick="srec_togglePause()">
<div id="srec_metadatadiv" style="padding:20px;color:lightgrey;text-align:left;display:none"></div>
<div id="srec_DeskParent" style="width:100%;height:100%;background-color:black;display:none">
<canvas id="srec_Desk" width="640" height="480"></canvas>
</div>
<div id="srec_TermParent" style="position:absolute;top:0;height:100%;width:100%;background-color:black;display:none">
<div><pre id="srec_Term"></pre></div>
</div>
<!--<div id=srec_p11DeskConsoleMsg style="display:none;cursor:pointer;position:absolute;left:30px;top:17px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick=clearConsoleMsg()></div>-->
</div>
<div id="srec_deskarea4" style="padding-top:2px;padding-bottom:2px;background:#C0C0C0">
<div style="float:right;text-align:right;padding-right:4px">
<div id="srec_timespan" style="padding-top:4px;padding-right:4px">00:00:00</div>
</div>
<div>
&nbsp;
<input id="srec_PlayButton" type="button" value="플레이" disabled="disabled" onclick="srec_play()">
<input id="srec_PauseButton" type="button" value="중지" disabled="disabled" onclick="srec_pause()">
<input id="srec_RestartButton" type="button" value="재시작" disabled="disabled" onclick="srec_restart()">
<select id="srec_PlaySpeed" onchange="this.blur();">
<option value="4">1/4 속도</option>
<option value="2">1/2 속도</option>
<option value="1" selected="">정상 속도</option>
<option value="0.5">2 배속</option>
<option value="0.25">4 배속</option>
<option value="0.1">10 배속</option>
</select>
</div>
</div>
</div>
</div>
</div>
<!-- ###END###{SessionRecording} -->
<div id="id_mainview" style="height:100%;display:none">
<div id="id_leftbar" class="navbar">
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<div id="tlsNotification1" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none" onclick="showTlsCert(1)"><img src="images/lock.gif"> TLS 보안</div>
<div id="tlsNotification2" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none" onclick="showTlsCert(1)"><img src="images/lock.gif"> TLS 보안 (핀)</div>
<div id="tlsNotification3" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none" onclick="showTlsCert(1)"><img src="images/lock.gif"> TLS (신뢰할 수 없음)</div>
<div id="tlsNotification4" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none;color:red" onclick="switchToTls()"><img src="images/unlock.gif"> TLS로 전환</div>
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{ComputerSelector} -->
<div style="padding:8px">
<input type="button" id="disconnectButton" value="분리" onkeypress="return false" onkeydown="return false" onclick="disconnect()" style="width:138px">
</div>
<!-- ###END###{ComputerSelector} -->
<!-- ###BEGIN###{Mode-LMS} -->
<div style="padding:8px">
<input type="button" id="disconnectButton" value="분리" onkeypress="return false" onkeydown="return false" onclick="disconnect()" style="width:138px">
</div>
<!-- ###END###{Mode-LMS} -->
<!-- ###BEGIN###{Mode-Firmware} -->
<br>
<!-- ###END###{Mode-Firmware} -->
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<br>
<!-- ###END###{Mode-MeshCentral2} -->
<p id="go1" class="nav1" onclick="go(1)"><a>시스템 상태</a></p>
<!-- ###BEGIN###{Desktop} -->
<p id="go14" class="nav1" onclick="go(14)"><a>원격 데스크탑</a></p>
<!-- ###BEGIN###{DesktopInbandFiles} -->
<p id="go24" class="nav1" onclick="go(24)">&nbsp;&nbsp;<a>파일</a></p>
<!-- ###END###{DesktopInbandFiles} -->
<!-- ###END###{Desktop} -->
<!-- ###BEGIN###{Terminal} -->
<p id="go13" class="nav1" onclick="go(13)"><a>시리얼 오버 LAN</a></p>
<!-- ###END###{Terminal} -->
<!-- ###BEGIN###{HardwareInfo} -->
<p id="go2" class="nav1" onclick="go(2)"><a>하드웨어 정보</a></p>
<!-- ###END###{HardwareInfo} -->
<!-- ###BEGIN###{EventLog} -->
<p id="go6" class="nav1" onclick="go(6)"><a>이벤트 로그</a></p>
<!-- ###END###{EventLog} -->
<!-- ###BEGIN###{AuditLog} -->
<p id="go15" class="nav1" onclick="go(15)"><a>감사 로그</a></p>
<!-- ###END###{AuditLog} -->
<!-- ###BEGIN###{Storage} -->
<p id="go21" class="nav1" onclick="go(21)"><a>저장</a></p>
<!-- ###END###{Storage} -->
<!-- ###BEGIN###{NetworkSettings} -->
<p id="go8" class="nav1" onclick="go(8)"><a>네트워크 설정</a></p>
<!-- ###END###{NetworkSettings} -->
<!-- ###BEGIN###{RemoteAccess} -->
<p id="go17" class="nav1" onclick="go(17)"><a>인터넷 설정</a></p>
<!-- ###END###{RemoteAccess} -->
<!-- ###BEGIN###{Certificates} -->
<p id="go16" class="nav1" onclick="go(16)"><a>보안 설정</a></p>
<!-- ###END###{Certificates} -->
<!-- ###BEGIN###{AgentPresence} -->
<p id="go19" class="nav1" onclick="go(19)"><a>에이전트 존재</a></p>
<!-- ###END###{AgentPresence} -->
<!-- ###BEGIN###{SystemDefense} -->
<p id="go18" class="nav1" onclick="go(18)"><a>시스템 방어</a></p>
<!-- ###END###{SystemDefense} -->
<p id="go11" class="nav1" onclick="go(11)"><a>사용자 계정</a></p>
<!-- ###BEGIN###{EventSubscriptions} -->
<p id="go22" class="nav1" onclick="go(22)"><a>구독</a></p>
<!-- ###END###{EventSubscriptions} -->
<!-- ###BEGIN###{Alarms} -->
<p id="go23" class="nav1" onclick="go(23)"><a>웨이크 경보</a></p>
<!-- ###END###{Alarms} -->
<!-- ###BEGIN###{Scripting-Editor} -->
<p id="go20" class="nav1" onclick="go(20)"><a>스크립트 편집기</a></p>
<!-- ###END###{Scripting-Editor} -->
<!-- ###BEGIN###{WsmanBrowser} -->
<p id="go12" class="nav1" onclick="go(12)"><a>WSMAN 브라우저</a></p>
<!-- ###END###{WsmanBrowser} -->
<!-- ###BEGIN###{Storage} -->
<!-- ###BEGIN###{Mode-Firmware} -->
<!-- <div id=storagelinks style=margin-top:4px></div> -->
<!-- ###END###{Mode-Firmware} -->
<!-- ###END###{Storage} -->
<!-- ###BEGIN###{Look-ISDU} -->
<img id="id_isdu-image1" src="images-isdu/TabConfig.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image2" src="images-isdu/TabConnection.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image3" src="images-isdu/TabDesktop.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image4" src="images-isdu/TabDiscovery.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image5" src="images-isdu/TabEvents.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image6" src="images-isdu/TabNetwork.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image7" src="images-isdu/TabPolicies.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image8" src="images-isdu/TabRemote.png" style="position:fixed;bottom:16px;left:32px;display:none">
<!-- ###END###{Look-ISDU} -->
<!-- ###BEGIN###{Look-BrandedCommander} -->
<!-- ###BEGIN###{!Mode-Firmware} -->
<img id="id_isdu-image1" src="images-BrandedCommander/TabConfig.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image2" src="images-BrandedCommander/TabConnection.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image3" src="images-BrandedCommander/TabDesktop.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image4" src="images-BrandedCommander/TabDiscovery.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image5" src="images-BrandedCommander/TabEvents.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image6" src="images-BrandedCommander/TabNetwork.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image7" src="images-BrandedCommander/TabPolicies.png" style="position:fixed;bottom:16px;left:32px;display:none">
<img id="id_isdu-image8" src="images-BrandedCommander/TabRemote.png" style="position:fixed;bottom:16px;left:32px;display:none">
<!-- ###END###{!Mode-Firmware} -->
<!-- ###END###{Look-BrandedCommander} -->
</div>
<div id="id_mainarea" class="maincell">
<!-- ###BEGIN###{IDER} -->
<div id="id_iderstatus" style="position:relative;height:21px;background:#8fac8d;padding:5px;margin-bottom:1px;display:none;z-index:1000">
<div style="float:right">
<input id="IDERDiskMapButton" type="button" value="디스크 맵" onclick="iderToggleDiskMap()">
<input type="button" value="IDE-R 세션 중지" onclick="iderStop()">
</div>
<div style="font-size:16px;padding-top:2px">&nbsp;<span id="id_iderstatusstr"></span></div>
<div id="iderHeatmap" style="z-index:1000;position:absolute;top:31px;right:8px;border:1px solid black;box-shadow: 0px 0px 10px;border-radius:5px;padding:8px;width:600px;background-color:#99CC99;display:none">
<div id="floppyHeatMap" style="display:none">
<div id="floppyHeatMapText" style="margin:2px">플로피, 블록은 512 바이트입니다.</div>
<canvas id="floppyHeatMapCanvas" width="600" height="0"></canvas>
</div>
<div id="cdromHeatMap" style="display:none">
<div id="cdromHeatMapText" style="margin:2px">CDROM, 블록은 2048 바이트입니다.</div>
<canvas id="cdromHeatMapCanvas" width="600" height="0"></canvas>
</div>
</div>
</div>
<!-- ###END###{IDER} -->
<!-- ###BEGIN###{Scripting} -->
<div id="id_scriptstatus" style="height:21px;background:#8fac8d;padding:5px;margin-bottom:1px;display:none;overflow:hidden">
<div style="float:right"><input type="button" value="스크립트 중지" onclick="script_Stop()"></div>
<div style="font-size:16px;padding-top:2px;overflow:hidden">&nbsp;<b>스크립트 실행</b><span style="overflow:hidden" id="id_scriptstatusstr"></span></div>
</div>
<!-- ###END###{Scripting} -->
<!-- ###BEGIN###{VersionWarning} -->
<div id="id_versionWarning" style="height:21px;background:#8fac8d;padding:5px;margin-bottom:1px;display:none">
<div style="font-size:16px;float:right;cursor:pointer;padding-right:5px;padding-left:5px;padding-top:2px;font-size:15px" onclick="QV('id_versionWarning', false)"></div>
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<div style="font-size:14px;padding-top:2px">&nbsp;<b>이 컴퓨터의 펌웨어는 업데이트되어야합니다.&nbsp;<a style="cursor:pointer" onclick="require('nw.gui').Shell.openExternal('https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00075&amp;languageid=en-fr')"><u>여기를 확인하십시오</u></a>.</b></div>
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<div style="font-size:14px;padding-top:2px">&nbsp;<b>이 컴퓨터의 펌웨어는 업데이트되어야합니다.&nbsp;<a style="cursor:pointer" href="https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00075&amp;languageid=en-fr" rel="noreferrer noopener" target="_blank"><u>여기를 확인하십시오</u></a>.</b></div>
<!-- ###END###{!Mode-NodeWebkit} -->
</div>
<!-- ###END###{VersionWarning} -->
<!-- ###BEGIN###{Storage} -->
<div id="id_mainarea_frame" style="width:100%;height:100%">
<iframe id="id_StorageIFrame" style="width:100%;height:100%;border:0"></iframe>
</div>
<!-- ###END###{Storage} -->
<div id="id_mainarea_pad" style="padding:8px;overflow-x:hidden">
<div id="p0">
<h1>불러오는 중 ...</h1>
</div>
<div id="p1" style="display:none">
<h1>시스템 상태</h1>
<span id="id_TableSysStatus"></span>
</div>
<!-- ###BEGIN###{HardwareInfo} -->
<div id="p2" style="display:none">
<h1 style="margin-bottom:16px">하드웨어 정보</h1>
<span id="id_TableSysInfo"></span>
</div>
<!-- ###END###{HardwareInfo} -->
<!-- ###BEGIN###{EventLog} -->
<div id="p6" style="display:none">
<h1>이벤트 로그</h1>
<span id="id_TableEventLog"></span>
<span id="id_TableEventLog2"></span>
</div>
<!-- ###END###{EventLog} -->
<!-- ###BEGIN###{NetworkSettings} -->
<div id="p8" style="display:none">
<h1>네트워크 설정</h1>
<span id="id_TableNetworkSettingsSpan"></span>
<!-- ###BEGIN###{Wireless} -->
<span id="id_TableWifi2"></span>
<!-- ###END###{Wireless} -->
<!-- ###BEGIN###{NetAuth} -->
<span id="id_TableNetAuth"></span>
<!-- ###END###{NetAuth} -->
</div>
<!-- ###END###{NetworkSettings} -->
<div id="p11" style="display:none">
<h1>사용자 계정</h1>
<span id="id_TableUserAccounts"></span>
</div>
<!-- ###BEGIN###{WsmanBrowser} -->
<div id="p12" style="display:none">
<h1>WSMAN 브라우저</h1>
<div>
<table class="log1" cellpadding="0" cellspacing="0" style="width:100%;border-radius:8px">
<tbody><tr>
<td>
<div style="padding:4px">
<select id="id_QuerySelect" multiple="multiple" style="width:100%;height:120px"></select>
</div>
</td>
</tr>
<tr>
<td>
<input id="id_p12querybutton" type="button" value="질문" style="margin: 4px" onclick="wsmanQuery()">
<input type="button" value="명확한" style="margin: 4px" onclick="QH('id_wsresults', '')">
<input id="idx_browserFilter" placeholder="필터" style="margin: 4px" onkeyup="wsmanFilter()">
</td>
</tr>
</tbody></table>
</div>
<br>
<div class="us" id="id_wsresults"></div>
</div>
<!-- ###END###{WsmanBrowser} -->
<!-- ###BEGIN###{Terminal} -->
<div id="p13" style="display:none;min-width:780px">
<h1>Serial-over-LAN 터미널</h1>
<br>
<div id="id_p13warning1" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showFeaturesDlg()">
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">인텔 ® AMT 리디렉션 포트 또는 Serial-over-LAN 기능이 비활성화되었습니다<span id="id_p13warninga">사용하려면 여기를 클릭하십시오.</span></div>
</div>
<!-- ###BEGIN###{PowerControl} -->
<div id="id_p13warning2" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showPowerActionDlg()">
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">원격 컴퓨터의 전원이 켜져 있지 않으면 여기를 클릭하여 전원 명령을 실행하십시오.</div>
</div>
<!-- ###END###{PowerControl} -->
<table cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px">
<tbody><tr>
<td style="padding-top:2px;padding-bottom:2px;background:#CCC">
<div style="float:right; text-align:right">
<input onkeyup="sendTermInputKeys(event)" autocorrect="off" autocapitalize="off" style="opacity:0;width:0;height:0;font-size:1px" onblur="keyInputBlur()">
<span id="id_p13power"></span>&nbsp;
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<div id="termRecordIcon" title="Server is recording this session" style="display:none;float:right;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-right:4px"></div>
<!-- ###END###{Mode-MeshCentral2} -->
<!-- ###BEGIN###{PowerControl} -->
<input type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="전원 동작 ..." onclick="showPowerActionDlg()" style="margin-right:3px">
<!-- ###END###{PowerControl} -->
<!-- ###BEGIN###{IDER} -->
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<input type="button" id="idx_SIDER1" value="SIDER" title="Start server-side remote disk mount operation" onkeypress="return false" onkeydown="return false" onclick="iderServerStart()" style="margin-right:3px">
<!-- ###END###{Mode-MeshCentral2} -->
<input type="button" id="idx_IDER1" value="IDER" title="원격 디스크 마운트 작업 시작" onkeypress="return false" onkeydown="return false" onclick="iderStart(event)" style="margin-right:3px">
<!-- ###END###{IDER} -->
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<!-- ###BEGIN###{FileSaver} -->
<input id="idx_terminalCaptureButton" type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="캡처 시작" title="Toggle start/stop of terminal capture, when stopping the content of the capture buffer will be saved to a file." onclick="terminalCaptureToggle(event)" style="margin-right:3px">
<!-- ###END###{FileSaver} -->
<!-- ###BEGIN###{TerminalReplay} -->
<!-- <input id="idx_terminalReplayButton" type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="Replay Capture" onclick="terminalReplay()" style="margin-right:3px"> -->
<!-- ###END###{TerminalReplay} -->
<!-- ###END###{!Mode-NodeWebkit} -->
</div>
<div>
&nbsp;<input type="button" id="idx_connectbutton2" value="잇다" onclick="connectTerminal(event)" disabled="disabled">
&nbsp;<span id="id_termstatus">연결이 끊어졌습니다.</span>
</div>
</td>
</tr>
<tr>
<td style="background:#000;text-align:center"><pre id="Term"></pre></td>
</tr>
<tr>
<td style="padding-top:2px;padding-bottom:2px;background:#CCC">
<div style="float:right;text-align:right">
<input id="id_tcrbutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event);return false" class="bottombutton" value="CR + LF" title="리턴 키가 보낼 것을 토글" onclick="termToggleCr();Q('id_tcrbutton').blur()">
<!-- ###BEGIN###{TerminalSize} -->
<input id="id_tsizebutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="80x25" title="터미널 크기 전환" onclick="termToggleSize();Q('id_tsizebutton').blur()">
<!-- ###END###{TerminalSize} -->
<input id="id_tfxkeysbutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event);return false" class="bottombutton" value="인텔 (F10 = ESC + [OM)" title="F1 ~ F10 키 에뮬레이션 유형 전환" onclick="termToggleFx();Q('id_tfxkeysbutton').blur()">
<!-- ###BEGIN###{Terminal-Enumation-All} -->
<input id="id_ttypebutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event);return false" class="bottombutton" value="확장 된 아스키" title="터미널 에뮬레이션 유형 전환" onclick="termToggleType();Q('id_ttypebutton').blur()">&nbsp;
<!-- ###END###{Terminal-Enumation-All} -->
</div>
<div>
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<input id="id_toolbtncc" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="Ctl-C" onclick="termSendKey(3);Q('id_toolbtncc').blur()">
<input id="id_toolbtncx" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="Ctl-X" onclick="termSendKey(24);Q('id_toolbtncx').blur()">
<input id="id_toolbtnes" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="ESC" onclick="termSendKey(27);Q('id_toolbtnes').blur()">
<input id="id_toolbtnbs" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="역행 키이" onclick="termSendKey(8);Q('id_toolbtnbs').blur()">
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<span id="termkeysspan">
<select style="margin-left:6px" id="termkeys">
<option value="3">Ctrl-C</option>
<option value="24">Ctrl-X</option>
<option value="27">ESC</option>
<option value="8">역행 키이</option>
<option value="1001">F1</option>
<option value="1002">F2</option>
<option value="1003">F3</option>
<option value="1004">F4</option>
<option value="1005">F5</option>
<option value="1006">F6</option>
<option value="1007">F7</option>
<option value="1008">F8</option>
<option value="1009">F9</option>
<option value="1010">F10</option>
<option value="1011">F11</option>
<option value="1012">F12</option>
</select>
<input id="TermWD" type="button" value="보내다" onkeypress="return false" onkeydown="return false" onclick="termSendKeys()">
&nbsp;
</span>
<!-- ###END###{!Mode-NodeWebkit} -->
<input id="id_tpastebutton" type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="풀" disabled="disabled" onclick="setDialogMode(3,'Paste',3,termPaste)">
</div>
</td>
</tr>
</tbody></table>
</div>
<!-- ###END###{Terminal} -->
<!-- ###BEGIN###{Desktop} -->
<div id="p14" style="display:none;min-width:780px">
<div id="id_rdheader"><h1>원격 데스크탑</h1><br></div>
<div id="id_p14warning1" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showFeaturesDlg()">
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">인텔 ® AMT 리디렉션 포트 또는 KVM 기능이 비활성화되었습니다<span id="id_p14warninga">사용하려면 여기를 클릭하십시오.</span></div>
</div>
<!-- ###BEGIN###{PowerControl} -->
<div id="id_p14warning2" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showPowerActionDlg()">
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">원격 컴퓨터의 전원이 켜져 있지 않으면 여기를 클릭하여 전원 명령을 실행하십시오.</div>
</div>
<!-- ###END###{PowerControl} -->
<table cellpadding="0" cellspacing="0" style="width: 100%; padding: 0px; padding: 0px; margin-top: 0px">
<tbody><tr>
<td style="padding-top: 2px;padding-bottom:2px;background: #CCC">
<div style="float:right; text-align:right">
<span id="id_p14power"></span>&nbsp;
<div class="rb" title="왼쪽으로 회전" onclick="drotate(-1)"></div>
<div class="rb" title="오른쪽으로 회전" onclick="drotate(1)"></div>
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<div id="deskRecordIcon" title="Server is recording this session" style="display:none;float:right;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-right:4px"></div>
<!-- ###END###{Mode-MeshCentral2} -->
<input id="idx_deskFullBtn" type="button" title="전체 화면 모드 전환" onkeypress="return false" onkeydown="return false" value="완전한" onclick="deskToggleFull()" style="margin-right:3px">
<!-- ###BEGIN###{DesktopFocus} -->
<input id="idx_deskFocusBtn" type="button" title="마우스 주변 영역 만 활성화되면 포커스 모드 전환" onkeypress="return false" onkeydown="return false" value="모든 초점" onclick="deskToggleFocus()" style="margin-right:3px">
<!-- ###END###{DesktopFocus} -->
<!-- ###BEGIN###{FileSaver} -->
<!-- ###BEGIN###{!DesktopRecorder} -->
<input id="idx_deskSaveBtn" type="button" title="원격 데스크톱의 스크린 샷 저장" onkeypress="return false" onkeydown="return false" value="저장..." onclick="deskSaveImage()" style="margin-right:3px">
<!-- ###END###{!DesktopRecorder} -->
<!-- ###END###{FileSaver} -->
<input type="button" value="설정 ..." title="원격 데스크톱 설정 편집" onkeypress="return false" onkeydown="return false" onclick="showDesktopSettings()" style="margin-right:3px">
<!-- ###BEGIN###{IDER} -->
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<input type="button" id="idx_SIDER2" value="SIDER" title="Start server-side remote disk mount operation" onkeypress="return false" onkeydown="return false" onclick="iderServerStart()" style="margin-right:3px">
<!-- ###END###{Mode-MeshCentral2} -->
<input type="button" id="idx_IDER2" value="IDER" title="원격 디스크 마운트 작업 시작" onkeypress="return false" onkeydown="return false" onclick="iderStart(event)" style="margin-right:3px">
<!-- ###END###{IDER} -->
<!-- ###BEGIN###{PowerControl} -->
<input type="button" title="원격 시스템의 전원 상태 변경" onkeypress="return false" onkeydown="return false" value="전원 동작 ..." onclick="showPowerActionDlg()" style="margin-right:3px">
<!-- ###END###{PowerControl} -->
</div>
<div>
<div id="idx_deskFullBtn2" onclick="deskToggleFull()" style="float:left;cursor:pointer;font-size:15px;display:none">&nbsp;</div>
&nbsp;<input type="button" id="idx_connectbutton1" value="잇다" onclick="connectDesktopButton(event)" onkeypress="return false" onkeydown="return false" disabled="disabled">
&nbsp;<span id="id_deskstatus">연결이 끊어졌습니다.</span>
</div>
</td>
</tr>
<tr>
<td id="id_DeskParent" style="background:black;text-align:center;position:relative">
<!-- ###BEGIN###{DesktopFocus} -->
<div id="DeskFocus" style="color:transparent;border:3px dotted rgba(255,0,0,.2);position:absolute;border-radius:5px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)"></div>
<!-- ###END###{DesktopFocus} -->
<!-- ###BEGIN###{DesktopInband} -->
<canvas id="Desk" width="640" height="400" style="-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" onwheel="dmousewheel(event)" moz-opaque=""></canvas>
<!-- ###END###{DesktopInband} -->
<!-- ###BEGIN###{!DesktopInband} -->
<canvas id="Desk" width="640" height="400" style="-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" moz-opaque=""></canvas>
<!-- ###END###{!DesktopInband} -->
</td>
</tr>
<tr>
<td style="padding-top:2px;padding-bottom:2px;background:#CCC">
<!--
<div style="float:right; text-align:right">
<select id="specialkeylist" onkeypress="return false"></select>
<input id="specialkeylistinput" type="button" onkeypress="return false" class="bottombutton" value="Send" onclick="sendSpecialKey()">&nbsp;
</div>
-->
<!-- ###BEGIN###{DesktopClipboard} -->
<input id="id_DeskKvmClipButton" value="클립 보드" type="button" style="float:right;display:none" onclick="deskClipboard()">
<!-- ###END###{DesktopClipboard} -->
<!-- ###BEGIN###{FileSaver} -->
<!-- ###BEGIN###{DesktopRecorder} -->
<div id="id_DeskRecorderTools" style="float:right">
<div id="DeskRecordButton" class="videoIcon" title="원격 데스크톱 세션을 파일에 기록" onclick="deskRecordSession()"></div>
<div id="DeskSaveImageButton" class="cameraIcon" title="원격 데스크톱의 스크린 샷 저장" onclick="deskSaveImage()"></div>
</div>
<!-- ###END###{DesktopRecorder} -->
<!-- ###END###{FileSaver} -->
<!-- ###BEGIN###{Desktop-Multi} -->
<div id="id_DeskScreenSelector" style="float:right"></div>
<!-- ###END###{Desktop-Multi} -->
<div>
&nbsp;
<span id="deskkeysspan">
<select style="margin-left:6px" id="deskkeys">
<option value="0">승리</option>
<option value="1">승 + 다운</option>
<option value="2">승 +</option>
<option value="3">승 + L</option>
<option value="4">승 + M</option>
<option value="20">승 + R</option>
<option value="23">승 + 왼쪽</option>
<option value="24">승리 + 오른쪽</option>
<option value="5">Shift + Win + M</option>
<option value="19">Alt-Tab</option>
<option value="21">Alt-F4</option>
<option value="22">Ctrl-W</option>
<option value="6">F1</option>
<option value="7">F2</option>
<option value="8">F3</option>
<option value="9">F4</option>
<option value="10">F5</option>
<option value="11">F6</option>
<option value="12">F7</option>
<option value="13">F8</option>
<option value="14">F9</option>
<option value="15">F10</option>
<option value="16">F11</option>
<option value="17">F12</option>
<option value="25">Enter</option>
<!-- <option value=18>LS+LA+PrtSc</option> -->
</select>
<input id="DeskWD" type="button" value="보내다" onkeypress="return false" onkeydown="return false" onclick="deskSendKeys()">
&nbsp;
</span>
<input id="id_DeskCAD" type="button" value="Ctrl-Alt-Del" onkeypress="return false" onkeydown="return false" onclick="sendCAD()">&nbsp;
<!-- ###BEGIN###{DesktopType} -->
<input id="id_DeskType" type="button" value="유형" onkeypress="return false" onkeydown="return false" onclick="deskShowTypeDialog()">&nbsp;
<!-- ###END###{DesktopType} -->
<span id="id_DeskSBspan"><input id="id_DeskSB" type="checkbox"> 빈 화면&nbsp;</span>
<span id="id_DeskVOspan"><input id="id_DeskVO" type="checkbox"> 보기 만&nbsp;</span>
</div>
</td>
</tr>
</tbody></table>
</div>
<!-- ###END###{Desktop} -->
<!-- ###BEGIN###{AuditLog} -->
<div id="p15" style="display:none">
<span id="id_TableAuditLog1"></span>
<h1>감사 로그</h1>
<span id="id_TableAuditLog2"></span>
</div>
<!-- ###END###{AuditLog} -->
<!-- ###BEGIN###{Certificates} -->
<div id="p16" style="display:none">
<h1>보안 설정</h1>
<span id="id_TableCerts"></span>
</div>
<!-- ###END###{Certificates} -->
<!-- ###BEGIN###{RemoteAccess} -->
<div id="p17" style="display:none">
<h1>인터넷 설정</h1>
<span id="id_TableRemoteAccess"></span>
</div>
<!-- ###END###{RemoteAccess} -->
<!-- ###BEGIN###{SystemDefense} -->
<div id="p18" style="display:none">
<h1>시스템 방어</h1>
<span id="id_TableSystemDefense"></span>
</div>
<!-- ###END###{SystemDefense} -->
<!-- ###BEGIN###{AgentPresence} -->
<div id="p19" style="display:none">
<h1>에이전트 존재</h1>
<span id="id_TableSystemAgentPresence"></span>
</div>
<!-- ###END###{AgentPresence} -->
<!-- ###BEGIN###{Scripting-Editor} -->
<div id="p20" style="display:none">
<h1>스크립트 편집기</h1>
<div class="log1" style="padding:5px;border-radius:5px">
<div id="EditScriptStatus" style="float:right;font-weight:bold;padding:5px">중지</div>
<div>
<input type="button" value="에디터보기" title="스크립트 라인 편집기보기로 전환" id="viewEditorButton" onclick="scriptViewButton(0)">
<input type="button" value="뷰 빌더" title="블록 에디터 뷰로 전환" id="viewBuilderButton" onclick="scriptViewButton(1)">
<input type="button" value="새로운..." title="스크립트 편집기를 지우십시오" onclick="script_newScriptDlg()">
<input type="button" value="하중..." title="파일에서 스크립트로드" onclick="script_runScriptDlg()">
<!-- ###BEGIN###{FileSaver} -->
<input type="button" value="저장..." title="스크립트를 파일로 저장" onclick="script_saveScript(event)">
<!-- ###END###{FileSaver} -->
<input type="button" value="재시작" title="스크립트를 컴파일하고 처음부터 실행할 준비를하십시오" onclick="resetScriptButton()">
<input type="button" value="계속하다" title="현재 실행 지점에서 스크립트를 실행하십시오." onclick="runScriptButton()">
<input type="button" value="단절" title="스크립트 실행 일시 중지" onclick="breakScriptButton()">
<input type="button" value="단계" title="스크립트의 한 단계 실행" onclick="stepScriptButton()">
</div>
</div>
<div id="scriptbuilder" style="display:none">
<h2>스크립트 작성기</h2>
<div style="padding:0;margin:0">
<div style="width:250px;height:400px;float:left;padding:0;margin:0;padding-right:3px">
<input id="blockfilter" style="width:inherit;height:24px;padding:0;margin:0;border:1px solid gray;margin-bottom:1px" placeholder="필터 블록 ..." onkeyup="script_fonfilterchanged()">
<div id="blocks" style="width:inherit;height:373px;border:1px solid gray;overflow-y:scroll;padding:0;margin:0"></div>
</div>
<div id="scriptblocks" style="width:auto;height:400px;padding:0;margin:0;border:1px solid gray;overflow-y:scroll" ondrop="script_fondrop(event, this)" onclick="script_fonclick(event)"></div>
</div>
</div>
<div id="scripteditor">
<h2>스크립트</h2>
<textarea id="scriptarea" style="width:100%;height:176px;resize:vertical;margin:0;padding:0;font-family:Arial,Helvetica,sans-serif" spellcheck="false"></textarea>
<div style="display:none">
<br><h2>컴파일 된 스크립트</h2>
<textarea id="compiledarea" style="width:100%;height:16px;resize:vertical;margin:0;padding:0" spellcheck="false"></textarea>
<br>
</div>
<h2>변수</h2>
<div id="variables" style="width:100%;height:200px;resize:vertical;border:1px solid gray;overflow:scroll;margin:0;padding:0;user-select:text;-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text"></div>
</div>
<h2>콘솔</h2>
<textarea id="console" style="width:100%;height:80px;resize:vertical;margin:0;padding:0;user-select:text;-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text" readonly=""></textarea>
</div>
<!-- ###END###{Scripting-Editor} -->
<!-- ###BEGIN###{Storage} -->
<div id="p21" style="display:none">
<h1>저장</h1>
<span id="id_TableSystemStorage"></span>
</div>
<!-- ###END###{Storage} -->
<!-- ###BEGIN###{EventSubscriptions} -->
<div id="p22" style="display:none">
<h1>이벤트 구독</h1>
<span id="id_TableEventSubscriptions"></span>
</div>
<!-- ###END###{EventSubscriptions} -->
<!-- ###BEGIN###{Alarms} -->
<div id="p23" style="display:none">
<h1>웨이크 경보</h1>
<span id="id_TableAlarm"></span>
</div>
<!-- ###END###{Alarms} -->
<!-- ###BEGIN###{DesktopInbandFiles} -->
<div id="p24" style="display:none;position:absolute;top:0px;bottom:0px;left:8px;right:24px">
<h1>파일</h1><br>
<table id="p24toolbar" style="width:100%;position:absolute;top:35px" cellpadding="0" cellspacing="0">
<tbody><tr>
<td style="width:100%;background-color:#d3d9d6;text-align:left;padding:4px" valign="bottom">
<div id="p24rightOfButtons" style="float:right;margin-top:3px"></div>
<div>
<input type="button" id="p24FolderUp" disabled="disabled" onclick="p24folderup()" value="쪽으로">&nbsp;
<input type="button" id="p24SelectAllButton" disabled="disabled" onclick="p24selectallfile()" value="모두 선택" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24RenameFileButton" disabled="disabled" value="이름 바꾸기" onclick="p24renamefile()" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24DeleteFileButton" disabled="disabled" value="지우다" onclick="p24deletefile()" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24NewFolderButton" disabled="disabled" value="새 폴더" onclick="p24createfolder()" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24UploadButton" disabled="disabled" value="업로드" onclick="p24uploadFile()" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24CutButton" disabled="disabled" value="절단" onclick="p24copyFile(1)" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24CopyButton" disabled="disabled" value="부" onclick="p24copyFile(0)" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24PasteButton" disabled="disabled" value="풀" onclick="p24pasteFile()" onkeypress="return false" onkeydown="return false">&nbsp;
<input type="button" id="p24RefreshButton" disabled="disabled" value="새롭게 하다" onclick="p24folderup(9999)" onkeypress="return false" onkeydown="return false">&nbsp;
</div>
</td>
</tr>
<tr>
<td style="background-color:#E4E9E7;height:28px">
<div style="float:right;margin-right:4px">
<select id="p24sortdropdown" onchange="p24updateFiles()">
<option value="1" selected="selected">이름으로 분류하다</option>
<option value="2">크기별로 정렬</option>
<option value="3">날짜순으로 정렬</option>
<option value="4">이름으로 내림차순</option>
<option value="5">크기로 내림차순</option>
<option value="6">날짜별로 내림차순</option>
</select>
</div>
<div>&nbsp;&nbsp;<span id="p24currentpath"></span></div>
</td>
</tr>
</tbody></table>
<div id="p24filetable" style="width:100%;overflow:auto;-webkit-user-select:none;position:absolute;top:92px;bottom:30px">
<div id="p24bigok" style="width:256px;overflow:hidden;position:absolute;top:80px;width:100%;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b></b></div>
<div id="p24bigfail" style="width:256px;overflow:hidden;position:absolute;top:80px;width:100%;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b></b></div>
<span id="p24files"></span>
</div>
<table id="p24toolbarBottom" style="width:100%;position:absolute;bottom:10px" cellpadding="0" cellspacing="0">
<tbody><tr><td style="text-align:left;padding:3px;text-align:center;background-color:#D3D9D6">&nbsp;<span id="p24bottomstatus"></span></td></tr>
</tbody></table>
</div>
<!-- ###END###{DesktopInbandFiles} -->
</div>
</div>
</div>
<!-- ###BEGIN###{Mode-MeshCentral2} -->
<div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial, Helvetica, sans-serif;border-radius:5px;position:fixed;overflow:hidden;top:75px;width:400px;max-height:550px;display:none">
<!-- ###END###{Mode-MeshCentral2} -->
<!-- ###BEGIN###{!Mode-MeshCentral2} -->
<div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial, Helvetica, sans-serif;border-radius:5px;position:fixed;top:160px;width:400px;display:none">
<!-- ###END###{!Mode-MeshCentral2} -->
<div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0">
<div id="id_dialogclose" style="float:right;padding:1px;margin-right:5px;cursor:pointer;font-size:15px" onclick="setDialogMode()"></div>
<div id="id_dialogtitle" style="padding:5px"></div>
<div style="width:100%;margin:6px"></div>
</div>
<div style="margin-right:16px;margin-left:8px">
<div id="dialog1" style="margin:auto;text-align:center;margin:3px">
<div id="id_dialogMessage" style="padding:10px"></div>
</div>
<div id="dialog2" style="margin:auto;margin:3px">
<br>
<div style="height:26px"><input id="d2username" style="float:right;width:200px" onkeyup="updateAccountDialog()"><div>사용자 이름</div></div>
<div style="height:26px"><input id="d2password1" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="updateAccountDialog()"><div>암호*</div></div>
<div style="height:26px"><input id="d2password2" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="updateAccountDialog()"><div>비밀번호 확인</div></div>
<div id="id_d2permissions">
<div style="height:26px"><select id="d2permission" style="float:right;width:200px"><option value="0">현지</option><option value="1">회로망</option><option value="2">어떤</option></select><div>허가</div></div>
<div>부여 된 권한</div>
<ul id="id_d2realms" style="list-style-type:none;height:100px;overflow:auto;width:100%;border: 1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0"></ul>
</div>
<div style="font-size:10px"><br>* 대문자, 소문자, 0-9 및! @ # $ % ^ &amp; * () +-중 하나를 포함하는 최소 8 자</div>
</div>
<!-- ###BEGIN###{Terminal} -->
<div id="dialog3" style="margin:auto;text-align:center;margin:3px">
<textarea id="d3pastetextarea" maxlength="4096" style="width:100%;height:200px;resize:none"></textarea>
</div>
<!-- ###END###{Terminal} -->
<!-- ###BEGIN###{Mode-LMS} -->
<div id="dialog4" style="margin:auto;margin:3px">
<br>
<div style="height:26px"><input id="d4username" placeholder="관리자" style="float:right;width:200px" onkeyup="lmsUpdateLoginDialog(event, 1)"><div>사용자 이름</div></div>
<div style="height:26px"><input id="d4password" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="lmsUpdateLoginDialog(event, 2)"><div>암호*</div></div>
<div style="font-size:10px"><br>* 대문자, 소문자, 0-9 및! @ # $ % ^ &amp; * () +-중 하나를 포함하는 최소 8 자</div>
</div>
<!-- ###END###{Mode-LMS} -->
<!-- ###BEGIN###{ComputerSelector} -->
<div id="dialog4" style="margin:auto;margin:3px">
<br>
<div style="height:26px"><input id="d4name" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>친숙한 이름</div></div>
<div style="height:26px"><input id="d4tags" list="d4devGroups" style="float:right;width:200px" placeholder="나의 그룹"><div>그룹 이름</div></div>
<div style="height:26px"><input id="d4hostname" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>호스트 이름</div></div>
<div style="height:26px"><select id="d4security" style="float:right;width:200px" onchange="updateComputerDialog()"><option value="0">다이제스트 / 없음</option><option value="1">다이제스트 / TLS</option><option value="2">Kerberos / 없음</option><option value="3">Kerberos / TLS</option></select><div>인증 / 보안</div></div>
<div id="d4digest">
<div style="height:26px"><input id="d4username" value="관리자" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>사용자 이름</div></div>
<div style="height:26px"><input id="d4password" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>암호*</div></div>
<div style="font-size:10px"><br>* 대문자, 소문자, 0-9 및! @ # $ % ^ &amp; * () +-중 하나를 포함하는 최소 8 자</div>
</div>
<div id="d4kerb">
<div style="height:26px"><input id="d4kerberos" style="float:right;width:200px" onkeyup="updateComputerDialog()" placeholder="computer.domain.com:16992" title="이 필드가 채워지면이 값은 host : port 대신 Kerberos 토큰을 요청하는 데 사용됩니다."><div>선택적 토큰 요청 *</div></div>
<div style="font-size:10px"><br>* Kerberos 토큰 요청의 대체 호스트 이름</div>
</div>
<datalist id="d4devGroups"></datalist>
</div>
<!-- ###END###{ComputerSelector} -->
<div id="dialog5" style="margin:auto;margin:3px">
<br>
<div style="height:26px">
<select id="d5actionSelect" style="float:right;width:200px"></select>
<div>파워 액션</div>
</div>
<div>
<span style="color:red">경고:</span> 일부 전원 작업으로 인해 데이터가 손실 될 수 있으며 데스크톱, 터미널 또는 디스크 리디렉션 세션의 연결이 끊어 질 수 있습니다.
</div>
</div>
<div id="dialog6" style="margin:auto;margin:3px">
<br>
<div style="height:26px"><input id="d6ConsentText" style="float:right;width:200px" maxlength="6" onkeyup="consentChanged()" onkeypress="if (event.keyCode == 13) return dialogclose(1); else return numbersOnly(event)"><div>동의 코드</div></div>
<div style="height:26px"><select id="d6Display" onchange="changeConsentDisplay()" style="float:right;width:200px"><option value="0">기본 디스플레이</option><option value="1">보조 디스플레이</option><option id="d6ThirdDisplay" value="2" style="display:none">세번째 디스플레이</option></select><div>동의 표시</div></div>
</div>
<!-- ###BEGIN###{Desktop} -->
<div id="dialog7" style="margin:auto;margin:3px">
<br>
<div style="height:26px">
<select id="idx_d7desktopmode" style="float:right;width:200px"></select>
<div>이미지 인코딩</div>
</div>
<div id="d7decimationspan" style="height:26px">
<select id="d7decimation" style="float:right;width:200px"><option value="0">Don't set</option><option value="1">비활성화</option><option value="2">Automatic</option><option value="3">가능</option></select>
<div>Downscaling</div>
</div>
<div style="height:80px">
<div style="float:right;border:1px solid #666;width:200px;height:80px;overflow-y:scroll;background-color:white">
<!-- ###BEGIN###{DesktopFocus} -->
<label><input type="checkbox" id="d7showfocus">초점 도구 표시</label><br>
<!-- ###END###{DesktopFocus} -->
<label><input type="checkbox" id="d7showcursor">로컬 마우스 커서 표시</label><br>
<label><input type="checkbox" id="d7showcad">Ctrl-Alt-Del 표시</label><br>
<label><input type="checkbox" id="d7limitFrameRate">프레임 속도 제한</label><br>
<label><input type="checkbox" id="d7noMouseRotate">마우스를 돌리지 마십시오</label><br>
<label><input type="checkbox" id="d7kvmrmw">Reverse Mouse Wheel</label><br>
</div>
<div>다른 설정</div>
</div>
<!-- ###BEGIN###{DesktopInband} -->
<div id="d7softkvmsettings" style="display:none">
<h4 style="width:100%;border-bottom:1px solid gray">소프트웨어 KVM</h4>
<div style="margin:3px 0 3px 0">
<select id="d7bitmapquality" style="float:right;width:200px;height:20px" dir="rtl">
<option value="50">50 %</option>
<option value="40">40 %</option>
<option selected="selected" value="30">30 %</option>
<option value="20">20 %</option>
<option value="10">10 %</option>
<option value="5">5 %</option>
<option value="1">1%</option>
</select>
<div style="height:20px">품질</div>
</div>
<div style="margin:3px 0 3px 0">
<select id="d7bitmapscaling" style="float:right;width:200px;height:20px" dir="rtl">
<option selected="selected" value="1024">100 %</option>
<option value="896">87.5 %</option>
<option value="768">75 %</option>
<option value="640">62.5 %</option>
<option value="512">50 %</option>
<option value="384">37.5 %</option>
<option value="256">25 %</option>
<option value="128">12.5 %</option>
</select>
<div style="height:20px">스케일링</div>
</div>
</div>
<!-- ###END###{DesktopInband} -->
</div>
<!-- ###END###{Desktop} -->
<!-- ###BEGIN###{!Mode-Firmware} -->
<div id="dialog8" style="display:table;margin:3px">
<div style="margin:3px 0 3px 0;padding-top:5px">
<input id="idx_d8username" value="관리자" style="float:right;width:220px">
<div style="height:20px">사용자 이름</div>
</div>
<div style="margin:3px 0 3px 0">
<input id="idx_d8password" type="password" autocomplete="off" style="float:right;width:220px">
<div style="height:20px">암호</div>
</div>
</div>
<!-- ###END###{!Mode-Firmware} -->
<div id="dialog9" style="margin:auto;margin:3px">
<label style="display:block"><input type="checkbox" id="idx_d9redir">리디렉션 포트</label>
<label id="idx_d9kvm_div" style="display:block"><input type="checkbox" id="idx_d9kvm">KVM 원격 데스크톱</label>
<label style="display:block"><input type="checkbox" id="idx_d9ider">IDE 리디렉션<br></label>
<label style="display:block"><input type="checkbox" id="idx_d9sol">시리얼 오버 LAN<br></label>
</div>
<div id="dialog10" style="margin:auto;margin:3px">
<label><input type="radio" name="d10" id="idx_d10none" value="0">불필요<br></label>
<label><input type="radio" name="d10" id="idx_d10kvm" value="1">KVM에만 필요<br></label>
<label><input type="radio" name="d10" id="idx_d10all" value="4294967295">항상 필수<br></label>
</div>
<div id="dialog11" style="margin:auto;margin:3px">
<div id="id_dialogOptions"></div>
</div>
<!-- ###BEGIN###{Wireless} -->
<div id="dialog12" style="margin:auto;margin:3px">
<br>
<div style="height:26px"><input id="idx_d12name" style="float:right;width:200px" maxlength="32" onkeyup="updateWifiDialog()" title="최대 32 자"><div title="최대 32 자">프로필 이름</div></div>
<div style="height:26px"><input id="idx_d12ssid" style="float:right;width:200px" maxlength="32" onkeyup="updateWifiDialog()" title="최대 32 자"><div title="최대 32 자">SSID</div></div>
<div style="height:26px">
<select id="idx_d12pri" style="float:right;width:200px" onclick="updateWifiDialog()"></select>
<div>우선 순위</div>
</div>
<div style="height:26px">
<select id="idx_d12auth" style="float:right;width:200px" onclick="updateWifiDialog()"></select>
<div>입증</div>
</div>
<div style="height:26px">
<select id="idx_d12enc" style="float:right;width:200px" onclick="updateWifiDialog()">
<option id="id_d12e4" value="4">CCMP-AES</option>
<option id="id_d12e3" value="3">TKIP-RC4</option>
<!--<option id="id_d12e2" value="2">WEP</option>-->
<!--<option id="id_d12e5" value="5">None</option>-->
</select>
<div>암호화</div>
</div>
<div id="idx_d12pass">
<div style="height:26px"><input id="idx_d12password1" type="password" style="float:right;width:200px" maxlength="63" onkeyup="updateWifiDialog()" title="8 자에서 63 자 사이의 길이"><div title="8 자에서 63 자 사이의 길이">암호*</div></div>
<div style="height:26px"><input id="idx_d12password2" type="password" style="float:right;width:200px" maxlength="63" onkeyup="updateWifiDialog()" title="8 자에서 63 자 사이의 길이"><div title="8 자에서 63 자 사이의 길이">비밀번호 확인</div></div>
</div>
<!-- ###BEGIN###{NetAuth} -->
<div id="idx_d12netauth" style="display:none">
<div id="idx_d12protocoldiv" style="height:26px">
<select id="idx_d12protocol" style="float:right;width:200px" onchange="updateNetAuth2Dialog(event)">
<option value="0" selected="selected">EAP-TLS</option>
<option value="1">EAP-TTLS/MSCHAPv2</option>
<option value="2">PEAPv0/EAP-MSCHAPv2</option>
<option value="3">PEAPv1/EAP-GTC</option>
<option value="4">EAP-FAST/MSCHAPv2</option>
<option value="5">EAP-FAST/GTC</option>
<option value="6">EAP-FAST/TLS</option>
</select>
<div>실험 계획안</div>
</div>
<div id="idx_d12servernamediv" style="height:26px"><input id="idx_d12servername" style="float:right;width:200px" maxlength="80" onkeyup="updateNetAuthDialog()" title="최대 32 자"><div title="최대 32 자">Server Name</div></div>
<div id="idx_d12servernamecomparediv" style="height:26px">
<select id="idx_d12servernamecompare" style="float:right;width:200px" onclick="updateNetAuth2Dialog()">
<option value="0" selected="selected">Full Name</option>
<option value="1">Domain Suffix</option>
</select>
<div>Server Name Compare</div>
</div>
<div id="idx_d12domaindiv" style="height:26px"><input id="idx_d12domain" style="float:right;width:200px" maxlength="128" onkeyup="updateNetAuth2Dialog()" title="Maximum 128 characters"><div title="Maximum 128 characters">Domain</div></div>
<div id="idx_d12usernamediv" style="height:26px"><input id="idx_d12username" style="float:right;width:200px" maxlength="128" onkeyup="updateNetAuth2Dialog()" title="Maximum 128 characters"><div title="Maximum 128 characters">사용자 이름</div></div>
<div id="idx_d12passworddiv" style="height:26px"><input id="idx_d12password" type="password" style="float:right;width:200px" maxlength="32" onkeyup="updateNetAuth2Dialog()" title="Maximum length is 32 characters"><div title="Maximum length is 32 characters">암호</div></div>
<div id="idx_d12roamingidentitydiv" style="height:26px"><input id="idx_d12roamingidentity" style="float:right;width:200px" maxlength="80" onkeyup="updateNetAuth2Dialog()" title="Maximum 80 characters"><div title="Maximum 80 characters">Roaming Identity</div></div>
<div id="idx_d12pacdiv" style="height:26px"><input id="idx_d12pac" style="float:right;width:200px" maxlength="256" onkeyup="updateNetAuth2Dialog()" title="Maximum 256 characters"><div title="Maximum 256 characters">Protected Access Credentials</div></div>
<div id="idx_d12pacpassworddiv" style="height:26px"><input id="idx_d12pacpassword" type="password" style="float:right;width:200px" maxlength="256" onkeyup="updateNetAuth2Dialog()" title="Maximum length is 256 characters"><div title="Maximum length is 256 characters">PAC Password</div></div>
<div id="idx_d12clientcertdiv" style="height:26px">
<select id="idx_d12clientcert" style="float:right;width:200px" onclick="updateNetAuth2Dialog()"></select>
<div>Client Certificate</div>
</div>
<div id="idx_d12servercertdiv" style="height:26px">
<select id="idx_d12servercert" style="float:right;width:200px" onclick="updateNetAuth2Dialog()"></select>
<div>Server Issuer Cert</div>
</div>
<div id="idx_d12activeins0div" style="height:26px">
<select id="idx_d12activeins0" style="float:right;width:200px" onclick="updateNetAuth2Dialog()">
<option value="1">가능</option>
<option value="0">비활성화</option>
</select>
<div>Active in S0</div>
</div>
</div>
<!-- ###END###{NetAuth} -->
</div>
<!-- ###END###{Wireless} -->
<!-- ###BEGIN###{USBSetup} -->
<div id="dialog13" style="margin:auto;margin:3px">
<label><input type="checkbox" id="d13valid">유효한 기록<br></label>
<span id="d13ScrambledRecordSpan"><label><input type="checkbox" id="d13scramble">스크램블 기록</label><br></span>
</div>
<div id="dialog14" style="margin:auto;margin:3px">
<div style="height:26px">
<select id="idx_d14version" style="float:right;width:200px">
<option value="1">버전 1</option>
<option value="2">버전 2</option>
<option value="3">버전 3</option>
<option value="4">버전 4</option>
</select>
<div>Setup.bin 버전</div>
</div>
<div style="height:26px">
<select id="idx_d14consume" style="float:right;width:200px">
<option value="1">기록은 소비되지 않습니다</option>
<option value="0">기록이 소비됩니다</option>
</select>
<div>레코드 소비</div>
</div>
</div>
<div id="dialog15" style="margin:auto;margin:3px">
<input id="d15setupbinfile" type="file" style="width:100%" accept=".bin">
</div>
<div id="dialog16" style="margin:auto;margin:3px">
<div style="height:26px">
<select id="d16type" style="float:right;width:260px" onchange="usb_ond16typechange()" onclick="usb_ond16typechange()" onscroll="usb_ond16typechange()" onkeydown="usb_ond16typechange()"></select>
<div>변수 유형</div>
</div>
<div id="d16genericvalue" style="height:26px">
<select id="idx_d16value1" style="float:right;width:260px"></select>
<input id="idx_d16value2" style="float:right;width:260px;display:none">
<div>변수 값</div>
</div>
<div id="d16customvalue"></div>
</div>
<!-- ###END###{USBSetup} -->
<!-- ###BEGIN###{ComputerSelector} -->
<div id="dialog17" style="margin:auto;margin:3px">
<input id="idx_d17computerlistfile" type="file" style="width:100%" accept=".json, .csv">
</div>
<div id="dialog18" style="margin:auto;margin:3px">
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
<input id="idx_d18computerfilename" style="width:100%" value="computerlist.json">
<!-- ###END###{!Mode-NodeWebkit} -->
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<!-- <input id="idx_d18computersavefile" type="file" nwsaveas="computerlist.json" accept=".json"> -->
<div style="text-align:left;height:26px;padding-top:6px">
<label><input id="d18usepassword" type="checkbox" style="float:left" onchange="saveComputerListUpdate()"><div>암호화를 사용하십시오. 파일에는 인텔 ® AMT 자격 증명이 포함되며 암호를 사용하여 저장하면이 데이터를 보호 할 수 있습니다.</div></label>
</div>
<div id="d18showpassword" style="display:none;padding-top:16px">
<div style="height:26px"><input id="d18password1" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="saveComputerListUpdate()"><div>암호*</div></div>
<div style="height:26px"><input id="d18password2" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="saveComputerListUpdate()"><div>비밀번호 확인</div></div>
<div style="font-size:10px"><br>* 대문자, 소문자, 0-9 및! @ # $ % ^ &amp; * () +-중 하나를 포함하는 최소 8 자</div>
</div>
<!-- ###END###{Mode-NodeWebkit} -->
</div>
<!-- ###END###{ComputerSelector} -->
<!-- ###BEGIN###{FileSaver} -->
<div id="dialog19" style="margin:auto;margin:3px">
이 시스템에 대한 인텔 ® AMT의 전체 상태가 파일로 저장됩니다. 비밀번호는 저장되지 않지만 일부 민감한 데이터가 포함될 수 있습니다.<br><br>
<input id="idx_d19savestatefilename" style="width:100%" value="amtstate.json">
</div>
<!-- ###END###{FileSaver} -->
<!-- ###BEGIN###{NetworkSettings} -->
<div id="dialog20" style="margin:auto;margin:3px">
<input type="radio" name="d20" id="d20a" value="0">비활성화<br>
<input type="radio" name="d20" id="d20b" value="1">ICMP 응답<br>
<input type="radio" name="d20" id="d20c" value="2">RMCP 응답<br>
<input type="radio" name="d20" id="d20d" value="3">ICMP 및 RMCP 응답<br><br>
</div>
<div id="dialog21" style="margin:auto;margin:3px">
<div id="id_d21ipaddrsync">
<label><input type="checkbox" name="d21" id="d21ipsync" onclick="updateIPSetupDlg()">운영 체제 IP 주소 동기화</label><br>
</div>
<label><input type="radio" name="d21" id="d21o0" onclick="updateIPSetupDlg()"><span id="d21l0"></span></label><br>
<label><input type="radio" name="d21" id="d21o1" onclick="updateIPSetupDlg()"><span id="d21l1"></span></label><br>
<div id="id_d21manualdiv">
<label><input type="radio" name="d21" id="d21o2" onclick="updateIPSetupDlg()"><span id="d21l2"></span></label><br><br>
<div style="margin-left:20px">
<div style="height:26px"><input id="idx_d21address" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>IP 주소</div></div>
<div style="height:26px" id="id_d21subnetdiv"><input id="idx_d21subnet" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>서브넷 마크</div></div>
<div style="height:26px"><input id="idx_d21gateway" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>게이트웨이</div></div>
<div style="height:26px"><input id="idx_d21dns1" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>기본 DNS</div></div>
<div style="height:26px"><input id="idx_d21dns2" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>대체 DNS</div></div>
</div>
</div>
</div>
<div id="dialog23" style="margin:auto;margin:3px">
<br>
<div style="height:26px">
<select id="idx_d23ddns" style="float:right;width:200px" onchange="showEditDnsDlgChange()">
<option value="0">비활성화</option>
<option value="1">비활성화, DHCP 업데이트</option>
<option value="2">가능</option>
</select>
<div>동적 DNS 클라이언트</div>
</div>
<div style="height:26px"><input id="idx_d23interval" style="float:right;width:200px"><div>업데이트 간격 (분)</div></div>
<div style="height:26px"><input id="idx_d23ttl" style="float:right;width:200px"><div>TTL (초)</div></div>
<div style="font-size:10px"><br>기본 간격은 1440 분이고 기본 TTL은 900 초입니다.</div>
</div>
<!-- ###END###{NetworkSettings} -->
<!-- ###BEGIN###{PowerControl-Advanced} -->
<div id="dialog24" style="margin:auto;margin:3px">
<br>
<div style="height:26px">
<select id="idx_d24Command" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
<option value="2">파워 업</option>
<option value="10">초기화</option>
<option value="5">전원 사이클</option>
<option value="8">전력 다운</option>
<option id="d24p500" value="500">대기 모드에서 OS 웨이크</option>
<option id="d24p501" value="501">OS 절전</option>
<option value="999">부팅 옵션 설정</option>
</select>
<div>원격 명령</div>
</div>
<div style="height:80px">
<div id="idx_d24bootoptions" style="float:right;border:1px solid #666;width:200px;height:72px;overflow-y:scroll;background-color:white">
<div id="d24dBiosPause"><label><input type="checkbox" id="d24BiosPause" onchange="showAdvPowerDlgChange()">BIOS 일시 정지</label><br></div>
<div id="d24dBiosSecureBoot"><label><input type="checkbox" id="d24BiosSecureBoot" onchange="showAdvPowerDlgChange()">보안 부팅 시행</label><br></div>
<div id="d24dBiosSetup"><label><input type="checkbox" id="d24BiosSetup" onchange="showAdvPowerDlgChange()">BIOS 설정</label><br></div>
<div id="d24dForceProgressEvents"><label><input type="checkbox" id="d24ForceProgressEvents" onchange="showAdvPowerDlgChange()">강제 진행 이벤트</label><br></div>
<div id="d24dLockPowerButton"><label><input type="checkbox" id="d24LockPowerButton" onchange="showAdvPowerDlgChange()">전원 잠금 버튼</label><br></div>
<div id="d24dLockResetButton"><label><input type="checkbox" id="d24LockResetButton" onchange="showAdvPowerDlgChange()">잠금 재설정 버튼</label><br></div>
<div id="d24dLockSleepButton"><label><input type="checkbox" id="d24LockSleepButton" onchange="showAdvPowerDlgChange()">잠자기 버튼</label><br></div>
<div id="d24dLockKeyboard"><label><input type="checkbox" id="d24LockKeyboard" onchange="showAdvPowerDlgChange()">키보드 잠금</label><br></div>
<div id="d24dUserPasswordBypass"><label><input type="checkbox" id="d24UserPasswordBypass" onchange="showAdvPowerDlgChange()">BIOS 비밀번호 우회</label><br></div>
<div id="d24dReflashBios"><label><input type="checkbox" id="d24ReflashBios" onchange="showAdvPowerDlgChange()">BIOS를 다시 플래시</label><br></div>
<div id="d24dSafeMode"><label><input type="checkbox" id="d24SafeMode" onchange="showAdvPowerDlgChange()">안전 모드</label><br></div>
<div id="d24dUseIDER"><label><input type="checkbox" id="d24UseIDER" onchange="showAdvPowerDlgChange()">IDER 사용</label><br></div>
<div id="d24dSerialOverLan"><label><input type="checkbox" id="d24SerialOverLan" onchange="showAdvPowerDlgChange()">시리얼 오버 LAN</label><br></div>
<div id="d24dSecureErase"><label><input type="checkbox" id="d24SecureErase" onchange="showAdvPowerDlgChange()">인텔 ® 원격 보안 지우기</label><br></div>
<div id="d24dPlatformErase"><label><input type="checkbox" id="d24PlatformErase" onchange="showAdvPowerDlgChange()">Remote Platform Erase</label><br></div>
<div id="d24dFirmwareReset"><label><input type="checkbox" id="d24FirmwareReset" onchange="showAdvPowerDlgChange()">Clear Intel® ME Settings</label><br></div>
</div>
<div>부팅 설정</div>
</div>
<div style="height:26px">
<select id="idx_d24ForceBootDevice" style="float:right;width:200px" onchange="showAdvPowerDlgChange()"></select>
<div>부팅 소스</div>
</div>
<div id="idx_d24bootSource" style="height:26px">
<select id="idx_d24BootMediaIndex" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
<option value="0">없음</option>
<option value="1">색인 1</option>
<option value="2">인덱스 2</option>
<option value="3">색인 3</option>
<option value="3">색인 4</option>
</select>
<div>Boot Media</div>
</div>
<!-- ###BEGIN###{PowerControl-OneClick} -->
<div id="idx_d24customBootSource" style="height:26px;display:none">
<select id="idx_d24customBootMediaIndex" onchange="showAdvPowerDlgChange()" style="float:right;width:200px"></select>
<div>Boot Media</div>
</div>
<div id="idx_d24diskImage" style="height:26px">
<input id="idx_d24ocrBootFile" type="file" onchange="showAdvPowerDlgChange()" style="float:right;width:200px" accept=".iso">
<div>Boot Image</div>
</div>
<div id="idx_d24diskImageUrl" style="height:26px">
<input id="idx_d24ocrBootUrl" type="text" onchange="showAdvPowerDlgChange()" onkeyup="showAdvPowerDlgChange()" placeholder="https://" style="float:right;width:200px">
<div>Boot URL</div>
</div>
<div id="idx_d24diskImageHttpTimeout" style="height:26px">
<input id="idx_d24ocrBootHttpBootTimeout" type="text" onchange="showAdvPowerDlgChange()" onkeyup="showAdvPowerDlgChange()" value="0" style="float:right;width:200px">
<div>Timeout (Seconds)</div>
</div>
<!-- ###END###{PowerControl-OneClick} -->
<div style="height:26px" id="idd_d24IDERBootDevice">
<select id="idx_d24IDERBootDevice" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
<option value="0">플로피로 부팅</option>
<option value="1">CDROM으로 부팅</option>
</select>
<div>IDER 부팅 장치</div>
</div>
<div style="height:26px">
<select id="idx_d24Verbocity" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
<option value="0">시스템 기본값</option>
<option id="idx_d24Verbocity1" value="1">조용한</option>
<option id="idx_d24Verbocity2" value="2">말 수가 많은</option>
<option id="idx_d24Verbocity3" value="3">빈 화면</option>
</select>
<div>어휘</div>
</div>
<div style="height:26px" id="idd_d24RSEPass">
<div style="float:right;width:200px"><input type="password" id="d24rsepass" maxlength="32" style="float:right;width:100%"></div>
<div>RSE 비밀번호</div>
</div>
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<div id="idd_d24RSEPassTlsWarn"><div style="color:red"><b>경고:</b> TLS가 사용되지 않으면 암호가 일반 상태로 전송됩니다.</div></div>
<!-- ###END###{Mode-NodeWebkit} -->
</div>
<!-- ###END###{PowerControl-Advanced} -->
<!-- ###BEGIN###{Alarms} -->
<div id="dialog25" style="margin:auto;margin:3px">
<div style="text-align:left">
<div style="height:26px;margin-top:4px"><input id="d25alarm_name" style="float:right;width:180px" maxlength="32" onkeyup="alertDialogUpdate()"><div style="padding-top:4px">알람 이름</div></div>
<div style="height:26px;margin-top:4px">
<div style="float:right">
<input id="d25alarm_sdate" style="width:180px" maxlength="10" onkeyup="alertDialogUpdate()" onkeypress="return numbersOnly(event,45)">
</div>
<div style="padding-top:4px">웨이크 날짜 (년-월-일)</div>
</div>
<div style="height:26px;margin-top:4px">
<div style="float:right">
<input id="d25alarm_stime" style="width:180px" maxlength="10" onkeyup="alertDialogUpdate()" onkeypress="return numbersOnly(event,58)">
</div>
<div style="padding-top:4px">웨이크 시간 (시 : 분 : 초)</div>
</div>
<div style="height:26px;margin-top:4px">
<div style="float:right">
<input id="d25alarm_interval" style="width:180px" maxlength="10" onkeyup="alertDialogUpdate()" onkeypress="return numbersOnly(event,45)">
</div>
<div style="padding-top:4px">간격 (일-시간-분)</div>
</div>
<div style="height:26px;margin-top:4px">
<div style="float:right;width:180px">
<select id="d25alarm_doc" style="width:100%" onchange="showAdvPowerDlgChange()">
<option value="0">알람 유지</option>
<option value="1">완료시 삭제</option>
</select>
</div>
<div style="padding-top:4px">깨어 난 후</div>
</div>
</div>
</div>
<!-- ###END###{Alarms} -->
<div id="dialog26" style="margin:auto;margin:3px">
<div id="d26rpediv">
<div>Remote Platform Erase (RPE)</div>
<label><input type="radio" name="d26b" id="idx_d26rpe1" value="2">가능<br></label>
<label><input type="radio" name="d26b" id="idx_d26rpe0" value="0">비활성화<br></label>
<hr>
</div>
<div>One One Click Recovery (OCR)</div>
<label><input type="radio" name="d26a" id="idx_d26ocr1" value="1">가능<br></label>
<label><input type="radio" name="d26a" id="idx_d26ocr0" value="0">비활성화<br></label>
</div>
<!-- ###BEGIN###{NetAuth} -->
<div id="dialog27" style="margin:auto;margin:3px">
<br>
<div style="height:26px">
<select id="idx_d27enabled" style="float:right;width:200px" onclick="updateNetAuthDialog()">
<option value="0">비활성화</option>
<option value="1">가능</option>
</select>
<div>가능</div>
</div>
<div id="idx_d27protocoldiv" style="height:26px">
<select id="idx_d27protocol" style="float:right;width:200px" onclick="updateNetAuthDialog()">
<option value="0" selected="selected">EAP-TLS</option>
<option value="1">EAP-TTLS/MSCHAPv2</option>
<option value="2">PEAPv0/EAP-MSCHAPv2</option>
<option value="3">PEAPv1/EAP-GTC</option>
<option value="4">EAP-FAST/MSCHAPv2</option>
<option value="5">EAP-FAST/GTC</option>
<option value="6">EAP-FAST/TLS</option>
</select>
<div>실험 계획안</div>
</div>
<div id="idx_d27servernamediv" style="height:26px"><input id="idx_d27servername" style="float:right;width:200px" maxlength="80" onkeyup="updateNetAuthDialog()" title="최대 32 자"><div title="최대 32 자">Server Name</div></div>
<div id="idx_d27servernamecomparediv" style="height:26px">
<select id="idx_d27servernamecompare" style="float:right;width:200px" onclick="updateNetAuthDialog()">
<option value="0" selected="selected">Full Name</option>
<option value="1">Domain Suffix</option>
</select>
<div>Server Name Compare</div>
</div>
<div id="idx_d27domaindiv" style="height:26px"><input id="idx_d27domain" style="float:right;width:200px" maxlength="128" onkeyup="updateNetAuthDialog()" title="Maximum 128 characters"><div title="Maximum 128 characters">Domain</div></div>
<div id="idx_d27usernamediv" style="height:26px"><input id="idx_d27username" style="float:right;width:200px" maxlength="128" onkeyup="updateNetAuthDialog()" title="Maximum 128 characters"><div title="Maximum 128 characters">사용자 이름</div></div>
<div id="idx_d27passworddiv" style="height:26px"><input id="idx_d27password" type="password" style="float:right;width:200px" maxlength="32" onkeyup="updateNetAuthDialog()" title="Maximum length is 32 characters"><div title="Maximum length is 32 characters">암호</div></div>
<div id="idx_d27roamingidentitydiv" style="height:26px"><input id="idx_d27roamingidentity" style="float:right;width:200px" maxlength="80" onkeyup="updateNetAuthDialog()" title="Maximum 80 characters"><div title="Maximum 80 characters">Roaming Identity</div></div>
<div id="idx_d27pacdiv" style="height:26px"><input id="idx_d27pac" style="float:right;width:200px" maxlength="256" onkeyup="updateNetAuthDialog()" title="Maximum 256 characters"><div title="Maximum 256 characters">Protected Access Credentials</div></div>
<div id="idx_d27pacpassworddiv" style="height:26px"><input id="idx_d27pacpassword" type="password" style="float:right;width:200px" maxlength="256" onkeyup="updateNetAuthDialog()" title="Maximum length is 256 characters"><div title="Maximum length is 256 characters">PAC Password</div></div>
<div id="idx_d27clientcertdiv" style="height:26px">
<select id="idx_d27clientcert" style="float:right;width:200px" onclick="updateNetAuthDialog()"></select>
<div>Client Certificate</div>
</div>
<div id="idx_d27servercertdiv" style="height:26px">
<select id="idx_d27servercert" style="float:right;width:200px" onclick="updateNetAuthDialog()"></select>
<div>Server Issuer Cert</div>
</div>
<div id="idx_d27activeins0div" style="height:26px">
<select id="idx_d27activeins0" style="float:right;width:200px" onclick="updateNetAuthDialog()">
<option value="0">가능</option>
<option value="1">비활성화</option>
</select>
<div>Active in S0</div>
</div>
<div id="idx_d27pxetimeoutdiv" style="height:26px"><input id="idx_d27pxetimeout" style="float:right;width:200px" onkeyup="updateNetAuthDialog()"><div>PXE Timeout</div></div>
</div>
<!-- ###END###{NetAuth} -->
</div>
<div style="padding:10px;margin-bottom:4px">
<input id="idx_dlgCancelButton" type="button" value="취소" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)">
<input id="idx_dlgOkButton" type="button" value="확인" style="float:right;width:80px" onclick="dialogclose(1)">
<div style="height:25px"><input id="idx_dlgDeleteButton" type="button" value="지우다" style="width:80px;display:none" onclick="dialogclose(2)"></div>
</div>
</div>
<!-- ###BEGIN###{ContextMenus} -->
<div id="contextMenu" class="contextMenu" style="display:none"></div>
<!-- ###END###{ContextMenus} -->
<!-- ###BEGIN###{Mode-NodeWebkit} -->
<!-- ###END###{Mode-NodeWebkit} -->
<!-- ###BEGIN###{PowerControl} -->
<!-- ###END###{PowerControl} -->
<script type="text/javascript">
// ###BEGIN###{!Look-BrandedCommander}
var version = '0.9.6';
// ###END###{!Look-BrandedCommander}
// ###BEGIN###{Look-BrandedCommander}
var version = '1.2.0';
// ###END###{Look-BrandedCommander}
var urlvars = {};
var amtstack;
var wsstack = null;
// ###BEGIN###{WsmanBrowser}
var AllWsman = 'AMT_8021xCredentialContext,AMT_8021XProfile,AMT_ActiveFilterStatistics,AMT_AgentPresenceCapabilities,AMT_AgentPresenceInterfacePolicy,AMT_AgentPresenceService,AMT_AgentPresenceWatchdog,AMT_AgentPresenceWatchdogAction,AMT_AlarmClockService,IPS_AlarmClockOccurrence,AMT_AssetTable,AMT_AssetTableService,AMT_AuditLog,AMT_AuditPolicyRule,AMT_AuthorizationService,AMT_BootCapabilities,AMT_BootSettingData,AMT_ComplexFilterEntryBase,AMT_CRL,AMT_CryptographicCapabilities,AMT_EACCredentialContext,AMT_EndpointAccessControlService,AMT_EnvironmentDetectionInterfacePolicy,AMT_EnvironmentDetectionSettingData,AMT_EthernetPortSettings,AMT_EventLogEntry,AMT_EventManagerService,AMT_EventSubscriber,AMT_FilterEntryBase,AMT_FilterInSystemDefensePolicy,AMT_GeneralSettings,AMT_GeneralSystemDefenseCapabilities,AMT_Hdr8021Filter,AMT_HeuristicPacketFilterInterfacePolicy,AMT_HeuristicPacketFilterSettings,AMT_HeuristicPacketFilterStatistics,AMT_InterfacePolicy,AMT_IPHeadersFilter,AMT_KerberosSettingData,AMT_ManagementPresenceRemoteSAP,AMT_MessageLog,AMT_MPSUsernamePassword,AMT_NetworkFilter,AMT_NetworkPortDefaultSystemDefensePolicy,AMT_NetworkPortSystemDefenseCapabilities,AMT_NetworkPortSystemDefensePolicy,AMT_PCIDevice,AMT_PETCapabilities,AMT_PETFilterForTarget,AMT_PETFilterSetting,AMT_ProvisioningCertificateHash,AMT_PublicKeyCertificate,AMT_PublicKeyManagementCapabilities,AMT_PublicKeyManagementService,AMT_PublicPrivateKeyPair,AMT_RedirectionService,AMT_RemoteAccessCapabilities,AMT_RemoteAccessCredentialContext,AMT_RemoteAccessPolicyAppliesToMPS,AMT_RemoteAccessPolicyRule,AMT_RemoteAccessService,AMT_SetupAndConfigurationService,AMT_SNMPEventSubscriber,AMT_StateTransitionCondition,AMT_SystemDefensePolicy,AMT_SystemDefensePolicyInService,AMT_SystemDefenseService,AMT_SystemPowerScheme,AMT_ThirdPartyDataStorageAdministrationService,AMT_ThirdPartyDataStorageService,AMT_TimeSynchronizationService,AMT_TLSCredentialContext,AMT_TLSProtocolEndpoint,AMT_TLSProtocolEndpointCollection,AMT_TLSSettingData,AMT_TrapTargetForService,AMT_UserInitiatedConnectionService,AMT_WebUIService,AMT_WiFiPortConfigurationService,CIM_AbstractIndicationSubscription,CIM_Account,CIM_AccountManagementCapabilities,CIM_AccountManagementService,CIM_AccountOnSystem,CIM_AdminDomain,CIM_AlertIndication,CIM_AssignedIdentity,CIM_AssociatedPowerManagementService,CIM_AuthenticationService,CIM_AuthorizationService,CIM_Battery,CIM_BIOSElement,CIM_BIOSFeature,CIM_BIOSFeatureBIOSElements,CIM_BootConfigSetting,CIM_BootService,CIM_BootSettingData,CIM_BootSourceSetting,CIM_Capabilities,CIM_Card,CIM_Chassis,CIM_Chip,CIM_Collection,CIM_Component,CIM_ComputerSystem,CIM_ComputerSystemPackage,CIM_ConcreteComponent,CIM_ConcreteDependency,CIM_Controller,CIM_CoolingDevice,CIM_Credential,CIM_CredentialContext,CIM_CredentialManagementService,CIM_Dependency,CIM_DeviceSAPImplementation,CIM_ElementCapabilities,CIM_ElementConformsToProfile,CIM_ElementLocation,CIM_ElementSettingData,CIM_ElementSoftwareIdentity,CIM_ElementStatisticalData,CIM_EnabledLogicalElement,CIM_EnabledLogicalElementCapabilities,CIM_EthernetPort,CIM_Fan,CIM_FilterCollection,CIM_FilterCollectionSubscription,CIM_HostedAccessPoint,CIM_HostedDependency,CIM_HostedService,CIM_Identity,CIM_IEEE8021xCapabilities,CIM_IEEE8021xSettings,CIM_Indication,CIM_IndicationService,CIM_InstalledSoftwareIdentity,CIM_KVMRedirectionSAP,CIM_LANEndpoint,CIM_ListenerDestination,CIM_ListenerDestinationWSManagement,CIM_Location,CIM_Log,CIM_LogEntry,CIM_LogicalDevice,CIM_LogicalElement,CIM_LogicalPort,CIM_LogicalPortCapabilities,CIM_LogManagesRecord,CIM_ManagedCredential,CIM_ManagedElement,CIM_ManagedSystemElement,CIM_MediaAccessDevice,CIM_MemberOfCollection,CIM_Memory,CIM_MessageLog,CIM_NetworkPort,CIM_NetworkPortCapabilities,CIM_NetworkPortConfigurationService,CIM_OrderedComponent,CIM_OwningCollectionElement,CIM_OwningJobElement,CIM_PCIController,CIM_PhysicalComponent,CIM_PhysicalElement,CIM_PhysicalElementLocation,CIM_PhysicalFrame,CIM_PhysicalMemory,CIM_PhysicalPackage,CIM_Policy,CIM_PolicyAction,CIM_PolicyCondition,CIM_PolicyInSystem,CIM_PolicyRule,CIM_PolicyRuleInSystem,CIM_PolicySet,CIM_PolicySetAppliesToElement,CIM_PolicySetInSystem,CIM_PowerManagementCapabilities,CIM_PowerManagementService,CIM_PowerSupply,CIM_Privilege,CIM_PrivilegeManagementCapabilities,CIM_PrivilegeManagementService,CIM_ProcessIndication,CIM_Processor,CIM_ProtocolEndpoint,CIM_ProvidesServiceToElement,CIM_Realizes,CIM_RecordForLog,CIM_RecordLog,CIM_RedirectionService,CIM_ReferencedProfile,CIM_RegisteredProfile,CIM_RemoteAccessAvailableToElement,CIM_RemoteIdentity,CIM_RemotePort,CIM_RemoteServiceAccessPoint,CIM_Role,CIM_RoleBasedAuthorizationService,CIM_RoleBasedManagementCapabilities,CIM_RoleLimitedToTarget,CIM_SAPAvailableForElement,CIM_SecurityService,CIM_Sensor,CIM_Service,CIM_ServiceAccessBySAP,CIM_ServiceAccessPoint,CIM_ServiceAffectsElement,CIM_ServiceAvailableToElement,CIM_ServiceSAPDependency,CIM_ServiceServiceDependency,CIM_SettingData,CIM_SharedCredential,CIM_SoftwareElement,CIM_SoftwareFeature,CIM_SoftwareFeatureSoftwareElements,CIM_SoftwareIdentity,CIM_StatisticalData,CIM_StorageExtent,CIM_System,CIM_SystemBIOS,CIM_SystemComponent,CIM_SystemDevice,CIM_SystemPackaging,CIM_UseOfLog,CIM_Watchdog,CIM_WiFiEndpoint,CIM_WiFiEndpointCapabilities,CIM_WiFiEndpointSettings,CIM_WiFiPort,CIM_WiFiPortCapabilities,IPS_AdminProvisioningRecord,IPS_ClientProvisioningRecord,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_HTTPProxyService,IPS_HTTPProxyAccessPoint,IPS_IderSessionUsingPort,IPS_IPv6PortSettings,IPS_KVMRedirectionSettingData,IPS_KvmSessionUsingPort,IPS_ManualProvisioningRecord,IPS_OptInService,IPS_PowerManagementService,IPS_ProvisioningAuditRecord,IPS_ProvisioningRecordLog,IPS_RasSessionUsingPort,IPS_ScreenConfigurationService,IPS_ScreenSettingData,IPS_SecIOService,IPS_SessionUsingPort,IPS_SolSessionUsingPort,IPS_TLSProvisioningRecord,IPS_WatchDogAction'.split(',');
// ###END###{WsmanBrowser}
var disconnecturl = null;
// ###BEGIN###{Terminal}
var terminal;
// ###END###{Terminal}
var currentView = 0;
var LoadingHtml = '<div style=text-align:center;padding-top:20px>' + "불러오는 중 ..." + '<div>';
var amtversion = 0;
var amtversionmin = 0;
var amtFirstPull = 0; // Bitmask, Set this when the first pull request is made on a device: 1 = HardwareInfo, 2 = WirelessInfo, 4 = SystemDefense, 8 = Storage, 16 = EventLog, 32 = AuditLog, 64 = ExtraInfo, 128 = 802.1x
// ###BEGIN###{NetworkSettings}
var amtwirelessif = -1; // Set to the interface index for the wireless interface, -1 if no wireless.
// ###END###{NetworkSettings}
// ###BEGIN###{Desktop}
var desktop;
var desktopsettings = { encflags: 1, showfocus: false, showmouse: true, showcad: true, limitFrameRate: false, noMouseRotate: false, decimationMode: 2 };
// ###END###{Desktop}
// ###BEGIN###{Mode-MeshCentral2}
var currentMeshNode = null;
// ###END###{Mode-MeshCentral2}
var webcompilerfeatures = [/*###WEBCOMPILERFEATURES###*/];
var StatusStrs = ["연결 해제", "연결 중 ...", "설정...", "연결됨"];
// ###BEGIN###{Scripting}
var scriptstate;
// ###END###{Scripting}
// ###BEGIN###{USBSetup}
var setupbin;
var selectedRecord = 0;
var selectedVariable = 0;
// ###END###{USBSetup}
// ###BEGIN###{!Mode-MeshCentral2}
var amtPowerPollTimer = null;
// ###END###{!Mode-MeshCentral2}
// ###BEGIN###{Mode-LMS}
var lms = null;
// ###END###{Mode-LMS}
// ###BEGIN###{ComputerSelector-Local}
// ###BEGIN###{Mode-NodeWebkit}
var kerberos;
try { kerberos = require('krb-ticket'); } catch (e) { console.log("Kerberos를 설정할 수 없습니다"); }
if (!kerberos || kerberos.initialize() != 0) { kerberos = null; }
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
var kerberos = null;
// ###END###{!Mode-NodeWebkit}
var filterFocus = false;
// ###END###{ComputerSelector-Local}
var t, t2, rsepass = null; // Global temporary variable
// ###BEGIN###{MeshServerConnect}
var meshCentralServer = null;
// ###END###{MeshServerConnect}
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
var webserver = null;
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
// ###BEGIN###{DesktopClipboard}
var xxKvmClipEnc = null;
var xxKvmClipVal = null;
// ###END###{DesktopClipboard}
function startup() {
// This is a bit freeky, but all HTML input elements are just going to be accessible directly.
var allelements = document.getElementsByTagName('input');
for (t = 0; t < allelements.length; t++) { if (allelements[t].id) { window[allelements[t].id] = allelements[t]; } }
// ###BEGIN###{!Mode-NodeWebkit}
urlvars = getUrlVars();
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
// Move things around to make space for the left-side toolbar
QS('id_computerSelector').left = '52px';
QS('id_computerListParent').left = '52px';
QS('id_certManagerPanel').left = '52px';
QS('id_certManagerPanel2').left = '52px';
QS('id_usbSetupPanel').left = '52px';
QS('id_usbSetupPanel2').left = '52px';
// ###BEGIN###{SessionRecording}
QS('id_sessionPlayerPanel').left = '52px';
// ###END###{SessionRecording}
// Parse the runtime arguments
urlvars = getUrlVars();
var argv = require('nw.gui').App.argv;
for (var i in argv) {
if (argv[i].substring(0,1) == '-') {
var j = argv[i].indexOf(':');
if (j == -1) {
urlvars[argv[i].substring(1)] = 1;
} else {
urlvars[argv[i].substring(1, j)] = argv[i].substring(j + 1);
}
}
}
// If we are in NodeWebkit, check if we need to start a output log.
if (urlvars.logfile && (typeof urlvars.logfile == 'string')) {
g_logFile = require('fs').createWriteStream(urlvars.logfile, { flags: 'a' }); // Or 'w' to truncate the file every time the process starts.
g_logStdout = process.stdout;
console.logEx = console.log;
console.log = function () {
if (arguments.length == 1) console.logEx(arguments[0]);
if (arguments.length == 2) console.logEx(arguments[0], arguments[1]);
if (arguments.length == 3) console.logEx(arguments[0], arguments[1], arguments[2]);
if (arguments.length == 4) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3]);
if (arguments.length == 5) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
if (arguments.length == 6) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
if (arguments.length == 7) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
if (arguments.length == 8) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]);
g_logFile.write(require('util').format.apply(null, arguments) + '\r\n');
//g_logStdout.write(require('util').format.apply(null, arguments) + '\r\n'); //console.errorEx(arguments);
}
console.errorEx = console.error;
console.error = console.log;
console.log('--- LOG START: ' + new Date() + ' ---');
}
// If we are in NodeWebkit, check if we need to display the console window
if (urlvars['debug'] == 1) { require('nw.gui').Window.get().showDevTools(); }
// Prepend 'script' and 'list' with working directory if set and ':' is not in the string. This covers the case where self-extracting Commander has working directory set incorrectly.
if (urlvars['script'] && (urlvars['script'].indexOf(':') < 0)) { urlvars['script'] = require('path').dirname(process.execPath) + '\\' + urlvars['script']; }
if (urlvars['list'] && (urlvars['list'].indexOf(':') < 0)) { urlvars['list'] = require('path').dirname(process.execPath) + '\\' + urlvars['list']; }
// Setup the TLS security mode
try {
NW_TlsSecurityMode = parseInt(localStorage.getItem('TlsSecurityMode') ? localStorage.getItem('TlsSecurityMode') : '1');
NW_SkipTlsHostnameCheck = parseInt(localStorage.getItem('SkipTlsHostnameCheck') ? localStorage.getItem('SkipTlsHostnameCheck') : '0');
} catch (ex) {
NW_TlsSecurityMode = '1';
NW_SkipTlsHostnameCheck = '0';
}
if (urlvars['tlssecurity']) { NW_TlsSecurityMode = parseInt(urlvars['tlssecurity']); }
if (urlvars['ignoretls']) { NW_TlsSecurityMode = 0; }
if (urlvars['skiptlshostcheck']) { NW_SkipTlsHostnameCheck = parseInt(urlvars['skiptlshostcheck']); }
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{DesktopClipboard}
if (urlvars['kvmclip']) { QV('id_DeskKvmClipButton', true); }
// ###END###{DesktopClipboard}
// ###BEGIN###{ContextMenus}
document.onclick = function (e) { hideContextMenu(); }
// ###END###{ContextMenus}
// ###BEGIN###{SessionRecording}
srec_cleanup();
Q('srec_PlaySpeed').value = 1;
// ###END###{SessionRecording}
// ###BEGIN###{Mode-LMS}
// Setup LMS
lms = CreateLmsControl();
lms.onStateChanged = lmsChangedState;
lms.onData = lmsOnData;
lms.Start();
QH('id_lmsData', LoadingHtml);
QH('id_lmsData', '');
QH('id_computername', 'Configuration Console v' + version);
go(101);
lmsRefresh();
// ###END###{Mode-LMS}
// ###BEGIN###{WsmanBrowser}
// Add all WSMAN objects to WSMAN browser
for (var w in AllWsman) { var option = document.createElement('option'); option.text = AllWsman[w]; option.id = 'WSB-' + AllWsman[w]; Q('id_QuerySelect').add(option); }
// ###END###{WsmanBrowser}
// ###BEGIN###{Desktop}
// Setup the remote desktop
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk', Q('id_mainarea')));
desktop.onStateChanged = onDesktopStateChange;
QE('idx_connectbutton1', true);
try { t = localStorage.getItem('desktopsettings'); } catch (ex) {}
if (t) { desktopsettings = JSON.parse(t); }
if (urlvars.kvmenc) { var v = parseInt(urlvars.kvmenc); if (typeof v == 'number') { desktopsettings.encflags = v; } }
if (urlvars.kvmdec) { var v = parseInt(urlvars.kvmdec); if (typeof v == 'number') { desktopsettings.decimationMode = v; } }
applyDesktopSettings();
var s = '';
//for (var c = 1; c < 13; c++) s += '<option value="' + (0xffbd + c) + '">F' + c +;
//QH('specialkeylist', s);
// ###END###{Desktop}
// ###BEGIN###{Terminal}
// Setup the terminal
terminal = CreateAmtRedirect(CreateAmtRemoteTerminal('Term'));
terminal.onStateChanged = onTerminalStateChange;
// ###BEGIN###{Terminal-Enumation-All}
Q('id_ttypebutton').value = terminalEmulations[terminal.m.terminalEmulation];
// ###END###{Terminal-Enumation-All}
Q('id_tcrbutton').value = (terminal.m.lineFeed == '\r\n')?"CR + LF":"LF";
QE('idx_connectbutton2', true);
// Setup Terminal drag & drop
Q('p13').addEventListener('dragover', haltEvent, false);
Q('p13').addEventListener('dragleave', haltEvent, false);
Q('p13').addEventListener('drop', terminal_FileSelectHandler, false);
// ###END###{Terminal}
// Main drag & drop
document.addEventListener('dragover', haltEvent, false);
document.addEventListener('dragleave', haltEvent, false);
document.addEventListener('drop', documentFileSelectHandler, false);
// ###BEGIN###{Certificates}
// Setup Terminal drag & drop
Q('p16').addEventListener('dragover', haltEvent, false);
Q('p16').addEventListener('dragleave', haltEvent, false);
Q('p16').addEventListener('drop', cert_FileSelectHandler, false);
// ###END###{Certificates}
// ###BEGIN###{CertificateManager}
// Setup Certificate Manager drag & drop
Q('id_certManagerPanel').addEventListener('dragover', haltEvent, false);
Q('id_certManagerPanel').addEventListener('dragleave', haltEvent, false);
Q('id_certManagerPanel').addEventListener('drop', cert_importCertOk2, false);
// ###END###{CertificateManager}
// ###BEGIN###{CertificateManager}
cert_loadCertificates();
cert_updateCertificateList();
// ###END###{CertificateManager}
// ###BEGIN###{FileSaver}
// ###BEGIN###{Desktop}
// ###BEGIN###{!Mode-NodeWebkit}
if (!Q('Desk')['toBlob']) { QV('idx_deskSaveBtn', false); }// On some browsers like IE, we can't save screen shots. Hide the sceeenshot/capture buttons.
// ###END###{!Mode-NodeWebkit}
// ###END###{Desktop}
// ###END###{FileSaver}
// ###BEGIN###{ComputerSelector}
if (!urlvars['host']) { go(101); }
QH('id_computername', format("원격 관리 콘솔 v{0}", version));
// ###BEGIN###{ComputerSelector-Local}
if (urlvars['host']) {
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
// If host is set to a hostname, connect directly to that computer
var xuser = urlvars['user'];
if (!xuser) xuser = '*'; // If user not set, default to * and use Kerberos
var xpass = urlvars['pass'];
if (!xpass) xpass = ''; // If password not set, default to blank.
var xtls = 0;
if (urlvars['tls'] == 1) { xtls = 1; }
currentcomputer = { 'host': urlvars['host'], 'host': urlvars['host'], 'user': xuser, 'pass': xpass, 'tls': xtls, 'h': Math.random() };
// ###BEGIN###{Mode-NodeWebkit}
currentcomputer['tlscerthash'] = getCertPinning(urlvars['host']); // If we have a pinned TLS cert, add it here.
// ###END###{Mode-NodeWebkit}
disconnecturl = urlvars['disconnecturl'];
if (!disconnecturl) disconnecturl = 'none';
if (disconnecturl == 'none') QV('disconnectButton', false);
if (disconnecturl == 'close') Q('disconnectButton').value = 'Close';
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
if ((currentcomputer['user'] == '*') || (currentcomputer['pass'] != '')) {
// Don't prompt the user for password, just connect. This is Kerberos or password already provided.
connect(ports.host, ports.http, currentcomputer['user'], currentcomputer['pass'], currentcomputer['tls']);
} else {
// Prompt the user for digest password.
computerlist = [currentcomputer];
updateComputerList();
computerConnect(null, currentcomputer.h);
}
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
updateComputerList();
// ###END###{ComputerSelector-Local-ScriptOnly}
}
// ###BEGIN###{!Mode-NodeWebkit}
else if (urlvars['connect']) { loadServerComputer(); }
// ###END###{!Mode-NodeWebkit}
else {
// ###BEGIN###{Mode-NodeWebkit}
if (urlvars['list']) {
// Read the computers from a file list
var listok = 0;
try {
var ctext = require('fs').readFileSync(urlvars['list'], 'utf8');
if ((ctext.length > 2) && (ctext.charCodeAt(0) == 65533) && (ctext.charCodeAt(1) == 65533)) { // This is unicode detection
ctext = require('fs').readFileSync(urlvars['list'], 'utf16le');
if ((ctext.length > 1) && (ctext.charCodeAt(0) == 65279)) { ctext = ctext.substring(1); }
}
if (ctext) {
computerlist = JSON.parse(ctext);
if (computerlist.computers) { computerlist = computerlist.computers; }
var pins = getCertPinnings();
for (var i in computerlist) {
computerlist[i].checked = false;
if (!computerlist[i]['h']) computerlist[i]['h'] = Math.random(); // If 'h' handle is not present, create one.
if (!computerlist[i]['tls']) computerlist[i]['tls'] = 0; // If TLS is not present, assume 0.
if (!computerlist[i]['host'] && computerlist[i]['fqdn']) computerlist[i]['host'] = computerlist[i]['fqdn'];
if (!computerlist[i]['pass'] == null) computerlist[i]['pass'] = '';
if (computerlist[i]['fqdn']) delete computerlist[i]['fqdn'];
// Add stored certificate pinning.
if ((computerlist[i]['tlscerthash'] == null) && (pins[computerlist[i]['host']] != null)) { computerlist[i]['tlscerthash'] = pins[computerlist[i]['host']]; }
delete computerlist[i]['tlscert2'];
delete computerlist[i]['tlscerthash2'];
}
listok = computerlist.length;
if (listok > 0) updateComputerList();
}
} catch (e) { messagebox("컴퓨터 목록", "잘못된 목록 파일 : " + e) }
// Run a script on all computers
if (urlvars['script'] && listok > 0) {
// Select all computers
for (var i in computerlist) { Q('SJ-' + computerlist[i]['h']).checked = true; }
// Run the script
try {
var data = require('fs').readFileSync(urlvars['script'], 'utf8');
if (data) { mscript_onScriptRead( { target: { result: data }}, 1 ); }
} catch (e) { messagebox("스크립트 실행", "잘못된 스크립트 파일입니다.") }
}
} else {
// Setup the computer selector
loadComputers();
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
// Setup the computer selector
loadComputers();
// ###END###{!Mode-NodeWebkit}
}
// ###END###{ComputerSelector-Local}
// ###BEGIN###{ComputerSelector-Remote}
// Load the list of computers from the server
loadServerComputerList();
// ###END###{ComputerSelector-Remote}
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-Firmware}
connect('/wsman');
// ###END###{Mode-Firmware}
// ###BEGIN###{USBSetup}
usb_displaySetupBin();
// Add all possible variable types to dialog 16
var options = '';
for (var i in AmtSetupBinVarIds) { for (var j in AmtSetupBinVarIds[i]) { options += '<option value="' + i + '-' + j + '">' + AmtSetupBinVarIds[i][j][1] } }
QH('d16type', options);
// ###END###{USBSetup}
document.onkeyup = handleKeyUp;
document.onkeydown = handleKeyDown;
document.onkeypress = handleKeyPress;
window.onresize = center;
center();
// ###BEGIN###{Mode-NodeWebkit}
NW_WindowTitle = require('nw.gui').Window.get().title;
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Scripting-Editor}
// ###BEGIN###{!Mode-Firmware}
scriptLoadStartingBlocks();
// ###END###{!Mode-Firmware}
// ###END###{Scripting-Editor}
// ###BEGIN###{Mode-NodeWebkit}
NW_AutoUpdateCheck();
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
if (urlvars['help'] || urlvars['?']) { messagebox("사령관 라인 옵션", '<div style=text-align:left><b>-host:[hostname]</b>, ' + "인텔 &reg; AMT의 호스트 이름 또는 IP" + '<br/><b>-user:[username]</b>, ' + "다이제스트 로그인 사용자 이름" + '<br/><b>-pass:[password]</b>, ' + "다이제스트 로그인 비밀번호" + '<br/><b>-tls</b>, ' + "TLS 보안을 사용하여 연결" + '<br/><b>-kvm</b>, ' + "연결되면 원격 데스크톱으로 이동" + '<br/><b>-kvmfull</b>, ' + "연결되면 전체 화면 원격 데스크톱으로 이동" + '<br/><b>-kvmonly</b>, ' + "전체 화면 원격 데스크톱 만 수행" + '<br/><b>-sol</b>, ' + "연결되면 터미널로 이동" + '<br/><b>-script:[file]</b>, ' + "스크립트를 실행" + '<br/><b>-autoexit</b>, ' + "스크립트 완료 후 종료" + '<br/><b>-ignoretls</b>, ' + "인텔 &reg; AMT TLS 인증서를 확인하지 마십시오" + '<br/></div>'); }
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
if (urlvars['help'] || urlvars['?']) { messagebox("사령관 라인 옵션", '<div style=text-align:left><b>-list:[listfile]</b>, ' + "List of computers to run a script on" + '<br/><b>-script:[file]</b>, ' + "스크립트를 실행" + '<br/><b>-autoexit</b>, ' + "Exit after all scripts are done" + '<br/><b>-ignoretls</b>, ' + "인텔 &reg; AMT TLS 인증서를 확인하지 마십시오" + '<br/></div>'); }
// ###END###{ComputerSelector-Local-ScriptOnly}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{DesktopInbandFiles}
// Setup upload drag & drop
Q('p24filetable').addEventListener('drop', p24fileDragDrop, false);
Q('p24filetable').addEventListener('dragover', p24fileDragOver, false);
Q('p24filetable').addEventListener('dragleave', p24fileDragLeave, false);
// ###END###{DesktopInbandFiles}
// ###BEGIN###{DesktopRecorder}
if (urlvars && urlvars['norecord']) { QV('id_DeskRecorderTools', false); }
// ###END###{DesktopRecorder}
// ###BEGIN###{Mode-NodeWebkit}
// Check input arguments
if (urlvars['webcn'] == 1) { delete urlvars['webcn']; setTimeout(function() { alert('Invalid webcn argument, use -webcn:domain.com.'); }, 100); }
// ###END###{Mode-NodeWebkit}
}
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
function setupWebServer(leafCN) {
if ((webserver != null) && (webserver.certCommonName == leafCN)) return;
// Stop the web server if present
if (webserver != null) { webserver.stop(); webserver = null; }
// Create a web server to serve One Client Recovery (OCR) disk image files.
webserver = CreateWebServer();
webserver.generateCertificate(leafCN);
webserver.start();
webserver.onTransfers = function (webserver, transfers) {
var x = '';
for (var i in transfers) { x += '<div style="width:350px;position:relative;padding:3px"><span style="position:absolute;padding:3px;font-weight:bold">' + transfers[i].xfilename + '</span><div style="height:20px;background-color:#4CAF50;width:' + Math.floor((transfers[i].progress.count * 100) / transfers[i].xsize) + '%;border-radius:4px"></div></div>'; }
QV('TransferNotification', transfers.length > 0);
QH('TransferNotification', x);
}
//console.log('WebServer Cert Hash RAW', webserver.certHashRaw);
//console.log('WebServer Cert Hash HEX', webserver.certHashHex);
}
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
function documentFileSelectHandler(e) {
haltEvent(e);
// ###BEGIN###{IDER}
var diskimages = true;
for (var i = 0; i < e.dataTransfer.files.length; i++) {
if ((e.dataTransfer.files[i].name.toLowerCase().endsWith('.img') == false) && (e.dataTransfer.files[i].name.toLowerCase().endsWith('.iso') == false)) { diskimages = false; }
}
if ((diskimages == true) && (e.dataTransfer != null) && (currentView > 0) && (currentView < 100) && ((e.dataTransfer.files.length == 1) || (e.dataTransfer.files.length == 2))) {
var floppyfile = null, cdromfile = null;
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.iso')) { cdromfile = e.dataTransfer.files[0]; }
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.img')) { floppyfile = e.dataTransfer.files[0]; }
if (e.dataTransfer.files.length == 2) {
if (e.dataTransfer.files[1].name.toLowerCase().endsWith('.iso')) { cdromfile = e.dataTransfer.files[1]; }
if (e.dataTransfer.files[1].name.toLowerCase().endsWith('.img')) { floppyfile = e.dataTransfer.files[1]; }
}
if ((floppyfile != null) || (cdromfile != null)) iderStart3(floppyfile, cdromfile, 1);
return;
}
// ###END###{IDER}
if (e.dataTransfer == null || e.dataTransfer.files.length != 1) return;
var f = null, filename = e.dataTransfer.files[0].name.toLowerCase();
// ###BEGIN###{Storage}
if (currentView == 21) { UploadToStorage(e.dataTransfer.files[0], filename); return; }
// ###END###{Storage}
// ###BEGIN###{ComputerSelector-Local}
if (currentView == 101) {
if (filename.endsWith('.mescript') || filename.endsWith('.meblocks')) { f = mscript_onScriptRead; }
if (filename.endsWith('.json') || filename.endsWith('.csv')) { f = function (file) { onComputerListRead(file, filename); } }
}
// ###END###{ComputerSelector-Local}
// ###BEGIN###{USBSetup}
if (currentView == 102 && filename.endsWith('.bin')) { f = usb_onSetupBinRead; }
// ###END###{USBSetup}
// ###BEGIN###{Scripting}
if (wsstack != null && (filename.endsWith('.mescript') || filename.endsWith('.meblocks'))) { f = script_onScriptRead; }
// ###END###{Scripting}
// ###BEGIN###{SessionRecording}
if (currentView == 104 && filename.endsWith('.mcrec')) { srec_ondrop(e); return; }
// ###END###{SessionRecording}
if (f != null) { var reader = new FileReader(); reader.onload = f; reader.readAsBinaryString(e.dataTransfer.files[0]); }
}
// ###BEGIN###{Mode-NodeWebkit}
// ###BEGIN###{Look-Commander}
function NW_CheckForUpdateMenu() {
if (NW_UpdateMenuItem.checked == true) { NW_AutoUpdateCheck(); }
try { localStorage.setItem('checkForUpdate', NW_UpdateMenuItem.checked); } catch (ex) { }
}
// ###END###{Look-Commander}
// ###BEGIN###{Look-BrandedCommander}
function NW_CheckForUpdateMenu() {
if (NW_UpdateMenuItem.checked == true) { NW_AutoUpdateCheck(); }
try { localStorage.setItem('checkForUpdate', NW_UpdateMenuItem.checked); } catch (ex) { }
}
// ###END###{Look-BrandedCommander}
// Check if an update is available
function NW_AutoUpdateCheck() {
// ###BEGIN###{Look-Commander}
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
try {
if (localStorage.getItem('checkForUpdate') != 'false') {
var request = new XMLHttpRequest();
request.onload = function () {
if (request.status >= 200 && request.status < 400) {
var x = request.responseText, i = x.indexOf('##3B356F7A-0854-4EBA-B10D-4CC4FB522695##');
if (i > 0) {
x = x.substring(i);
var newversion = parseInt(x.substring(40, 46));
var criticalversion = parseInt(x.substring(48, 54));
var url = x.substring(56);
var j = url.indexOf('##');
if (j >= 0) {
url = url.substring(0, j);
var currentversion = version.split('.');
currentversion = parseInt(currentversion[0] * 10000) + parseInt(currentversion[1] * 100) + parseInt(currentversion[2]);
if (currentversion < newversion) {
var newversiontext = Math.floor(newversion / 10000) + '.' + (Math.floor(newversion / 100) % 100) + '.' + (newversion % 100);
var msg = format("MeshCommander v {0}을 (를) 사용할 수 있습니다", newversiontext);
if (currentversion < criticalversion) {
msg += "중요한 보안 업데이트입니다.";
QS('UpdateNotification')['background-color'] = 'orange';
}
QH('UpdateNotificationText', msg);
QV('UpdateNotification', true);
}
}
}
}
};
request.onerror = function () { console.log('Failed to get script blocks'); };
request.open('GET', 'https://sites.google.com/site/opensoftwareprojects/mesh/security-1/autoupdate', true);
request.send();
}
} catch (ex) { }
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###END###{Look-Commander}
// ###BEGIN###{Look-BrandedCommander}
try {
if (localStorage.getItem('checkForUpdate') != 'false') {
var request = new XMLHttpRequest();
request.onload = function () {
if (request.status >= 200 && request.status < 400) {
var x = request.responseText, i = x.indexOf('##371cff53-32b7-4278-86c5-3e6906965332##');
if (i > 0) {
x = x.substring(i);
var newversion = parseInt(x.substring(40, 46));
var criticalversion = parseInt(x.substring(48, 54));
var url = x.substring(56);
var j = url.indexOf('##');
if (j >= 0) {
url = url.substring(0, j);
var currentversion = version.split('.');
currentversion = parseInt(currentversion[0] * 10000) + parseInt(currentversion[1] * 100) + parseInt(currentversion[2]);
if (currentversion < newversion) {
var newversiontext = Math.floor(newversion / 10000) + '.' + (Math.floor(newversion / 100) % 100) + '.' + (newversion % 100);
var msg = format("Intel&reg; Manageability Commander v{0} is available", newversiontext);
if (currentversion < criticalversion) {
msg += "중요한 보안 업데이트입니다.";
QS('UpdateNotification')['background-color'] = 'orange';
}
QH('UpdateNotificationText', msg);
QV('UpdateNotification', true);
}
}
}
}
};
request.onerror = function () { console.log('Failed to get script blocks'); };
request.open('GET', 'https://software.intel.com/en-us/articles/intel-manageability-commander', true);
request.send();
}
} catch (ex) { }
// ###END###{Look-BrandedCommander}
}
function NW_HideUpdateNotification() {
QV('UpdateNotification', false);
}
function NW_PerformUpdate() {
require('nw.gui').Shell.openExternal('http://www.meshcommander.com/meshcommander');
}
var NW_WindowTitle = null;
var NW_UpdateMenuItem = null;
var NW_AmtScanMenuItem = null;
var NW_TlsSecurityMode = 1;
var NW_SkipTlsHostnameCheck = 0;
function NW_SetupMainMenu(x) {
var gui = require('nw.gui');
var mainmenu = new gui.Menu({ type: 'menubar' });
// Add Mac OS X specific menu
var os = require('os');
if (os.platform() == 'darwin') { mainmenu.createMacBuiltin('MeshCommander', { hideEdit: true, hideWindow: true }); }
var filemenu = new gui.MenuItem({ label: "파일" });
var filemenusub = new gui.Menu();
var seperator = false;
var toolsmenu = null;
var scriptmenu = null;
var securitymenu = null;
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer == null) {
// ###END###{MeshServerConnect}
if (x == 101) {
// Computer selector
filemenusub.append(new gui.MenuItem({ label: "Intel AMT Computer 추가 ...", click: addComputer }));
filemenusub.append(new gui.MenuItem({ label: "컴퓨터로드 ...", click: NW_LoadComputers }));
filemenusub.append(new gui.MenuItem({ label: "컴퓨터 저장 ...", click: NW_SaveComputers }));
// ###BEGIN###{ComputerSelectorScanner}
filemenusub.append(new gui.MenuItem({ label: "컴퓨터 스캔 ...", click: showScanDialog }));
// ###END###{ComputerSelectorScanner}
// ###BEGIN###{MeshServerConnect}
filemenusub.append(new gui.MenuItem({ type: 'separator' }));
filemenusub.append(new gui.MenuItem({ label: "MeshCentral에 연결 ...", click: showMeshCentralConnectDialog }));
// ###END###{MeshServerConnect}
seperator = true;
}
// ###BEGIN###{MeshServerConnect}
} else {
filemenusub.append(new gui.MenuItem({ label: "MeshCentral에서 연결 해제", click: meshCentralDisconnect }));
seperator = true;
}
// ###END###{MeshServerConnect}
// ###BEGIN###{USBSetup}
if (x == 102) {
// Setup.bin Editor
filemenusub.append(new gui.MenuItem({ label: "새로운...", click: usb_newSetupBin }));
filemenusub.append(new gui.MenuItem({ label: "Setup.bin로드 ...", click: NW_LoadSetupBin }));
filemenusub.append(new gui.MenuItem({ label: "Setup.bin 저장 ...", click: usb_saveSetupBin }));
seperator = true;
}
// ###END###{USBSetup}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer == null) {
// ###END###{MeshServerConnect}
if (x >= 101 && x <= 104) {
// Tools
toolsmenu = new gui.MenuItem({ label: "도구" });
var toolsmenusub = new gui.Menu();
toolsmenusub.append(new gui.MenuItem({ label: "컴퓨터 관리", click: NW_ComputerManagement, type: 'checkbox', checked: (x == 101) }));
// ###BEGIN###{CertificateManager}
toolsmenusub.append(new gui.MenuItem({ label: "인증서 관리자", click: NW_CertificateManager, type: 'checkbox', checked: (x == 103) }));
// ###END###{CertificateManager}
// ###BEGIN###{USBSetup}
toolsmenusub.append(new gui.MenuItem({ label: "Setup.bin 관리자", click: NW_SetupBinEditor, type: 'checkbox', checked: (x == 102) }));
// ###END###{USBSetup}
// ###BEGIN###{SessionRecording}
toolsmenusub.append(new gui.MenuItem({ label: "세션 플레이어", click: NW_SessionPlayer, type: 'checkbox', checked: (x == 104) }));
// ###END###{SessionRecording}
toolsmenu.submenu = toolsmenusub;
}
// ###BEGIN###{Scripting}
// ###BEGIN###{!Look-BrandedCommander}
if (x == 101) {
// Batch Scripting
scriptmenu = new gui.MenuItem({ label: "스크립트" });
var scriptmenusub = new gui.Menu();
if (computersRunningScripts > 0) {
scriptmenusub.append(new gui.MenuItem({ label: "모든 스크립트 중지", click: mscript_runScriptDlg }));
} else {
scriptmenusub.append(new gui.MenuItem({ label: "스크립트 시작 ...", click: mscript_runScriptDlg }));
}
scriptmenu.submenu = scriptmenusub;
}
if (x >= 0 && x < 100) {
// Computer Scripting
scriptmenu = new gui.MenuItem({ label: "스크립트" });
var scriptmenusub = new gui.Menu();
if (scriptstate) {
scriptmenusub.append(new gui.MenuItem({ label: "스크립트 중지", click: script_Stop }));
} else {
scriptmenusub.append(new gui.MenuItem({ label: "스크립트 시작 ...", click: script_runScriptDlg }));
}
scriptmenu.submenu = scriptmenusub;
}
// ###END###{!Look-BrandedCommander}
// ###END###{Scripting}
if (x == 101) {
// Security
securitymenu = new gui.MenuItem({ label: "보안" });
var securitymenusub = new gui.Menu();
securitymenusub.append(new gui.MenuItem({ label: "TLS 인증서 무시", click: NW_ChangeTlsSecurityMode0, type: 'checkbox', checked: (NW_TlsSecurityMode == 0) }));
securitymenusub.append(new gui.MenuItem({ label: "TLS 인증서 및 핀보기", click: NW_ChangeTlsSecurityMode1, type: 'checkbox', checked: (NW_TlsSecurityMode == 1) }));
securitymenusub.append(new gui.MenuItem({ type: 'separator' }));
NW_SkipTlsHostnameMenuItem = new gui.MenuItem({ label: "TLS 호스트 이름 확인 건너 뛰기", click: NW_SkipTlsHostnameCheck0, type: 'checkbox', checked: (NW_SkipTlsHostnameCheck == 1) })
securitymenusub.append(NW_SkipTlsHostnameMenuItem);
securitymenu.submenu = securitymenusub;
}
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
if (x >= 0 && x < 100 && disconnecturl != 'none' && disconnecturl != 'close') {
// Computer screen
filemenusub.append(new gui.MenuItem({ label: "분리", click: disconnect }));
seperator = true;
}
// Explicit exit action not required on Mac. The MacBuiltin menu includes native option to quit application (Quit)
if (os.platform() != 'darwin') {
if (seperator == true) filemenusub.append(new gui.MenuItem({ type: 'separator' }));
filemenusub.append(new gui.MenuItem({ label: "출구", click: NW_Exit }));
}
filemenu.submenu = filemenusub;
if (x == 13) {
// Terminal
toolsmenu = new gui.MenuItem({ label: "단말기" });
var toolsmenusub = new gui.Menu();
if (terminal.State == 0) {
toolsmenusub.append(new gui.MenuItem({ label: "잇다", click: connectTerminal }));
} else {
toolsmenusub.append(new gui.MenuItem({ label: "분리", click: connectTerminal }));
}
// ###BEGIN###{FileSaver}
toolsmenusub.append(new gui.MenuItem({ type: 'separator' }));
if (terminal.m.capture == null) {
// ###BEGIN###{!TerminalReplay}
toolsmenusub.append(new gui.MenuItem({ label: "캡처 시작", click: terminalCaptureToggle }));
// ###END###{!TerminalReplay}
// ###BEGIN###{TerminalReplay}
if (terminalReplayTimer == null) {
toolsmenusub.append(new gui.MenuItem({ label: "캡처 시작", click: terminalCaptureToggle }));
toolsmenusub.append(new gui.MenuItem({ label: "재생 캡처", click: terminalReplay }));
} else {
toolsmenusub.append(new gui.MenuItem({ label: "재생 중지", click: terminalReplay }));
}
// ###END###{TerminalReplay}
} else {
toolsmenusub.append(new gui.MenuItem({ label: "캡처 중지", click: terminalCaptureToggle }));
}
// ###END###{FileSaver}
toolsmenu.submenu = toolsmenusub;
}
if (x == 14) {
// Desktop
toolsmenu = new gui.MenuItem({ label: "데스크탑" });
var toolsmenusub = new gui.Menu();
if (desktop.State == 0) {
toolsmenusub.append(new gui.MenuItem({ label: "잇다", click: connectDesktop }));
} else {
toolsmenusub.append(new gui.MenuItem({ label: "분리", click: connectDesktop }));
}
toolsmenusub.append(new gui.MenuItem({ type: 'separator' }));
toolsmenusub.append(new gui.MenuItem({ label: "설정", click: showDesktopSettings }));
toolsmenu.submenu = toolsmenusub;
}
// Language menu
var languagemenu = new gui.MenuItem({ label: "언어" });
var languagesubmenu = new gui.Menu();
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'en'), label: "영어", click: function () { window.location.href = 'commander.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'zh-chs'), label: "중국어 (간체)", click: function () { window.location.href = 'commander_zh-chs.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'nl'), label: "네덜란드 사람", click: function () { window.location.href = 'commander_nl.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'fr'), label: "프랑스 국민", click: function () { window.location.href = 'commander_fr.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'de'), label: "독일 사람", click: function () { window.location.href = 'commander_de.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'it'), label: "이탈리아 사람", click: function () { window.location.href = 'commander_it.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'ja'), label: "일본어", click: function () { window.location.href = 'commander_ja.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'pt'), label: "포르투갈 인", click: function () { window.location.href = 'commander_pt.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'ru'), label: "러시아인", click: function () { window.location.href = 'commander_ru.htm'; } }));
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'es'), label: "스페인의", click: function () { window.location.href = 'commander_es.htm'; } }));
languagemenu.submenu = languagesubmenu;
var helpmenu = new gui.MenuItem({ label: "도움" });
var helpmenusub = new gui.Menu();
// ###BEGIN###{Look-Commander}
var checkForUpdateCheck = false;
try { checkForUpdateCheck = (localStorage.getItem('checkForUpdate') == 'false') ? false : true; } catch (ex) {}
NW_UpdateMenuItem = new gui.MenuItem({ type: 'checkbox', checked: checkForUpdateCheck, label: "업데이트 확인", click: NW_CheckForUpdateMenu })
helpmenusub.append(NW_UpdateMenuItem);
// ###END###{Look-Commander}
// ###BEGIN###{Look-BrandedCommander}
var checkForUpdateCheck = false;
try { checkForUpdateCheck = (localStorage.getItem('checkForUpdate') == 'false') ? false : true; } catch (ex) { }
NW_UpdateMenuItem = new gui.MenuItem({ type: 'checkbox', checked: checkForUpdateCheck, label: "업데이트 확인", click: NW_CheckForUpdateMenu })
helpmenusub.append(NW_UpdateMenuItem);
// ###END###{Look-BrandedCommander}
// ###BEGIN###{ComputerSelectorScanner}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer == null) {
// ###END###{MeshServerConnect}
var amtPresenceScan = true;
try { amtPresenceScan = (localStorage.getItem('scanForComputers') == 'false') ? false : true; } catch (ex) { }
NW_AmtScanMenuItem = new gui.MenuItem({ type: 'checkbox', checked: amtPresenceScan, label: "존재 여부 검사", click: NW_AmtScanMenu })
helpmenusub.append(NW_AmtScanMenuItem);
if (amtPresenceScan == true) { globalAmtScanner.start(); }
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
// ###END###{ComputerSelectorScanner}
helpmenusub.append(new gui.MenuItem({ label: "초기화", click: NW_Reload }));
if (urlvars['debug']) { helpmenusub.append(new gui.MenuItem({ label: "디버그 표시 ...", click: NW_Debug })); }
// ###BEGIN###{Look-ISDU}
helpmenusub.append(new gui.MenuItem({ type: 'separator' }));
helpmenusub.append(new gui.MenuItem({ label: "About...", click: WM_About }));
// ###END###{Look-ISDU}
// ###BEGIN###{Look-BrandedCommander}
helpmenusub.append(new gui.MenuItem({ type: 'separator' }));
helpmenusub.append(new gui.MenuItem({ label: "About...", click: WM_About }));
// ###END###{Look-BrandedCommander}
helpmenu.submenu = helpmenusub;
mainmenu.append(filemenu);
if (toolsmenu != null) mainmenu.append(toolsmenu);
if (scriptmenu != null) mainmenu.append(scriptmenu);
if (securitymenu != null) mainmenu.append(securitymenu);
mainmenu.append(languagemenu);
mainmenu.append(helpmenu);
gui.Window.get().menu = mainmenu;
}
function NW_Exit() {
require('nw.gui').Window.get().close(); // Closes only the current window.
//require('nw.gui').App.quit(); // Closes all instances of the app.
}
function NW_Reload() { require('nw.gui').Window.get().reloadIgnoringCache(); }
function NW_Debug() { require('nw.gui').Window.get().showDevTools(); }
function NW_ChangeTlsSecurityMode0() { NW_TlsSecurityMode = 0; try { localStorage.setItem('TlsSecurityMode', NW_TlsSecurityMode); } catch (ex) { } NW_SetupMainMenu(currentView); }
function NW_ChangeTlsSecurityMode1() { NW_TlsSecurityMode = 1; try { localStorage.setItem('TlsSecurityMode', NW_TlsSecurityMode); } catch (ex) { } NW_SetupMainMenu(currentView); }
function NW_SkipTlsHostnameCheck0() { NW_SkipTlsHostnameCheck = NW_SkipTlsHostnameMenuItem.checked ? 1 : 0; try { localStorage.setItem('SkipTlsHostnameCheck', NW_SkipTlsHostnameCheck); } catch (ex) { } NW_SetupMainMenu(currentView); }
function NW_LoadComputers() {
var chooser = Q('idx_d17computerlistfile');
if (chooser.getAttribute('eventset') != 1) {
chooser.setAttribute('eventset', '1');
chooser.addEventListener('change', NW_LoadComputersEx, false);
}
chooser.value = null;
chooser.click();
}
function NW_LoadComputersEx(evt) {
var reader = new FileReader();
reader.onload = function(file) { onComputerListRead(file, Q('idx_d17computerlistfile').files[0].name); }
reader.readAsBinaryString(this.files[0]);
}
function NW_SaveComputers() { saveComputerList(); }
function NW_ComputerManagement() { toolmenuclick(-1); go(101); }
// ###BEGIN###{CertificateManager}
function NW_CertificateManager() { toolmenuclick(-1); go(103); }
// ###END###{CertificateManager}
function NW_SetupBinEditor() { toolmenuclick(-1); go(102); }
// ###BEGIN###{SessionRecording}
function NW_SessionPlayer() { toolmenuclick(-1); go(104); }
// ###END###{SessionRecording}
function NW_LoadSetupBin() {
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('accept', '.bin');
chooser.addEventListener('change', NW_LoadSetupBinEx, false);
chooser.value = null;
chooser.click();
}
function NW_LoadSetupBinEx() {
var reader = new FileReader();
reader.onload = function(file) { usb_onSetupBinRead(file); }
reader.readAsBinaryString(this.files[0]);
}
// ###BEGIN###{Look-ISDU}
function WM_About() {
var x = { 'position': 'center', 'focus': true, 'frame': true, 'icon': 'favicon.png', 'width': 520, 'height': 320 };
if (process.version == 'v1.2.0') x['toolbar'] = false;
require('nw.gui').Window.open('about.htm', x);
}
// ###END###{Look-ISDU}
// ###BEGIN###{Look-BrandedCommander}
function WM_About() {
var x = { 'position': 'center', 'focus': true, 'frame': true, 'icon': 'favicon.png', 'width': 520, 'height': 320 };
if (process.version == 'v1.2.0') x['toolbar'] = false;
require('nw.gui').Window.open('about.htm', x);
}
// ###END###{Look-BrandedCommander}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{ComputerSelector}
// Load the list of computers from the server
function loadServerComputerList() {
var request = new XMLHttpRequest();
request.onload = function() {
if (request.status >= 200 && request.status < 400) {
// Success
var serverComputerList = JSON.parse(request.responseText);
if (serverComputerList && serverComputerList != null && serverComputerList instanceof Array) {
currentcomputer = null;
computerlist = [];
for (var i in serverComputerList) {
var computer = serverComputerList[i];
if (computer['host']) {
computer.checked = false;
if (!computer['h']) computer['h'] = Math.random(); // If 'h' handle is not present, create one.
if (!computer['tls']) computer['tls'] = 0; // If TLS is not present, assume 0.
computerlist.push(computer);
}
}
updateComputerList();
}
} else {
console.log('Failed to get server computer list');
}
};
request.onerror = function() {
console.log('Failed to get server computer list');
};
// ###BEGIN###{ComputerSelector-Remote}
request.open('GET', 'webrelay.ashx?action=getcomputerlist', true);
// ###END###{ComputerSelector-Remote}
// ###BEGIN###{ComputerSelector-Local}
request.open('GET', urlvars['connect'], true);
// ###END###{ComputerSelector-Local}
request.send();
}
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-LMS}
// Called when the LMS control channel changes state
function lmsChangedState(sender, state)
{
//console.log("LMS Control Channel State: " + state);
if (state == 0) {
setDialogMode();
QV('id_lmsToolBarContent', false);
QH('id_lmsData', '<div style=text-align:center;padding-top:20px>' + "MicroLMS disconnected." + '<div>');
QH('id_lmsData2', '');
} else if (state == 2) { QV('id_lmsToolBarContent', true); lmsRefresh(); }
}
function lmsLogin() { window.location.href = '/authindex.html'; }
var lmsProvisioningStates = ["Pre-Provisioning", "In-Provisioning", "Post-Provisioning"];
var lmsProvisioningModes = ["없음", "Enterprise Mode", "Small Buisness Mode", "Remote Assistance Mode"];
var lmsMeInfo = null;
var lmsTemp = null;
var lmsNotifications = null;
// Called when data is received on the LMS control channel
function lmsOnData(sender, data)
{
var cmdid = ReadShortX(data, 0);
//console.log("LMS Control Channel Data: " + data + ", cmdid:" + cmdid);
switch (+cmdid) {
case 1: { // ME Information
//console.log(data.substring(2));
var meinfo = JSON.parse(data.substring(2));
QV('id_lmsLoginButton', meinfo['LoginMode'] == 1);
// If Intel AMT is in-between states, reload data in a few seconds.
if ((meinfo['TrustedHashes'] != null) && (meinfo['ProvisioningMode'] == -858993460)) {
QV('id_lmsConfigureButton', false);
QV('id_lmsActivateButton', false);
QV('id_lmsDeactivateButton', false);
setTimeout(lmsRefresh, 1000);
return;
}
lmsMeInfo = meinfo;
if (meinfo['ProvisioningState'] == null) {
QH('id_lmsData', '<div style=text-align:center;padding-top:20px>' + "Intel&reg; AMT not found" + '<div>');
QH('id_lmsData2', '');
} else {
meinfo['Flags'] = +meinfo['Flags'];
var x = '<h2>' + "Current Status" + '</h2>';
x += TableStart();
if (meinfo['ProvisioningState'] != 2) {
x += TableEntry("Activation state", lmsProvisioningStates[meinfo['ProvisioningState']]);
} else {
if (meinfo['Flags'] & 2) { x += TableEntry("Activation state", "Activated in Client Control Mode"); }
else if (meinfo['Flags'] & 4) { x += TableEntry("Activation state", "Activated in Admin Control Mode"); }
else { x += TableEntry("Activation state", "Activated, " + lmsProvisioningModes[meinfo['ProvisioningMode']]); }
}
x += TableEntry("Intel&reg; AMT version", addLink(meinfo['Versions']['AMT'], 'lmsShowVersionsDlg()'));
if (meinfo['MeiVersion'] != null) { x += TableEntry("Intel&reg; MEI driver version", meinfo['MeiVersion']); }
x += TableEnd();
if (meinfo['ProvisioningState'] != 2) {
x += '<h2>' + "Activation Information" + '</h2>';
x += TableStart();
if (meinfo['DnsSuffix']) {
x += TableEntry("Trusted DNS suffix", meinfo['DnsSuffix']);
} else {
x += TableEntry("Trusted DNS suffix", '<i>' + "Not Set" + '</i>');
}
if (meinfo['TrustedHashes'] != null) {
if (meinfo['TrustedHashes'].length == 1) {
x += TableEntry("Trusted hashes", addLink(meinfo['TrustedHashes'].length + ' hash', 'lmsShowTrustedHashesDlg()'));
} else {
x += TableEntry("Trusted hashes", addLink(meinfo['TrustedHashes'].length + ' hashes', 'lmsShowTrustedHashesDlg()'));
}
}
x += TableEnd();
}
QH('id_lmsData', x);
QV('id_lmsData2', true);
lmsNotifications = meinfo['Notifications'].reverse();
lmsRefreshNotifications();
QV('id_lmsConfigureButton', (meinfo['ProvisioningState'] == 2)); // Only display the "Login..." button if Intel AMT is in post-provisioning state.
QV('id_lmsActivateButton', (meinfo['ProvisioningState'] == 0) && (meinfo['LoginMode'] >= 2)); // Only display the "Activate..." button if Intel AMT is in pre-provisioning state and we are adrministrator.
QV('id_lmsDeactivateButton', (meinfo['ProvisioningState'] == 2) && (meinfo['Flags'] & 2) && (meinfo['LoginMode'] >= 2)); // Only display the "Deactivate..." button if Intel AMT is in port-provisioning state & in client control mode & we are adrministrator.
}
break;
}
case 2: { // Intel ME Un-Provisioning
lmsDeactivateX2(ReadIntX(data, 2));
break;
}
case 3: { // Intel ME System Account Information
var status = ReadIntX(data, 2);
if (status != 0) {
messagebox("인텔 &reg; AMT 활성화", format("Failed to get account information, status {0}", status));
} else {
var meuser = data.substring(6, data.indexOf('\0', 6));
var mepass = data.substring(39, data.indexOf('\0', 39));
QH('id_dialogMessage', "Fetching activation status...");
wsstack = WsmanStackCreateService("localhost", 16992, meuser, mepass, false);
amtstack = AmtStackCreateService(wsstack);
amtstack.onProcessChanged = onProcessChanged;
amtstack.BatchEnum(null, ['*AMT_GeneralSettings', '*IPS_HostBasedSetupService'], lmsActivationX1);
}
break;
}
case 9: { // New notification
var notification = JSON.parse(data.substring(2));
if (lmsNotifications == null) { lmsNotifications = []; }
lmsNotifications.unshift(notification);
lmsRefreshNotifications();
if ((notification.code == 'iAMT0055-0') || (notification.code == 'iAMT0055-1') || (notification.code == 'iAMT0055-2')) { setDialogMode(); lmsRefresh(); }
break;
}
}
}
function lmsRefreshNotifications() {
var x = '<h2>' + "Notifications" + '</h2>' + TableStart();
if (lmsNotifications && lmsNotifications.length > 0) {
for (var i in lmsNotifications) {
var n = lmsNotifications[i], v = n.str;
if (n.code != 'iAMT0050-32') {
if (v.indexOf('User Notification Alert - ') == 0) { v = v.substring(26); }
x += TableEntry(new Date(n.date).toLocaleString(), v);
}
}
} else {
x += '<tr><td style=padding:8px><i>' + "No notifications found." + '</i><td>';
}
x += TableEnd();
QH('id_lmsData2', x);
}
function lmsActivationX1(stack, name, responses, status) {
if (status != 200) {
messagebox("인텔 &reg; AMT 활성화", format("Failed to fetch activation status, status {0}", status));
} else if (responses['IPS_HostBasedSetupService'].response['AllowedControlModes'].length != 2) {
messagebox("인텔 &reg; AMT 활성화", "Client control mode activation not allowed");
} else {
lmsTemp = responses['AMT_GeneralSettings'].response;
amtstack.IPS_HostBasedSetupService_Setup(2, rstr2hex(rstr_md5('admin:' + responses['AMT_GeneralSettings'].response['DigestRealm'] + ':' + d4password.value)), null, null, null, null, lmsActivationX2);
}
}
function lmsActivationX2(stack, name, response, status) {
if (status != 200 || response.Body['ReturnValue'] != 0) {
messagebox("인텔 &reg; AMT 활성화", format("Failed activation, status {0}", status));
} else {
setDialogMode();
lmsRefresh();
lmsTemp['HostName'] = lmsMeInfo['OsHostname']; // Set the OS hostname
// TODO: Also set the local FQDN if we can get it from LMS
wsstack = WsmanStackCreateService('localhost', 16992, 'admin', d4password.value, false);
amtstack = AmtStackCreateService(wsstack);
amtstack.onProcessChanged = onProcessChanged;
amtstack.Put('AMT_GeneralSettings', lmsTemp, function() { }, 0, 1);
}
}
function lmsDeactivate() {
if (xxdialogMode || lms.State != 2) return;
QH('id_dialogMessage', "Confirm Intel&reg; AMT deactivation?");
setDialogMode(1, "Intel&reg; AMT Deactivation", 3, lmsDeactivateX1);
}
function lmsDeactivateX1() {
statusbox("Intel&reg; AMT Deactivation", "Deactivating Intel&reg; AMT...");
lms.SendCmd(2, IntToStrX(1)); // Send request for deactivation
}
function lmsDeactivateX2(status) {
if (status != 0) {
messagebox("Intel&reg; AMT Deactivation", format("Failed deactivation, status ", status));
} else {
QH('id_lmsData', "Please wait for deactivation...");
QV('id_lmsData2', false);
setDialogMode();
lmsRefresh();
}
}
// Refresh button on the UI
function lmsRefresh() {
if (lms.State != 2) return;
lms.SendCmd(1, ''); // Send the request basic information command
}
// Configure button on the UI
function lmsConfigure() {
if (xxdialogMode) return;
setDialogMode(4, "Intel&reg; AMT Login", 3, function () { lmsConfigureLogin(); });
//d4username.readOnly = false;
d4username.disabled = false;
if (d4username.value == 'admin') d4username.value = '';
inputBoxFocus('d4username');
lmsUpdateLoginDialog();
}
// Called when the user hits OK on the login dialog
function lmsConfigureLogin() {
var user = d4username.value;
if (user == '') user = 'admin';
connect('localhost', 16992, user, d4password.value, 0);
}
// Activate button on the UI
function lmsActivate() {
if (xxdialogMode|| lms.State != 2) return;
setDialogMode(4, "인텔 &reg; AMT 활성화", 3, function () { lmsActivateEx(); });
//d4username.readOnly = true;
d4username.disabled = true;
d4username.value = 'admin';
inputBoxFocus('d4password');
lmsUpdateLoginDialog();
}
// Go head with Intel AMT client control mode activation
function lmsActivateEx()
{
lms.SendCmd(3); // Send request for account information
statusbox("인텔 &reg; AMT 활성화", "Fetching Account Information...");
}
// Called each time something changes in the login dialog
function lmsUpdateLoginDialog(e, d) {
var ok = passwordcheck(d4password.value);
QE('idx_dlgOkButton', ok);
if (e != null && e.keyCode == 13 && d == 1) inputBoxFocus('d4password');
if (ok == true && e != null && e.keyCode == 13 && d == 2) dialogclose(1);
}
var lmsHashArgStrings = ["MD5", "SHA1", "SHA256", "SHA512"];
function lmsShowTrustedHashesDlg() {
// {\"AC\":%d,\"DF\":%d,\"AL\":%d,\"NA\":\"%s\",\"HA\":\"%s\"}"
var x = '<div style=max-height:240px;overflow-y:scroll>' + TableStart();
for (var i in lmsMeInfo['TrustedHashes'])
{
//x += '<b>' + lmsMeInfo['TrustedHashes'][i]['Name'] + '</b><br><span style=font-size:10px>' + lmsHashArgStrings[lmsMeInfo['TrustedHashes'][i]['HashAlgorithm']] + (lmsMeInfo['TrustedHashes'][i]['Active'] == 1?", Active":'') + (lmsMeInfo['TrustedHashes'][i]['Default'] == 1?", Default":'') + '</span><br><span style=font-size:10px>' + lmsMeInfo['TrustedHashes'][i]['Hash'] + '</span><br><br>';
x += TableEntry('<b>' + lmsMeInfo['TrustedHashes'][i]['Name'] + '</b><br><span style=font-size:10px>' + lmsHashArgStrings[lmsMeInfo['TrustedHashes'][i]['HashAlgorithm']] + (lmsMeInfo['TrustedHashes'][i]['Active'] == 1?", Active":'') + (lmsMeInfo['TrustedHashes'][i]['Default'] == 1?", Default":'') + '</span><br><span style=font-size:8px>' + lmsMeInfo['TrustedHashes'][i]['Hash'] + '</span>', '');
}
x += TableEnd() + '</div>';
messagebox("Intel&reg; AMT Trusted Hashes", x);
}
function lmsShowVersionsDlg() {
var x = TableStart();
x += TableEntry("인텔 &reg; AMT", lmsMeInfo['Versions']['AMT']);
if (lmsMeInfo['MeiVersion'] != null) { x += TableEntry("Intel&reg; MEI driver", lmsMeInfo['MeiVersion']); }
for (var i in lmsMeInfo['Versions']) { if (i != 'AMT') x += TableEntry(i, lmsMeInfo['Versions'][i]); }
x += TableEnd();
messagebox("Intel&reg; AMT Versions", x);
}
// ###END###{Mode-LMS}
// ###BEGIN###{Mode-MeshCentral2}
function connectButtonfunction() {
if (!wsstack || wsstack.socketState == 0) { meshcentral2credCallback(); } else { disconnect(); }
}
function connectButtonfunctionEx() {
currentMeshNode = parent.getCurrentNode();
connect(currentMeshNode._id, 16992, null, null, 0);
Q('xconnectbutton1').value = "분리";
}
function getCurrentMeshNode() { return currentMeshNode; }
function setConnectionState(isConnectable) { QE('xconnectbutton1', isConnectable); if (isConnectable == false) { disconnect(); } }
function setFrameHeight(height) {
//console.log('setFrameHeight', height);
//QS('entireBody').height = height;
}
function setAuthCallback(updateAmtCredentials) { meshcentral2credCallback = updateAmtCredentials; }
function setUrlVar(name, value) { if (!urlvars) { urlvars = {}; } urlvars[name] = value; }
// ###END###{Mode-MeshCentral2}
function cleanup() {
// ###BEGIN###{Terminal}
// ###BEGIN###{FileSaver}
// ###BEGIN###{!Mode-NodeWebkit}
idx_terminalCaptureButton.value = "캡처 시작";
// ###END###{!Mode-NodeWebkit}
if (terminal.m.capture) delete terminal.m.capture;
// ###END###{FileSaver}
terminal.Stop();
// ###END###{Terminal}
// ###BEGIN###{Desktop}
desktop.disconnectCode = 0;
desktop.Stop();
// ###END###{Desktop}
}
function handleKeyUp(e) {
if (xxdialogMode) return;
// ###BEGIN###{ComputerSelector}
// ###BEGIN###{ComputerSelector-Local}
if (currentView == 101) {
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer == null) {
// ###END###{MeshServerConnect}
if (e.keyCode == 45) { addComputer(); } // Insert key
if (e.keyCode == 46) { deleteComputers(); } // Delete key
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
if ((e.keyCode == 65) && (e.ctrlKey == true)) { selectAllComputers(); } // Select all
if (e.keyCode == 13) { if (computersRunningScripts == 0) { computerConnect(event, currentcomputer.h); } } // Enter key
if ((e.keyCode == 8) && !filterFocus) { var x = Q('computerFilter').value; Q('computerFilter').value = (x.substring(0, x.length - 1)); computerFilterFunc(); }
if (e.keyCode == 27) { Q('computerFilter').value = ''; computerFilterFunc(); }
}
// ###END###{ComputerSelector-Local}
// ###BEGIN###{ComputerSelector-Remote}
if (currentView == 101) {
if ((e.keyCode == 65) && (e.ctrlKey == true)) { selectAllComputers(); } // Select all
}
// ###END###{ComputerSelector-Remote}
// ###END###{ComputerSelector}
// ###BEGIN###{CertificateManager}
if (currentView == 103) {
//if (e.keyCode == 45) { addComputer(); } // Insert key
if (e.keyCode == 46) { cert_deleteCertificates(); } // Delete key
//if ((e.keyCode == 65) && (e.ctrlKey == true)) { selectAllCertificates(); } // Select all
}
// ###END###{CertificateManager}
// ###BEGIN###{Desktop}
// ###BEGIN###{!DesktopInband}
if (currentView == 14 && desktop.State == 3) { if (!Q('id_DeskVO').checked) { return desktop.m.handleKeyUp(e); } }
// ###END###{!DesktopInband}
// ###BEGIN###{DesktopInband}
if (currentView == 14 && desktop.State == 3) { if (Q('id_DeskVO').checked) return; if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.handleKeyUp(e); desktop.m.sendKeepAlive(); } else { return desktop.m.handleKeyUp(e); } }
// ###END###{DesktopInband}
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (currentView == 13 && terminal.State == 3) return terminal.m.TermHandleKeyUp(e);
// ###END###{Terminal}
}
function handleKeyDown(e) {
//console.log('handleKeyDown', e);
if (xxdialogMode) return;
// ###BEGIN###{Desktop}
// ###BEGIN###{!DesktopInband}
if (currentView == 14 && desktop.State == 3) { if (!Q('id_DeskVO').checked) { return desktop.m.handleKeyDown(e); } }
// ###END###{!DesktopInband}
// ###BEGIN###{DesktopInband}
if (currentView == 14 && desktop.State == 3) { if (Q('id_DeskVO').checked) return; if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.handleKeyDown(e); desktop.m.sendKeepAlive(); } else { return desktop.m.handleKeyDown(e); } }
// ###END###{DesktopInband}
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (currentView == 13 && terminal.State == 3) return terminal.m.TermHandleKeyDown(e);
// ###END###{Terminal}
// ###BEGIN###{ComputerSelector-Local}
if (currentView == 101) {
if (e.keyCode == 38) { var selectprev = null; for (var y in computerlist) { if (currentcomputer.h == computerlist[y].h) { if (selectprev != null) { computerSelect(null, selectprev); } } else { selectprev = computerlist[y].h; } } } // Up key
if (e.keyCode == 40) { var selectnext = 0; for (var y in computerlist) { if (selectnext == 1) { selectnext = 2; computerSelect(null, computerlist[y].h); } else { if (currentcomputer.h == computerlist[y].h) { selectnext = 1; } } } } // Down key
}
// ###END###{ComputerSelector-Local}
}
function handleKeyPress(e) {
//console.log('handleKeyPress', e);
if (xxdialogMode) return;
// ###BEGIN###{ComputerSelector-Local}
if (currentView == 101) {
if ((!filterFocus) && (e.keyCode != 0)) { Q('computerFilter').value = ((Q('computerFilter').value + String.fromCharCode(e.keyCode))); computerFilterFunc(); }
}
// ###END###{ComputerSelector-Local}
// ###BEGIN###{Desktop}
// ###BEGIN###{!DesktopInband}
if (currentView == 14 && desktop.State == 3) { if (!Q('id_DeskVO').checked) { return desktop.m.handleKeys(e); } }
// ###END###{!DesktopInband}
// ###BEGIN###{DesktopInband}
if (currentView == 14 && desktop.State == 3) { if (Q('id_DeskVO').checked) return; if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.handleKeys(e); desktop.m.sendKeepAlive(); } else { return desktop.m.handleKeys(e); } }
// ###END###{DesktopInband}
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (currentView == 13 && terminal.State == 3) return terminal.m.TermHandleKeys(e);
// ###END###{Terminal}
// ###BEGIN###{SessionRecording}
if (currentView == 104) {
if (e.keyCode == 32) { srec_togglePause(); haltEvent(e); }
if (e.keyCode == 49) { Q('srec_PlaySpeed').value = 4; haltEvent(e); }
if (e.keyCode == 50) { Q('srec_PlaySpeed').value = 2; haltEvent(e); }
if (e.keyCode == 51) { Q('srec_PlaySpeed').value = 1; haltEvent(e); }
if (e.keyCode == 52) { Q('srec_PlaySpeed').value = 0.5; haltEvent(e); }
if (e.keyCode == 53) { Q('srec_PlaySpeed').value = 0.25; haltEvent(e); }
if (e.keyCode == 54) { Q('srec_PlaySpeed').value = 0.1; haltEvent(e); }
if (e.keyCode == 48) { srec_pause(); srec_restart(); haltEvent(e); }
}
// ###END###{SessionRecording}
}
var connectFunc = null;
var connectFuncTag = null;
function connect(host, port, user, pass, tls, func, functag) {
go(0);
fullscreenonly = false;
connectFunc = func;
connectFuncTag = functag;
// ###BEGIN###{Desktop}
if (urlvars['kvm'] == 1) { go(14); }
if ((urlvars['kvmfull'] == 1) || (urlvars['kvmonly'] == 1)) { go(14); deskToggleFull(urlvars['kvmonly'] == 1); }
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (urlvars['sol'] == 1) { go(13); }
// ###END###{Terminal}
// ###BEGIN###{Mode-NodeWebkit}
var tlsoptions = {};
// ###BEGIN###{CertificateManager}
// Create a list of trusted certificates in PEM format
var trustedCertStringsPem = [];
for (var y in certificateStore) {
var certificate = certificateStore[y];
if (certificate['trusted'] == true) { trustedCertStringsPem.push('-----BEGIN CERTIFICATE-----\n' + certificate['certbin'] + '\n-----END CERTIFICATE-----\n'); }
}
tlsoptions.ca = trustedCertStringsPem;
// Setup out console TLS authentication certificate
var authcert = getTlsAuthCertificate();
if (authcert != null) {
tlsoptions.cert = forge.pki.certificateToPem(authcert['cert']);
tlsoptions.key = forge.pki.privateKeyToPem(authcert['privateKey']);
}
// ###END###{CertificateManager}
// ###BEGIN###{!MeshServerConnect}
wsstack = WsmanStackCreateService(host, port, user, pass, tls, tlsoptions);
// ###END###{!MeshServerConnect}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
wsstack = WsmanStackCreateService(currentcomputer._id, null, null, null, 0, meshCentralServer);
} else {
wsstack = WsmanStackCreateService(host, port, user, pass, tls, tlsoptions);
}
// ###END###{MeshServerConnect}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
wsstack = WsmanStackCreateService(host, port, user, pass, tls);
// ###END###{!Mode-NodeWebkit}
amtstack = AmtStackCreateService(wsstack);
amtstack.onProcessChanged = onProcessChanged;
// Setup TLS checking
// ###BEGIN###{Mode-NodeWebkit}
wsstack.comm.xtlsSkipHostCheck = NW_SkipTlsHostnameCheck;
if (NW_TlsSecurityMode == 0) { wsstack.comm.xtlsFingerprint = 0; }
else { wsstack.comm.xtlsFingerprint = currentcomputer['tlscerthash'] ? currentcomputer['tlscerthash'] : currentcomputer['tlscerthash2']; }
// ###END###{Mode-NodeWebkit}
// Hide TLS indicator
// ###BEGIN###{Mode-NodeWebkit}
QV('tlsNotification1', false);
QV('tlsNotification2', false);
QV('tlsNotification3', false);
QV('tlsNotification4', false);
// ###END###{Mode-NodeWebkit}
// Setup Digest Realm checking
// ###BEGIN###{ComputerSelector}
if (currentcomputer['digestrealm']) { wsstack.comm.digestRealmMatch = currentcomputer['digestrealm']; }
// ###END###{ComputerSelector}
// Hide most of the left menu options, we will see them as we load data
for (var i = 2; i < 25; i++) { QV('go' + i, false); }
QV('go8', true); // Network Settings
// ###BEGIN###{Terminal}
QV('go13', false); // Terminal
// ###BEGIN###{!Mode-NodeWebkit}
QE('TermWD', false);
// ###END###{!Mode-NodeWebkit}
// ###END###{Terminal}
// ###BEGIN###{Desktop}
//QV('go14', false); // Desktop
// ###END###{Desktop}
//QV('go15', false); // Audit Log
// ###BEGIN###{WsmanBrowser}
QV('go12', true); // WSMAN Browser
// ###END###{WsmanBrowser}
// ###BEGIN###{Certificates}
//QV('go16', false); // Security Settings
// ###END###{Certificates}
// ###BEGIN###{RemoteAccess}
//QV('go17', false); // Remote Access
// ###END###{RemoteAccess}
// ###BEGIN###{Scripting-Editor}
QV('go20', true); // Scripting Editor
// ###END###{Scripting-Editor}
// ###BEGIN###{Storage}
// ###BEGIN###{Mode-Firmware}
//QH('storagelinks', '');
// ###END###{Mode-Firmware}
// ###END###{Storage}
// Clear the displayed power state
// ###BEGIN###{Terminal}
QH('id_p13power', ''); // Terminal
// ###END###{Terminal}
// ###BEGIN###{Desktop}
QH('id_p14power', ''); // Desktop
// ###END###{Desktop}
// Clear everything, make sure all connection state is reset.
amtversion = amtversionmin = amtFirstPull = 0;
amtsysstate = amtdeltatime = amtlogicalelements = HardwareInventory = undefined;
amtPowerBootCapabilities = null;
xxAccountFetch = 999;
// ###BEGIN###{PowerControl}
// ###BEGIN###{!Mode-MeshCentral2}
if (!urlvars['norefresh']) { amtPowerPollTimer = setInterval(PullPowerState, 5000); }
// ###END###{!Mode-MeshCentral2}
// ###END###{PowerControl}
// Show loading on all panels
QH('id_TableSysStatus', LoadingHtml);
// ###BEGIN###{NetworkSettings}
QH('id_TableNetworkSettingsSpan', LoadingHtml);
amtwirelessif = -1;
// ###BEGIN###{Wireless}
xxWireless = undefined;
QH('id_TableWifi2', '');
// ###END###{Wireless}
// ###END###{NetworkSettings}
// ###BEGIN###{HardwareInfo}
QH('id_TableSysInfo', LoadingHtml);
// ###END###{HardwareInfo}
xxAccountAdminName = null;
xxAccountRealmInfo = {};
QH('id_TableUserAccounts', LoadingHtml);
// ###BEGIN###{EventLog}
eventmessages = null;
QH('id_TableEventLog','');
QH('id_TableEventLog2',LoadingHtml);
// ###END###{EventLog}
// ###BEGIN###{AuditLog}
auditLog = null;
QH('id_TableAuditLog1', '');
QH('id_TableAuditLog2', LoadingHtml);
// ###END###{AuditLog}
// ###BEGIN###{Certificates}
xxCertificates = null;
QH('id_TableCerts', LoadingHtml);
// ###END###{Certificates}
// ###BEGIN###{WsmanBrowser}
QH('id_wsresults', '');
// ###END###{WsmanBrowser}
// ###BEGIN###{IDER}
iderStop();
// ###END###{IDER}
// ###BEGIN###{RemoteAccess}
xxRemoteAccess = null;
xxEnvironementDetection = null;
xxCiraServers = null;
xxUserInitiatedCira = null;
xxRemoteAccessCredentiaLinks = null;
xxMPSUserPass = null;
xxPolicies = null;
QH('id_TableRemoteAccess', LoadingHtml);
// ###END###{RemoteAccess}
// ###BEGIN###{AgentPresence}
QH('id_TableSystemAgentPresence', LoadingHtml);
// ###END###{AgentPresence}
// ###BEGIN###{SystemDefense}
xxSystemDefense = null;
xxSystemDefenceLinkedPolicy = {};
xxUpdatingDefenseStats = false;
xxFilterStatistics = [{}, {}]; // Wired and wireless interface stats
xxFilterStatisticsTimer = null;
xxFilterStatisticsTimerActive = false;
QH('id_TableSystemDefense', LoadingHtml);
// ###END###{SystemDefense}
// ###BEGIN###{Desktop}
QE('id_DeskCAD', false);
// ###BEGIN###{DesktopClipboard}
QE('id_DeskKvmClipButton', false);
// ###END###{DesktopClipboard}
QE('DeskWD', false);
QE('deskkeys', false);
if (urlvars['kvmviewonly']) { QE('id_DeskVO', false); Q('id_DeskVO').checked = true; }
// ###BEGIN###{DesktopType}
QE('id_DeskType', false);
// ###END###{DesktopType}
// ###END###{Desktop}
// ###BEGIN###{Desktop-Multi}
desktopScreenInfo = null;
// ###END###{Desktop-Multi}
// Start pulling Intel AMT information
amtstack.BatchEnum('', ['CIM_SoftwareIdentity', '*AMT_SetupAndConfigurationService'], processSystemVersion); // Get Intel AMT version information and plenty more
//amtstack.Enum('CIM_LogicalElement', processSystemVersion); // Get Intel AMT version information and plenty more
// ###BEGIN###{VersionWarning}
QV('id_versionWarning', false);
// ###END###{VersionWarning}
// ###BEGIN###{Scripting-Editor}
fupdatescript();
// ###END###{Scripting-Editor}
}
function disconnect() {
// ###BEGIN###{Desktop-Multi}
if (desktopPollTimer != null) {clearInterval(desktopPollTimer); desktopPollTimer = null; }
// ###END###{Desktop-Multi}
// ###BEGIN###{Mode-NodeWebkit}
if (urlvars['host']) {
require('nw.gui').Window.get().close();
//require('nw.gui').App.quit();
return;
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Desktop}
if (fullscreen) deskToggleFull();
// ###END###{Desktop}
// ###BEGIN###{IDER}
iderStop();
// ###END###{IDER}
// ###BEGIN###{PowerControl}
// ###BEGIN###{!Mode-MeshCentral2}
if (amtPowerPollTimer != null) { clearInterval(amtPowerPollTimer); amtPowerPollTimer = null; }
// ###END###{!Mode-MeshCentral2}
// ###END###{PowerControl}
// ###BEGIN###{SystemDefense}
StopDefenseStatsTimer();
// ###END###{SystemDefense}
// ###BEGIN###{Scripting}
script_Stop();
// ###END###{Scripting}
// ###BEGIN###{Scripting-Editor}
breakScriptButton();
// ###END###{Scripting-Editor}
dialogclose(0);
// ###BEGIN###{!Mode-MeshCentral2}
QH('id_computername', '');
// ###END###{!Mode-MeshCentral2}
if (amtstack) {
amtstack.onProcessChanged = null; // Un-hook progress indicator
amtstack.CancelAllQueries(999); // Fail all pending WSMAN calls. Set to 999 to indicate not to call back any of the pending calls with errors.
amtstack = null;
}
cleanup();
wsstack = null;
delete amtstack;
onProcessChanged(0, 1);
go(101);
// ###BEGIN###{!Mode-MeshCentral2}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
QH('id_computername', format("원격 관리 콘솔 v{0}, 서버 : {1}", version, meshCentralServer.host));
} else {
QH('id_computername', format("원격 관리 콘솔 v{0}", version));
}
// ###END###{MeshServerConnect}
// ###BEGIN###{!MeshServerConnect}
QH('id_computername', format("원격 관리 콘솔 v{0}", version));
// ###END###{!MeshServerConnect}
// ###END###{!Mode-MeshCentral2}
// ###BEGIN###{Mode-NodeWebkit}
require('nw.gui').Window.get().title = NW_WindowTitle;
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Mode-MeshCentral2}
Q('xconnectbutton1').value = "잇다";
QH('id_messageviewstr', "연결 해제");
go(100);
// ###END###{Mode-MeshCentral2}
}
function onProcessChanged(a, b) {
QS('id_progressbar').width = ((a * 100) / b) + '%';
if (a == 0) refreshButtons(true); // If nothing is being done, re-enable refresh buttons
// ###BEGIN###{Mode-NodeWebkit}
// Don't do any WSMAN if we don't need to do it.
if ((urlvars['kvmonly'] == 1) || (fullscreenonly == true)) return;
// ###END###{Mode-NodeWebkit}
// If there is nothing being done now, see if we can pull more information
if (a != 0 || !amtstack) return;
if ((amtversion > 0) && ((amtFirstPull & 64) == 0)) {
amtFirstPull |= 64;
PullPowerPolicy();
// ###BEGIN###{EventSubscriptions}
subscriptionsFilters = null;
PullEventSubscriptions();
// ###END###{EventSubscriptions}
// ###BEGIN###{AgentPresence}
PullWatchdog();
// ###END###{AgentPresence}
// ###BEGIN###{Scripting-Editor}
scriptViewButton(script_BuildingBlocks?1:0);
// ###END###{Scripting-Editor}
if (amtversion > 5) {
// ###BEGIN###{Certificates}
PullCertificates();
// ###END###{Certificates}
// ###BEGIN###{RemoteAccess}
PullRemoteAccess();
// ###END###{RemoteAccess}
}
return;
}
// ###BEGIN###{HardwareInfo}
if ((amtFirstPull & 1) == 0) { PullHardware(); return; }
// ###END###{HardwareInfo}
// ###BEGIN###{EventLog}
if ((amtFirstPull & 16) == 0) { PullEventLog(); return; }
// ###END###{EventLog}
// ###BEGIN###{AuditLog}
if ((amtFirstPull & 32) == 0) { PullAuditLog(); return; }
// ###END###{AuditLog}
}
// ###BEGIN###{Mode-LMS}
function toolmenuclick(x) {
QV('id_menuitem1', currentView == 101);
// ###BEGIN###{USBSetup}
QV('id_menuitem2', currentView == 102);
// ###END###{USBSetup}
// ###BEGIN###{CertificateManager}
QV('id_menuitem3', currentView == 103);
// ###END###{CertificateManager}
// ###BEGIN###{SessionRecording}
QV('id_menuitem4', currentView == 104);
// ###END###{SessionRecording}
var d = (QS('id_computerSelectorMenu').display == 'none');
if (d == true && xxdialogMode) return;
xxdialogMode = (d == true)?999:undefined;
QV('id_computerSelectorMenu', d);
if (x == 0) return;
go(x);
}
// ###END###{Mode-LMS}
// ###BEGIN###{ComputerSelector}
var computerlist = [];
var currentcomputer = null;
var computersRunningScripts = 0;
function toolmenuclick(x) {
QV('id_menuitem1', currentView == 101);
// ###BEGIN###{USBSetup}
QV('id_menuitem2', currentView == 102);
// ###END###{USBSetup}
// ###BEGIN###{CertificateManager}
QV('id_menuitem3', currentView == 103);
// ###END###{CertificateManager}
// ###BEGIN###{SessionRecording}
QV('id_menuitem4', currentView == 104);
// ###END###{SessionRecording}
var d = (QS('id_computerSelectorMenu').display == 'none');
if (x == -1) { QV('id_computerSelectorMenu', false); xxdialogMode = undefined; return; }
if (d == true && xxdialogMode) return;
xxdialogMode = (d == true)?999:undefined;
QV('id_computerSelectorMenu', d);
if (x <= 0) return;
go(x);
}
function computerFilterFunc() {
var filter = computerFilter.value.toLowerCase();
for (var w in computerlist) { QV('CX-' + computerlist[w].h, filter == '' || computerlist[w].checked == true || computerlist[w]['host'].toLowerCase().indexOf(filter) >= 0 || computerlist[w]['name'].toLowerCase().indexOf(filter) >= 0); }
}
// ###BEGIN###{ComputerSelector-Local}
function addComputer() {
if (xxdialogMode) return;
// Build the list of groups
var groups = [], x = '';
for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (computer.tags != '') && (groups.indexOf(computer.tags) == -1) && (computer.tags.indexOf('"') == -1)) { groups.push(computer.tags); } }
groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
for (var y in groups) { x += '<option value="' + groups[y] + '">'; }
QH('d4devGroups', x);
// Display the dialog box
d4name.value = d4tags.value = d4hostname.value = d4password.value = '';
d4username.value = "관리자";
if (kerberos != null) {
QH('d4security', '<option value=0>' + "다이제스트 / 없음" + '</option><option value=1>' + "다이제스트 / TLS" + '</option><option value=2>' + "Kerberos / 없음" + '</option><option value=3>' + "Kerberos / TLS" + '</option>');
} else {
QH('d4security', '<option value=0>' + "다이제스트 / 없음" + '</option><option value=1>' + "다이제스트 / TLS" + '</option>');
}
d4security.value = 0;
setDialogMode(4, "컴퓨터 추가", 3, function () { addComputerButton(); });
updateComputerDialog();
d4name.focus();
}
// Toggle the select of all computers
// TODO: Fix problem with this combined with filter box
function selectAllComputers() {
var x = false;
for (var y in computerlist) { if (computerlist[y].checked == false) { x = true; } }
for (var y in computerlist) { computerlist[y].checked = x; Q('SJ-' + computerlist[y]['h']).checked = x; } // TODO: Only select or un-select when element is visible
}
function deleteComputers() {
if (xxdialogMode) return;
// Figure out how many computers are selected.
var clist = [];
for (var y in computerlist) { if (computerlist[y].checked == true) { clist.push(computerlist[y]); } }
if (clist.length == 0) { clist.push(currentcomputer); }
if (clist.length == 1) {
setDialogMode(11, "컴퓨터 삭제", 3, deleteComputersEx, '<br>' + "컴퓨터를 삭제 하시겠습니까?", clist);
} else {
setDialogMode(11, "컴퓨터 삭제", 3, deleteComputersEx, '<br>' + format("{0} 컴퓨터를 삭제 하시겠습니까?", clist.length), clist);
}
}
function deleteComputersEx(button, clist) {
for (var i in clist) {
var handleToDelete = clist[i]['h'];
if ((currentcomputer != null) && (currentcomputer['h'] == handleToDelete)) { currentcomputer = null; }
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == handleToDelete) { computerlist.splice(x, 1); } }
}
saveComputers();
updateComputerList();
updateComputerDetails();
}
function newComputerList() {
if (xxdialogMode) return;
QH('id_dialogMessage', "Clear list of known Intel&reg; AMT computers?");
setDialogMode(1, "새로운 컴퓨터 목록", 3, newComputerListOk);
}
function newComputerListOk(r) {
computerlist = [];
currentcomputer = null;
// ###BEGIN###{!Mode-NodeWebkit}
idx_d18computerfilename.value = 'computerlist.json';
// ###END###{!Mode-NodeWebkit}
saveComputers();
updateComputerList();
}
function openComputerList() {
if (xxdialogMode) return;
// ###BEGIN###{!Mode-NodeWebkit}
setDialogMode(17, "Open Computer List", 3, openComputerListOk);
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = Q('idx_d17computerlistfile');
if (chooser.getAttribute('eventset') != 1) {
chooser.setAttribute('eventset', '1');
chooser.addEventListener('change', NW_LoadComputersEx, false);
}
chooser.value = null;
chooser.click();
// ###END###{Mode-NodeWebkit}
}
function openComputerListOk(r) {
if (r != 1) return;
var x = Q('idx_d17computerlistfile');
if (x.files.length != 1) return;
var reader = new FileReader();
reader.onload = function(file) { onComputerListRead(file, Q('idx_d17computerlistfile').files[0].name); }
reader.readAsBinaryString(x.files[0]);
}
function onComputerListRead(file, name, pass) {
var x;
if (name.toLowerCase().endsWith('.csv')) {
// Load from a CSV file
x = { computers: [] };
var lines = file.target.result.split('\r\n').join('\n').split('\n'), headers = {}, count = 0;
for (var i in lines) {
var values = lines[i].split(',');
if (i == 0) {
// Fill the headers
for (var j in values) {
if (values[j] == 'Intel AMT FQDN') { headers[j] = 'name'; }
if (values[j] == 'Intel AMT IPv4') { headers[j] = 'host'; }
if (values[j] == 'Intel AMT Version') { headers[j] = 'ver'; }
//if (values[j] == 'Last Connection Time') { headers[j] = 'date'; }
}
} else {
// Fill data
var computerEntry = {};
for (var j in values) {
if (headers[j] && (values[j].length > 0)) { computerEntry[headers[j]] = values[j]; }
}
if (computerEntry.host || computerEntry.name) {
if (computerEntry.host == null) { computerEntry.host = computerEntry.name; }
if (computerEntry.user == null) { computerEntry.user = 'admin'; }
if (computerEntry.pass == null) { computerEntry.pass = ''; }
if (computerEntry.tls == null) { computerEntry.tls = 1; }
x.computers.push(computerEntry);
count++;
}
}
}
if (count == 0) { x = {}; }
} else {
try { x = JSON.parse(file.target.result); } catch (ex) { }
// ###BEGIN###{Mode-NodeWebkit}
if (x && x['magic'] == '3209ruwpcoinaT4r9w347t0e4ug') {
if (pass) {
// Decrypt the file
x = getDecryptedData(x, pass);
if (x && (x != null)) { x = JSON.parse(x); }
} else {
// Prompt to the password
var x = "선택한 파일에는 비밀번호가 필요합니다." + '<br/><br/><div style=height:26px><input id=idx_filepass type=password style=float:right;width:200px onkeyup=filePasswordDialogUpdate()><div>' + "암호" + '</div></div>';
setDialogMode(11, "파일 비밀번호", 3, onComputerListReadEx, x, [file, name]);
filePasswordDialogUpdate();
return;
}
}
// ###END###{Mode-NodeWebkit}
}
if (!x || !x['computers']) {
messagebox("파일 열기", "잘못되거나 손상된 컴퓨터 목록 파일. 열 수가없는.");
} else {
// ###BEGIN###{!Mode-NodeWebkit}
idx_d18computerfilename.value = name;
// ###END###{!Mode-NodeWebkit}
currentcomputer = null;
computerlist = x['computers'];
for (var i in computerlist) { computerlist[i]['h'] = Math.random(); computerlist[i].checked = false; }
updateComputerList();
saveComputers();
}
}
function onComputerListReadEx(button, tag) { onComputerListRead(tag[0], tag[1], Q('idx_filepass').value); }
function filePasswordDialogUpdate() { QE('idx_dlgOkButton', passwordcheck(Q('idx_filepass').value)); }
// ###BEGIN###{FileSaver}
function saveComputerListUpdate() {
var ok = true;
// ###BEGIN###{Mode-NodeWebkit}
QV('d18showpassword', d18usepassword.checked);
if (d18usepassword.checked == true) { ok = (passwordcheck(d18password1.value) && (d18password1.value == d18password2.value)) };
// ###END###{Mode-NodeWebkit}
QE('idx_dlgOkButton', ok);
}
function saveComputerList() {
if (xxdialogMode) return;
// ###BEGIN###{Mode-NodeWebkit}
d18usepassword.checked = false;
d18password1.value = '';
d18password2.value = '';
// ###END###{Mode-NodeWebkit}
setDialogMode(18, "컴퓨터 목록 저장", 3, saveComputerListOk);
saveComputerListUpdate();
}
function saveComputerListOk() {
var computerlist2 = Clone(computerlist);
for (var i in computerlist2) { delete computerlist2[i]['h']; delete computerlist2[i].checked; delete computerlist2[i]['consolemsg']; }
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(JSON.stringify({ 'webappversion':version, 'computers':computerlist2 }, null, ' ').replace(/\n/g, '\r\n')), idx_d18computerfilename.value);
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('nwsaveas', 'computerlist.json');
chooser.addEventListener('change', function() {
if (this.value == '') return;
if (d18usepassword.checked == false) {
require('fs').writeFile(this.value, JSON.stringify({ 'webappversion': version, 'computers': computerlist2 }, null, ' ').replace(/\n/g, '\r\n'), function () { });
} else {
require('fs').writeFile(this.value, JSON.stringify(getEncryptedData(JSON.stringify({ 'webappversion': version, 'computers': computerlist2 }, null, ' '), d18password1.value), null, ' ').replace(/\n/g, '\r\n'), function () { });
}
this.value = '';
}, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
function getEncryptedData(dataStr, password) {
var crypto = require('crypto');
var salt = crypto.randomBytes(16);
var key = crypto.pbkdf2Sync(password, salt, 128000, 16, 'sha512');
var iv = Math.round((Math.pow(36, 13) - Math.random() * Math.pow(36, 12))).toString(36).slice(1);
var cipher = crypto.createCipheriv('aes-256-gcm', key.toString('hex'), iv);
var encrypted = cipher.update(dataStr, 'utf8', 'hex') + cipher.final('hex');
return { 'magic': '3209ruwpcoinaT4r9w347t0e4ug', 'version': 1, 'salt': salt.toString('hex'), 'iv': iv, 'tag': cipher.getAuthTag().toString('hex'), 'data': encrypted };
}
function getDecryptedData(encryptedData, password) {
var crypto = require('crypto');
var salt = new require('buffer').Buffer(encryptedData['salt'], 'hex');
var iv = encryptedData['iv'];
var tag = new require('buffer').Buffer(encryptedData['tag'], 'hex');
var data = encryptedData['data'];
var key = crypto.pbkdf2Sync(password, salt, 128000, 16, 'sha512');
var decipher = crypto.createDecipheriv('aes-256-gcm', key.toString('hex'), iv);
decipher.setAuthTag(tag);
var decrypted = decipher.update(data, 'hex', 'utf8') + decipher.final('utf8');
return decrypted;
}
// ###END###{FileSaver}
function updateComputerDialog() {
var k = Q('d4security').value >= 2;
QV('d4digest', !k);
QV('d4kerb', k);
var hostSplit = d4hostname.value.split(':');
var hostnameok = (d4hostname.value.length > 0) && (hostSplit.length < 3);
if (hostnameok && (hostSplit.length == 2)) { var hostport = parseInt(hostSplit[1]); hostnameok = (hostport > 0) && (hostport < 65536) && (hostport == hostSplit[1]); }
QS('d4hostname')['background-color'] = (hostnameok ? 'white' : 'LightYellow');
if (k && hostnameok) {
QE('idx_dlgOkButton', d4hostname.value.length > 0);
} else {
QS('d4username')['background-color'] = (((d4username.value.length > 0) && (d4username.value != '*')) ? 'white' : 'LightYellow');
QS('d4password')['background-color'] = (((d4username.value == '$$OsAdmin') || passwordcheck(d4password.value) || d4password.value == '') ? 'white' : 'LightYellow');
QE('idx_dlgOkButton', d4hostname.value.length > 0 && d4username.value.length > 0 && d4username.value != '*' && ((d4username.value == '$$OsAdmin') || passwordcheck(d4password.value) || d4password.value == ''));
}
}
function addComputerButton() {
var k = Q('d4security').value >= 2;
// ###BEGIN###{!Mode-NodeWebkit}
if (k) {
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': '*', 'pass': encodeURIComponent(Q('d4kerberos').value), 'tls': d4security.value % 2 });
} else {
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': encodeURIComponent(d4username.value), 'pass': encodeURIComponent(d4password.value), 'tls': d4security.value % 2 });
}
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
if (k) {
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': '*', 'pass': encodeURIComponent(Q('d4kerberos').value), 'tls': d4security.value % 2, 'tlscerthash': getCertPinning(d4hostname.value) });
} else {
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': encodeURIComponent(d4username.value), 'pass': encodeURIComponent(d4password.value), 'tls': d4security.value % 2, 'tlscerthash': getCertPinning(d4hostname.value) });
}
// ###END###{Mode-NodeWebkit}
saveComputers();
updateComputerList();
}
function computerSelector_FileSelectHandler(e) {
haltEvent(e);
if (e.dataTransfer == null || e.dataTransfer.files.length != 1) return;
var reader = new FileReader();
reader.onload = function(file) { onComputerListRead(file, e.dataTransfer.files[0].name); }
reader.readAsText(e.dataTransfer.files[0]);
}
function computerEdit(h) {
if (xxdialogMode) return;
var c = null;
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
// Build the list of groups
var groups = [], x = '';
for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (computer.tags != '') && (groups.indexOf(computer.tags) == -1) && (computer.tags.indexOf('"') == -1)) { groups.push(computer.tags); } }
groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
for (var y in groups) { x += '<option value="' + groups[y] + '">'; }
QH('d4devGroups', x);
// If connected to a MeshCentral server, only edit the device name
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
var x = '<div style=height:26px><input id=d11deviceName style=float:right;width:200px value="' + decodeURIComponent(c['name'] ? c['name'] : '') + '"><div>' + "친숙한 이름" + '</div></div>';
setDialogMode(11, "장치 편집", 3, computerEditMeshOk, x, c);
return;
}
// ###END###{MeshServerConnect}
if (kerberos != null || c['user'] == '*') {
QH('d4security', '<option value=0>' + "다이제스트 / 없음" + '</option><option value=1>' + "다이제스트 / TLS" + '</option><option value=2>' + "Kerberos / 없음" + '</option><option value=3>' + "Kerberos / TLS" + '</option>');
} else {
QH('d4security', '<option value=0>' + "다이제스트 / 없음" + '</option><option value=1>' + "다이제스트 / TLS" + '</option>');
}
d4name.value = decodeURIComponent(c['name']?c['name']:'');
d4tags.value = decodeURIComponent(c['tags']?c['tags']:'');
d4hostname.value = decodeURIComponent(c['host']);
d4security.value = c['tls'] + ((c['user'] == '*')?2:0);
if (c['user'] == '*') {
d4kerberos.value = decodeURIComponent(c['pass']?c['pass']:'');
} else {
d4username.value = decodeURIComponent(c['user']?c['user']:'');
d4password.value = decodeURIComponent(c['pass']?c['pass']:'');
}
setDialogMode(4, "장치 편집", 7, function (r) { computerEditOk(r, h); });
updateComputerDialog();
Q('d4name').focus();
}
// ###BEGIN###{MeshServerConnect}
function computerEditMeshOk(button, c) {
if (Q('d11deviceName').value != c.name) { meshCentralServer.send({ action: 'changedevice', nodeid: c._id, name: Q('d11deviceName').value }); }
}
// ###END###{MeshServerConnect}
function computerEditOk(r, h) {
if (r == 2) { computerRemoveEx(h); return; }
var c = null;
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
c['name'] = decodeURIComponent(d4name.value);
c['tags'] = decodeURIComponent(d4tags.value);
c['host'] = decodeURIComponent(d4hostname.value);
if (d4security.value < 2) {
// Digest authentication
c['user'] = decodeURIComponent(d4username.value);
c['pass'] = decodeURIComponent(d4password.value);
} else {
// Kerberos authentication
c['user'] = '*';
c['pass'] = decodeURIComponent(d4kerberos.value);
}
c['tls'] = d4security.value % 2;
//for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { computerlist.splice(x, 1); } }
//var c = { 'h': h, "name": d4name.value, "host": d4hostname.value, "user": d4username.value, "pass": d4password.value, "tls": d4security.value };
//computerlist.push(c);
//if (currentcomputer['h'] == c['h']) { currentcomputer = c; }
saveComputers();
//computerSelect();
updateComputerList();
updateComputerDetails();
}
function computerRemoveEx(h) {
if (currentcomputer['h'] == h) currentcomputer = null;
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { computerlist.splice(x, 1); } }
saveComputers();
updateComputerList();
updateComputerDetails();
}
function onFilterFocus(x) { filterFocus = x; }
// ###END###{ComputerSelector-Local}
function updateComputerList() {
QH('id_computerList', '');
// ###BEGIN###{MeshServerConnect}
if ((meshCentralServer != null) && (computerlist.length == 0)) {
QV('id_noKnownComputers', false);
if (meshCentralServer.socketState < 3) {
QH('id_computerList', '<div style=width:99%;text-align:center;margin-top:36px;color:gray>' + "연결 중 ..." + '</div>');
} else {
QH('id_computerList', '<div style=width:99%;text-align:center;margin-top:36px;color:gray>' + "이 계정에 인텔 &reg; AMT 컴퓨터가 없습니다." + '</div>');
}
QV('id_noKnownComputers', false);
} else {
QV('id_noKnownComputers', computerlist.length == 0);
}
// ###END###{MeshServerConnect}
// ###BEGIN###{!MeshServerConnect}
QV('id_noKnownComputers', computerlist.length == 0);
// ###END###{!MeshServerConnect}
QV('computerFilter', computerlist.length != 0);
// ###BEGIN###{FileSaver}
QE('saveComputersButton', computerlist.length != 0);
// ###END###{FileSaver}
// ###BEGIN###{Scripting}
computersRunningScripts = 0;
var computersWithScriptsMsgs = 0;
for (var y in computerlist) { if (computerlist[y].scriptstate) computersRunningScripts++; if (computerlist[y]['consolemsgs']) computersWithScriptsMsgs++; }
// ###BEGIN###{Mode-NodeWebkit}
if (urlvars['autoexit'] && computersRunningScripts == 0 && computersWithScriptsMsgs > 0) {
require('nw.gui').Window.get().close();
//require('nw.gui').App.quit();
return;
} // Exit if no scripts are running
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{ComputerSelectorToolbar}
QE('idx_runScriptOnComputersButton', computerlist.length != 0);
// ###BEGIN###{MeshServerConnect}
QV('id_noScriptButtons', (computersRunningScripts == 0) && (meshCentralServer == null));
QV('idx_disconnectMeshCentralButton', meshCentralServer != null);
QV('idx_runScriptOnComputersButton', meshCentralServer == null);
QV('toolmenuicondiv', meshCentralServer == null);
// ###BEGIN###{Mode-NodeWebkit}
QV('LeftMenuMyCerts', meshCentralServer == null);
QV('LeftMenuMyUsb', meshCentralServer == null);
QV('LeftMenuPlayer', meshCentralServer == null);
// ###END###{Mode-NodeWebkit}
// ###END###{MeshServerConnect}
// ###BEGIN###{!MeshServerConnect}
QV('id_noScriptButtons', computersRunningScripts == 0);
// ###END###{!MeshServerConnect}
idx_runScriptOnComputersButton.value = (computersRunningScripts > 0 ? "모든 스크립트 중지" : "스크립트 실행 ...")
// ###END###{ComputerSelectorToolbar}
// ###END###{Scripting}
QV('id_computerDetailsParent', computerlist.length != 0);
QS('id_computerListParent').right = (computerlist.length == 0 ? 0 : '300px');
computerlist.sort(function (a, b) { var aa = a['name'] ? a['name'].toLowerCase() : a['host'].toLowerCase(); var bb = b['name'] ? b['name'].toLowerCase() : b['host'].toLowerCase(); if (aa > bb) { return 1; } if (aa < bb) { return -1; } return 0; });
if (currentcomputer == null && computerlist.length > 0) { currentcomputer = computerlist[0]; }
// Built a sorted list of groups
var groups = [''], groupHtml = {};
for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (groups.indexOf(computer.tags) == -1)) { groups.push(computer.tags); } }
groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
for (var y in groups) { groupHtml[groups[y]] = ''; }
// Go thru each computer and create the HTML entry
for (var y in computerlist) {
var computer = computerlist[y], extra = [], group = '', disabled = false;
if (computer.tags != null) { group = computer.tags; }
if (computer['user'] == '*') { extra.push("Kerberos"); } else { if (computer['user']) { extra.push(EscapeHtml(decodeURIComponent(computer['user']))); } }
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
var securityok = false;
if (computer['conn']) {
if ((computer['conn'] & 2) != 0) { extra.push("시라"); securityok = true; } else {
if ((computer['conn'] & 4) != 0) { extra.push("곧장"); }
else if ((computer['conn'] & 8) != 0) { extra.push("계전기"); }
}
}
if (securityok == true) {
if (computer['tls'] != 0) { extra.push("TLS"); }
} else {
extra.push((computer['tls'] == 0) ? NoBreak("보안 없음") : "TLS");
}
} else {
extra.push((computer['tls'] == 0) ? NoBreak("보안 없음") : "TLS");
}
// ###END###{MeshServerConnect}
// ###BEGIN###{!MeshServerConnect}
extra.push((computer['tls'] == 0) ? NoBreak("보안 없음") : "TLS");
// ###END###{!MeshServerConnect}
var name = decodeURIComponent(computer['host']);
if (computer['name'] && computer['name'] != '') name = decodeURIComponent(computer['name']);
var x = '<div id=CX-' + computer['h'] + ' ondblclick=computerEdit(' + computer['h'] + ')>';
// ###BEGIN###{Look-Commander}
// ###BEGIN###{ComputerSelectorScanner}
var gray = false;
if (NW_AmtScanMenuItem && (NW_AmtScanMenuItem.checked == true)) { gray = ((!globalAmtScanner.scanTable[computer['h']]) || (globalAmtScanner.scanTable[computer['h']].scanstate != 1)); }
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) { disabled = gray = ((computer.conn & 14) == 0); }
// ###END###{MeshServerConnect}
// ###BEGIN###{!ComputerSelectorNoImages}
x += '<div id=SI-' + computer['h'] + ' class=\"j' + (computer['icon'] ? computer['icon'] : 1) + (gray ? ' gray' : '') + '\" style=float:left;margin-left:4px;margin-right:4px></div>';
// ###END###{!ComputerSelectorNoImages}
// ###END###{ComputerSelectorScanner}
// ###BEGIN###{!ComputerSelectorScanner}
// ###BEGIN###{!ComputerSelectorNoImages}
x += '<div id=SI-' + computer['h'] + ' class=\"j' + (computer['icon'] ? computer['icon'] : 1) + '\" style=float:left;margin-left:4px;margin-right:4px></div>';
// ###END###{!ComputerSelectorNoImages}
// ###END###{!ComputerSelectorScanner}
// ###END###{Look-Commander}
// ###BEGIN###{ComputerSelectorNoImages}
x += '<div><table style="height:24px;width:calc(100%);margin:3px;cursor:pointer;border:none" cellspacing=0 cellpadding=0';
// ###END###{ComputerSelectorNoImages}
// ###BEGIN###{!ComputerSelectorNoImages}
x += '<div><table style="height:24px;width:calc(100% - 38px);margin:3px;cursor:pointer;border:none" cellspacing=0 cellpadding=0';
// ###END###{!ComputerSelectorNoImages}
// ###BEGIN###{ComputerSelector-Local}
// ###BEGIN###{ContextMenus}
var cmenus = [];
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
if ((computer.scriptstate == undefined) && (disabled == false)) {
cmenus.push("잇다" + '#computerConnect(event,' + computer['h'] + ')');
cmenus.push("창 연결" + '#computerConnect(event,' + computer['h'] + ',100)');
cmenus.push('-');
cmenus.push("데스크탑" + '#computerConnect(event,' + computer['h'] + ',1)');
cmenus.push("데스크톱 만" + '#computerConnect(event,' + computer['h'] + ',3)');
cmenus.push("단말기" + '#computerConnect(event,' + computer['h'] + ',4)');
}
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###BEGIN###{Scripting}
if (computer.scriptstate != null) cmenus.push("스크립트 중지" + '#computerStopScript(event,' + computer['h'] + ')');
if (computer['consolemsgs'] != null) cmenus.push("스크립트 출력 ..." + '#mscript_showComputerScriptOutput(' + computer['h'] + ')');
// ###END###{Scripting}
if (computer.scriptstate == null) cmenus.push("편집하다..." + '#computerEdit(' + computer['h'] + ')');
x += ' cm=\'' + cmenus.join('|') + '\'';
// ###END###{ContextMenus}
// ###END###{ComputerSelector-Local}
x += ' onclick="computerSelect(event, ' + computer['h'] + ')" id=CI-' + computer['h'] + '>';
x += '<td id=LCX-' + computer['h'] + ' class=g1 style=float:none>&nbsp;</td>' // Left side gray scale
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer == null) {
// ###END###{MeshServerConnect}
// ###BEGIN###{ComputerSelectorScanner}
if (NW_AmtScanMenuItem && (NW_AmtScanMenuItem.checked == true)) {
var scanstate = globalAmtScanner.scanTable[computer['h']], scancolor = '';
if (scanstate) { if (scanstate.scanstate == 1) scancolor = ';background-color:green'; if (scanstate.scanstate == 0) scancolor = ';background-color:red'; }
x += '<td style=width:12px title="' + "인텔 &reg; AMT RMCP 응답" + '"><div id=SS-' + computer['h'] + ' class=computeritemcir style=' + scancolor + '></div>';
}
// ###END###{ComputerSelectorScanner}
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
// ###BEGIN###{Look-ISDU}
x += '<td style=width:24px><img src=images-isdu/ComputerIcon.png style=padding-top:2px /></td>';
// ###END###{Look-ISDU}
// ###BEGIN###{Look-Commander}
//x += '<td class=j' + (computer['icon'] ? computer['icon'] : 1) + '></td>';
// ###END###{Look-Commander}
// ###BEGIN###{Look-BrandedCommander}
x += '<td><img src=images-BrandedCommander/ComputerIcon.png style=vertical-align:text-top /></td>';
// ###END###{Look-BrandedCommander}
// ###BEGIN###{Scripting}
x += '<td style=width:10px><input id=SJ-' + computer['h'] + ' type=checkbox onclick=onComputerChecked()' + (computer.checked?' checked':'') + (computersRunningScripts>0?' disabled':'') + ' /></td>';
// ###END###{Scripting}
x += '<td align=left><b style=font-size:16px>' + EscapeHtml(name) + '</b></td>';
// ###BEGIN###{!Scripting}
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td>';
// ###END###{ComputerSelector-Local-ScriptOnly}
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td><td style=width:1px;padding-right:5px>' + AddButton2("잇다", 'computerConnect(event,' + computer['h'] + ')', disabled ? 'disabled=disabled' : '') + '</td>';
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###END###{!Scripting}
// ###BEGIN###{Scripting}
if (computersRunningScripts == 0) {
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td>';
// ###END###{ComputerSelector-Local-ScriptOnly}
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td><td style=width:1px;padding-right:5px>' + AddButton2("잇다", 'computerConnect(event,' + computer['h'] + ')', disabled?'disabled=disabled':'') + '</td>';
// ###END###{!ComputerSelector-Local-ScriptOnly}
} else {
if (computer.scriptstate) { x += '<td align=right style=padding-right:5px id=XI-' + computer['h'] + '>' + EscapeHtml(computer['consolemsg']) + '</td><td style=width:1px>' + AddButton2("중지", 'computerStopScript(event,' + computer['h'] + ')') + '</td>'; }
}
// ###END###{Scripting}
x += '<td id=RCX-' + computer['h'] + ' class=g2 style=float:none>&nbsp;</td>' // Right side gray scale
x += '</table></div></div>';
groupHtml[group] += x; // Add this device to the proper group
}
// Append all the groups into the final HTML
if (computerlist.length > 0) {
var x = '';
for (var y in groups) {
if (groups[y] != '') { x += '<div style="font-size:14px;border-bottom:1px solid lightgray;margin-left:4px;margin-top:6px"><b>' + EscapeHtml(groups[y]) + '</b></div>'; }
x += groupHtml[groups[y]];
}
QH('id_computerList', '<div style=width:99%>' + x + '</div>');
}
updateComputerDetails();
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
}
function onComputerChecked() {
for (var y in computerlist) { computerlist[y].checked = Q('SJ-' + computerlist[y]['h']).checked; }
}
function addComputerDetailsEntry(x, y) {
//return '<div class=log style=border-radius:4px;padding:3px;margin-bottom:3px><div style=width:100%;font-size:9px>' + x + '</div><div style=width:100%>&nbsp;' + y + '</div></div>';
return '<div style=border-radius:4px;padding:3px;margin-bottom:3px;background-color:#ddd><div style=width:100%;font-size:9px>' + x + '</div><div style=width:100%>&nbsp;' + y + '</div></div>';
}
function updateComputerDetails() {
var x = '<div style=position:absolute;top:0;right:0;left:0;bottom:0>', disabled = false;
if (currentcomputer != null) {
// ###BEGIN###{Look-Commander}
// Put the big computer logo
// ###BEGIN###{!ComputerSelectorNoImages}
x += '<div style=position:absolute;top:4px;left:4px;right:4px;bottom:80px>';
if (currentcomputer['name']) x += '<div style=width:100%;text-align:center><b>' + EscapeHtml(decodeURIComponent(currentcomputer['name'])) + '</b></div>';
// ###BEGIN###{ComputerSelectorScanner}
var icon = 1, gray = false;
if ((NW_AmtScanMenuItem) && (NW_AmtScanMenuItem.checked == true)) { gray = (!globalAmtScanner.scanTable[currentcomputer['h']]) || (globalAmtScanner.scanTable[currentcomputer['h']].scanstate != 1); }
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) { disabled = gray = ((currentcomputer.conn & 14) == 0); }
// ###END###{MeshServerConnect}
if (currentcomputer['icon']) { icon = parseInt(currentcomputer['icon']); }
x += '<img ' + (gray ? 'class=gray ' : '') + 'src="images-commander/icons200-' + icon + '-1.png" onclick=showIconSelector() height=200 width=200 style=margin-left:50px;cursor:pointer></img>';
// ###END###{ComputerSelectorScanner}
// ###BEGIN###{!ComputerSelectorScanner}
var icon = 1;
if (currentcomputer['icon']) { icon = parseInt(currentcomputer['icon']); }
x += '<img src="images-commander/icons200-' + icon + '-1.png" onclick=showIconSelector() height=200 width=200 style=margin-left:50px;cursor:pointer></img>';
// ###END###{!ComputerSelectorScanner}
// ###END###{!ComputerSelectorNoImages}
x += '</div>';
// ###END###{Look-Commander}
var bottomButtons = '';
var bottomButtonsHeight = 0;
if (computersRunningScripts == 0) {
//bottomButtons += '<div style=position:fixed;bottom:8px;right:5px>';
bottomButtonsHeight = 14 + 20;
bottomButtons += '<div style=position:absolute;bottom:8px;left:4px;right:4px>';
// ###BEGIN###{Scripting}
if (currentcomputer['consolemsgs']) { bottomButtonsHeight += 20; bottomButtons += '<input type=Button value="' + "스크립트 출력 표시 ..." + '" style=width:292px onclick=mscript_showComputerScriptOutput(' + currentcomputer['h'] + ')><br>'; }
// ###END###{Scripting}
// ###BEGIN###{ComputerSelector-Local}
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
bottomButtons += '<input type=Button value="' + "편집하다..." + '" style=width:146px onclick=computerEdit(' + currentcomputer['h'] + ')>';
bottomButtons += '<input type=Button value="' + "잇다" + '" style=width:146px onclick=computerConnect(event,' + currentcomputer['h'] + ') ' + (disabled ? 'disabled=disabled' : '') + '>';
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
bottomButtons += '<input type=Button value="' + "편집하다..." + '" style=width:292px onclick=computerEdit(' + currentcomputer['h'] + ')>';
// ###END###{ComputerSelector-Local-ScriptOnly}
// ###END###{ComputerSelector-Local}
// ###BEGIN###{!ComputerSelector-Local}
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
bottomButtons += '<input type=Button value="' + "잇다" + '" style=width:292px onclick=computerConnect(event,' + currentcomputer['h'] + ' ' + (disabled ? 'disabled=disabled' : '') + ')>';
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###END###{!ComputerSelector-Local}
bottomButtons += '</div>';
} else {
// ###BEGIN###{Scripting}
if (currentcomputer.scriptstate || currentcomputer['consolemsgs']) {
//bottomButtons += '<div style=position:fixed;bottom:8px;right:5px>';
bottomButtonsHeight = 14;
bottomButtons += '<div style=position:absolute;bottom:8px;left:4px;right:4px>';
if (currentcomputer['consolemsgs'] != null) { bottomButtonsHeight += 20; bottomButtons += '<input type=Button value="' + "스크립트 출력 표시 ..." + '" style=width:292px onclick=mscript_showComputerScriptOutput(' + currentcomputer['h'] + ')><br>'; }
if (currentcomputer.scriptstate != null) { bottomButtonsHeight += 20; bottomButtons += '<input type=Button value="' + "스크립트 중지" + '" style=width:292px onclick=computerStopScript(event,' + currentcomputer['h'] + ')>'; }
bottomButtons += '</div>';
}
// ###END###{Scripting}
}
// ###BEGIN###{Look-Commander}
// ###BEGIN###{!ComputerSelectorNoImages}
x += '<div style="overflow-y:auto;position:absolute;top:216px;left:4px;right:4px;bottom:' + bottomButtonsHeight + 'px">';
// ###END###{!ComputerSelectorNoImages}
// ###BEGIN###{ComputerSelectorNoImages}
x += '<div style="overflow-y:auto;position:absolute;top:4px;left:4px;right:4px;bottom:' + bottomButtonsHeight + 'px">';
// ###END###{ComputerSelectorNoImages}
// ###END###{Look-Commander}
// ###BEGIN###{!Look-Commander}
x += '<div style="overflow-y:auto;position:absolute;top:4px;left:4px;right:4px;bottom:' + bottomButtonsHeight + 'px">';
if (currentcomputer['name']) x += addComputerDetailsEntry("친숙한 이름", EscapeHtml(decodeURIComponent(currentcomputer['name'])));
// ###END###{!Look-Commander}
x += addComputerDetailsEntry("호스트 이름", decodeURIComponent(currentcomputer['host']));
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer == null) {
// ###END###{MeshServerConnect}
if (currentcomputer['user'] != '*') {
x += addComputerDetailsEntry("입증", "다이제스트 /" + EscapeHtml(decodeURIComponent(currentcomputer['user'])));
} else {
if (currentcomputer['pass'] == '') {
x += addComputerDetailsEntry("입증", "Kerberos");
} else {
x += addComputerDetailsEntry("입증", "Kerberos /" + EscapeHtml(decodeURIComponent(currentcomputer['pass'])));
}
}
x += addComputerDetailsEntry("보안", ((currentcomputer['tls'] == 0)?"없음":"TLS 보안"));
if (currentcomputer['tags']) { x += addComputerDetailsEntry("그룹 이름", EscapeHtml(decodeURIComponent(currentcomputer['tags']))); }
// ###BEGIN###{MeshServerConnect}
} else {
if (currentcomputer['tags']) { x += addComputerDetailsEntry("장치 그룹", EscapeHtml(decodeURIComponent(currentcomputer['tags']))); }
if (currentcomputer['conn']) {
var cn = [];
if ((currentcomputer['conn'] & 1) != 0) cn.push('Agent');
if ((currentcomputer['conn'] & 2) != 0) cn.push('CIRA');
else if ((currentcomputer['conn'] & 4) != 0) cn.push('Direct');
else if ((currentcomputer['conn'] & 8) != 0) cn.push('Relay');
x += addComputerDetailsEntry("연결성", cn.join(', '));
}
}
// ###END###{MeshServerConnect}
if (currentcomputer['ver']) {
var mode = '';
if (currentcomputer['pstate'] == 2) { mode = "ACM"; if (currentcomputer['pmode'] == 2) mode = "CCM"; }
if (mode != '') mode = ' / ' + mode;
x += addComputerDetailsEntry("인텔 &reg; AMT", "v" + currentcomputer['ver'] + mode);
}
if (currentcomputer['date']) { x += addComputerDetailsEntry("마지막 연결", new Date(currentcomputer['date']).toDateString()); }
if (currentcomputer['digestrealm']) {
// ###BEGIN###{ContextMenus}
x += '<div cm="' + NoBreak("영역 제거 ...") + '#removeCurrentRealm(' + currentcomputer['h'] + ')">';
// ###END###{ContextMenus}
x += addComputerDetailsEntry("다이제스트 영역", '<span style=font-size:x-small>' + currentcomputer['digestrealm'] + '</span><br /><span style=margin-left:5px><a style=cursor:pointer;font-size:10px;color:blue onclick=removeCurrentRealm(' + currentcomputer['h'] + ')><u>' + "영역 제거" + '</u></a></span>');
// ###BEGIN###{ContextMenus}
x += '</div>';
// ###END###{ContextMenus}
}
// ###BEGIN###{Mode-NodeWebkit}
// ###BEGIN###{Certificates}
if (currentcomputer['tlscerthash']) {
if (currentcomputer['tlscert']) {
// ###BEGIN###{ContextMenus}
x += '<div cm="' + NoBreak("인증서보기 ...") + '#viewCurrentPinCertificate(' + currentcomputer['h'] + ')|' + NoBreak("피닝 제거 ...") + '#removeCurrentPinCertificate(' + currentcomputer['h'] + ')">';
// ###END###{ContextMenus}
x += addComputerDetailsEntry("TLS 인증서", '<span title="Cert hash: ' + currentcomputer['tlscerthash'] + '">' + "특정 인증서에 고정" + '</span><br /><span style=margin-left:5px><a style=cursor:pointer;font-size:10px;color:blue onclick=viewCurrentPinCertificate(' + currentcomputer['h'] + ')><u>' + "인증서 표시" + '</u></a> <a style=cursor:pointer;font-size:10px;color:blue onclick=removeCurrentPinCertificate(' + currentcomputer['h'] + ')><u>' + "피닝 제거" + '</u></a></span>');
// ###BEGIN###{ContextMenus}
x += '</div>';
// ###END###{ContextMenus}
} else {
// ###BEGIN###{ContextMenus}
x += '<div cm="' + NoBreak("피닝 제거 ...") + '#removeCurrentPinCertificate(' + currentcomputer['h'] + ')">';
// ###END###{ContextMenus}
x += addComputerDetailsEntry("TLS 인증서", '<span title="Cert hash: ' + currentcomputer['tlscerthash'] + '">' + "특정 인증서에 고정" + '</span><br /><span style=margin-left:5px><a style=cursor:pointer;font-size:10px;color:blue onclick=removeCurrentPinCertificate(' + currentcomputer['h'] + ')><u>' + "피닝 제거" + '</u></a></span>');
// ###BEGIN###{ContextMenus}
x += '</div>';
// ###END###{ContextMenus}
}
}
// ###END###{Certificates}
// ###END###{Mode-NodeWebkit}
x += '</div>';
}
QH('id_computerDetails', x + bottomButtons + '</div>');
computerSelect();
}
// ###BEGIN###{Look-Commander}
// ###BEGIN###{!ComputerSelectorNoImages}
function showIconSelector() {
if (xxdialogMode) return;
var x = '<br><div style=display:inline-block;width:40px></div>';
x += '<div style=display:inline-block class=i1 onclick=setIcon(1)></div>';
x += '<div style=display:inline-block class=i2 onclick=setIcon(2)></div>';
x += '<div style=display:inline-block class=i3 onclick=setIcon(3)></div>';
x += '<div style=display:inline-block class=i4 onclick=setIcon(4)></div>';
x += '<div style=display:inline-block class=i5 onclick=setIcon(5)></div>';
x += '<div style=display:inline-block class=i6 onclick=setIcon(6)></div>';
setDialogMode(11, "아이콘 선택", 0, null, x);
QV('id_dialogclose', true);
}
function setIcon(icon) {
setDialogMode(0);
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) { meshCentralServer.send({ action: 'changedevice', nodeid: currentcomputer._id, icon: icon }); return; }
// ###END###{MeshServerConnect}
currentcomputer['icon'] = icon;
// ###BEGIN###{ComputerSelector-Local}
saveComputers();
// ###END###{ComputerSelector-Local}
updateComputerList();
}
// ###END###{!ComputerSelectorNoImages}
// ###END###{Look-Commander}
// ###BEGIN###{Mode-NodeWebkit}
// ###BEGIN###{ContextMenus}
// ###BEGIN###{Certificates}
function viewCurrentPinCertificate(h) {
if (xxdialogMode) return;
var c = null;
for (var x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
var cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(hex2rstr(c['tlscert'])));
var commonName = cert.subject.getField('CN').value;
var fingerprint = '', fingerprint2 = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex().toUpperCase();
for (i = 0; i < fingerprint2.length; i++) { if ((i != 0) && (i % 2 == 0)) { fingerprint += ':'; } fingerprint += fingerprint2.substring(i, i + 1); }
var x = '<img src=images-commander/cert1.png style=float:right height=32 width=32 />';
x += 'This certificate is pinned to computer ' + c['name'] + '. When connecting, if this certificate is received the connection will allowed. Hit delete button to un-pin.<br>';
// ###BEGIN###{FileSaver}
//x += addHtmlValue("Certificate", c.X509Certificate.length + " bytes, " + '<a style=cursor:pointer;color:blue onclick=downloadCert(' + h + ')>' + "Download" + '</a>');
// ###END###{FileSaver}
// ###BEGIN###{!FileSaver}
//x += addHtmlValue("Certificate", c.X509Certificate.length + " bytes");
// ###END###{!FileSaver}
x += '<br><div style="border-bottom:1px solid gray"><i>' + "인증서 주체" + '</i></div><br>';
for (var i in xxCertSubjectNames) { var a = cert.subject.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
x += addHtmlValueNoTitle("지문", fingerprint.substring(0,29) + '<br />' + fingerprint.substring(30));
x += '<br><div style="border-bottom:1px solid gray"><i>' + "발급자 인증서" + '</i></div><br>';
for (var i in xxCertSubjectNames) { var a = cert.issuer.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
setDialogMode(11, "증명서-" + EscapeHtml(commonName), 5, function (b) { if (b == 2) { removeCurrentPinCertificateEx(2, h); } }, x);
}
function removeCurrentPinCertificate(h) {
if (xxdialogMode) return;
setDialogMode(11, "인증서 고정", 3, removeCurrentPinCertificateEx, "선택한 컴퓨터의 인증서 고정을 제거 하시겠습니까?", h);
}
function removeCurrentPinCertificateEx(button, h) {
var c = null;
for (var x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
if (c['tlscert']) delete c['tlscert'];
if (c['tlscerthash']) delete c['tlscerthash'];
storeCertPinning(c['host'], null);
saveComputers();
updateComputerList();
}
// ###END###{Certificates}
// ###END###{ContextMenus}
// ###END###{Mode-NodeWebkit}
function removeCurrentRealm(h) {
if (xxdialogMode) return;
setDialogMode(11, "다이제스트 영역", 3, removeCurrentRealmEx, "선택한 컴퓨터에 대해 다이제스트 영역 고정을 제거 하시겠습니까?", h);
}
function removeCurrentRealmEx(button, h) {
var c = null;
for (var x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
if (c['digestrealm']) delete c['digestrealm'];
saveComputers();
updateComputerList();
}
// ###BEGIN###{ComputerSelector-Local}
function saveComputers() {
if (urlvars['host']) return;
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) return;
// ###END###{MeshServerConnect}
// ###BEGIN###{Mode-NodeWebkit}
const crypto = require('crypto');
crypto.randomBytes(256, function(err, buf) {
if (err) throw err; // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
var computerlist2 = JSON.parse(JSON.stringify(computerlist));
for (var i in computerlist2) { delete computerlist2[i]['tlscert2']; delete computerlist2[i]['tlscerthash2']; } // Clean up the list
var k = buf.toString('hex'), cipher = crypto.createCipher('aes-256-ctr', k), crypted = cipher.update(JSON.stringify(computerlist2), 'utf8', 'hex');
crypted += cipher.final('hex');
try { localStorage.setItem('computers', k + crypted); } catch (ex) { }
});
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
try { localStorage.setItem('computers', JSON.stringify(computerlist)); } catch (ex) { }
// ###END###{!Mode-NodeWebkit}
}
function loadComputers() {
if (urlvars['host']) return;
// ###BEGIN###{Mode-NodeWebkit}
var ctext = null;
try { ctext = localStorage.getItem('computers'); } catch (ex) { }
if (ctext) {
try { computerlist = JSON.parse(ctext); } catch (e) {
if (ctext.length > 512) { // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
var crypto = require('crypto'), k = ctext.substring(0, 512), crypted = ctext.substring(512), decipher = crypto.createDecipher('aes-256-ctr', k), dec = decipher.update(crypted, 'hex', 'utf8');
dec += decipher.final('utf8');
try { computerlist = JSON.parse(dec); } catch (e) { computerlist = []; }
var pins = getCertPinnings();
for (var i in computerlist) {
computerlist[i].checked = false;
// Add stored certificate pinning.
if ((computerlist[i]['tlscerthash'] == null) && (pins[computerlist[i]['host']] != null)) { computerlist[i]['tlscerthash'] = pins[computerlist[i]['host']]; }
delete computerlist[i]['tlscert2'];
delete computerlist[i]['tlscerthash2'];
}
}
}
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
var ctext = null;
try { ctext = localStorage.getItem('computers'); } catch (ex) { }
if (ctext) { try { computerlist = JSON.parse(ctext); } catch (e) { computerlist = []; } }
// ###END###{!Mode-NodeWebkit}
updateComputerList();
// ###BEGIN###{ComputerSelectorScanner}
// ###BEGIN###{Mode-NodeWebkit}
globalAmtScanner.performScan();
// ###END###{Mode-NodeWebkit}
// ###END###{ComputerSelectorScanner}
}
// ###END###{ComputerSelector-Local}
function computerConnect(e, h, m, skipPass) {
if (xxdialogMode) return;
// ###BEGIN###{Mode-NodeWebkit}
if ((m == 100) || (e && (e.shiftKey == true))) {
// Launch a new instance of MeshCommander
var adder = '';
// ###BEGIN###{Desktop}
if (m == 1) { adder = '&kvm=1'; }
if (m == 2) { adder = '&kvmfull=1'; }
if (m == 3) { adder = '&kvmonly=1'; }
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (m == 4) { adder = '&sol=1'; }
// ###END###{Terminal}
var username = currentcomputer['user'];
if (username == '') { username = 'admin'; }
require('nw.gui').Window.open(window.location.href + '?host=' + currentcomputer['host'] + '&user=' + username + '&pass=' + currentcomputer['pass'] + '&tls=' + currentcomputer['tls'] + adder, { 'icon': 'favicon.png', 'toolbar': false, 'frame': true, 'width': 970, 'min_width': 970, 'height': 760, 'min_height': 640 });
//require('child_process').exec('nw.exe -host:' + decodeURIComponent(currentcomputer['host']) + ' -user:' + decodeURIComponent(currentcomputer['user']) + ' -pass:' + decodeURIComponent(currentcomputer['pass']) + ((currentcomputer['tls']==1)?' -tls':''), function (error, stdout, stderr) { });
return;
}
// ###END###{Mode-NodeWebkit}
if (e) haltEvent(e);
computerSelect(null, h);
if (currentcomputer == null) return;
if ((currentcomputer['user'] != '*') && (currentcomputer['pass'] == '')) {
if (skipPass === true) { computerConnectLogin(9, m); return; }
// Query for the login password
var x = '<br>Enter the login password for ' + EscapeHtml(currentcomputer['name'] ? currentcomputer['name'] : currentcomputer['host']) + '.<br><br>';
x += '<div style=height:26px><input id=d11connectUser onkeyup=computerConnectUpdateLogin() style=float:right;width:200px value="' + currentcomputer['user'] + '"><div>' + "사용자 이름" + '</div></div>';
x += '<div style=height:26px><input id=d11connectPass onkeyup=computerConnectUpdateLogin(event) type=password style=float:right;width:200px><div>' + "암호" + '</div></div>';
setDialogMode(11, "로그인 자격 증명", 3, computerConnectLogin, x);
Q('d11connectPass').focus();
computerConnectUpdateLogin();
} else {
// Go ahead and connect
computerConnectLogin(0, m);
}
}
function computerConnectUpdateLogin(e) {
var ok = (Q('d11connectUser').value.length > 0) && (passwordcheck(Q('d11connectPass').value));
QE('idx_dlgOkButton', ok);
if ((e != undefined) && (e.keyCode == 13) && (ok == true)) { setDialogMode(0); computerConnectLogin(1, xxdialogTag); }
}
// If the user is prompted for a user/pass, we should not re-prompt after a certificate validation prompt.
var skipPassUser = null;
var skipPassPass = null;
function computerConnectLogin(button, m) {
var user = decodeURIComponent(currentcomputer['user']);
var pass = decodeURIComponent(currentcomputer['pass']);
if (button == 1) { user = Q('d11connectUser').value; pass = Q('d11connectPass').value; }
if (button == 9) { user = skipPassUser; pass = skipPassPass; }
skipPassUser = user;
skipPassPass = pass;
// Go ahead and connect
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
if (user == '') { user = 'admin'; } // Default to admin if not specified.
connect(ports.host, ports.http, user, pass, currentcomputer['tls'], function (mtag) {
// ###BEGIN###{Mode-NodeWebkit}
// If the fingerprint is set but not the certificate, set the cert.
if (wsstack.comm.xtlsCertificate && (currentcomputer['tlscert'] == null) && (wsstack.comm.xtlsFingerprint == currentcomputer['tlscerthash'])) {
currentcomputer['tlscert'] = wsstack.comm.xtlsCertificate.raw.toString('hex');
updateComputerDetails();
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Desktop}
if (mtag == 1) { go(14); connectDesktop(); } // Go directly to remote desktop (1)
if ((mtag == 2) || (mtag == 3)) { connectDesktop(); } // Go remote desktop fullscreen (2) and only remote desktop (3)
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (mtag == 4) { go(13); connectTerminal(); } // Go directly to terminal (4)
// ###END###{Terminal}
}, m);
if (m == 1) { go(14); }
if ((m == 2) || (m == 3)) { go(14); deskToggleFull(m == 3); }
if (m == 4) { go(13); }
}
function computerSelect(e, h) {
if (h && ((currentcomputer == null) || (currentcomputer.h !== h))) { currentcomputer = getComputer(h); updateComputerDetails(); }
for (var y in computerlist) {
var computer = computerlist[y], sel = (currentcomputer != null && computer['h'] == currentcomputer['h']);
QS('CI-' + computer['h'])['background-color'] = sel ? '#a0a0a0' : '#c9c9c9';
Q('LCX-' + computer['h']).classList.remove('g1');
Q('LCX-' + computer['h']).classList.remove('g1s');
Q('RCX-' + computer['h']).classList.remove('g2');
Q('RCX-' + computer['h']).classList.remove('g2s');
Q('LCX-' + computer['h']).classList.add(sel?'g1s':'g1');
Q('RCX-' + computer['h']).classList.add(sel?'g2s':'g2');
}
}
function getComputer(h) { for (var i in computerlist) { if (computerlist[i]['h'] == h) return computerlist[i]; } return null; }
// ###BEGIN###{Scripting}
function mscript_showComputerScriptOutput(h) {
if (xxdialogMode) return;
var computer = getComputer(h);
computer.consoledialog = 'scriptOutputArea';
var name = computer['name'];
if (!name) name = computer['host'];
var v = '<textarea id=scriptOutputArea style=width:100%;height:150px;resize:vertical spellcheck=false readonly></textarea>';
setDialogMode(11, "스크립트 출력-" + name, 5, mscript_showComputerScriptOutputOk, v, computer);
Q('scriptOutputArea').value = EscapeHtml(computer['consolemsgs']);
}
function mscript_showComputerScriptOutputOk(button, computer) {
computer.consoledialog = undefined;
if (button == 2) {
if (computer.scriptstate) {
computer['consolemsgs'] = '';
} else {
delete computer['consolemsgs'];
delete computer['consolemsg'];
}
saveComputers();
updateComputerDetails();
}
}
function mscript_runScriptDlg() {
if (computersRunningScripts > 0) {
// Stop all scripts
for (var y in computerlist) {
var computer = computerlist[y];
if (computer.scriptstate) { computer.scriptstate.stop(); computer.scriptstate = undefined; }
}
updateComputerList();
} else {
// Start a new script dialog box
if (xxdialogMode || scriptstate) return;
var clist = [];
for (var y in computerlist) { if (computerlist[y].checked == true) { clist.push(computerlist[y]); } }
if (clist.length == 0) { clist.push(currentcomputer); }
setDialogMode(11, "스크립트 실행", 3, mscript_runScriptDlgOk, '<br>' + format("{0} 컴퓨터에서 선택된 스크립트를 실행하십시오.", clist.length) + '.<br><br><input id=mscriptopen type=file style=width:100% accept=".mescript">');
}
}
function mscript_runScriptDlgOk(r) {
if (r != 1) return;
var x = Q('mscriptopen');
if (x.files.length != 1) return;
var reader = new FileReader();
reader.onload = mscript_onScriptReadNoPrompt;
reader.readAsBinaryString(x.files[0]);
}
function mscript_onScriptReadNoPrompt(file) { mscript_onScriptRead(file, 1); }
function mscript_onScriptRead(file, noprompt) {
if (computersRunningScripts > 0) return;
var x, clist = [];
try { x = JSON.parse(file.target.result); } catch (e) {}
if (x && x['mescript']) {
onComputerChecked();
for (var y in computerlist) { if (computerlist[y].checked == true) { clist.push(computerlist[y]); } }
if (clist.length == 0) { clist.push(currentcomputer); }
x.clist = clist;
if (noprompt == 1) {
mscript_onScriptReadOk(0, x);
} else {
setDialogMode(11, "스크립트 실행", 3, mscript_onScriptReadOk, format("{0} 컴퓨터에서이 스크립트를 실행 하시겠습니까?", clist.length), x);
}
}
}
function mscript_onScriptReadOk(button, tag) {
var x = tag;
// ###BEGIN###{CertificateManager}
var tlsoptions = {};
// Create a list of trusted certificates in PEM format
var trustedCertStringsPem = [];
for (var y in certificateStore) {
var certificate = certificateStore[y];
if (certificate['trusted'] == true) { trustedCertStringsPem.push('-----BEGIN CERTIFICATE-----\n' + certificate['certbin'] + '\n-----END CERTIFICATE-----\n'); }
}
tlsoptions.ca = trustedCertStringsPem;
// Setup out console TLS authentication certificate
var authcert = getTlsAuthCertificate();
if (authcert != null) {
tlsoptions.cert = forge.pki.certificateToPem(authcert['cert']);
tlsoptions.key = forge.pki.privateKeyToPem(authcert['privateKey']);
}
// ###END###{CertificateManager}
for (var y in x.clist) {
var mscriptstate, computer = x.clist[y], startvars = { '_interactive':0 };
// ###BEGIN###{Certificates}
startvars['_certificates'] = 1;
// ###END###{Certificates}
// ###BEGIN###{Mode-Firmware}
startvars['_mode'] = 'Firmware';
// ###END###{Mode-Firmware}
// ###BEGIN###{Mode-MeshCentral2}
startvars['_mode'] = 'MeshCentral2';
// ###END###{Mode-MeshCentral2}
// ###BEGIN###{Mode-NodeWebkit}
startvars['_mode'] = 'NodeWebkit';
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Mode-LMS}
startvars['_mode'] = 'LMS';
// ###END###{Mode-LMS}
// ###BEGIN###{Mode-WebSite}
startvars['_mode'] = 'WebSite';
// ###END###{Mode-WebSite}
if (x && x['mescript']) mscriptstate = script_setup(atob(x['mescript']), startvars);
if (mscriptstate) {
mscriptstate.computer = computer;
var ports = portsFromHost(computer['host'], computer['tls']);
// ###BEGIN###{CertificateManager}
mscriptstate.wsstack = WsmanStackCreateService(ports.host, ports.http, decodeURIComponent(computer['user']), decodeURIComponent(computer['pass']), computer['tls'], tlsoptions);
// ###END###{CertificateManager}
// ###BEGIN###{!CertificateManager}
mscriptstate.wsstack = WsmanStackCreateService(ports.host, ports.http, decodeURIComponent(computer['user']), decodeURIComponent(computer['pass']), computer['tls']);
// ###END###{!CertificateManager}
mscriptstate.amtstack = AmtStackCreateService(mscriptstate.wsstack);
mscriptstate.onStep = mscript_updateScriptState;
mscriptstate.onConsole = mscript_console;
// Setup TLS checking
// ###BEGIN###{Mode-NodeWebkit}
if (NW_TlsSecurityMode == 0) { mscriptstate.wsstack.comm.xtlsFingerprint = 0; }
else { mscriptstate.wsstack.comm.xtlsFingerprint = computer['tlscerthash'] ? computer['tlscerthash'] : computer['tlscerthash2']; }
// ###END###{Mode-NodeWebkit}
computer['consolemsg'] = '';
computer['consolemsgs'] = '';
computer.scriptstate = mscriptstate;
computer.scriptstate.start(100);
} else {
messagebox("스크립트 실행", "잘못된 스크립트 파일입니다.")
return;
}
}
updateComputerList();
}
function mscript_updateScriptState(scriptstate) {
if (scriptstate.state == 0) { scriptstate.computer.scriptstate = undefined; updateComputerList(); }
}
function mscript_console(msg, scriptstate) {
scriptstate.computer['consolemsg'] = msg;
scriptstate.computer['consolemsgs'] += (msg + '\r\n');
if (scriptstate.computer.consoledialog) { Q(scriptstate.computer.consoledialog).value = scriptstate.computer['consolemsgs']; }
QH('XI-' + scriptstate.computer['h'], msg);
}
function computerStopScript(e, h) {
var computer = getComputer(h);
if (computer.scriptstate) { computer.scriptstate.stop(); computer.scriptstate = undefined; }
updateComputerList();
}
// ###END###{Scripting}
//
// MeshCentral Connection
//
// ###BEGIN###{MeshServerConnect}
function showMeshCentralConnectDialog(showtoken) {
if (xxdialogMode || meshCentralServer) return;
var x = '<img src=\'images-commander/meshcentral50.png\' style=width:50px;height:50px;float:right></img><div>' + "Connect to a MeshCentral server and manage Intel&reg; AMT computers on that account." + '<div><br style=clear:both />';
x += '<div style=height:26px><input id=meshserverurl value="" placeholder="sample.server.com:443" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "서버 이름" + '</div></div>';
x += '<div style=height:26px><input id=meshserverhash value="" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "인증서 해시" + '</div></div>';
x += '<div style=height:26px><input id=meshserveruser value="" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "사용자 이름" + '</div></div>';
x += '<div style=height:26px><input id=meshserverpass value="" type=password style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "암호" + '</div></div>';
if (showtoken) { x += '<div style=height:26px><input id=meshservertoken value="" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "로그인 토큰" + '</div></div>'; }
//x += '<div style=height:26px><input id=meshserverproxy value="" placeholder="proxy.com:123" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Proxy" + '</div></div>';
setDialogMode(11, "MeshCentral Connect", 3, showMeshCentralConnectDialogOk, x);
try {
if (localStorage.getItem('meshserverurl')) { Q('meshserverurl').value = localStorage.getItem('meshserverurl'); }
if (localStorage.getItem('meshserverhash')) { Q('meshserverhash').value = localStorage.getItem('meshserverhash'); }
if (localStorage.getItem('meshserveruser')) { Q('meshserveruser').value = localStorage.getItem('meshserveruser'); }
//if (localStorage.getItem('meshserverproxy')) { Q('meshserverproxy').value = localStorage.getItem('meshserverproxy'); }
} catch (ex) { }
showMeshCentralConnectDialogUpdate();
}
function showMeshCentralConnectDialogUpdate() {
QS('meshserverurl')['background-color'] = ((Q('meshserverurl').value.length > 0) ? 'white' : 'LightYellow');
QS('meshserveruser')['background-color'] = ((Q('meshserveruser').value.length > 0) ? 'white' : 'LightYellow');
QS('meshserverpass')['background-color'] = ((Q('meshserverpass').value.length > 0) ? 'white' : 'LightYellow');
var token = true;
try { token = (Q('meshservertoken').value.length > 0); } catch (ex) { }
QE('idx_dlgOkButton', token && (Q('meshserverurl').value.length > 0) && (Q('meshserveruser').value.length > 0) && (Q('meshserverpass').value.length > 0));
}
function showMeshCentralConnectDialogOk() {
try {
localStorage.setItem('meshserverurl', Q('meshserverurl').value);
localStorage.setItem('meshserverhash', Q('meshserverhash').value);
localStorage.setItem('meshserveruser', Q('meshserveruser').value);
} catch (ex) { }
var pass = Q('meshserverpass').value;
var token = null;
try { token = Q('meshservertoken').value; } catch (ex) { }
//try { localStorage.setItem('meshserverproxy', Q('meshserverproxy').value); } catch (ex) { }
var serverUrl = Q('meshserverurl').value;
if (serverUrl.indexOf('://') < 0) { serverUrl = ('wss://' + serverUrl); }
serverUrl = new URL(serverUrl);
var serverPort = parseInt(serverUrl.port);
if (isNaN(serverPort) || serverPort == 0) { serverPort = 443; }
meshCentralServer = CreateMeshCentralServer(serverUrl.hostname, serverPort, '/control.ashx', Q('meshserveruser').value, Q('meshserverpass').value, token, Q('meshserverhash').value);
meshCentralServer.onStateChange = function (sender, state, cause, msg) {
var askForToken = false;
if (state == 0) {
// Disconnected
loadComputers();
// If the connection failed due to hash mismatch, prompt the user.
disconnect();
QH('id_computername', format("원격 관리 콘솔 v{0}", version));
if (cause == 'HashMatchFail') { showTlsCert(3, "인식 할 수없는 인증서로 MeshCentral 서버에 연결되었습니다. 확인을 클릭하여 수락하고 연결하십시오.", meshCentralServer.xtlsCertificate, meshCentralServer.password, meshCentralHashRetry); }
else if ((cause == 'noauth') && (msg == 'tokenrequired')) { askForToken = true; }
else if (cause == 'noauth') { setDialogMode(11, "MeshCentral 연결", 1, null, "잘못된 사용자 이름 또는 비밀번호입니다."); }
meshCentralServer = null;
} else if (state == 1) {
// Connecting
currentcomputer = null;
computerlist = [];
QH('id_computername', 'Remote Management Console v' + version + ', Connecting to ' + meshCentralServer.host + '...');
} else if (state == 3) {
// Connected
currentcomputer = null;
computerlist = meshCentralServer.computerlist;
meshCentralServer.xconnected = true;
QH('id_computername', 'Remote Management Console v' + version + ', Server: ' + meshCentralServer.host);
}
updateComputerList();
NW_SetupMainMenu(currentView);
if (askForToken) {
// Ask for 2-factor token and try again
showMeshCentralConnectDialog(true);
Q('meshserverpass').value = pass;
Q('meshservertoken').focus();
showMeshCentralConnectDialogUpdate();
}
}
meshCentralServer.onNodeChange = function (sender, node) {
//computerlist = meshCentralServer.computerlist;
updateComputerList();
}
setDialogMode(0);
meshCentralServer.connect();
}
// The user accepted the MeshCentral server hash, set it and try to connect again.
function meshCentralHashRetry(b, args) {
try { localStorage.setItem('meshserverhash', args.c.fingerprint.split(':').join('').toLowerCase()); } catch (ex) { }
showMeshCentralConnectDialog();
Q('meshserverpass').value = args.m; // Set the retry password
showMeshCentralConnectDialogOk();
}
function meshCentralDisconnect() {
if (meshCentralServer == null) return;
meshCentralServer.disconnect();
meshCentralServer = null;
currentcomputer = null;
updateComputerList();
}
// ###END###{MeshServerConnect}
// ###BEGIN###{ComputerSelectorScanner}
// ###BEGIN###{Mode-NodeWebkit}
//
// Network scan
//
var globalAmtScanner = CreateAmtScanner(amtScanChangePresence);
var globalAmtScannerResults = null;
function showScanDialog() {
if (xxdialogMode) return;
var x = "Intel AMT 장치를 검색 할 IP 주소 범위를 입력하십시오." + '<br /><br />';
x += '<div style=height:20px><div style=float:right;width:260px;overflow:hidden><input id=idx_iprange style=width:204px placeholder="192.168.0.0/16" onkeyup=showScanDialogUpdate()></input><input id=idx_iprangebutton type=button value=Scan onclick=amtScanStartScan()></input></b></div><div>' + "IP 범위" + '</div></div>';
x += '<br /><div id=idx_results style="width:100%;height:200px;background-color:white;border:1px gray solid;overflow-y:scroll"></div>';
setDialogMode(11, "인텔 &reg; AMT 장치 검색", 3, showScanDialogOk, x);
QH('idx_results', '<div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>' + "샘플 IP 범위 값" + '<br />192.168.0.100<br />192.168.0.0/16<br />192.168.0.1-192.168.0.100</div>');
try { Q('idx_iprange').value = localStorage.getItem('scanrange'); } catch (ex) { }
showScanDialogUpdate();
}
function showScanDialogUpdate() {
QS('idx_iprange')['background-color'] = ((Q('idx_iprange').value.length > 0) ? 'white' : 'LightYellow');
QE('idx_iprangebutton', Q('idx_iprange').value.length > 0);
amtScanCheckbox();
}
// Populate the Intel AMT scan dialog box with the result of the RMCP scan
function amtScanResult(scanner, result) {
if ((xxdialogMode == undefined) || (!Q('idx_iprange'))) return;
if (result == null) {
// If no results where found, display a nice message
QH('idx_results', '<div style=width:100%;text-align:center;margin-top:12px>Scan returned no results.</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.0.0/16<br />192.167.0.1-192.168.0.100</div>');
} else {
// Add the new result to the scan results dialog box
var x = '', str = '<b>' + result.rinfo.address + '</b> - v' + result.ver;
if (globalAmtScannerResults == null) { globalAmtScannerResults = {}; QH('idx_results', ''); }
globalAmtScannerResults[result.rinfo.address] = result;
if (result.state == 2) { if (result.tls == 1) { str += ' with TLS.'; } else { str += ' without TLS.'; } } else { str += ' not activated.'; }
x += '<div style=margin-bottom:2px>';
x += '<div class=j1 style=height:24px;float:left;background-color:white></div>';
x += '<div class=g1 style=height:24px;float:left></div><div class=g2 style=height:24px;float:right></div><div style=height:24px;width:100%;background-color:#c9c9c9><div><div style=display:inline-block;margin-right:5px><input class=DevScanCheckbox tag="' + result.rinfo.address + '" type=checkbox onclick=amtScanCheckbox() /></div><div style=display:inline-block;margin-left:5px>' + str + '</div></div></div></div>';
QA('idx_results', x);
}
}
function amtScanStartScan() {
var ip_range = Q('idx_iprange').value;
try { localStorage.setItem('scanrange', ip_range); } catch (ex) { }
globalAmtScannerResults = null;
if (globalAmtScanner.performRangeScan('1', ip_range, amtScanResult) == false) {
// The scan could not occur because of an error. Likely the user range was invalid.
x = '<div style=width:100%;text-align:center;margin-top:12px>' + "이 주소 범위를 스캔 할 수 없습니다." + '</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>' + "샘플 IP 범위 값" + '<br />192.168.0.100<br />192.168.0.0/16<br />192.167.0.1-192.168.0.100</div>';
} else {
// Show scanning...
QH('idx_results', '<div style=width:100%;text-align:center;margin-top:12px>' + "스캐닝..." + '</div>');
}
}
// Called when a scanned computer is checked or unchecked.
function amtScanCheckbox() {
var elements = document.getElementsByClassName('DevScanCheckbox'), checkcount = 0;
for (var i in elements) { if (elements[i].checked) checkcount++; }
QE('idx_dlgOkButton', checkcount > 0);
}
// Called when the OK button is pressed on the scan dialog
function showScanDialogOk() {
var elements = document.getElementsByClassName('DevScanCheckbox');
for (var i in elements) {
if (elements[i].checked) {
var ipaddr = elements[i].getAttribute('tag');
var result = globalAmtScannerResults[ipaddr];
computerlist.push({ 'h': Math.random(), 'name': ipaddr, 'host': ipaddr, 'tags': '', 'user': 'admin', 'pass': '', 'tls': result.tls, 'ver': result.ver });
}
saveComputers();
updateComputerList();
}
}
// Called by the scanner to change Intel AMT presense state
function amtScanChangePresence(h, presence) {
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) return;
// ###END###{MeshServerConnect}
var element = Q('SS-' + h);
if (element) { element.style['background-color'] = presence ? 'green' : 'red'; }
// ###BEGIN###{Look-Commander}
if (presence) { Q('SI-' + h).classList.remove('gray'); } else { Q('SI-' + h).classList.add('gray'); }
// ###END###{Look-Commander}
// If the computer that was updated is the current computer, update the details.
if (currentcomputer && (currentcomputer.h == h)) { updateComputerDetails(); }
}
// Called when used clicks the "Scan for presense" menu option
function NW_AmtScanMenu() {
try { localStorage.setItem('scanForComputers', NW_AmtScanMenuItem.checked); } catch (ex) { }
if (NW_AmtScanMenuItem.checked == true) { globalAmtScanner.start(); } else { globalAmtScanner.stop(); }
updateComputerList();
}
// ###END###{Mode-NodeWebkit}
// ###END###{ComputerSelectorScanner}
// ###END###{ComputerSelector}
// ###BEGIN###{ContextMenus}
function handleContextMenu(e) {
hideContextMenu();
if (xxdialogMode) return;
// ###BEGIN###{ComputerSelector}
toolmenuclick(-1);
// ###END###{ComputerSelector}
var cm = document.elementFromPoint(e.pageX, e.pageY);
while (cm && cm != null && cm.getAttribute('cm') == null) { cm = cm.parentElement; }
if (cm && cm != null && cm.getAttribute('cm') != null) {
var x = '', menus = cm.getAttribute('cm').split('|');
if (cm.getAttribute('class') == 'computeritem') cm.click();
for (var i in menus) {
if (menus[i] == '-') {
x += '<hr style="border:1px solid lightgray" />';
} else {
var menus2 = menus[i].split('#');
x += '<div class=cmtext onclick=\"hideContextMenu();' + menus2[1] + '\"><b>' + menus2[0] + '</b></div>';
}
}
QS('contextMenu').top = e.pageY + 'px';
QS('contextMenu').left = e.pageX + 'px';
QH('contextMenu', x);
QV('contextMenu', true);
haltEvent(e);
return false;
}
}
function hideContextMenu() { QV('contextMenu', false); }
// ###END###{ContextMenus}
//
// BOTTOM INFORMATION STRING
//
// ###BEGIN###{VersionWarning}
// Returns true if Intel AMT needs to be updated
function checkAmtVersion(version) {
var vSplit = version.split('.');
var v1 = parseInt(vSplit[0]);
var v2 = parseInt(vSplit[1]);
var v3 = parseInt(vSplit[2]);
var vx = ((v2 * 1000) + v3);
var ok = 0;
if ((v1 <= 5) || (v1 >= 12)) { ok = 1; } // Intel AMT less then v5 and v12 and beyond, all ok.
else if ((v1 == 6) && (vx >= 2061)) { ok = 1; } // 1st Gen Core
else if ((v1 == 7) && (vx >= 1091)) { ok = 1; } // 2st Gen Core
else if ((v1 == 8) && (vx >= 1071)) { ok = 1; } // 3st Gen Core
else if ((v1 == 9)) { if ((v2 < 5) && (vx >= 1041)) { ok = 1; } else if (vx >= 5061) { ok = 1; } } // 4st Gen Core
else if ((v1 == 10) && (vx >= 55)) { ok = 1; } // 5st Gen Core
else if (v1 == 11) {
if ((v2 < 5) && (vx >= 25)) { ok = 1; } // 6st Gen Core
else if (vx >= 6027) { ok = 1; } // 7st Gen Core
}
return (ok == 0);
}
// ###END###{VersionWarning}
function processSystemVersion(stack, name, responses, status) {
if (status == 200 || status == 400) {
var v;
if (status == 200) {
//amtlogicalelements = responses;
amtlogicalelements = [];
if (responses != null) {
if (responses['CIM_SoftwareIdentity'] != null && responses['CIM_SoftwareIdentity'].responses != null) {
amtlogicalelements = responses['CIM_SoftwareIdentity'].responses;
if (responses['AMT_SetupAndConfigurationService'] != null && responses['AMT_SetupAndConfigurationService'].response != null) {
amtlogicalelements.push(responses['AMT_SetupAndConfigurationService'].response);
}
}
}
if (amtlogicalelements.length == 0) { console.error('ERROR: Could not get Intel AMT version.'); disconnect(); return; } // Could not get Intel AMT version, disconnect();
v = getInstance(amtlogicalelements, 'AMT')['VersionString'];
} else {
v = stack.wsman.comm.amtVersion;
if (!v) { errcheck(400, stack); return; }
}
amtversion = parseInt(v.split('.')[0]);
amtversionmin = parseInt(v.split('.')[1]);
// If this is Intel AMT 16 or higher, boost the stack speed by allowing HTTP pipelining.
//if (amtversion > 15) {
//stack.MaxActiveEnumsCount = 2;
//stack.wsman.comm.MaxActiveAjaxCount = 2;
//}
// ###BEGIN###{Mode-NodeWebkit}
// Perform Intel ME authentication if available.
if ((amtversion >= 15) && (wsstack.comm.xtlsCertificate != null)) {
stack.amtauthnonce = require('crypto').randomBytes(20).toString('base64');
stack.AMT_GeneralSettings_AMTAuthenticate(stack.amtauthnonce, function (stack, name, response, status) {
//console.log('AMTAuthenticate', status, response);
//status = 200;
//response = JSON.parse('{"Header":{"To":"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous","RelatesTo":"15","Action":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings/AMTAuthenticateResponse","MessageID":"uuid:00000000-8086-8086-8086-00000000008E","ResourceURI":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings","Method":"AMTAuthenticate"},"Body":{"Nonce":"s5PzXOyJqlPwnE/FJ1Imk2tLc2s=","UUID":"465A544C39335830B0304A51465A544C","FQDN":"","FWVersion":"15.0.10.7000","AMTSVN":1,"Signature":"cT4DpT2VpDi0jq+3tIswntXIIitCQV6QxMbXMZryob7RYRyazW9YFKrX5nfu0tPpTqLEP9P+C8pVT4ZngU1TIrn2ptVw/xCKmOn56Y62U0Gv+fQSG1+AJFRej+W7Clv4","LengthOfCertificates":[602,638,631,708],"Certificates":"MIICVjCCAd2gAwIBAgIQSsxzEcw7W5elVuRWfkbN1zAKBggqhkjOPQQDAzAeMRwwGgYDVQQDDBNDU01FIFRHTCBBTVQgIDAxU0RFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowFTETMBEGA1UEAwwKQU1UIFdTLU1BTjB2MBAGByqGSM49AgEGBSuBBAAiA2IABOiUImnj9foD828QWknCF47SuIhwKn+AzhcgPz7IaUb/Z9KTPn57VfxahHBObijKRodtcxao0Jip/0sM3wbXkHvF03BLdxP6/ab5uMYLH+ZDjdlwC69qkjQtXciIzml8u6OB6DCB5TAfBgNVHSMEGDAWgBS4jxQZFu/qvArLmfxFoa+HO3ZPhjAPBgNVHRMBAf8EBTADAQEAMA4GA1UdDwEB/wQEAwIGgDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDZwAwZAIwMlkcpHt5ydDt2hmnF+pJxLzH6oF3K2XPviuudyQ8DtHfuziWXgI7t2KS/Y5tOFEAAjBxLW0MkEcpDlsKNS0ASNxOhi6neEEQaxT93EJh3J/Z0SU8qYdE2/qtfe087XhCvlowggJ6MIICAaADAgECAgUBBBwAIDAKBggqhkjOPQQDAzAjMSEwHwYDVQQDDBhDU01FIFRHTCBTVk4wMSBLZXJuZWwgREUwHhcNMjAwNzIzMDAwMDAwWhcNNDkxMjMxMjM1OTU5WjAeMRwwGgYDVQQDDBNDU01FIFRHTCBBTVQgIDAxU0RFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES/XBgK8rDlDycUzCocI1TrrrcQzD2Okq2BJhfqSg6MKxRMyei903Ewl94yl+tFsWoLuPiZDVE/bfxJghTynuGxk38YI8Qn8L3mPL+ahh3tSxWxC3kdszrU9dgObLF+2Io4IBCDCCAQQwHwYDVR0jBBgwFoAUzxraD/dMy5Zf2FiUKGctnPWwk30wHQYDVR0OBBYEFLiPFBkW7+q8CsuZ/EWhr4c7dk+GMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMIGgBgNVHR8EgZgwgZUwgZKgSqBIhkZodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jcmxzL09uRGllX0NBX0NTTUVfSW5kaXJlY3QuY3JsokSkQjBAMSYwJAYDVQQLDB1PbkRpZSBDQSBDU01FIEludGVybWVkaWF0ZSBDQTEWMBQGA1UEAwwNd3d3LmludGVsLmNvbTAKBggqhkjOPQQDAwNnADBkAjBiU4sHamrnSkvkwpTbVJah30CSGycVSwlUCUnXxFBFcCmXQeuXdElJiXhZyO5CQf8CMBxnQghoKlmUCKhzEYHjDMdXAKJcIapz6ksRDuYycxOlEpyBjei5tU5Nq16qDdt0njCCAnMwggH5oAMCAQICAQEwCgYIKoZIzj0EAwMwGjEYMBYGA1UEAwwPQ1NNRSBUR0wgUk9NIERFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowIzEhMB8GA1UEAwwYQ1NNRSBUR0wgU1ZOMDEgS2VybmVsIERFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtfPOoxER7WKkOQQFPnDBikHOrIkNZA1si7sFV1Y1tSBF4HCCl0BfXo5GqsOxzwJ2JcJLiP16ZP3rMcOOpufVLwPwN/0jmP1/KDeANgmwGLLvjAuHfx/KRU3MqkDdSLbfo4IBCDCCAQQwHwYDVR0jBBgwFoAUsd+j/J4YMaOrY0I0x9dKYND8mMQwHQYDVR0OBBYEFM8a2g/3TMuWX9hYlChnLZz1sJN9MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgKsMIGgBgNVHR8EgZgwgZUwgZKgSqBIhkZodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jcmxzL09uRGllX0NBX0NTTUVfSW5kaXJlY3QuY3JsokSkQjBAMSYwJAYDVQQLDB1PbkRpZSBDQSBDU01FIEludGVybWVkaWF0ZSBDQTEWMBQGA1UEAwwNd3d3LmludGVsLmNvbTAKBggqhkjOPQQDAwNoADBlAjB0WjT9RuE7v+dm2EM2uf7uZ3Pv3KAKZzBkpvokIbuO1qE3FS36mf3kKfl58hMhfosCMQD4NyxKd28cm9ZfW7eOEetEwXXDgCtq+rfzCXbJWDQvkYpnS4LPxIXxEsiN6/scTH0wggLAMIICRqADAgECAhBAAAAAAAAAAAAAAAAAAAAAMAoGCCqGSM49BAMDMEgxLjAsBgNVBAsMJU9uIERpZSBDU01FIERfVEdMIERFQlVHMDAwIElzc3VpbmcgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wHhcNMTkwMTAxMDAwMDAwWhcNNDkxMjMxMjM1OTU5WjAaMRgwFgYDVQQDDA9DU01FIFRHTCBST00gREUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQ4g65/2ziA9osYJXOdQ81/PobyJmcTqSU8CMcVk3OyWhGjaczREvl+DvZpd5+2CYAxSr3ItlK5Jn3z1xG4mwHRzH0FFdu7Ooxf7kSH5dXnSO7hv6q/y97+KTy6odfzRuqjggEhMIIBHTAfBgNVHSMEGDAWgBQ7McrVw0uS10jI/ZKqda6dMkoGQjAdBgNVHQ4EFgQUsd+j/J4YMaOrY0I0x9dKYND8mMQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAa4wYgYIKwYBBQUHAQEEVjBUMFIGCCsGAQUFBzAChkZodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jZXJ0cy9UR0xfREVCVUcwMDBfT25EaWVfQ0EuY2VyMFYGA1UdHwRPME0wS6BJoEeGRWh0dHBzOi8vdHNERS5pbnRlbC5jb20vY29udGVudC9PbkRpZUNBL2NybHMvVEdMX0RFQlVHMDAwX09uRGllX0NBLmNybDAKBggqhkjOPQQDAwNoADBlAjAjX8BHXjQGsr1uqkCDdqRRzT2yQNLU4i85H+mJboRaAB2h09mISKagGU0m3DXywmICMQDmTjjpPjCJye9m2u/csfkUAn7rP1FLmdJHtT9qN968CACWQQ356e8s3XgNpNtexJU=","ReturnValue":0,"ReturnValueStr":"SUCCESS"}}'); // Sample Response 1
//response = JSON.parse('{"Header":{"To":"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous","RelatesTo":"15","Action":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings/AMTAuthenticateResponse","MessageID":"uuid:00000000-8086-8086-8086-0000000000F8","ResourceURI":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings","Method":"AMTAuthenticate"},"Body":{"Nonce":"NlfyHfo322EtefP1q5s92K+szBw=","UUID":"465A544C39335830B0304A51465A544C","FQDN":"","FWVersion":"15.0.10.7000","AMTSVN":1,"Signature":"9jBx0HfvNECPrMrg16px2RGDu/qdgrUyguOamlJ5hpiYgt9ZPrMz6/WgYY5nbnT6zBxSTUP+AqEzcmA6oWunYHZQJprY9iDdew4PPIHWqGZGgqh/10m3aYHwy+TKk/Ab","LengthOfCertificates":[603,638,631,708],"Certificates":"MIICVzCCAd2gAwIBAgIQSsxzEcw7W5elVuRWfkbN1zAKBggqhkjOPQQDAzAeMRwwGgYDVQQDDBNDU01FIFRHTCBBTVQgIDAxU0RFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowFTETMBEGA1UEAwwKQU1UIFdTLU1BTjB2MBAGByqGSM49AgEGBSuBBAAiA2IABOiUImnj9foD828QWknCF47SuIhwKn+AzhcgPz7IaUb/Z9KTPn57VfxahHBObijKRodtcxao0Jip/0sM3wbXkHvF03BLdxP6/ab5uMYLH+ZDjdlwC69qkjQtXciIzml8u6OB6DCB5TAfBgNVHSMEGDAWgBS4jxQZFu/qvArLmfxFoa+HO3ZPhjAPBgNVHRMBAf8EBTADAQEAMA4GA1UdDwEB/wQEAwIGgDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDaAAwZQIwYCfw7GuUi9XxfBfhO/LYUbSb3pd65tkpRSLjIhsj9uMG9DFbMVUy9aicvZt7NYwXAjEAtAdHvcmoI/fZfw2Mo7TooojLe+xfHzZ5NyZyVlPaVyya25K/3kE05gvQO1jvk/ZcMIICejCCAgGgAwIBAgIFAQQcACAwCgYIKoZIzj0EAwMwIzEhMB8GA1UEAwwYQ1NNRSBUR0wgU1ZOMDEgS2VybmVsIERFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQ1NNRSBUR0wgQU1UICAwMVNERTB2MBAGByqGSM49AgEGBSuBBAAiA2IABEv1wYCvKw5Q8nFMwqHCNU6663EMw9jpKtgSYX6koOjCsUTMnovdNxMJfeMpfrRbFqC7j4mQ1RP238SYIU8p7hsZN/GCPEJ/C95jy/moYd7UsVsQt5HbM61PXYDmyxftiKOCAQgwggEEMB8GA1UdIwQYMBaAFM8a2g/3TMuWX9hYlChnLZz1sJN9MB0GA1UdDgQWBBS4jxQZFu/qvArLmfxFoa+HO3ZPhjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwICBDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDZwAwZAIwYlOLB2pq50pL5MKU21SWod9AkhsnFUsJVAlJ18RQRXApl0Hrl3RJSYl4WcjuQkH/AjAcZ0IIaCpZlAiocxGB4wzHVwCiXCGqc+pLEQ7mMnMTpRKcgY3oubVOTateqg3bdJ4wggJzMIIB+aADAgECAgEBMAoGCCqGSM49BAMDMBoxGDAWBgNVBAMMD0NTTUUgVEdMIFJPTSBERTAeFw0yMDA3MjMwMDAwMDBaFw00OTEyMzEyMzU5NTlaMCMxITAfBgNVBAMMGENTTUUgVEdMIFNWTjAxIEtlcm5lbCBERTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLXzzqMREe1ipDkEBT5wwYpBzqyJDWQNbIu7BVdWNbUgReBwgpdAX16ORqrDsc8CdiXCS4j9emT96zHDjqbn1S8D8Df9I5j9fyg3gDYJsBiy74wLh38fykVNzKpA3Ui236OCAQgwggEEMB8GA1UdIwQYMBaAFLHfo/yeGDGjq2NCNMfXSmDQ/JjEMB0GA1UdDgQWBBTPGtoP90zLll/YWJQoZy2c9bCTfTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwICrDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDaAAwZQIwdFo0/UbhO7/nZthDNrn+7mdz79ygCmcwZKb6JCG7jtahNxUt+pn95Cn5efITIX6LAjEA+DcsSndvHJvWX1u3jhHrRMF1w4Aravq38wl2yVg0L5GKZ0uCz8SF8RLIjev7HEx9MIICwDCCAkagAwIBAgIQQAAAAAAAAAAAAAAAAAAAADAKBggqhkjOPQQDAzBIMS4wLAYDVQQLDCVPbiBEaWUgQ1NNRSBEX1RHTCBERUJVRzAwMCBJc3N1aW5nIENBMRYwFAYDVQQDDA13d3cuaW50ZWwuY29tMB4XDTE5MDEwMTAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowGjEYMBYGA1UEAwwPQ1NNRSBUR0wgUk9NIERFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOIOuf9s4gPaLGCVznUPNfz6G8iZnE6klPAjHFZNzsloRo2nM0RL5fg72aXeftgmAMUq9yLZSuSZ989cRuJsB0cx9BRXbuzqMX+5Eh+XV50ju4b+qv8ve/ik8uqHX80bqo4IBITCCAR0wHwYDVR0jBBgwFoAUOzHK1cNLktdIyP2SqnWunTJKBkIwHQYDVR0OBBYEFLHfo/yeGDGjq2NCNMfXSmDQ/JjEMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGuMGIGCCsGAQUFBwEBBFYwVDBSBggrBgEFBQcwAoZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY2VydHMvVEdMX0RFQlVHMDAwX09uRGllX0NBLmNlcjBWBgNVHR8ETzBNMEugSaBHhkVodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jcmxzL1RHTF9ERUJVRzAwMF9PbkRpZV9DQS5jcmwwCgYIKoZIzj0EAwMDaAAwZQIwI1/AR140BrK9bqpAg3akUc09skDS1OIvOR/piW6EWgAdodPZiEimoBlNJtw18sJiAjEA5k446T4wicnvZtrv3LH5FAJ+6z9RS5nSR7U/ajfevAgAlkEN+envLN14DaTbXsSV","ReturnValue":0,"ReturnValueStr":"SUCCESS"}}'); // Sample Response 2
if (status == 200) {
stack.amtauth = response.Body;
stack.amtauth.CertificatesDer = [];
var certs = [], urlList = [], certsbin = atob(stack.amtauth.Certificates), cptr = 0;
for (var i = 0; i < stack.amtauth.LengthOfCertificates.length; i++) {
var bin = certsbin.substring(cptr, cptr + stack.amtauth.LengthOfCertificates[i]);
stack.amtauth.CertificatesDer.push(bin);
var cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(bin)); // Node-forge does not support ECC, but we are using a modified Node-forge that can still parse the cert.
cert.xCrlUrls = getExtensionUrls(cert, 'cRLDistributionPoints');
cert.xParentUrls = getExtensionUrls(cert, { id: '1.3.6.1.5.5.7.1.1' });
cert.xFingerprint = forge.md.sha256.create().update(bin).digest().toHex().toUpperCase();
cptr += stack.amtauth.LengthOfCertificates[i];
certs.push(cert);
if ((cert.xCrlUrls.length > 0) && (urlList.indexOf(cert.xCrlUrls[0]) == -1)) { urlList.push(cert.xCrlUrls[0]); }
}
// If the top certificate has a parent URL, add it to the list of URL's to fetch.
if ((certs.length > 0) && (certs[certs.length - 1].xParentUrls.length > 0) && (urlList.indexOf(certs[certs.length - 1].xParentUrls[0]) == -1)) {
urlList.push(certs[certs.length - 1].xParentUrls[0]);
}
stack.amtauth.Certificates = certs;
stack.amtauth.ClientNonce = stack.amtauthnonce;
delete stack.amtauth.LengthOfCertificates;
stack.amtauth.uuidStr = guidToStr(stack.amtauth.UUID).toLowerCase();
var trustedCsmeRoots = [
'3BA13766B1889DCB1E2D55BACCC9EC087452F78783E2EBAFD918FF4ED6ACC840', // www.intel.com / OnDie CA DEBUG Root Cert Signing CA
'C001DF02B31A60A2B37130365956400A2AFCFD147E8552FD7EA3F17F2AB0D457', // www.intel.com / ODCA CA2 CSME Intermediate CA
'5E3EEE5748AC13E0B3D1227FCDC4751AA1402DDE8031D21F63CB4ECF43F02440' // www.intel.com / OnDie CA CSME Intermediate CA
];
// Load the entire certificate chain and CRL's
var urlLoad = function (url, data) {
if (data == null) return;
for (var j in certs) {
if ((certs[j].xCrlUrls.length > 0) && (certs[j].xCrlUrls[0] == url)) { certs[j].xCrl = data; }
if ((j == (certs.length - 1)) && (certs[j].xParentUrls.length > 0) && (certs[j].xParentUrls[0] == url)) {
var xcert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(data)); // Node-forge does not support ECC, but we are using a modified Node-forge that can still parse the cert.
xcert.xCrlUrls = getExtensionUrls(xcert, 'cRLDistributionPoints');
xcert.xParentUrls = getExtensionUrls(xcert, { id: '1.3.6.1.5.5.7.1.1' });
xcert.xFingerprint = forge.md.sha256.create().update(data).digest().toHex().toUpperCase();
if (trustedCsmeRoots.indexOf(xcert.xFingerprint) >= 0) { xcert.xTrusted = true; }
certs.push(xcert);
stack.amtauth.CertificatesDer.push(data);
if ((xcert.xCrlUrls.length > 0) && (urlList.indexOf(xcert.xCrlUrls[0]) == -1)) { getCertUrl(xcert.xCrlUrls[0], urlLoad); }
if ((xcert.xParentUrls.length > 0) && (urlList.indexOf(xcert.xParentUrls[0]) == -1)) { urlList.push(xcert.xParentUrls[0]); getCertUrl(xcert.xParentUrls[0], urlLoad); }
return;
}
}
}
for (var i in urlList) { getCertUrl(urlList[i], urlLoad); }
} else {
console.log('AMTAuthenticate', status, response);
}
delete stack.amtauthnonce;
});
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{ComputerSelector}
if (stack.wsman.comm.digestRealm && (currentcomputer['digestrealm'] != stack.wsman.comm.digestRealm)) {
currentcomputer['digestrealm'] = stack.wsman.comm.digestRealm;
// ###BEGIN###{ComputerSelector-Local}
saveComputers();
// ###END###{ComputerSelector-Local}
updateComputerDetails();
}
// ###END###{ComputerSelector}
// ###BEGIN###{VersionWarning}
QV('id_versionWarning', checkAmtVersion(v));
// ###END###{VersionWarning}
// ###BEGIN###{!Mode-Firmware}
//if (amtversion > 10) { wsstack.comm.MaxActiveAjaxCount = 4; amtstack.MaxActiveEnumsCount = 1; console.log('HTTP Pipelining activated'); } // With Intel AMT 11 and higher, use HTTP pipelining.
// ###END###{!Mode-Firmware}
PullSystemStatus();
updateSystemStatus();
// Perform loads more WSMAN only if needed
if ((urlvars['kvmonly'] != 1) && (fullscreenonly == false)) {
PullUserInfo();
// ###BEGIN###{Alarms}
if (amtversion >= 8) PullAlarms();
// ###END###{Alarms}
}
// ###BEGIN###{Mode-NodeWebkit}
if (wsstack.comm.getPeerCertificate() != null) {
QV('tlsNotification1', wsstack.comm.xtlsCheck == 1);
QV('tlsNotification2', wsstack.comm.xtlsCheck == 2);
QV('tlsNotification3', wsstack.comm.xtlsCheck == 3);
}
if (currentcomputer['tlscerthash2']) delete currentcomputer['tlscerthash2'];
if (currentcomputer['tlscert2']) delete currentcomputer['tlscert2'];
// ###END###{Mode-NodeWebkit}
// Connection callback
if (connectFunc) { connectFunc(connectFuncTag); connectFunc = null; connectFuncTag = null; }
// ###BEGIN###{Desktop}
if (urlvars['kvm'] == 1) { go(14); connectDesktop(); }
if ((urlvars['kvmfull'] == 1) || (urlvars['kvmonly'] == 1)) { go(14); connectDesktop(); }
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (urlvars['sol'] == 1) { go(13); connectTerminal(); }
// ###END###{Terminal}
// ###BEGIN###{Scripting}
// ###BEGIN###{Mode-NodeWebkit}
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
if (urlvars['host'] && urlvars['script']) {
try {
var data = require('fs').readFileSync(urlvars['script'], 'utf8');
if (data) { script_onScriptRead( { target: { result: data }} ); }
} catch (e) { messagebox("스크립트 실행", "잘못된 스크립트 파일입니다.") }
}
// ###END###{!ComputerSelector-Local-ScriptOnly}
// ###END###{Mode-NodeWebkit}
// ###END###{Scripting}
} else {
errcheck(status, stack);
}
}
// Control the state of all refresh buttons
var refreshButtonsState = true;
function refreshButtons(x) {
if (refreshButtonsState == x) return;
refreshButtonsState = x;
var i = 0, e = document.getElementsByTagName('input');
for (; i < e.length; i++) { if (e[i].name == 'refreshbtn') { e[i].disabled = !x; } }
}
// Store certificate pinning
// ###BEGIN###{Mode-NodeWebkit}
function storeCertPinning(host, hash) {
var pins = {};
try { pins = JSON.parse(localStorage.getItem('amtcertpins')); } catch (e) { }
if ((pins == null) || (typeof pins != 'object')) { pins = {}; }
if (hash) { pins[host] = hash; } else { delete pins[host]; }
try { localStorage.setItem('amtcertpins', JSON.stringify(pins)); } catch (ex) { }
}
function getCertPinnings() { try { var x = JSON.parse(localStorage.getItem('amtcertpins')); if ((x == null) || (typeof x != 'object')) return {}; return x; } catch (e) { return {} } }
function getCertPinning(host) { return getCertPinnings()[host]; }
// ###END###{Mode-NodeWebkit}
// Display TLS certificate
// ###BEGIN###{Mode-NodeWebkit}
var showTlsCertTempCert;
function showTlsCert(buttons, msg, cert, tag, func) {
if (xxdialogMode) return;
var c = showTlsCertTempCert = cert?cert:wsstack.comm.getPeerCertificate(), x = '<br>';
if (msg) x = '<div>' + msg + '</div><br />';
// ###BEGIN###{FileSaver}
x += addHtmlValue("증명서", c.raw.length + " 바이트" + '<a style=cursor:pointer;color:blue onclick=downloadTlsCert()>' + "다운로드" + '</a>');
// ###END###{FileSaver}
// ###BEGIN###{!FileSaver}
x += addHtmlValue("증명서", c.raw.length + " 바이트");
// ###END###{!FileSaver}
// Display certificate key usages
var y = [];
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.2') >= 0) { y.push(NoBreak("TLS 클라이언트")); }
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.3') >= 0) { y.push(NoBreak("코드 서명")); }
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.4') >= 0) { y.push("이메일"); }
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.1') >= 0) { y.push(NoBreak("TLS 서버")); }
if (c.ext_key_usage.indexOf('2.16.840.1.113741.1.2.1') >= 0) { y.push(NoBreak("인텔 &reg; AMT 콘솔")); }
if (c.ext_key_usage.indexOf('2.16.840.1.113741.1.2.2') >= 0) { y.push(NoBreak("인텔 &reg; AMT 에이전트")); }
if (c.ext_key_usage.indexOf('2.16.840.1.113741.1.2.3') >= 0) { y.push(NoBreak("인텔 &reg; AMT 활성화")); }
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.8') >= 0) { y.push(NoBreak("타임 스탬핑")); }
if (y.length > 0) { x += addHtmlValueNoTitle("인증서 사용법", y.join(', ') + '.') + '<br clear=all />'; }
x += '<br><div style="border-bottom:1px solid gray"><i>' + "인증서 주체" + '</i></div><br>';
for (var i in c.subject) { if (c.subject[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(MakeToArray(c.subject[i]).join(', '))); } }
x += addHtmlValueNoTitle("지문", c.fingerprint.substring(0,29) + '<br />' + c.fingerprint.substring(30));
x += '<br><div style="border-bottom:1px solid gray"><i>' + "발급자 인증서" + '</i></div><br>';
for (var i in c.issuer) { if (c.issuer[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(MakeToArray(c.issuer[i]).join(', '))); } }
if (func == null) { func = showTlsCertDefault; }
setDialogMode(11, "TLS 인증서-" + EscapeHtml(c.subject['CN']), buttons, func, x, { c: c, m: tag });
}
function showTlsCertDefault(b, args) {
var cert = args.c, mode = args.m;
if (b == 0) { disconnect(); }
if (b == 1) {
currentcomputer['tlscerthash'] = cert.fingerprint.split(':').join('').toLowerCase();
currentcomputer['tlscert'] = cert.raw.toString('hex');
currentcomputer['tlscerthash2'] = cert.fingerprint.split(':').join('').toLowerCase();
currentcomputer['tlscert2'] = cert.raw.toString('hex');
storeCertPinning(currentcomputer.host, cert.fingerprint.split(':').join('').toLowerCase());
// ###BEGIN###{ComputerSelector-Local}
saveComputers();
// ###END###{ComputerSelector-Local}
updateComputerDetails();
if (mode == 1) {
// Reconnect immidiatly
computerConnect(undefined, currentcomputer['h'], 0, true);
}
}
}
function downloadTlsCert() {
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
chooser.setAttribute('nwsaveas', showTlsCertTempCert.subject['CN'] + '.cer');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, showTlsCertTempCert.raw, 'binary', function () { }); }, false);
chooser.click();
}
function switchToTls() {
if (xxTlsCurrentCert == null) {
setDialogMode(11, "TLS로 전환", 3, switchToTls1, "연결이 현재 보안되지 않았습니다. 확인을 클릭하여 TLS를 사용하여 Intel AMT를 설정하고 보안 연결로 전환하십시오.");
} else {
setDialogMode(11, "TLS로 전환", 3, switchToTls1, "연결이 현재 보안되지 않고 Intel AMT가 이미 TLS로 설정되어 있습니다. 확인을 클릭하여 보안 연결로 전환하십시오.");
}
}
function switchToTls1() {
// Check if Intel AMT is already setup with TLS.
if (xxTlsCurrentCert == null) {
// TLS is not setup, start by asking Intel AMT to generate a key pair
messagebox("TLS 설정", "인증서 키 생성 중 ...");
amtstack.AMT_PublicKeyManagementService_GenerateKeyPair(0, 2048, switchToTls2);
} else {
// Setup the certificate pinning and reconnect
var cert = null;
try { cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(xxCertificates[xxTlsCurrentCert].X509Certificate)); } catch (ex) { messagebox("TLS 인증서", "TLS 인증서를 읽지 못했습니다 : " + ex); return; }
currentcomputer['tlscert'] = forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex();
currentcomputer['tlscerthash'] = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex();
currentcomputer['tls'] = 1;
updateComputerDetails();
saveComputers();
// Disconnect and reconnect immidiatly
disconnect();
computerConnect(undefined, currentcomputer['h'], 0, true);
}
}
function switchToTls2(stack, serviceName, response, status) {
if (status != 200) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다. 상태: " + status); return; }
if (response.Body['ReturnValue'] != 0) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다." + response.Body['ReturnValueStr']); return; }
// Get the new key pair
messagebox("TLS 설정", "인증서 키를 가져 오는 중 ...");
amtstack.Enum('AMT_PublicPrivateKeyPair', switchToTls3, response.Body['KeyPair']['ReferenceParameters']['SelectorSet']['Selector']['Value']);
}
function switchToTls3(stack, serviceName, response, status, tag) {
if (status != 200) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다. 상태: " + status); return; }
var DERKey = null;
for (var i in response) { if (response[i]['InstanceID'] == tag) DERKey = response[i]['DERKey']; }
// Sign the key pair using the CA certifiate
messagebox("TLS 설정", "TLS 인증서 생성 중 ...");
var name = ''
try { name = amtsysstate['AMT_GeneralSettings'].response['HostName']; } catch (ex) { }
if ((name == null) || (name == '')) { name = currentcomputer['name']; }
if ((name == null) || (name == '')) { name = currentcomputer['host']; }
var cert = amtcert_signWithCaKey(DERKey, null, { 'CN': name, 'O': "없음", 'ST': "없음", 'C': "없음" }, { 'CN': "신뢰할 수없는 루트 인증서" }, { name: 'extKeyUsage', serverAuth: true });
if (cert == null) { messagebox("발급 증명서", "인증서에 서명 할 수 없습니다."); return; }
// Save cert and cert hash in computer list
messagebox("TLS 설정", "TLS 인증서 업로드 중 ...");
currentcomputer['tlscert'] = forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex();
currentcomputer['tlscerthash'] = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex();
updateComputerDetails();
saveComputers();
// Place the resulting signed certificate back into AMT
var pem = forge.pki.certificateToPem(cert).replace(/(\r\n|\n|\r)/gm, '');
amtstack.AMT_PublicKeyManagementService_AddCertificate(pem.substring(27, pem.length - 25), switchToTls4);
}
function switchToTls4(stack, serviceName, response, status) {
if (status != 200) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다. 상태: " + status); return; }
messagebox("TLS 설정", "TLS 인증서 설정 중 ...");
var certInstanceId = response.Body['CreatedCertificate']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
// Set the TLS certificate
setTlsSecurityPendingCalls = 3;
if (xxTLSCredentialContext.length > 0) {
// Modify the current context
var newTLSCredentialContext = Clone(xxTLSCredentialContext[0]);
newTLSCredentialContext['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'] = certInstanceId;
amtstack.Put('AMT_TLSCredentialContext', newTLSCredentialContext, switchToTls5, 0, 1);
} else {
// Add a new security context
amtstack.Create('AMT_TLSCredentialContext', {
'ElementInContext': '<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_PublicKeyCertificate') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + certInstanceId + '</w:Selector></w:SelectorSet></a:ReferenceParameters>',
'ElementProvidingContext': '<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_TLSProtocolEndpointCollection') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="ElementName">TLSProtocolEndpointInstances Collection</w:Selector></w:SelectorSet></a:ReferenceParameters>'
}, switchToTls5);
}
// Figure out what index is local & remote
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
// Remote TLS settings
var xxTlsSettings2 = Clone(xxTlsSettings);
xxTlsSettings2[remoteNdx]['Enabled'] = true;
xxTlsSettings2[remoteNdx]['MutualAuthentication'] = false;
xxTlsSettings2[remoteNdx]['AcceptNonSecureConnections'] = true;
delete xxTlsSettings2[remoteNdx]['TrustedCN'];
// Local TLS settings
xxTlsSettings2[localNdx]['Enabled'] = true;
delete xxTlsSettings2[localNdx]['TrustedCN'];
// Update TLS settings
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[0], switchToTls5, 0, 1, xxTlsSettings2[0]);
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[1], switchToTls5, 0, 1, xxTlsSettings2[1]);
}
function switchToTls5(stack, name, response, status) {
if (stack) {
if (status != 200) { messagebox('', "TLS 인증서를 설정하지 못했습니다. 상태 =" + status); return; }
if (response.Body['ReturnValueStr'] && !methodcheck(response)) return;
}
// Check if all the calls are done & perform a commit
if ((--setTlsSecurityPendingCalls) == 0) {
messagebox("TLS 설정", "커밋 수행 중 ...");
amtstack.AMT_SetupAndConfigurationService_CommitChanges(null, switchToTls6);
}
}
function switchToTls6(stack, name, response, status) {
if (status != 200) { messagebox('', "TLS 보안을 설정하지 못했습니다. 상태 =" + status); return; }
if (response.Body['ReturnValue'] != 0) { messagebox('', "TLS 보안을 설정하지 못했습니다. 오류 : " + response.Body['ReturnValueStr']); return; }
// Switch current computer to TLS
messagebox("TLS 설정", "TLS 설정이 완료되었습니다.");
currentcomputer['tls'] = 1;
updateComputerDetails();
saveComputers();
setTimeout(function () {
setDialogMode();
// Disconnect and reconnect immidiatly
disconnect();
computerConnect(undefined, currentcomputer['h'], 0, true);
}, 2000);
}
// ###END###{Mode-NodeWebkit}
//
// SYSTEM STATUS PANEL
//
// ###BEGIN###{PowerControl}
function PullPowerState() {
if (amtstack && amtstack.GetPendingActions() == 0 && amtsysstate && amtsysstate['CIM_ServiceAvailableToElement']) {
amtstack.Enum('CIM_ServiceAvailableToElement', function (stack, name, responses, status) {
if (status != 200) return; // If the polling fails, just skip it.
amtsysstate['CIM_ServiceAvailableToElement'].responses = responses;
if ((amtversion > 9) && (amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0) && (amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] == 2)) {
// If Intel AMT 10+ and powered on, poll the OS power state.
amtstack.Get('IPS_PowerManagementService', function (stack, name, response, status) {
if (status == 200) { amtsysstate['IPS_PowerManagementService'].response = response.Body; updateSystemStatus(); }
});
} else {
updateSystemStatus();
}
});
}
}
// ###END###{PowerControl}
function PullSystemStatus(x) {
refreshButtons(false);
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(processSystemTime);
// ###BEGIN###{Look-Intel-SBT}
amtstack.BatchEnum('', ['*AMT_GeneralSettings'], processSystemStatus);
// ###END###{Look-Intel-SBT}
// ###BEGIN###{!Look-Intel-SBT}
var query = ['CIM_ServiceAvailableToElement', '*AMT_GeneralSettings', 'AMT_EthernetPortSettings', '*AMT_RedirectionService', 'CIM_ElementSettingData', '*AMT_BootCapabilities'];
if (amtversion > 5) query.push('IPS_IPv6PortSettings', '*CIM_KVMRedirectionSAP', '*IPS_OptInService','*IPS_KVMRedirectionSettingData');
if (amtversion > 9) query.push('*IPS_ScreenConfigurationService', '*IPS_PowerManagementService');
if (amtversion > 15) query.push('*CIM_BootService');
// ###BEGIN###{NetAuth}
if (amtversion > 2) query.push('*AMT_8021XProfile');
// ###END###{NetAuth}
amtstack.BatchEnum('', query, processSystemStatus, true);
// ###END###{!Look-Intel-SBT}
// ###BEGIN###{Wireless}
if (x == 1) PullWireless();
// ###END###{Wireless}
}
function processSystemTime(stack, name, responses, status) {
if (errcheck(status, stack)) return;
if (status == 200) {
// Convert ms to time and adjust for the timezone
var t = new Date(), t2 = new Date();
//t.setTime(responses.Body['Ta0'] * 1000 + (t.getTimezoneOffset() * 60 * 1000));
t.setTime(responses.Body['Ta0'] * 1000);
amtdeltatime = t - t2;
updateSystemStatus();
}
}
var amtdeltatime;
var amtsysstate;
var amtlogicalelements; // processSystemVersion
var amtfeatures = {};
function processSystemStatus(stack, name, responses, status) {
// ###BEGIN###{ComputerSelector}
if (wsstack == null || amtstack != stack) return;
// ###END###{ComputerSelector}
// If this computer has no KVM, ignore and continue (Standard Manageability)
if ((responses['IPS_ScreenConfigurationService'] == undefined) || (responses['IPS_ScreenConfigurationService'].status == 400)) { responses['IPS_ScreenConfigurationService'] = null; }
if ((responses['IPS_KVMRedirectionSettingData'] == undefined) || (responses['IPS_KVMRedirectionSettingData'].status == 400)) { responses['IPS_KVMRedirectionSettingData'] = null; }
if ((responses['CIM_KVMRedirectionSAP'] == undefined) || (responses['CIM_KVMRedirectionSAP'].status == 400)) { responses['CIM_KVMRedirectionSAP'] = null; }
if ((responses['IPS_OptInService'] == undefined) || (responses['IPS_OptInService'].status == 400)) { responses['IPS_OptInService'] = null; }
if ((responses['AMT_RedirectionService'] != undefined) && (responses['AMT_RedirectionService'].status == 200)) { QV('go13', true); } // Show the terminal
// Reset the status after possible KVM removal
status = 0;
for (var i in responses) { if ((responses[i] != null) && (responses[i].status > status)) { status = responses[i].status; } }
if ((status != 400) && errcheck(status, stack)) return;
amtsysstate = responses;
applyDesktopSettings();
updateSystemStatus();
}
// Ask to synchronize the Intel AMT clock
function syncClock() {
if (xxdialogMode) return;
setDialogMode(11, "시계 동기화", 3, syncClockEx, "이 컴퓨터와 Intel AMT 시계를 동기화 하시겠습니까?");
}
// Synchronize the Intel AMT clock
function syncClockEx() {
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(function (stack, name, response, status) {
if (status != 200) { messagebox('', "시간을 설정하지 못했습니다. 상태 =" + status); return; }
if (response.Body['ReturnValue'] != 0) { messagebox('', "시간을 설정하지 못했습니다. 오류 : " + response.Body['ReturnValueStr']); return; }
//var now = new Date(), Tm1 = Math.round((now.getTime() - (now.getTimezoneOffset() * 60000)) / 1000);
var now = new Date(), Tm1 = Math.round(now.getTime() / 1000);
amtstack.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch(response.Body['Ta0'], Tm1, Tm1, function () { amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(processSystemTime); });
});
}
// ###BEGIN###{PowerControl}
var DMTFPowerStates = ['', '', "전원 켜짐", "가벼운 수면", "깊은 잠", "전원 사이클 (소프트 오프)", "꺼짐-하드", "최대 절전 모드", "소프트 오프", "전원을 껐다 켜십시오 (꺼짐)", "메인 버스 리셋", "진단 인터럽트 (NMI)", "해당 사항 없음", "꺼짐-부드럽고 우아한", "끄기-단단함", "우아한 마스터 버스 리셋", "전원주기 (꺼짐-소프트 우아함)", "전원을 껐다 켜십시오 (꺼짐-정상 작동)", "진단 인터럽트 (INIT)"];
// ###END###{PowerControl}
function updateSystemStatus() {
if ((!amtsysstate) || (currentView > 99)) return;
// System Status Table
var systemdefense = 0, host, y, x = TableStart(), features = '', gs = amtsysstate['AMT_GeneralSettings'].response;
// ###BEGIN###{PowerControl}
var t = '<i>' + "알 수 없는" + '</i>';
if ((amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0)) {
t = DMTFPowerStates[amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState']];
// If Intel AMT 10+, check OS power saving state.
if ((amtversion > 9) && (t == "전원 켜짐") && (amtsysstate['IPS_PowerManagementService']) && (amtsysstate['IPS_PowerManagementService'].response) && (amtsysstate['IPS_PowerManagementService'].response['OSPowerSavingState'] == 3)) { t = 'Standby (Connected)'; }
// ###BEGIN###{Terminal}
QH('id_p13power', t); // Display the power state on the terminal form
// ###END###{Terminal}
// ###BEGIN###{Desktop}
//if ((desktop.State != 0) && (Q('id_p14power').innerHTML.length > 0) && (Q('id_p14power').innerHTML != t)) { desktop.Stop(); setTimeout(connectDesktop, 150); }
QH('id_p14power', t); // Display the power state on the desktop form
// ###END###{Desktop}
}
if (gs['PowerSource']) t += [", 플러그인", "배터리 사용"][gs['PowerSource']];
x += TableEntry("힘", addLink(t, 'showPowerActionDlg()'));
// ###END###{PowerControl}
host = gs['HostName'];
y = gs['DomainName'];
if (y != null && y.length > 0) host += '.' + y;
if (host.length == 0) { host = ('<i>' + "없음" + '</i>'); } else { host = EscapeHtml(host); }
x += TableEntry("이름 및 도메인", addLinkConditional(host, 'showEditNameDlg()', xxAccountAdminName));
if (amtstack.amtauth && amtstack.amtauth.uuidStr) {
x += TableEntry("시스템 ID", amtstack.amtauth.uuidStr);
} else if (HardwareInventory) {
x += TableEntry("시스템 ID", guidToStr(HardwareInventory['CIM_ComputerSystemPackage'].response['PlatformGUID'].toLowerCase()));
}
if (amtlogicalelements) {
var mode = '', scs = getItem(amtlogicalelements, 'CreationClassName', 'AMT_SetupAndConfigurationService');
// ###BEGIN###{!Look-Intel-SBT}
if ((scs['ProvisioningState'] == 2) && (amtversion > 5)) {
mode = " 관리 제어 모드 (ACM)에서 활성화";
if (scs['ProvisioningMode'] == 4) { mode = " 클라이언트 제어 모드 (CCM)에서 활성화"; systemdefense = 9; }
}
// ###END###{!Look-Intel-SBT}
// ###BEGIN###{Look-Intel-SBT}
x += TableEntry("Intel&reg; SBT", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-Intel-SBT}
// ###BEGIN###{Look-Intel-SM}
x += TableEntry("Intel&reg; SM", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-Intel-SM}
// ###BEGIN###{Look-Intel-AMT}
x += TableEntry("인텔 &reg; AMT", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-Intel-AMT}
// ###BEGIN###{Look-Commander}
x += TableEntry("인텔 &reg; ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-Commander}
// ###BEGIN###{Look-ISDU}
x += TableEntry("인텔 &reg; ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-ISDU}
// ###BEGIN###{Look-BrandedCommander}
x += TableEntry("인텔 &reg; ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-BrandedCommander}
// ###BEGIN###{Look-Unite}
x += TableEntry("인텔 &reg; ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-Unite}
// ###BEGIN###{Look-MeshCentral}
x += TableEntry("인텔 &reg; ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
// ###END###{Look-MeshCentral}
// ###BEGIN###{ComputerSelector}
currentcomputer['ver'] = getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'];
currentcomputer['pstate'] = scs['ProvisioningState'];
currentcomputer['pmode'] = scs['ProvisioningMode'];
currentcomputer['date'] = new Date().toISOString();
updateComputerDetails();
// ###BEGIN###{ComputerSelector-Local}
saveComputers();
// ###END###{ComputerSelector-Local}
// ###END###{ComputerSelector}
}
// ###BEGIN###{!Mode-MeshCentral2}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
QH('id_computername', "컴퓨터: " + ((gs['HostName'] == '') ? ('<i>' + "없음" + '</i>') : gs['HostName']) + "서버 : " + meshCentralServer.host);
} else {
QH('id_computername', "컴퓨터: " + ((gs['HostName'] == '') ? ('<i>' + "없음" + '</i>') : gs['HostName']));
}
// ###END###{MeshServerConnect}
// ###BEGIN###{!MeshServerConnect}
QH('id_computername', "컴퓨터: " + ((gs['HostName'] == '') ? ('<i>' + "없음" + '</i>') : gs['HostName']));
// ###END###{!MeshServerConnect}
// ###END###{!Mode-MeshCentral2}
// ###BEGIN###{Mode-NodeWebkit}
if (gs['HostName'] != '') { require('nw.gui').Window.get().title = NW_WindowTitle + ' - ' + gs['HostName']; } else { require('nw.gui').Window.get().title = NW_WindowTitle; }
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{PowerControl}
if ((amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0)) {
// Intel AMT power state warning. If computer is not powered on, display a warning in terminal and desktop panels.
// ###BEGIN###{Terminal}
QV('id_p13warning2', amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] != 2);
// ###END###{Terminal}
// ###BEGIN###{Desktop}
QV('id_p14warning2', amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] != 2);
// ###END###{Desktop}
}
// ###END###{PowerControl}
// ###BEGIN###{!Look-Intel-SBT}
// Intel AMT Features
if (amtsysstate['AMT_RedirectionService'].status == 200) {
var redir = amtfeatures[0] = (amtsysstate['AMT_RedirectionService'].response['ListenerEnabled'] == true);
var sol = amtfeatures[1] = ((amtsysstate['AMT_RedirectionService'].response['EnabledState'] & 2) != 0);
var ider = amtfeatures[2] = ((amtsysstate['AMT_RedirectionService'].response['EnabledState'] & 1) != 0);
var kvm = amtfeatures[3] = undefined;
if ((amtversion > 5) && (amtsysstate['CIM_KVMRedirectionSAP'] != null)) {
// ###BEGIN###{Desktop}
QV('go14', true); // Desktop
// ###END###{Desktop}
kvm = amtfeatures[3] = ((amtsysstate['CIM_KVMRedirectionSAP'].response['EnabledState'] == 6 && amtsysstate['CIM_KVMRedirectionSAP'].response['RequestedState'] == 2) || amtsysstate['CIM_KVMRedirectionSAP'].response['EnabledState'] == 2 || amtsysstate['CIM_KVMRedirectionSAP'].response['EnabledState'] == 6);
}
if (redir) features += ", 리디렉션 포트";
if (sol) features += ", Serial-over-LAN";
if (ider) features += "IDE 리디렉션";
if (kvm) features += ", KVM";
if (features == '') features = ' ' + "없음";
x += TableEntry("활성 기능", addLinkConditional(features.substring(2), 'showFeaturesDlg()', xxAccountAdminName));
}
if ((amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) {
var desktopSettings = amtsysstate['IPS_KVMRedirectionSettingData'].response;
var screenname = "기본 디스플레이";
if ((amtversion > 7) && (desktopSettings['DefaultScreen'] !== undefined) && (desktopSettings['DefaultScreen'] < 255)) { screenname = ["기본 디스플레이", "보조 디스플레이", "세번째 디스플레이"][desktopSettings['DefaultScreen']]; }
features = '<span title="' + format("기본 원격 디스플레이는 {0}입니다.", screenname.toLowerCase()) + '">' + screenname + '</span>';
if (desktopSettings['Is5900PortEnabled'] == true) { features += "포트 5900 사용"; }
if (desktopSettings['OptInPolicy'] == true) { features += "," + desktopSettings['OptInPolicyTimeout'] + ' ' + ((desktopSettings['OptInPolicyTimeout'] > 0)?"초 옵트 인":"두 번째 옵트 인"); }
features += "," + desktopSettings['SessionTimeout'] + " 분" + ((desktopSettings['SessionTimeout'] > 0) ? 's' : '') + " 세션 타임 아웃";
// Screen blanking on AMT 10 and higher
if ((amtversion > 9) && (amtsysstate['IPS_ScreenConfigurationService'] != null)) {
var screenBlanking = ((amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState'] & 1) != 0);
if (screenBlanking) features += ", 블랭킹 허용";
// ###BEGIN###{Desktop}
QV('id_DeskSBspan', screenBlanking);
Q('id_DeskSB').checked = false;
// ###END###{Desktop}
} else {
// ###BEGIN###{Desktop}
QV('id_DeskSBspan', false);
// ###END###{Desktop}
}
// ###BEGIN###{Desktop-Settings}
x += TableEntry("원격 데스크탑", addLinkConditional(features, 'showDesktopSettingsDlg()', xxAccountAdminName));
// ###END###{Desktop-Settings}
// ###BEGIN###{!Desktop-Settings}
x += TableEntry("원격 데스크탑", features);
// ###END###{!Desktop-Settings}
}
// ###BEGIN###{Terminal}
QV('id_p13warning1', !redir || !sol); // Show the warning box on top of the terminal if redirection or sol is disabled.
QV('id_p13warninga', xxAccountAdminName); // If we are not administrator, we can't activate SOL.
// ###END###{Terminal}
// ###BEGIN###{Desktop}
QV('id_p14warning1', !redir || !kvm); // Show the warning box on top of the remote desktop viewer if redirection or kvm is disabled.
QV('id_p14warninga', xxAccountAdminName); // If we are not administrator, we can't activate KVM.
// ###END###{Desktop}
// Intel AMT user Consent
if ((amtversion > 5) && (amtsysstate != null && amtsysstate['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != undefined)) {
features = "알 수없는 상태";
var optinrequired = amtsysstate['IPS_OptInService'].response['OptInRequired'];
if (optinrequired == 0) { features = "불필요"; }
if (optinrequired == 1) { features = "KVM에만 필요"; }
if (optinrequired == 0xFFFFFFFF) { features = "항상 필수"; }
if (amtsysstate['IPS_OptInService'].response['CanModifyOptInPolicy'] == true) features = addLinkConditional(features, 'showConsentDlg()', xxAccountAdminName); // If we can modify user consent settings, add the link to do it.
x += TableEntry("사용자 동의", features);
}
// Power Options
if ((amtsysstate['AMT_BootCapabilities'].response['PlatformErase'] != null) && (amtsysstate['AMT_BootCapabilities'].response['PlatformErase'] > 0) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] != null)) {
var enabledBootStateStr = { 0: "알 수 없는", 1: "다른", 2: "가능", 3: "비활성화", 4: "종료", 5: "해당 사항 없음", 6: "활성화되었지만 오프라인", 7: "테스트 중", 8: "연기 됨", 9: "Quiesce", 10: "시작", 32768: "OCR Disabled", 32769: "OCR Enabled", 32770: "OCR Disabled, RPE Enabled", 32771: "RPE & OCR Enabled" };
if (amtversion > 15) { enabledBootStateStr[32768] = "OCR & RPE Disabled"; enabledBootStateStr[32769] = "OCR Enabled, RPE Disabled"; }
var t = enabledBootStateStr[amtsysstate['CIM_BootService'].response['EnabledState']]?enabledBootStateStr[amtsysstate['CIM_BootService'].response['EnabledState']]:"알 수 없는";
x += TableEntry("Boot Features", addLinkConditional(t, 'showEnableBootServiceDlg()', xxAccountAdminName));
}
// Intel AMT Power policy
if (AmtSystemPowerSchemes != null) {
var elementSettings = amtsysstate['CIM_ElementSettingData'].responses;
for (var i = 0; i < elementSettings.length; i++) {
if (elementSettings[i]['SettingData'] && elementSettings[i]['IsCurrent'] == 1 && elementSettings[i]['SettingData']['ReferenceParameters']['ResourceURI'] == 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_SystemPowerScheme') {
// Found the active Intel AMT power scheme
var powerguid = elementSettings[i]['SettingData']['ReferenceParameters']['SelectorSet']['Selector'][1]['Value'];
// Now find the name of the power schema in the AMT_SystemPowerScheme table
for (var j = 0; j < AmtSystemPowerSchemes.length; j++) {
if (AmtSystemPowerSchemes[j]['SchemeGUID'] == powerguid) {
// Found the power scheme name
x += TableEntry("전원 정책", addLinkConditional(AmtSystemPowerSchemes[j]['Description'].split(':' )[1], 'showPowerPolicyDlg(\"' + powerguid + '\")', xxAccountAdminName));
}
}
}
}
}
// ###END###{!Look-Intel-SBT}
if (amtdeltatime) { x += TableEntry("날짜 시간", addLinkConditional(new Date(new Date().getTime() + amtdeltatime).toLocaleString(), 'syncClock()', xxAccountAdminName)); }
var buttons = AddRefreshButton('PullSystemStatus()') + ' ';
// ###BEGIN###{PowerControl}
buttons += AddButton("전원 동작 ...", 'showPowerActionDlg()') + ' ';
// ###END###{PowerControl}
// ###BEGIN###{WsmanBrowser}
// ###BEGIN###{FileSaver}
buttons += AddButton("상태 저장 ...", 'saveEntireAmtState()') + ' ';
// ###END###{FileSaver}
// ###END###{WsmanBrowser}
// ###BEGIN###{Scripting}
buttons += AddButton("스크립트 실행 ...", 'script_runScriptDlg()') + ' ';
// ###END###{Scripting}
x += TableEnd(buttons);
// Show authentic CSME if present
if (amtstack.amtauth) { x += '<div style=position:absolute;top:10px;right:20px;cursor:pointer onclick=showAuthCsme()><img src=authcsme.png width=100 height=100 /></div>'; }
QH('id_TableSysStatus', x);
// ###BEGIN###{NetworkSettings}
var x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
x += TableEnd('<div>&nbsp;' + AddRefreshButton('PullSystemStatus(1)')
// ###BEGIN###{!Mode-LMS}
+ " 네트워크 설정을 변경하면이 페이지를 사용하지 못할 수 있습니다."
// ###END###{!Mode-LMS}
// ###BEGIN###{Mode-LMS}
+ " Changing network settings may cause this page to be unavailable for a few seconds."
// ###END###{Mode-LMS}
);
// General settings
x += '<br><h2>' + "일반 설정" + '</h2>';
x += TableStart();
// Network state
// if (gs['AMTNetworkEnabled']) { x += TableEntry("Network state", (gs['AMTNetworkEnabled']==1)?"Enabled":"Disabled"); }
// Shared FQDN
var fqdnshare = '';
if (host != '<i>' + "없음" + '</i>') {
if (gs['SharedFQDN'] == true) fqdnshare = ", OS와 공유";
if (gs['SharedFQDN'] == false) fqdnshare = "OS와 다른";
}
x += TableEntry("이름 및 도메인", addLinkConditional(host + fqdnshare, 'showEditNameDlg(1)', xxAccountAdminName));
// Dynamic DNS
var ddns = "비활성화";
if (gs['DDNSUpdateEnabled'] == true) {
ddns = "각각 활성화" + gs['DDNSPeriodicUpdateInterval'] + " 분, TTL은" + gs['DDNSTTL'] + " 의사록";
} else if (gs['DDNSUpdateByDHCPServerEnabled'] == true) {
ddns = "DHCP 서버로 업데이트";
}
x += TableEntry("동적 DNS", addLinkConditional(ddns, 'showEditDnsDlg()', xxAccountAdminName));
x += TableEnd();
for (var y in amtsysstate['AMT_EthernetPortSettings'].responses) {
var z = amtsysstate['AMT_EthernetPortSettings'].responses[y];
if (z['WLANLinkProtectionLevel'] || (y == 1)) { amtwirelessif = y; } // Set the wireless interface, this seems to cover new wireless only computers and older computers with dual interfaces.
if ((y == 0) && (amtwirelessif != y) && (z['MACAddress'] == '00-00-00-00-00-00')) { continue; } // On computers with only wireless, the wired interface will have a null MAC, skip it.
if (y == 0) systemdefense++;
x += '<br><h2>' + ((amtwirelessif == y)?"무선 인터페이스":"유선 인터페이스") + '</h2>';
x += TableStart();
/*
var lp = [], linkpolicy = MakeToArray(z['LinkPolicy']);
for (var p in linkpolicy) {
var ap = linkpolicy[p];
if (ap == 1) lp.push("S0/AC");
if (ap == 14) lp.push("Sx/AC");
if (ap == 16) lp.push("S0/DC");
if (ap == 224) lp.push("Sx/DC");
}
x += TableEntry("Link state", (z['LinkIsUp'] == true?"Link is up":"Link is down") + ", available in " + lp.join(', '));
*/
x += TableEntry("연결 상태", (z['LinkIsUp'] == true?"연결되었습니다":"링크가 다운되었습니다"));
if (z['LinkPolicy']) {
z['LinkPolicy'] = MakeToArray(z['LinkPolicy']);
var linkPolicyStr = [];
for (var i in z['LinkPolicy']) {
if (z['LinkPolicy'][i] == 1) { linkPolicyStr.push("S0 / AC"); }
if (z['LinkPolicy'][i] == 14) { linkPolicyStr.push("Sx / AC"); }
if (z['LinkPolicy'][i] == 16) { linkPolicyStr.push("S0 / DC"); }
if (z['LinkPolicy'][i] == 224) { linkPolicyStr.push("Sx / DC"); }
}
if (linkPolicyStr.length == 0) { linkPolicyStr.push(''); }
x += TableEntry("링크 정책", addLinkConditional((linkPolicyStr.length == 0) ? "사용할 수 없습니다" : "가능: " + linkPolicyStr.join(', '), 'showLinkPolicyDlg(' + y + ')', xxAccountAdminName));
}
if (z['MACAddress'] != '00-00-00-00-00-00') { x += TableEntry("MAC 주소", z['MACAddress']); }
// ###BEGIN###{Wireless}
if ((amtwirelessif == y) && xxWireless && xxWireless['CIM_WiFiPortCapabilities'].response) {
// Start and state
x += TableEntry("상태", addLinkConditional(xxWifiState[xxWireless['CIM_WiFiPort'].response['EnabledState']], 'showWifiStateDlg()', xxAccountAdminName));
/* This is not that useful
// Capabilities
var s = '', sc = xxWireless['CIM_WiFiPortCapabilities'].response, supportedTypes = sc['SupportedPortTypes'];
for (i in supportedTypes) { s += ", 802.11" + "abgn"[supportedTypes[i] - 70]; }
x += TableEntry("Capabilites", s.substring(2));
*/
// Current radio state
s = xxWireless['CIM_WiFiEndpoint'].response['LANID'];
x += TableEntry("라디오 상태", xxRadioState[xxWireless['CIM_WiFiEndpoint'].response['EnabledState']] + ", SSID: " + (s ? s : ('<i>' + "없음" + '</i>')));
// Current local profile synchronization
if (xxWireless['AMT_WiFiPortConfigurationService'] && xxWireless['AMT_WiFiPortConfigurationService'].response && (typeof xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 'number')) {
x += TableEntry("Local WIFI Profile Sync", addLinkConditional(((xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 1) ? "가능" : "비활성화"), 'showWifiSyncDlg(' + y + ')', xxAccountAdminName));
}
// CSME UEFI Wifi profile sharing, check if it is enabled in boot setting and it is not null at AMT_WiFiPortConfigrationService
if (amtsysstate['AMT_BootCapabilities'].response['UEFIWiFiCoExistenceAndProfileShare'] != null && amtsysstate['AMT_BootCapabilities'].response['UEFIWiFiCoExistenceAndProfileShare'] == true
&& xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled']!=null) {
x += TableEntry("UEFI WiFi CoEx Profile sharing", addLinkConditional(xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled']==1? "가능":"비활성화", 'showUefiWifiCoExDlg()', xxAccountAdminName));
} else {
x += TableEntry("UEFI WiFi CoEx Profile sharing", "Unavailable");
}
}
// ###END###{Wireless}
if (amtwirelessif != y) {
// Things that are specific to the wired interface
x += TableEntry("핑에 응답", addLinkConditional(["비활성화", "ICMP 응답", "RMCP 응답", "ICMP 및 RMCP 응답"][gs['PingResponseEnabled'] + (gs['RmcpPingResponseEnabled'] << 1)], 'showPingActionDlg()', xxAccountAdminName));
// ###BEGIN###{NetAuth}
// 802.1x
var netAuthProtocols = ['EAP-TLS', 'EAP-TTLS/MSCHAPv2', 'PEAPv0/EAP-MSCHAPv2', 'PEAPv1/EAP-GTC', 'EAP-FAST/MSCHAPv2', 'EAP-FAST/GTC', 'EAP-FAST/TLS'], netAuthStr = "비활성화";
if (amtsysstate['AMT_8021XProfile'].responses.Body['Enabled']) { netAuthStr = "사용," + netAuthProtocols[amtsysstate['AMT_8021XProfile'].responses.Body['AuthenticationProtocol']]; }
x += TableEntry("802.1x", addLinkConditional(netAuthStr, 'editNetAuthProfile()', xxAccountAdminName));
// ###END###{NetAuth}
var ipStateString = z['DHCPEnabled'] == true ? "DHCP 서버를 사용하여 자동" : "고정 IP 주소";
if (z['IpSyncEnabled'] == true) { ipStateString += ', IP sync with OS'; }
x += TableEntry("IPv4 상태", addLinkConditional(ipStateString, 'showIPSetupDlg()', xxAccountAdminName));
}
// Display IPv4 current settings
x += TableEntry("IPv4 주소", isIpAddress(z['IPAddress'],"없음"));
if (isIpAddress(z['DefaultGateway'])) { x += TableEntry("IPv4 게이트웨이 / 마스크", z['DefaultGateway'] + ' / ' + isIpAddress(z['SubnetMask'],"없음")); }
var dns = z['PrimaryDNS'];
if (isIpAddress(dns)) {
if (z['SecondaryDNS']) dns += ' / ' + z['SecondaryDNS'];
x += TableEntry("IPv4 도메인 이름 서버", dns);
}
if ((amtsysstate['IPS_IPv6PortSettings'].status == 200) && (amtversion > 5)) {
// Check if IPv6 is enabled for this interface
var zz = amtsysstate['IPS_IPv6PortSettings'].responses[y];
var ipv6state = "비활성화", ipv6, ipv6manual, elementSettings = amtsysstate['CIM_ElementSettingData'].responses;
for (var i = 0; i < elementSettings.length; i++) {
if (elementSettings[i]['SettingData'] && elementSettings[i]['SettingData']['ReferenceParameters']['SelectorSet']['Selector']['Value'] == 'Intel(r) IPS IPv6 Settings ' + y) {
ipv6 = (elementSettings[i]['IsCurrent'] == 1);
}
}
// Check if manual addresses have been added
if (ipv6 == true) {
ipv6manual = isIpAddress(zz['IPv6Address']) || isIpAddress(zz['DefaultRouter']) || isIpAddress(zz['PrimaryDNS']) || isIpAddress(zz['SecondaryDNS']);
ipv6state = (ipv6manual ? "사용, 자동 및 수동 주소" : "사용, 자동 주소");
}
// Display IPv6 current settings
x += TableEntry("IPv6 상태", addLinkConditional(ipv6state, 'showIPv6StateDlg(' + y + ',' + ipv6 + ')', xxAccountAdminName));
if (ipv6 == true) {
if (zz['CurrentAddressInfo'] && zz['CurrentAddressInfo'].length > 0) {
zz['CurrentAddressInfo'] = MakeToArray(zz['CurrentAddressInfo']); // Because our WSMAN stack does not know if this is a array, we need to make it an array if it contains 1 element.
ipv6addr = '';
for (var i = 0; i < zz['CurrentAddressInfo'].length; i++) { if (ipv6addr.length > 0) ipv6addr += ","; ipv6addr += zz['CurrentAddressInfo'][i].split(',')[0]; }
x += TableEntry("IPv6 주소", addLink(ipv6addr, 'showIPv6AddrDlg(' + y + ',\"' + zz['CurrentAddressInfo'] + '\")'));
} else {
x += TableEntry("IPv6 주소", "없음");
}
if (isIpAddress(zz['CurrentDefaultRouter'])) { x += TableEntry("IPv6 기본 라우터", zz['CurrentDefaultRouter']); }
if (isIpAddress(zz['CurrentPrimaryDNS'])) {
var dns = zz['CurrentPrimaryDNS'];
if (isIpAddress(zz['CurrentSecondaryDNS'])) dns += ' / ' + zz['CurrentSecondaryDNS'];
x += TableEntry("IPv6 도메인 이름 서버", dns);
}
}
}
x += TableEnd();
}
// Only do more WSMAN if we need it
if ((urlvars['kvmonly'] != 1) && (fullscreenonly == false)) {
// ###BEGIN###{Wireless}
// If there is a wireless interface, get the data for it. If not, show that there is not.
if (amtwirelessif != -1) { if ((amtFirstPull & 2) == 0) PullWireless(); }
// ###END###{Wireless}
QH('id_TableNetworkSettingsSpan', x);
// ###END###{NetworkSettings}
// ###BEGIN###{SystemDefense}
// If in ACM mode and we have a wired interface, pull System Defense information
if ((systemdefense == 1) && ((amtFirstPull & 4) == 0)) PullSystemDefense();
// ###END###{SystemDefense}
// ###BEGIN###{Storage}
if (((amtFirstPull & 8) == 0) && (amtversion > 11 || ((amtversion == 11) && (amtversionmin > 5)))) { PullStorage(); }
// ###END###{Storage}
}
if (currentView == 0) go(1, 1); // If we are at the loading screen, most to System Status screen
}
function isIpAddress(t, x) { return (t && t != null && t.length > 0 && t != '::' && t != '::0')?t:x; }
function showLinkPolicyDlg(y) {
if (xxdialogMode) return;
var z = amtsysstate['AMT_EthernetPortSettings'].responses[y], s = '';
s += '<label><input type=checkbox id=d11p1 value=1 ' + ((z['LinkPolicy'].indexOf(1) >= 0) ? 'checked' : '') + '>Available in S0/AC - Powered on & plugged in</label><br>';
s += '<label><input type=checkbox id=d11p2 value=14 ' + ((z['LinkPolicy'].indexOf(14) >= 0) ? 'checked' : '') + '>Available in Sx/AC - Sleeping & plugged in</label><br>';
s += '<label><input type=checkbox id=d11p3 value=16 ' + ((z['LinkPolicy'].indexOf(16) >= 0) ? 'checked' : '') + '>Available in S0/DC - Powered on & on battery</label><br>';
s += '<label><input type=checkbox id=d11p4 value=224 ' + ((z['LinkPolicy'].indexOf(224) >= 0) ? 'checked' : '') + '>Available in Sx/DC - Sleeping & on battery</label><br>';
setDialogMode(11, "링크 정책", 3, showLinkPolicyDlgEx, s, y);
}
function showLinkPolicyDlgEx(b, y) {
var x = Clone(amtsysstate['AMT_EthernetPortSettings'].responses[y]);
if (x['DHCPEnabled']) {
delete x['IPAddress'];
delete x['SubnetMask'];
delete x['DefaultGateway'];
delete x['PrimaryDNS'];
delete x['SecondaryDNS'];
}
x['LinkPolicy'] = [];
if (Q('d11p1').checked) { x['LinkPolicy'].push(1); }
if (Q('d11p2').checked) { x['LinkPolicy'].push(14); }
if (Q('d11p3').checked) { x['LinkPolicy'].push(16); }
if (Q('d11p4').checked) { x['LinkPolicy'].push(224); }
amtstack.Put('AMT_EthernetPortSettings', x, showLinkPolicyDlgExDone, 0, 1, x);
}
function showLinkPolicyDlgExDone(stack, name, response, status) {
if (status == 200) {
amtsysstate = undefined;
PullSystemStatus();
} else {
messagebox("링크 정책", format("새 링크 정책을 설정할 수 없습니다. 오류 {0}", status));
}
}
function showAuthCsme() {
if (xxdialogMode) return;
var x = '<div style=margin-top:8px>' + "Intel&reg; AMT supports authentic CSME feature, however MeshCommander cannot verify the authenticity yet." + '</div><hr style=margin-top:8px;margin-bottom:8px;height:2px;border-width:0;color:gray;background-color:gray />';
x += addHtmlValue("FW Version", amtstack.amtauth.FWVersion);
x += addHtmlValue("FQDN", amtstack.amtauth.FQDN ? amtstack.amtauth.FQDN : ('<i>' + "없음" + '</i>'));
x += '<hr style=margin-top:8px;margin-bottom:8px;height:2px;border-width:0;color:gray;background-color:gray /><div style=max-height:200px;overflow-y:auto><table>';
for (var i in amtstack.amtauth.Certificates) {
var cert = amtstack.amtauth.Certificates[i];
x += '<tr><td style=width:32px;vertical-align:top><img src=images-commander/cert1.png height=32 width=32 />';
x += '<td style=padding-bottom:6px><b>' + EscapeHtml(cert.subject.getField('CN').value) + ((cert.xTrusted === true) ? ', <span style=color:#080>' + "신뢰" + '</span>' : '') + '</b><br />';
if (cert.subject.getField('OU')) { x += EscapeHtml(cert.subject.getField('OU').value) + '<br />'; }
// ###BEGIN###{FileSaver}
x += amtstack.amtauth.CertificatesDer[i].length + " 바이트" + '<a style=cursor:pointer;color:blue onclick=downloadAuthCert(' + i + ')>' + "다운로드" + '</a>';
if (cert.xCrl) { x += '<br />' + "CRL " + cert.xCrl.length + " 바이트" + '<a style=cursor:pointer;color:blue onclick=downloadCertCrl(' + i + ')>' + "다운로드" + '</a>'; }
// ###END###{FileSaver}
// ###BEGIN###{!FileSaver}
x += amtstack.amtauth.CertificatesDer[i].length + " 바이트";
if (cert.xCrl) { x += '<br />' + "CRL " + cert.xCrl.length + " 바이트"; }
// ###END###{!FileSaver}
}
x += '</table><div>';
setDialogMode(11, "Authentic CSME", 1, null, x);
}
// ###BEGIN###{FileSaver}
function downloadCertCrl(h) {
h = parseInt(h);
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(amtstack.amtauth.Certificates[h].xCrl), amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.crl');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('nwsaveas', amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.crl');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, amtstack.amtauth.Certificates[h].xCrl, 'binary', function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
function downloadAuthCert(h) {
h = parseInt(h);
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(amtstack.amtauth.CertificatesDer[h]), amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.cer');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('nwsaveas', amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.cer');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, amtstack.amtauth.CertificatesDer[h], 'binary', function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
// ###BEGIN###{WsmanBrowser}
// ###BEGIN###{FileSaver}
var IntelAmtEntireState;
var IntelAmtEntireStateCalls;
function saveEntireAmtState() {
if (xxdialogMode) return;
var n = '', d = new Date();
if (amtsysstate) { n = '-' + amtsysstate['AMT_GeneralSettings'].response['HostName']; }
n += '-' + d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);;
idx_d19savestatefilename.value = 'amtstate' + n + '.json';
setDialogMode(19, "전체 인텔 &reg; AMT 상태 저장", 3, saveEntireAmtStateOk);
}
function saveEntireAmtStateOk() {
IntelAmtEntireState = { 'webappversion':version,'localtime':Date(),'utctime':new Date().toUTCString(),'isotime':new Date().toISOString() };
QH('id_dialogMessage', 'Fetching entire state, please wait...');
setDialogMode(1, "전체 인텔 &reg; AMT 상태 저장", 0, null);
// Fetch everything!
IntelAmtEntireStateCalls = 3;
amtstack.BatchEnum(null, AllWsman, saveEntireAmtStateOk2, null, true);
amtstack.GetAuditLog(saveEntireAmtStateOk3);
amtstack.GetMessageLog(saveEntireAmtStateOk4);
}
function saveEntireAmtStateOk2(stack, name, responses, status) { IntelAmtEntireState['wsmanenums'] = responses; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk3(stack, messages) { IntelAmtEntireState['auditlog'] = messages; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk4(stack, messages) { IntelAmtEntireState['eventlog'] = messages; saveEntireAmtStateDone(); }
function saveEntireAmtStateDone() {
if (--IntelAmtEntireStateCalls != 0) return;
setDialogMode();
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(JSON.stringify(IntelAmtEntireState, null, ' ').replace(/\n/g, '\r\n')), idx_d19savestatefilename.value);
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
chooser.setAttribute('nwsaveas', idx_d19savestatefilename.value);
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, JSON.stringify(IntelAmtEntireState, null, ' ').replace(/\n/g, '\r\n'), function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
// ###END###{WsmanBrowser}
// ###BEGIN###{Desktop-Settings}
function showDesktopSettingsDlg() {
if (xxdialogMode) return;
var desktopSettings = amtsysstate['IPS_KVMRedirectionSettingData'].response;
var x = '<div style=text-align:left>';
x += '<div style=height:26px;margin-top:4px><select id=subddisplay style=float:right;width:200px><option value=0>' + "기본 디스플레이" + '</option><option value=1>' + "보조 디스플레이" + '</option>';
if (amtversion > 9) { x += '<option value=2>' + "세번째 디스플레이" + '</option>'; }
x += '</select><div style=padding-top:4px>' + "기본 표시" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input id=subsessiontimeout style=float:right;width:200px maxlength=5 onkeypress="return numbersOnly(event)"><div style=padding-top:4px>' + "세션 시간 초과 (분)" + '</div></div>';
if (desktopSettings['OptInPolicy'] == true) { x += '<div style=height:26px;margin-top:4px><input id=suboptintimeout style=float:right;width:200px maxlength=5 onkeypress="return numbersOnly(event)"><div style=padding-top:4px>' + "옵트 인 타임 아웃 (초)" + '</div></div>'; }
x += '<div style=height:26px;margin-top:4px><select id=subdlegacy style=float:right;width:200px onchange=showDesktopSettingsDlgUpdate()><option value=0>' + "비활성화, 권장" + '</option><option value=1>' + "활성화 된 레거시 KVM 뷰어" + '</option></select><div style=padding-top:4px>' + "포트 5900" + '</div></div>';
x += '<div style=height:26px;margin-top:4px id=subspassx><input id=subspass type=password autocomplete=off style=float:right;width:200px maxlength=8 onkeyup=showDesktopSettingsDlgUpdate()><div style=padding-top:4px>' + "비밀번호 5900 (8 자)" + '</div></div>';
if ((amtversion > 9) && (amtsysstate['IPS_ScreenConfigurationService'] != null)) { x += '<div style=height:26px;margin-top:4px><select id=subsb style=float:right;width:200px onchange=showDesktopSettingsDlgUpdate()><option value=0>' + "비활성화" + '</option><option value=1>' + "가능" + '</option></select><div style=padding-top:4px title="' + "이 기능은 종종 지원되지 않습니다" + '">' + "스크린 블랭킹" + '</div></div>'; }
x += '</div>';
setDialogMode(11, "원격 데스크톱 설정", 3, showDesktopSettingsDlgOk, x);
Q('subddisplay').value = desktopSettings['DefaultScreen'];
Q('subsessiontimeout').value = desktopSettings['SessionTimeout'];
if (desktopSettings['OptInPolicy'] == true) { Q('suboptintimeout').value = desktopSettings['OptInPolicyTimeout']; }
Q('subdlegacy').value = ((desktopSettings['Is5900PortEnabled'] == true) ? 1 : 0);
if ((amtversion > 9) && (amtsysstate['IPS_ScreenConfigurationService'] != null)) { Q('subsb').value = amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState']; }
showDesktopSettingsDlgUpdate();
}
function showDesktopSettingsDlgUpdate() {
QV('subspassx', (Q('subdlegacy').value == 1));
var ok = ((Q('subdlegacy').value == 0) || (Q('subspass').value.length == 8) || (Q('subspass').value.length == 0)) && (Q('subsessiontimeout').value.length > 0);
if ((amtsysstate['IPS_KVMRedirectionSettingData'].response['OptInPolicy'] == true) && (Q('suboptintimeout').value.length == 0)) { ok = false; }
QE('idx_dlgOkButton', ok);
}
function showDesktopSettingsDlgOk() {
var x = Clone(amtsysstate['IPS_KVMRedirectionSettingData'].response);
x['DefaultScreen'] = Q('subddisplay').value
x['SessionTimeout'] = Q('subsessiontimeout').value;
x['Is5900PortEnabled'] = (Q('subdlegacy').value == 1);
if (x['OptInPolicy'] == true) { x['OptInPolicyTimeout'] = Q('suboptintimeout').value; }
if (x['Is5900PortEnabled'] == true) { x['RFBPassword'] = Q('subspass').value; }
amtstack.Put('IPS_KVMRedirectionSettingData', x, showDesktopSettingsDlgOk2);
// Screen blanking
var y = Clone(amtsysstate['IPS_ScreenConfigurationService'].response);
y['EnabledState'] = parseInt(Q('subsb').value);
amtstack.Put('IPS_ScreenConfigurationService', y, showDesktopSettingsDlgOk3);
}
function showDesktopSettingsDlgOk2(stack, name, responses, status) {
if (status == 200) PullSystemStatus(); else messagebox("원격 데스크톱 설정", format("오류 {0}, 값을 설정할 수 없습니다.", status));
}
function showDesktopSettingsDlgOk3(stack, name, response, status) {
if (status != 200) { messagebox("오류", format("화면 비우기를 설정할 수 없습니다.이 시스템에서 비우기를 지원하지 않을 수 있습니다 ({0}).", status)); return; }
amtstack.Get('IPS_ScreenConfigurationService', function (stack, name, response, status) {
if (status == 200) { amtsysstate['IPS_ScreenConfigurationService'].response = response.Body; updateSystemStatus(); }
}, 0, 1);
}
// ###END###{Desktop-Settings}
// ###BEGIN###{EventLog}
//
// EVENT LOG PANEL
//
function PullEventLog(button) {
if (button == 1 && xxdialogMode) return;
amtFirstPull |= 16;
amtstack.Enum('AMT_MessageLog', processMessageLog0);
amtstack.GetMessageLog(processMessageLog1);
}
var processMessageLog0responses = null;
function processMessageLog0(stack, name, responses, status) {
if (status != 200) return;
if (status) QV('go6', true); // Show event log left panel option
if (responses) processMessageLog0responses = responses;
var fr = '', x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
if (processMessageLog0responses != null) { fr = ((processMessageLog0responses[0]['IsFrozen'] == true) ? AddButton("고정 해제 로그", 'FreezeLog(0)') : AddButton("동결 로그", 'FreezeLog(1)')); }
// ###BEGIN###{!FileSaver}
x += TableEnd('<div style=float:right><input id=eventFilter placeholder="' + "필터" + '" style=margin:4px onkeyup=eventFilter()>&nbsp;</div><div>&nbsp;' + AddRefreshButton('PullEventLog(1)') + AddButton("로그 지우기", 'ClearLog()') + fr);
// ###END###{!FileSaver}
// ###BEGIN###{FileSaver}
x += TableEnd('<div style=float:right><input id=eventFilter placeholder="' + "필터" + '" style=margin:4px onkeyup=eventFilter()>&nbsp;</div><div>&nbsp;' + AddRefreshButton('PullEventLog(1)') + AddButton("로그 지우기", 'ClearLog()') + AddButton("저장...", 'SaveEventLog()') + fr);
// ###END###{FileSaver}
QH('id_TableEventLog', x + '<br>');
}
// ###BEGIN###{FileSaver}
function SaveEventLog() {
if (xxdialogMode || eventmessages == null) return;
SaveJsonFile('IntelAmtEventlog', 'events', 'Intel AMT Event Log', eventmessages);
}
// ###END###{FileSaver}
var eventmessages = null;
function processMessageLog1(stack, messages) {
eventmessages = messages;
var i, y = 0, x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=80px><p><td><td><td>';
x += '<tr><td class=r1 style=width:90px><b>&nbsp;&nbsp;Event</b><td class=r1 style=width:110px><b>Time</b><td class=r1 style=width:160px><b>' + "출처" + '</b><td class=r1><b>' + "기술" + '</b>';
for (i in messages) {
y++;
var icon = 1, m = messages[i];
if (m['EventSeverity'] >= 8) { icon = 2; } if (m['EventSeverity'] >= 16) { icon = 3; }
x += '<tr id=xamtevent' + i + ' class=r3 onclick=showEventDetails(' + i + ')><td class=r1><p><div class=icon' + icon + ' style=display:block;float:left;margin-left:5px;margin-right:5px></div>' + (parseInt(i) + 1) + '<td class=r1 title="' + m['Time'].toLocaleString() + '">' + m['Time'].toLocaleDateString('en', { year: 'numeric', month: '2-digit', day: 'numeric' }) + '<br>' + m['Time'].toLocaleTimeString('en', { hour:'2-digit', minute:'2-digit', second:'2-digit' }) + '<td class=r1>' + m['EntityStr'].replace('(r)', '&reg;') + '<td class=r1>' + m['Desc'];
}
x += TableEnd(y == 0 ? '&nbsp;' : '');
QH('id_TableEventLog2', x + '<br>');
processMessageLog0();
}
function FreezeLog(x) { if (!xxdialogMode) { amtstack.AMT_MessageLog_FreezeLog(x, function () { amtstack.Enum('AMT_MessageLog', processMessageLog0); }) } }
function ClearLog(x) { if (!xxdialogMode) { QH('id_dialogMessage', "이벤트 로그를 지우시겠습니까?"); setDialogMode(1, "이벤트 로그", 3, ClearLogEx); } }
function ClearLogEx() { amtstack.AMT_MessageLog_ClearLog(function (stack, name, responses, status) { if (status != 200) messagebox("이벤트 로그", "지울 수 없습니다. 오류 : " + status); else PullEventLog(); }) }
function showEventDetails(h) {
if (xxdialogMode) return;
var m = eventmessages[h];
var x = '<div style=text-align:left>';
x += addHtmlValue("시각", m['Time'].toLocaleString());
x += addHtmlValue("출처", m['EntityStr'].replace('(r)', '&reg;'));
x += addHtmlValue("기술", m['Desc']);
x += MoreStart();
x += addHtmlValue("장치 주소", m['DeviceAddress']);
x += addHtmlValue("실재", m['Entity']);
x += addHtmlValue("엔터티 인스턴스", m['EntityInstance']);
var e = '';
for (var i in m['EventData']) { if (e.length > 0) e +=','; e += m['EventData'][i]; }
x += addHtmlValue("데이터", e);
x += addHtmlValue("오프셋", m['EventOffset']);
x += addHtmlValue("센서 타입", m['EventSensorType']);
x += addHtmlValue("심각성", m['EventSeverity']);
x += addHtmlValue("소스 유형", m['EventSourceType']);
x += addHtmlValue("유형", m['EventType']);
x += addHtmlValue("센서 번호", m['SensorNumber']);
x += MoreEnd();
x += '</div>';
messagebox(format("이벤트 # {0} 세부 사항", h + 1), x);
}
function eventFilter() {
var filter = Q('eventFilter').value.toLowerCase();
for (var w in eventmessages) { QV('xamtevent' + w, filter == '' || eventmessages[w]['Desc'].toLowerCase().indexOf(filter) >= 0 || eventmessages[w]['EntityStr'].toLowerCase().indexOf(filter) >= 0); }
}
// ###END###{EventLog}
// ###BEGIN###{EventSubscriptions}
//
// EVENT SUBSCRIPTION PANEL
//
var subscriptionsFilters = null; // List of event filters
var subscriptionsListeners = null; // List of subscribers
function PullEventSubscriptions() {
if (subscriptionsFilters == null) { amtstack.Enum('CIM_FilterCollection', processEventSubscriptions0); }
amtstack.BatchEnum(null, ['CIM_ListenerDestination', 'CIM_FilterCollectionSubscription'], processEventSubscriptions1);
}
function processEventSubscriptions0(stack, name, responses, status) {
if (status == 408 || status == 400) return;
if (status && errcheck(status, stack)) return;
subscriptionsFilters = responses;
}
function processEventSubscriptions1(stack, name, responses, status) {
if (status == 408 || status == 400) return;
if (status && errcheck(status, stack)) return;
if (status) QV('go22', true); // Show event subscription left panel option
if (responses) subscriptionsListeners = responses;
var c= 0, x = TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "이벤트 가입자를 관리합니다." + '<br><br>';
for (var i in subscriptionsListeners['CIM_ListenerDestination']['responses']) {
var f = subscriptionsListeners['CIM_FilterCollectionSubscription']['responses'][i]['Filter']['ReferenceParameters']['SelectorSet']['Selector']['Value'].replace('(r)', '&reg;');
var r = subscriptionsListeners['CIM_ListenerDestination']['responses'][i];
x += '<div class=itemBar onclick="showSubscriptionDetails(' + i + ')"><div style=float:right></div><div style=padding-top:3px;overflow-x:hidden title="' + f + ' - ' + r['Destination'] + '"><b>' + f + '</b> - ' + r['Destination'] + '</div><div style=padding-top:3px></div></div>';
c++;
}
if (c == 0) x += ('<div style=padding-left:15px><br><i>' + "구독이 없습니다." + '</i></div><br>');
var y = '<div>&nbsp;' + AddRefreshButton('PullEventSubscriptions()');
if (xxAccountAdminName) y += AddButton("새로운 구독", 'newSubscriptionButton()');
x += '<br><td class=r1>' + TableEnd(y + '</div>');
QH('id_TableEventSubscriptions', x);
}
var subscriptionDeliveryModes = { 2:"푸시", 3:"ACK로 푸시", 4:"행사", 5:"손잡이" };
function showSubscriptionDetails(h) {
if (xxdialogMode) return;
var f = subscriptionsListeners['CIM_FilterCollectionSubscription']['responses'][h]['Filter']['ReferenceParameters']['SelectorSet']['Selector']['Value'].replace('(r)', '&reg;');
var r = subscriptionsListeners['CIM_ListenerDestination']['responses'][h];
var x = '<div style=text-align:left>';
x += addHtmlValue("목적지", r['Destination']);
x += addHtmlValue("필터", f);
x += addHtmlValue("전달 모드", subscriptionDeliveryModes[r['DeliveryMode']]);
x += '</div>';
setDialogMode(11, "신청" + (h + 1), xxAccountAdminName?5:1, deleteSubscriptionButton, x, h);
}
function deleteSubscriptionButton(button, h) {
if (button != 2) return;
var name = subscriptionsListeners['CIM_ListenerDestination']['responses'][h]['Name'];
var filter = subscriptionsListeners['CIM_FilterCollectionSubscription']['responses'][h]['Filter']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
amtstack.UnSubscribe('CIM_FilterCollectionSubscription', PullEventSubscriptions, null, 1, {'Filter':'<a:EndpointReference><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_FilterCollection</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + filter + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference>', 'Handler':'<a:EndpointReference><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ListenerDestinationWSManagement</w:ResourceURI><w:SelectorSet><w:Selector Name="CreationClassName">CIM_ListenerDestinationWSMAN</w:Selector><w:Selector Name="Name">' + name + '</w:Selector><w:Selector Name="SystemCreationClassName">CIM_ComputerSystem</w:Selector><w:Selector Name="SystemName">Intel(r) AMT</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference>'});
}
function newSubscriptionButton() {
if (xxdialogMode || (subscriptionsFilters == null)) return;
var x = '';
x += '<div style=height:26px;margin-top:4px><select id=subtype style=float:right;width:260px><option value=Push>' + "푸시" + '</option><option value=PushWithAck>' + "ACK로 푸시" + '</option></select><div style=padding-top:4px>' + "유형" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=subfilter style=float:right;width:260px>';
for (var i in subscriptionsFilters) { x += '<option value="' + subscriptionsFilters[i]['InstanceID'] + '">' + subscriptionsFilters[i]['CollectionName'].substring(13) + '</option>'; }
x += '</select><div style=padding-top:4px>' + "필터" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input id=suburl style=float:right;width:260px maxlength=253 onkeyup=newSubscriptionUpdate() value="http://"><div style=padding-top:4px>' + "URL" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=subauth style=float:right;width:260px onchange=newSubscriptionUpdate()><option value=0>' + "없음" + '</option><option value=1>' + "요람" + '</option></select><div style=padding-top:4px>' + "입증" + '</div></div>';
x += '<div style=height:26px;margin-top:4px id=subxuser><input id=subuser style=float:right;width:260px maxlength=32 onkeyup=newSubscriptionUpdate()><div style=padding-top:4px>' + "사용자 이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px id=subxpass><input id=subpass style=float:right;width:260px maxlength=32 onkeyup=newSubscriptionUpdate()><div style=padding-top:4px>' + "암호" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input id=subargs style=float:right;width:260px maxlength=128><div style=padding-top:4px>' + "인수" + '</div></div>';
setDialogMode(11, "이벤트 구독 추가", 3, newSubscriptionButtonOk, x);
newSubscriptionUpdate();
}
function newSubscriptionUpdate() {
QE('idx_dlgOkButton', ((Q('suburl').value.length > 0) && (Q('suburl').value.startsWith('http://')) && ((Q('subauth').value == 0) || ((Q('subuser').value.length > 0) && (Q('subpass').value.length > 0)))));
QV('subxuser', Q('subauth').value == 1);
QV('subxpass', Q('subauth').value == 1);
}
function newSubscriptionButtonOk() {
var user = (Q('subuser').value.length == 0)?undefined:Q('subuser').value, pass = (Q('subpass').value.length == 0)?undefined:Q('subpass').value;
amtstack.Subscribe('CIM_FilterCollection', Q('subtype').value, Q('suburl').value, newSubscriptionButtonOk2, null, 1, { 'InstanceID' : Q('subfilter').value }, (Q('subargs').value.length > 0)?Q('subargs').value:null, user, pass);
}
function newSubscriptionButtonOk2(stack, name, responses, status) {
if (status == 200) { PullEventSubscriptions(); }
}
// ###END###{EventSubscriptions}
// ###BEGIN###{AuditLog}
//
// AUDIT LOG PANEL
//
function PullAuditLog(button) {
if (button == 1 && xxdialogMode) return;
amtFirstPull |= 32;
amtstack.Enum('AMT_AuditLog', processAuditLog0);
}
var auditLog = null;
var auditLogEnabledStates = ["알 수 없는", "다른", "가능", "비활성화", "종료", "해당 사항 없음", "활성화되었지만 오프라인", "테스트 중", "연기 됨", "Quiesce", "시작"];
function processAuditLog0(stack, name, responses, status) {
if (status == 200) {
QV('go15', true); // Show audit log left panel option
var r = responses[0]['AuditState'];
var auditstate = (r & 0x01) ? "비활성화" : "가능";
if (r & 0x02) auditstate += ", 잠김";
if (r & 0x04) auditstate += ", 거의 전체";
if (r & 0x08) auditstate += ", 전체";
if (r & 0x10) auditstate += ", NoKey";
var x = '<h1>' + "감사 로그 설정" + '</h1>' + TableStart();
x += TableEntry("상태", auditstate);
x += TableEntry("저장", responses[0]['CurrentNumberOfRecords'] + " 기록," + responses[0]['PercentageFree'] + "% 무료");
x += TableEntry("정책 덮어 쓰기", ((responses[0]['OverwritePolicy'] == 2) ? "가득 차면 랩" : "덮어 쓰지 않음"));
x += TableEnd();
QH('id_TableAuditLog1', x);
amtstack.GetAuditLog(processAuditLog1);
}
}
function processAuditLog1(stack, messages) {
auditLog = messages;
var i, x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
// ###BEGIN###{!FileSaver}
x += TableEnd('<div style=float:right><input id=auditFilter placeholder="' + "필터" + '" style=margin:4px onkeyup=auditFilter()>&nbsp;</div><div> ' + AddRefreshButton('PullAuditLog(1)') + AddButton("로그 지우기", 'ClearAuditLog()') /* + AddButton("Settings...", 'ShowAuditLogSettings()')*/) + '<br>';
// ###END###{!FileSaver}
// ###BEGIN###{FileSaver}
x += TableEnd('<div style=float:right><input id=auditFilter placeholder="' + "필터" + '" style=margin:4px onkeyup=auditFilter()>&nbsp;</div><div> ' + AddRefreshButton('PullAuditLog(1)') + AddButton("저장...", 'SaveAuditLog()') + AddButton("로그 지우기", 'ClearAuditLog()') /* + AddButton("Settings...", 'ShowAuditLogSettings()')*/) + '<br>';
// ###END###{FileSaver}
if (messages.length == 0) {
x = "감사 로그 이벤트가 없습니다.";
} else {
var y = 0;
x += '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=80px><p><td><td><td>';
x += '<tr><td class=r1 style=width:110px>&nbsp;&nbsp;<b>' + "시각" + '</b><td class=r1 style=width:260px><b>' + "창시자" + '</b><td class=r1><b>Action</b>';
for (i in messages) {
var m = messages[i], description = m['AuditApp'], initiator = m['Initiator'];
y++;
var addr = '';
if (m['NetAddress'].length > 0) addr = m['NetAddress'].replace('0000:0000:0000:0000:0000:0000:0000:0001','::1');
if (m['Event']) description += "," + m['Event'];
if (m['ExStr'] != null) description += "," + m['ExStr'];
if (initiator != '' && addr != '') initiator += ",";
x += '<tr id=xamtaudit' + i + ' class=r3 onclick=showAuditDetails(' + i + ')><td class=r1 title="' + m['Time'].toLocaleString() + '">&nbsp;&nbsp;' + m['Time'].toLocaleDateString('en', { year: 'numeric', month: '2-digit', day: 'numeric' }) + '<br>&nbsp;&nbsp;' + m['Time'].toLocaleTimeString('en', { hour:'2-digit', minute:'2-digit', second:'2-digit' }) + '<td class=r1>' + initiator + addr + '<td class=r1>' + description;
}
x += TableEnd(y == 0 ? '&nbsp;' : '') + '<br>';
}
QH('id_TableAuditLog2', x);
}
function auditFilter() {
var filter = Q('auditFilter').value.toLowerCase();
for (var w in auditLog) { QV('xamtaudit' + w, filter == '' || JSON.stringify(auditLog[w]).toLowerCase().indexOf(filter) >= 0); }
}
// ###BEGIN###{FileSaver}
function SaveAuditLog() {
if (xxdialogMode || auditLog == null) return;
SaveJsonFile('IntelAmtAuditlog', 'auditevents', "인텔 AMT 감사 로그", auditLog);
}
// ###END###{FileSaver}
function ClearAuditLog(x) { QH('id_dialogMessage', "감사 로그를 지우시겠습니까?"); setDialogMode(1, "감사 로그", 3, ClearAuditLogEx); }
function ClearAuditLogEx() {
//amtstack.AMT_AuditLog_ClearLog(function () { PullAuditLog(); })
var handle = amtstack.AMT_AuditLog_SetAuditLock(1,0, handle, function() { amtstack.AMT_AuditLog_ClearLog(function () { amtstack.AMT_AuditLog_SetAuditLock(0, 2, handle, function () { setTimeout(PullAuditLog,1000);}); }); });
}
function ShowAuditLogSettings() {
if (xxdialogMode) return;
amtstack.AMT_AuditLog_RequestStateChange(2, 0, AuditLogSettingsCompleted); // Enable
}
function AuditLogSettingsCompleted(stack, name, responses, status) {
if (status == 200) PullAuditLog(); else messagebox("감사 로그", "오류: " + status);
}
function showAuditDetails(h) {
if (xxdialogMode) return;
var i, m = auditLog[h], x = '<div style=text-align:left>';
x += addHtmlValue("시각", m['Time'].toLocaleString());
if (m['Initiator'] != '') x += addHtmlValue("창시자", m['Initiator']);
if (m['NetAddress'] != '') x += addHtmlValue("주소", m['NetAddress']);
x += addHtmlValue("신청", m['AuditApp']);
x += addHtmlValue("행사", m['Event']);
if (m['ExStr'] != null) {
x += addHtmlValue("확장 된 데이터", m['ExStr']);
} else if (m['Ex'].length > 0) {
var e = '';
for (i in m['Ex']) { if (e.length > 0) e += ','; e += m['Ex'].charCodeAt(i); }
if (e != '') x += addHtmlValue("데이터 값", e);
if (m['Ex'].length > 2 && ReadShort(m['Ex'], 0) == (m['Ex'].length - 2)) x += addHtmlValue("데이터 문자열", m['Ex'].substring(2));
}
x += '</div>';
messagebox("감사 이벤트 #" + (h + 1) + " 세부", x);
}
// ###END###{AuditLog}
// ###BEGIN###{Certificates}
//
// Certificates
//
var xxCertificates = null;
var xxCertPrivateKeys = null;
var xxTlsSettings = null;
var xxTlsCurrentCert = null;
var xxTLSCredentialContext = null;
var xxCaPrivateKey = null;
var xxCaSubjectAttributes = null;
function PullCertificates() {
// We only deal with certificates starting with Intel AMT 6 and beyond
amtstack.BatchEnum(null, ['AMT_PublicKeyCertificate', 'AMT_PublicPrivateKeyPair', 'AMT_TLSSettingData', 'AMT_TLSCredentialContext'], processCerts1);
}
function processCerts1(stack, name, responses, status) {
if ((status == 400) || errcheck(status, stack)) return;
QV('go16', true); // Security Settings
xxCertificates = responses['AMT_PublicKeyCertificate'].responses;
xxCertPrivateKeys = responses['AMT_PublicPrivateKeyPair'].responses;
xxTlsSettings = responses['AMT_TLSSettingData'].responses;
xxTLSCredentialContext = responses['AMT_TLSCredentialContext'].responses;
// Select the current TLS certificate in the drop down box
xxTlsCurrentCert = null;
if (xxTLSCredentialContext.length > 0) {
var certInstanceId = xxTLSCredentialContext[0]['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
for (var i in xxCertificates) { if (xxCertificates[i]['InstanceID'] == certInstanceId) { xxTlsCurrentCert = i; } }
}
// ###BEGIN###{Mode-NodeWebkit}
try { if ((currentcomputer['tls'] == 0) && (xxTlsSettings[0]['MutualAuthentication'] !== true)) { QV('tlsNotification4', true); } } catch (ex) { console.log(ex); }
// ###END###{Mode-NodeWebkit}
// Setup the certificates
for (var i in xxCertificates) {
xxCertificates[i].TrustedRootCertficate = (xxCertificates[i]['TrustedRootCertficate'] == true);
xxCertificates[i].X509Certificate = window.atob(xxCertificates[i]['X509Certificate']);
xxCertificates[i].XIssuer = parseCertName(xxCertificates[i]['Issuer']);
xxCertificates[i].XSubject = parseCertName(xxCertificates[i]['Subject']);
}
amtcert_linkCertPrivateKey(xxCertificates, xxCertPrivateKeys); // This links all certificates and private keys
updateCertificates();
}
function parseCertName(x) {
var j, r = {}, xx = x.split(',');
for (var i in xx) { j = xx[i].indexOf('='); r[xx[i].substring(0, j)] = xx[i].substring(j + 1); }
return r;
}
function getTlsSecurityState(x) {
if (xxTlsSettings[x]['Enabled'] == false) return "비활성화";
var r = ((xxTlsSettings[x]['MutualAuthentication'] == true) ? "상호 인증 TLS" : "서버 인증 TLS") + ((xxTlsSettings[x]['AcceptNonSecureConnections'] == true) ? " 그리고 비 TLS" : '');
if ((xxTlsSettings[x]['MutualAuthentication'] == true) && (xxTlsSettings[x]['TrustedCN'])) {
var trustedCn = MakeToArray(xxTlsSettings[x]['TrustedCN']);
if (trustedCn.length > 0) { r += ', ' + ((trustedCn.length > 1) ? 'Trusted names' : 'Trusted name') + ': ' + trustedCn.join(', ') + '.'; }
}
return r;
}
function updateCertificates() {
if (xxCertificates == null) return;
// Figure out what index is local & remote
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
// General settings
var x = TableStart();
x += TableEntry("원격 TLS 보안", addLinkConditional(getTlsSecurityState(remoteNdx), 'showSetTlsSecurityDlg()', xxAccountAdminName));
x += TableEntry("로컬 TLS 보안", addLinkConditional(getTlsSecurityState(localNdx), 'showSetTlsSecurityDlg()', xxAccountAdminName));
x += TableEnd();
x += '<br>' + TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "이 컴퓨터의 인텔 &reg; AMT 인증서를 관리하십시오." + '<br><br>';
if (xxCertificates.length == 0 && xxCertPrivateKeys.length == 0) {
x += '<div style=padding-left:15px><br><i>' + "인증서를 찾을 수 없습니다." + '</i></div><br>';
} else {
for (var i in xxCertificates) {
var desc = '';
if (xxCertificates[i].TrustedRootCertficate) desc = "신뢰할 수있는 루트";
if (xxCertificates[i].XPrivateKey) desc = "개인 키";
if (i == xxTlsCurrentCert) desc += ", TLS 인증서";
x += '<div class=itemBar onclick=showCertDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(xxCertificates[i].XSubject['CN']) + '</b><i>' + desc + '</i></div></div>';
}
for (var i in xxCertPrivateKeys) {
if (!xxCertPrivateKeys[i].XCert) {
x += '<div class=itemBar onclick=showKeyPairDetails(' + i + ')><div style=padding-top:3px><i>' + "할당되지 않은 개인 키 쌍 #" + i + '</i></div></div>';
}
}
}
var buttons = AddRefreshButton('PullCertificates()');
if (xxAccountAdminName) { buttons += (AddButton("인증서 추가 ...", 'addCertButton()') + AddButton("인증서 발급 ...", 'issueCertButton()')); }
x += '<br><td class=r1>' + TableEnd(buttons);
QH('id_TableCerts', x);
}
function showKeyPairDetails(h) {
var x = "이것은 인증서에 속하지 않은 공개 / 개인 인증서 키 쌍입니다. 이 항목은 일시적이어야합니다.";
setDialogMode(11, "키 페어 #" + h, 5, function (b) { if (b == 2) { amtstack.Delete('AMT_PublicPrivateKeyPair', { 'InstanceID': xxCertPrivateKeys[h]['InstanceID'] }, PullCertificates, 0, 1); } }, x);
}
var xxCertSubjectNames = { 'CN': "공통 이름", 'O': "조직", 'OU': "조직 단위", 'S': "시 /도", 'ST': "시 /도", 'L': "소재지", 'C': "국가", 'SN': "성", 'GN': "이름" };
function showCertDetails(h) {
if (xxdialogMode) return;
var c = xxCertificates[h], x = '<br>';
// ###BEGIN###{FileSaver}
x += addHtmlValue("증명서", c.X509Certificate.length + " 바이트" + '<a style=cursor:pointer;color:blue onclick=downloadCert(' + h + ')>' + "다운로드" + '</a>');
// ###END###{FileSaver}
// ###BEGIN###{!FileSaver}
x += addHtmlValue("증명서", c.X509Certificate.length + " 바이트");
// ###END###{!FileSaver}
x += addHtmlValue("신뢰할 수있는 루트", c.TrustedRootCertficate ? "예" : "아니");
if (c.TrustedRootCertficate == false && c.XPrivateKey) { x += addHtmlValue("개인 키", "선물"); }
// Show certificate usages
/*
y = [];
if (extKeyUsage != null) {
if (extKeyUsage.clientAuth == true) { y.push("TLS&nbsp;Client"); }
if (extKeyUsage.codeSigning == true) { y.push("Code&nbsp;Signing"); }
if (extKeyUsage.emailProtection == true) { y.push("EMail"); }
if (extKeyUsage.serverAuth == true) { y.push("TLS&nbsp;Server"); }
if (extKeyUsage["2.16.840.1.113741.1.2.1"] == true) { y.push("Intel&reg;&nbsp;AMT Console"); }
if (extKeyUsage["2.16.840.1.113741.1.2.2"] == true) { y.push("Intel&reg;&nbsp;AMT Agent"); }
if (extKeyUsage["2.16.840.1.113741.1.2.3"] == true) { y.push("Intel&reg;&nbsp;AMT Activation"); }
if (extKeyUsage.timeStamping == true) { y.push("Time&nbsp;Stamping"); }
if (y.length > 0) { x += addHtmlValueNoTitle("Certificate Usage", y.join(', ') + '.') + '<br clear=all />'; }
}
*/
x += '<br><div style="border-bottom:1px solid gray"><i>' + "인증서 주체" + '</i></div><br>';
for (var i in c.XSubject) { if (c.XSubject[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(c.XSubject[i])); } }
// x += addHtmlValueNoTitle("Fingerprint", c.fingerprint.substring(0,29) + '<br />' + c.fingerprint.substring(30)); // TODO: Parse the certificate using Forge and get the fingerprint
x += '<br><div style="border-bottom:1px solid gray"><i>' + "발급자 인증서" + '</i></div><br>';
for (var i in c.XIssuer) { if (c.XIssuer[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(c.XIssuer[i])); } }
setDialogMode(11, "증명서-" + EscapeHtml(c.XSubject['CN']), 5, function (b) {
if (b == 2) {
// If there is a private key, delete it.
if (xxCertificates[h].XPrivateKey) amtstack.Delete('AMT_PublicPrivateKeyPair', { 'InstanceID': xxCertificates[h].XPrivateKey['InstanceID'] }, function () { }, 0, 1);
// Delete the certificate
amtstack.Delete('AMT_PublicKeyCertificate', xxCertificates[h], certificateRemoved, 0, 1);
}
}, x);
}
// ###BEGIN###{FileSaver}
function downloadCert(h) {
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(xxCertificates[h].X509Certificate), xxCertificates[h].XSubject['CN'] + '.cer');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('nwsaveas', xxCertificates[h].XSubject['CN'] + '.cer');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, xxCertificates[h].X509Certificate, 'binary', function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
function cert_FileSelectHandler(e) {
haltEvent(e);
if (e.dataTransfer.files.length == 1) {
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.p12')) {
issueCertButton(e.dataTransfer.files);
} else {
addCertButton(e.dataTransfer.files);
}
}
}
var xxDragDropCertFiles = null;
function addCertButton(files) {
if (xxdialogMode || !xxAccountAdminName) return;
var x = '<div style=height:10px></div>', op0 = '', op2 = '';
xxDragDropCertFiles = files;
// ###BEGIN###{CertificateManager}
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
if (amtversion > 12) { op2 = '<option value=2>' + "MeshCommander Web Server Root" + '</option>'; }
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
if (certificateStore.length > 0) { op0 += '<option value=0>' + "인증서 관리자에서 추가" + '</option>'; }
if ((!xxDragDropCertFiles) && ((op0 != '') || (op2 != ''))) { x += '<div style=height:26px;margin-top:4px><select onchange=addCertButtonUpdate() id=certoptype style=float:right;width:260px>' + op0 + '<option value=1>' + "인증서 파일에서 추가" + '</option>' + op2 + '</select><div style=padding-top:4px>' + "조작" + '</div></div>'; }
x += '<div id=dxcertfileop1>';
var input = '<input id=certopen onchange=addCertButtonUpdate() type=file style=float:right;width:260px accept=".crt,.cer,.pem">';
if (xxDragDropCertFiles) { input = '<input style=float:right;width:260px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
x += '<div style=height:26px;margin-top:4px>' + input + '<div style=padding-top:4px>' + "인증서 파일" + '</div></div></div>';
if (certificateStore.length > 0) {
x += '<div id=dxcertfileop2><div style=height:26px;margin-top:4px><select id=certhandle style=float:right;width:260px>';
for (var i in certificateStore) {
var certificate = certificateStore[i], name = certificate.cert.subject.getField('CN').value;
x += '<option value=' + certificate['h'] + '>' + name + '</option>';
}
x += '</select><div style=padding-top:4px>' + "증명서" + '</div></div></div>';
}
// ###END###{CertificateManager}
// ###BEGIN###{!CertificateManager}
var input = '<input id=certopen onchange=addCertButtonUpdate() type=file style=float:right;width:260px accept=".cer,.pem">';
if (xxDragDropCertFiles) { input = '<input style=float:right;width:260px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
x += '<div style=height:26px;margin-top:4px>' + input + '<div style=padding-top:4px>' + "인증서 파일" + '</div></div>';
// ###END###{!CertificateManager}
x += '<div style=height:26px;margin-top:4px><select id=certtype style=float:right;width:260px><option value=1>' + "신뢰할 수있는 루트 인증서" + '</option><option value=0>' + "체인 인증서" + '</option></select><div style=padding-top:4px>' + "증명서 종류" + '</div></div>';
setDialogMode(11, "인증서 추가", 3, addCertButtonOk, x);
addCertButtonUpdate();
}
function addCertButtonUpdate() {
// ###BEGIN###{CertificateManager}
if ((!xxDragDropCertFiles) && (certificateStore.length > 0)) {
QV('dxcertfileop2', Q('certoptype').value == 0);
QV('dxcertfileop1', Q('certoptype').value == 1);
if (Q('certoptype').value == 0) { QE('idx_dlgOkButton', true); return; }
}
// ###END###{CertificateManager}
var certopen = getInputElement('certopen');
QE('idx_dlgOkButton', !certopen || (certopen.files.length == 1) || (Q('certoptype').value == 2));
}
function addCertButtonOk() {
// ###BEGIN###{CertificateManager}
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
if (Q('certoptype').value == 2) {
var certbin = null;
if (webserver == null) {
webserver = CreateWebServer();
webserver.generateCertificate(0);
certbin = webserver.rootCert;
webserver = null;
} else {
certbin = webserver.rootCert;
}
// This is a .PEM file, keep everything between BEGIN/END, clean it up and use as-is. It's already Base64.
var i = certbin.indexOf('-----BEGIN CERTIFICATE-----');
if (i >= 0) {
certbin = certbin.substring(i + 27);
i = certbin.indexOf('-----END CERTIFICATE-----');
if (i >= 0) certbin = certbin.substring(0, i)
certbin = certbin.replace(/\r\n/g, '');
if (getSelectElement('certtype').value == 1) {
amtstack.AMT_PublicKeyManagementService_AddTrustedRootCertificate(certbin, certificateAdded);
} else {
amtstack.AMT_PublicKeyManagementService_AddCertificate(certbin, certificateAdded);
}
}
return;
}
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
if ((xxDragDropCertFiles) || (certificateStore.length == 0) || (Q('certoptype').value == 1)) {
var certopen = getInputElement('certopen');
var files = xxDragDropCertFiles;
if (certopen) files = certopen.files;
if (files && files.length == 1) {
var reader = new FileReader();
reader.onload = addCertButtonOk2;
reader.readAsBinaryString(files[0]);
}
} else {
var certificate = getCertificate(Q('certhandle').value)
if (getSelectElement('certtype').value == 1) {
amtstack.AMT_PublicKeyManagementService_AddTrustedRootCertificate(certificate['certbin'], certificateAdded);
} else {
amtstack.AMT_PublicKeyManagementService_AddCertificate(certificate['certbin'], certificateAdded);
}
}
// ###END###{CertificateManager}
// ###BEGIN###{!CertificateManager}
var certopen = getInputElement('certopen');
var files = xxDragDropCertFiles;
if (certopen) files = certopen.files;
if (files && files.length == 1) {
var reader = new FileReader();
reader.onload = addCertButtonOk2;
reader.readAsBinaryString(files[0]);
}
// ###END###{!CertificateManager}
}
function addCertButtonOk2(file) {
var data = file.target.result;
var i = data.indexOf('-----BEGIN CERTIFICATE-----');
if (i >= 0) {
// This is a .PEM file, keep everything between BEGIN/END, clean it up and use as-is. It's already Base64.
data = data.substring(i + 27);
i = data.indexOf('-----END CERTIFICATE-----');
if (i >= 0) data = data.substring(0, i)
data = data.replace(/\r\n/g, '');
} else {
// This is a .CER file, just base64 encode it and we should be ok.
data = btoa(data);
}
if (getSelectElement('certtype').value == 1) {
amtstack.AMT_PublicKeyManagementService_AddTrustedRootCertificate(data, certificateAdded);
} else {
amtstack.AMT_PublicKeyManagementService_AddCertificate(data, certificateAdded);
}
}
function issueCertButton(files) {
if (xxdialogMode || !xxAccountAdminName) return;
xxDragDropCertFiles = files;
// ###BEGIN###{CertificateManager}
var x = '', certCount = getCertificateWithKeyCount();
if ((!xxDragDropCertFiles) && (certCount > 0)) { x += '<div style=height:26px;margin-top:4px><select onchange=addCertButtonUpdate() id=certoptype style=float:right;width:230px><option value=0>' + "인증서 관리자의 문제" + '</option><option value=1>' + "인증서 파일에서 문제" + '</option></select><div style=padding-top:4px>Operation</div></div>'; }
x += '<div id=dxcertfileop1>', input = '<input id=certopen onchange=issueCertButtonUpdate() type=file style=float:right;width:230px accept=".p12">';
if (xxDragDropCertFiles) { input = '<input style=float:right;width:230px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
x += '<div style=height:26px;margin-top:4px>' + input + '<div style=padding-top:4px>' + "인증서 파일" + '</div></div><div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certopenpass type=password autocomplete=off style=float:right;width:230px><div style=padding-top:4px>' + "인증서 비밀번호" + '</div></div></div>';
if (certificateStore.length > 0) {
x += '<div id=dxcertfileop2><div style=height:26px;margin-top:4px><select id=certhandle style=float:right;width:230px>';
for (var i in certificateStore) {
var certificate = certificateStore[i], name = certificate.cert.subject.getField('CN').value
if (certificate['privateKey']) { x += '<option value=' + certificate['h'] + '>' + name + '</option>'; }
}
x += '</select><div style=padding-top:4px>' + "증명서" + '</div></div></div>';
}
// ###END###{CertificateManager}
// ###BEGIN###{!CertificateManager}
var x = '', input = '<input id=certopen type=file style=float:right;width:230px onchange=issueCertButtonUpdate() accept=".p12">';
if (xxDragDropCertFiles) { input = '<input style=float:right;width:230px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
x += '<div styleheight:26px;margin-top:14px>' + input + '<div style=padding-top:4px>Certificate file</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certopenpass type=password autocomplete=off style=float:right;width:230px><div style=padding-top:4px>' + "인증서 비밀번호" + '</div></div>';
// ###END###{!CertificateManager}
x += '<br><div style="border-bottom:1px solid gray"><i>' + "인텔 &reg; AMT 인증서" + '</i></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certcn style=float:right;width:230px><div style=padding-top:4px>' + "공통 이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certo style=float:right;width:230px><div style=padding-top:4px>' + "조직" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certst style=float:right;width:230px><div style=padding-top:4px>' + "시 /도" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certc style=float:right;width:230px><div style=padding-top:4px>' + "국가" + '</div></div>';
x += '<div>' + "인증서 사용법" + '</div><ul style="list-style-type:none;height:100px;overflow:auto;width:100%;border: 1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0">';
//x += '<li><label><input type=checkbox id=d11_cu1>' + "Intel&reg; AMT Console" + '</label></li>';
//x += '<li><label><input type=checkbox id=d11_cu2>' + "Intel&reg; AMT Agent" + '</label></li>';
//x += '<li><label><input type=checkbox id=d11_cu3>' + "Intel&reg; AMT Activation" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu4 checked>' + "TLS 서버 (HTTPS)" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu5>' + "TLS 클라이언트 (HTTPS)" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu6>' + "이메일 보호" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu7>' + "코드 서명" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu8>' + "타임 스탬프" + '</label></li>';
x += '</ul>';
setDialogMode(11, "발급 증명서", 3, issueCertButtonOk, x);
issueCertButtonUpdate();
}
function issueCertButtonUpdate() {
// ###BEGIN###{CertificateManager}
var certCount = getCertificateWithKeyCount();
if ((!xxDragDropCertFiles) && (certCount > 0)) {
QV('dxcertfileop2', Q('certoptype').value == 0);
QV('dxcertfileop1', Q('certoptype').value == 1);
QE('idx_dlgOkButton', (getInputElement('certcn').value != '') && (getInputElement('certo').value != '') && (getInputElement('certst').value != '') && (getInputElement('certc').value != ''));
return;
}
// ###END###{CertificateManager}
var certopen = getInputElement('certopen');
QE('certopenpass', !certopen || (certopen && certopen.files.length == 1));
var x = (!certopen || certopen.files.length < 2);
if ((!certopen || (certopen && certopen.files.length)) == 1 && Q('certopenpass').value == '') x = false;
if (getInputElement('certcn').value == '' || getInputElement('certo').value == '' || getInputElement('certst').value == '' || getInputElement('certc').value == '') { x = false; }
QE('idx_dlgOkButton', x);
}
function issueCertButtonOk() {
// ###BEGIN###{CertificateManager}
if ((xxDragDropCertFiles) || (certificateStore.length == 0) || (Q('certoptype').value == 1)) {
var certopen = getInputElement('certopen');
var files = xxDragDropCertFiles;
if (certopen) files = certopen.files;
if (files && files.length == 1) {
// Issue a certificate using this file
var reader = new FileReader();
reader.onload = issueCertButtonOk2;
reader.readAsBinaryString(files[0]);
} else {
// Issue a certificate using a dummy CA
issueCertButtonOk3(null);
}
} else {
// Save the certificate store certificate as a p12 and load it back up using the regular user flow. This makes the code smaller but slower.
var certificate = getCertificate(Q('certhandle').value);
var certBase64 = forge.util.encode64(forge.asn1.toDer(forge.pkcs12.toPkcs12Asn1(certificate['privateKey'], certificate['cert'], 'pass')).getBytes());
amtcert_loadP12File(atob(certBase64), 'pass', issueCertButtonOk3);
}
// ###END###{CertificateManager}
// ###BEGIN###{!CertificateManager}
var certopen = getInputElement('certopen');
var files = xxDragDropCertFiles;
if (certopen) files = certopen.files;
if (files && files.length == 1) {
// Issue a certificate using this file
var reader = new FileReader();
reader.onload = issueCertButtonOk2;
reader.readAsBinaryString(files[0]);
} else {
// Issue a certificate using a dummy CA
issueCertButtonOk3(null);
}
// ###END###{!CertificateManager}
}
function issueCertButtonOk2(file) {
// Load the CA certificate and private key
var r = amtcert_loadP12File(file.target.result, Q('certopenpass').value, issueCertButtonOk3);
if (r == false) { messagebox("발급 증명서", "인증서를 해독 / 디코딩 할 수 없습니다."); return; }
}
function issueCertButtonOk3(privateKey, subjectAttributes, cert) {
// Ask Intel AMT to generate a key pair
xxCaPrivateKey = privateKey;
xxCaSubjectAttributes = subjectAttributes;
amtstack.AMT_PublicKeyManagementService_GenerateKeyPair(0, 2048, GenerateKeyPairResponse);
}
function GenerateKeyPairResponse(stack, serviceName, response, status) {
if (status != 200) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다. 상태: " + status); return; }
if (response.Body['ReturnValue'] != 0) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다." + response.Body['ReturnValueStr']); return; }
// Get the new key pair
amtstack.Enum('AMT_PublicPrivateKeyPair', GenerateKeyPairResponse2, response.Body['KeyPair']['ReferenceParameters']['SelectorSet']['Selector']['Value']);
}
function GenerateKeyPairResponse2(stack, serviceName, response, status, tag) {
if (status != 200) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다. 상태: " + status); return; }
var DERKey = null;
for (var i in response) { if (response[i]['InstanceID'] == tag) DERKey = response[i]['DERKey']; }
// Get certificate values
var certattributes = { 'CN': getInputElement('certcn').value, 'O': getInputElement('certo').value, 'ST': getInputElement('certst').value, 'C': getInputElement('certc').value };
var issuerattributes = { 'CN': "신뢰할 수없는 루트 인증서" };
if (xxCaPrivateKey != null && xxCaSubjectAttributes) {
issuerattributes = {};
for (var i in xxCaSubjectAttributes) {
issuerattributes[xxCaSubjectAttributes[i].shortName] = xxCaSubjectAttributes[i].value; // The issuing CA's subject attributes
}
}
// Figure out the extended key usages
var extKeyUsage = { name: 'extKeyUsage' }
//if (Q('d11_cu1').checked) { extKeyUsage['2.16.840.1.113741.1.2.1'] = true; extKeyUsage.clientAuth = true; }
//if (Q('d11_cu2').checked) { extKeyUsage['2.16.840.1.113741.1.2.2'] = true; extKeyUsage.clientAuth = true; }
//if (Q('d11_cu3').checked) { extKeyUsage['2.16.840.1.113741.1.2.3'] = true; extKeyUsage.clientAuth = true; }
if (Q('d11_cu4').checked) { extKeyUsage.serverAuth = true; }
if (Q('d11_cu5').checked) { extKeyUsage.clientAuth = true; }
if (Q('d11_cu6').checked) { extKeyUsage.emailProtection = true; }
if (Q('d11_cu7').checked) { extKeyUsage.codeSigning = true; }
if (Q('d11_cu8').checked) { extKeyUsage.timeStamping = true; }
// Sign the key pair using the CA certifiate
var cert = amtcert_signWithCaKey(DERKey, xxCaPrivateKey, certattributes, issuerattributes, extKeyUsage);
if (cert == null) { messagebox("발급 증명서", "인증서에 서명 할 수 없습니다."); return; }
// Place the resulting signed certificate back into AMT
var pem = forge.pki.certificateToPem(cert).replace(/(\r\n|\n|\r)/gm, '');
amtstack.AMT_PublicKeyManagementService_AddCertificate(pem.substring(27, pem.length - 25), GenerateKeyPairResponse4);
}
function GenerateKeyPairResponse4(stack, serviceName, response, status) {
if (status != 200) { messagebox("발급 증명서", "키 페어를 생성하지 못했습니다. 상태: " + status); return; }
PullCertificates();
}
function certificateAdded(stack, serviceName, response, status) { if (status != 200 || response.Body['ReturnValue'] != 0) { messagebox("인증서 추가", "인증서를 추가 할 수 없습니다. 오류" + (status != 200 ? status : response.Body['ReturnValueStr'])); } else PullCertificates(); }
function certificateRemoved(stack, serviceName, header, status) { if (status != 200) { messagebox("인증서 제거", "인증서를 제거 할 수 없습니다. 오류" + status); } else PullCertificates(); }
function getInputElement(id) { var allelements = document.getElementsByTagName('input'); for (t = 0; t < allelements.length; t++) { if (allelements[t].id == id) return allelements[t]; } }
function getSelectElement(id) { var allelements = document.getElementsByTagName('select'); for (t = 0; t < allelements.length; t++) { if (allelements[t].id == id) return allelements[t]; } }
function showSetTlsSecurityDlg(x) {
if (xxdialogMode) return;
var x = '';
x += '<div style=height:26px;margin-top:4px><select onchange=showSetTlsSecurityDlgUpdate() id=tlscert style=float:right;width:260px><option value=-1>' + "인증서 없음, TLS 비활성화" + '</option>';
for (var i in xxCertificates) { if (xxCertificates[i].TrustedRootCertficate == false && xxCertificates[i].XPrivateKey) { x += '<option value=' + i + '>' + xxCertificates[i].XSubject['CN'] + '</option>'; } }
x += '</select><div style=padding-top:4px>' + "증명서" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=tlsremote style=float:right;width:260px onchange=showSetTlsSecurityDlgUpdate()><option value=0>Server-auth TLS only</option><option value=1>Server-auth, non-TLS allowed</option>';
x += '<option value=2>Mutual-auth TLS only</option><option value=3>Mutual-auth, non-TLS allowed</option>'; // Support for mutual-auth TLS seems to have been removed on AMT8 and after ??
x += '</select><div style=padding-top:4px>Security</div></div><div style=height:26px id=d11rcn title="' + "원격으로 연결할 수있는 쉼표로 구분 된 인증서 공통 이름 목록입니다." + '"><input id=d11_rcn style=float:right;width:260px onkeyup=showSetTlsSecurityDlgUpdate() placeholder="' + "이름 1, 이름 2" + '"><div style=padding-top:4px>' + "원격 CN" + '</div></div>';
setDialogMode(11, "TLS 설정", 3, showSetTlsSecurityDlgOk, x);
// Select the current TLS certificate in the drop down box
if ((xxTLSCredentialContext.length == 0) || (xxTlsSettings[0]['Enabled'] == false) || (xxTlsSettings[1]['Enabled'] == false)) {
getSelectElement('tlscert').value = -1;
} else {
var certInstanceId = xxTLSCredentialContext[0]['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
for (var i in xxCertificates) { if (xxCertificates[i]['InstanceID'] == certInstanceId) { getSelectElement('tlscert').value = i; } }
}
// Figure out what index is local & remote
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
// Select correct TLS options in the drop down boxes
getSelectElement('tlsremote').value = ((xxTlsSettings[remoteNdx]['MutualAuthentication'] == true) ? 2 : 0) + ((xxTlsSettings[remoteNdx]['AcceptNonSecureConnections'] == true) ? 1 : 0);
if (xxTlsSettings[remoteNdx]['TrustedCN']) { Q('d11_rcn').value = MakeToArray(xxTlsSettings[remoteNdx]['TrustedCN']).join(', '); }
showSetTlsSecurityDlgUpdate();
}
function showSetTlsSecurityDlgUpdate() {
var h = getSelectElement('tlscert').value;
QE('tlsremote', h != -1);
QV('d11rcn', (h != -1) && (getSelectElement('tlsremote').value > 1));
var ok = true;
if ((getSelectElement('tlsremote').value > 1) && (!splitDomains(Q('d11_rcn').value))) { ok = false; }
QE('idx_dlgOkButton', ok);
}
var setTlsSecurityPendingCalls;
var setTlsSecurityDeleteCredentialContext;
function showSetTlsSecurityDlgOk() {
var h = getSelectElement('tlscert').value;
var r = getSelectElement('tlsremote').value;
var xxTlsSettings2 = Clone(xxTlsSettings);
setTlsSecurityPendingCalls = 0;
setTlsSecurityDeleteCredentialContext = null;
if (h != -1) {
// Set the TLS certificate
if (xxTLSCredentialContext.length > 0) {
// Modify the current context
var newTLSCredentialContext = Clone(xxTLSCredentialContext[0]);
newTLSCredentialContext['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'] = xxCertificates[h]['InstanceID'];
amtstack.Put('AMT_TLSCredentialContext', newTLSCredentialContext, setTlsSecurityResponse, 0, 1);
setTlsSecurityPendingCalls++;
} else {
// Add a new security context
amtstack.Create('AMT_TLSCredentialContext', {
'ElementInContext':'<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_PublicKeyCertificate') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + xxCertificates[h]['InstanceID'] + '</w:Selector></w:SelectorSet></a:ReferenceParameters>',
'ElementProvidingContext':'<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_TLSProtocolEndpointCollection') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="ElementName">TLSProtocolEndpointInstances Collection</w:Selector></w:SelectorSet></a:ReferenceParameters>' }, setTlsSecurityResponse);
setTlsSecurityPendingCalls++;
}
} else {
// Clear the TLS certificate association (MOVE THIS)
if (xxTLSCredentialContext.length > 0) { setTlsSecurityDeleteCredentialContext = Clone(xxTLSCredentialContext[0]); }
}
// Figure out what index is local & remote
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
// Remote TLS settings
xxTlsSettings2[remoteNdx]['Enabled'] = (h != -1);
xxTlsSettings2[remoteNdx]['MutualAuthentication'] = (r >= 2);
xxTlsSettings2[remoteNdx]['AcceptNonSecureConnections'] = ((r % 2) == 1);
xxTlsSettings2[remoteNdx]['TrustedCN'] = splitDomains(Q('d11_rcn').value);
// Local TLS settings
xxTlsSettings2[localNdx]['Enabled'] = (h != -1);
xxTlsSettings2[localNdx]['TrustedCN'] = splitDomains(Q('d11_rcn').value); // This is required for old Intel AMT (v7 for sure) because older AMT support local interface mutual-auth and don't well if you don't set this.
// Mutual-auth TLS requires time sync
if (r >= 2) {
setTlsSecurityPendingCalls++;
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(function (stack, name, response, status) {
if (status != 200) { messagebox('', "시간을 설정하지 못했습니다. 상태 =" + status); return; }
if (response.Body['ReturnValue'] != 0) { messagebox('', "시간을 설정하지 못했습니다. 오류 : " + response.Body['ReturnValueStr']); return; }
//var now = new Date(), Tm1 = Math.round((now.getTime() - (now.getTimezoneOffset() * 60000)) / 1000);
var now = new Date(), Tm1 = Math.round(now.getTime() / 1000);
amtstack.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch(response.Body['Ta0'], Tm1, Tm1, function () { setTlsSecurityResponse(); });
});
}
// Update TLS settings
setTlsSecurityPendingCalls += 2;
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[0], setTlsSecurityResponse, 0, 1, xxTlsSettings2[0]);
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[1], setTlsSecurityResponse, 0, 1, xxTlsSettings2[1]);
statusbox("TLS 설정", "새로운 보안 설정 적용 중 ...");
}
// Split a string into a array of domains. Return null if not a valid list.
function splitDomains(str) {
str = str.split(',');
if (str.length == 0) return;
for (var i in str) { str[i] = str[i].trim(); if ((str[i].indexOf(' ') >= 0) || (str[i].length == 0)) return; }
if (str.length > 4) return;
return str;
}
function setTlsSecurityResponse(stack, name, response, status) {
if (stack) {
if (status != 200) { messagebox('', "TLS 보안을 설정하지 못했습니다. 상태 =" + status); return; }
if (response.Body['ReturnValueStr'] && !methodcheck(response)) return;
}
// Check if all the calls are done & perform a commit
if ((--setTlsSecurityPendingCalls) == 0) { amtstack.AMT_SetupAndConfigurationService_CommitChanges(null, setTlsSecurityResponse2); }
}
function setTlsSecurityResponse2(stack, name, response, status) {
if (status != 200) { messagebox('', "TLS 보안을 설정하지 못했습니다. 상태 =" + status); return; }
if (response.Body['ReturnValue'] != 0) { messagebox('', "TLS 보안을 설정하지 못했습니다. 오류 : " + response.Body['ReturnValueStr']); return; }
setTimeout(setTlsSecurityResponse3, 2000);
}
function setTlsSecurityResponse3() {
if (setTlsSecurityDeleteCredentialContext != null) { amtstack.Delete('AMT_TLSCredentialContext', setTlsSecurityDeleteCredentialContext, function () { }); }
PullCertificates();
setDialogMode();
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(processSystemTime);
}
// ###END###{Certificates}
// ###BEGIN###{AgentPresence}
//
// AGENT PRESENCE
//
var xxWatchdog = null;
function PullWatchdog() {
amtstack.BatchEnum(null, ['*AMT_AgentPresenceCapabilities', 'AMT_AgentPresenceWatchdog', 'AMT_AgentPresenceWatchdogAction', 'AMT_StateTransitionCondition', 'CIM_ConcreteDependency'], PullWatchdogResponse);
}
function PullWatchdogResponse(stack, name, responses, status) {
if ((status == 200) && (responses['AMT_AgentPresenceCapabilities'].status == 200)) {
xxWatchdog = responses;
// Place the actions into the watchdogs for easy navigation.
for (var i in xxWatchdog['CIM_ConcreteDependency'].responses) {
var link = xxWatchdog['CIM_ConcreteDependency'].responses[i];
var x1 = getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'CreationClassName');
if (x1 && x1['Value'] == 'AMT_AgentPresenceWatchdog') {
var deviceid = getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'DeviceID')['Value'];
var policyConditionName = getItem(link['Dependent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyConditionName')['Value'];
var watchdog = getItem(xxWatchdog['AMT_AgentPresenceWatchdog'].responses, 'DeviceID', deviceid);
var transitionPolicy = getItem(xxWatchdog['AMT_StateTransitionCondition'].responses, 'PolicyConditionName', policyConditionName);
if (!watchdog.transitions) watchdog.transitions = [];
watchdog.transitions.push(transitionPolicy);
}
if (x1 && x1['Value'] == 'AMT_StateTransitionCondition') {
var policyConditionName = getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyConditionName')['Value'];
var policyActionName = getItem(link['Dependent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyActionName')['Value'];
var transitionPolicy = getItem(xxWatchdog['AMT_StateTransitionCondition'].responses, 'PolicyConditionName', policyConditionName);
var watchdogAction = getItem(xxWatchdog['AMT_AgentPresenceWatchdogAction'].responses, 'PolicyActionName', policyActionName);
if (!transitionPolicy.actions) transitionPolicy.actions = [];
transitionPolicy.actions.push(watchdogAction);
}
}
updateWatchdog();
QV('go19', true); // Show Agent Presence panel
}
}
var watchdogEnabledStates = [ "알 수 없는", "다른", "가능", "비활성화", "종료", "해당 사항 없음", "활성화되었지만 오프라인", "테스트 중", "연기 됨", "Quiesce", "시작" ];
var watchdogMonitoredEntity = [ "알 수 없는", "다른", "운영 체제", "운영 체제 부팅 프로세스", "운영 체제 종료 프로세스", "펌웨어 부팅 프로세스", "BIOS 부팅 프로세스", "신청", "서비스 프로세서" ];
function updateWatchdog() {
if (xxWatchdog == null) return;
var x = '';
// Global Agent Presense Values
x += TableStart();
x += TableEntry("최대 워치 독", xxWatchdog['AMT_AgentPresenceCapabilities'].response['MaxTotalAgents'] + " 감시견");
x += TableEntry("최대 총 액션", xxWatchdog['AMT_AgentPresenceCapabilities'].response['MaxTotalActions'] + " 행위");
// x += TableEntry("Maximum EAC Watchdogs", xxWatchdog['AMT_AgentPresenceCapabilities'].response['MaxEacAgents'] + " watchdogs");
x += TableEnd() + '<br>';
// Watchdogs
x += TableStart2();
x += '<tr><td class=r1 style=padding-left:15px><br>' + "인텔 &reg; AMT 에이전트 존재 감시 기능을 관리하십시오." + '<br><br>';
if ((xxWatchdog['AMT_AgentPresenceWatchdog'].responses == null) || (xxWatchdog['AMT_AgentPresenceWatchdog'].responses.length == 0)) {
x += '<div style=padding-left:15px><i>' + "상담원 존재 감시기가 없습니다." + '</i></div><br>';
} else {
for (var i in xxWatchdog['AMT_AgentPresenceWatchdog'].responses) {
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
var n = guidToStr(rstr2hex(atob(w['DeviceID'])));
if (w['MonitoredEntityDescription'] && w['MonitoredEntityDescription'] != '') n = EscapeHtml(w['MonitoredEntityDescription']);
x += '<div class=itemBar onclick=showWatchdogDetails(' + i + ')><input type=button style=float:right value="' + "액션 추가 ..." + '" onclick=addWatchdogAction(event,' + i + ')>';
if (w.transitions) { x += '<input type=button style=float:right value="' + "작업 삭제 ..." + '" onclick=deleteWatchdogActions(event,' + i + ')>'; }
x += '<div style=padding-top:3px><b>' + n + '</b>, ' + amtstack.WatchdogCurrentStates[w['CurrentState']] + '</div>';
var xx = '';
for (var j in w.transitions) {
var t = w.transitions[j];
if (xx != '') xx += '<br>';
xx += getWatchdogTransitionStr(t['OldState']) + ' &rarr; ' + getWatchdogTransitionStr(t['NewState']);
if (t.actions) {
var action = t.actions[0];
if (action['EventOnTransition'] == true) { xx += " : 기록 할 이벤트"; }
}
}
if (xx != '') { x += '<div style=padding:12px>' + xx + '</div>'; }
x += '</div>';
}
}
x += '<br>';
x += TableEnd(AddRefreshButton('PullWatchdog()') + AddButton("워치 독 추가 ...", 'AddWatchdog()'));
x += '<br>';
QH('id_TableSystemAgentPresence', x);
}
function getWatchdogTransitionStr(s) {
if (s == 31) return "어떤 주";
var x = '';
for (var i in amtstack.WatchdogCurrentStates) { if ((s & i) != 0) { x += ', ' + amtstack.WatchdogCurrentStates[i]; } }
return x.substring(2);
}
function showWatchdogDetails(i) {
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
var x = '';
//x += addHtmlValue("DeviceID", guidToStr(rstr2hex(atob(w['DeviceID']))));
if (w['MonitoredEntityDescription'] && w['MonitoredEntityDescription'] != '') x += addHtmlValue("기술", EscapeHtml(w['MonitoredEntityDescription']));
x += addHtmlValue("모니터링 대상", watchdogMonitoredEntity[w['MonitoredEntity']]);
x += addHtmlValue("현재 상태", amtstack.WatchdogCurrentStates[w['CurrentState']]);
x += addHtmlValue("활성화 된 상태", watchdogEnabledStates[w['EnabledState']]);
x += addHtmlValue("시작 간격", w['StartupInterval'] + " 초");
x += addHtmlValue("타임 아웃 간격", w['TimeoutInterval'] + " 초");
setDialogMode(11, format("워치 독 {0}", guidToStr(rstr2hex(atob(w['DeviceID'])))), 5, showWatchdogDetailsOk, x, w);
}
function showWatchdogDetailsOk(x, w) {
if (x == 2) {
amtstack.Delete('AMT_AgentPresenceWatchdog', { 'DeviceID': w['DeviceID'] }, PullWatchdog);
}
}
function AddWatchdog() {
var x = '';
x += '<div style=height:26px;margin-top:4px><input id=wgname style=float:right;width:240px maxlength=16 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px>' + "이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input id=wgguid style=float:right;width:240px maxlength=36 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px title="' + "임의의 DeviceID 생성" + '">' + addLink("장치 아이디", 'GenerateWatchdogGuid()') + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input id=wgstart style=float:right;width:240px maxlength=8 placeholder=3600 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px>' + "시작 (초)" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input id=wgtimeout style=float:right;width:240px maxlength=8 placeholder=60 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px>' + "타임 아웃 (초)" + '</div></div>';
setDialogMode(11, "워치 독 추가", 3, AddWatchdogOk, x);
AddWatchdogUpdate();
}
function GenerateWatchdogGuid() {
var i, guid = '';
for (i = 0; i < 16; i++) { guid += String.fromCharCode(random(255)); }
Q('wgguid').value = guidToStr(rstr2hex(guid));
AddWatchdogUpdate();
}
function AddWatchdogUpdate() {
var ok = (Q('wgstart').value == '' || parseInt(Q('wgstart').value) > 0) && (Q('wgtimeout').value == '' || parseInt(Q('wgtimeout').value) > 0);
var gc = 0, g = Q('wgguid').value.toLowerCase();
for (var i = 0; i < g.length; i++) {
var c = g.charCodeAt(i);
if (c == 45) continue;
if ((c >= 48 && c <= 57) || (c >= 97 && c <= 102)) { gc++; } else { ok = false; }
}
if (gc != 32) ok = false;
QE('dlgOkButton', ok);
}
function AddWatchdogOk() {
var timeout = Q('wgtimeout').value, startup = Q('wgstart').value;
if (timeout == '') timeout = 60;
if (startup == '') startup = 3600;
var guid = btoa(hex2rstr(guidToStr(Q('wgguid').value.replace(/-/g, '')).replace(/-/g, '')));
var wdog = { 'CreationClassName': 0, 'DeviceID': guid, 'StartupInterval': startup, 'SystemCreationClassName': 0, 'SystemName': 0, 'TimeoutInterval': timeout, 'MonitoredEntityDescription': Q('wgname').value };
amtstack.Create('AMT_AgentPresenceWatchdog', wdog, AddWatchdogOk2);
}
function AddWatchdogOk2(stack, name, responses, status) {
if (status != 200) {
messagebox("지키는 개", "워치 독을 추가 할 수 없습니다. 오류 번호" + status);
} else {
PullWatchdog();
}
}
function addWatchdogAction(e, i) {
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
var x = '<table>';
x += '<td style=width:180px>' + "에서" + '<br>'
for (var i in amtstack.WatchdogCurrentStates) {
x += '<input id=wgsa' + i + ' type=checkbox onclick=addWatchdogActionUpdate()> ' + amtstack.WatchdogCurrentStates[i] + '<br />';
}
x += '<td>' + "에" + '<br>'
for (var i in amtstack.WatchdogCurrentStates) {
x += '<input id=wgsb' + i + ' type=checkbox onclick=addWatchdogActionUpdate()> ' + amtstack.WatchdogCurrentStates[i] + '<br />';
}
x += '</table><br>' + "조치 수행" + '<br><input id=wgsevent type=checkbox checked onclick=addWatchdogActionUpdate()>' + "이벤트 로그에 쓰기" + '<br />';
setDialogMode(11, "감시 조치 추가", 3, addWatchdogActionOk, x, w);
addWatchdogActionUpdate();
haltEvent(e);
}
function addWatchdogActionUpdate() {
var tfrom = 0, tto = 0;
for (var i in amtstack.WatchdogCurrentStates) {
if (Q('wgsa' + i).checked == true) tfrom += parseInt(i);
if (Q('wgsb' + i).checked == true) tto += parseInt(i);
}
QE('dlgOkButton', tfrom > 0 && tto > 0 && Q('wgsevent').checked == true);
}
function addWatchdogActionOk(b, w) {
var tfrom = 0, tto = 0;
for (var i in amtstack.WatchdogCurrentStates) {
if (Q('wgsa' + i).checked == true) tfrom += parseInt(i);
if (Q('wgsb' + i).checked == true) tto += parseInt(i);
}
amtstack.AMT_AgentPresenceWatchdog_AddAction(tfrom, tto, Q('wgsevent').checked, null, null, AddWatchdogActionResponse, null, 0, { 'DeviceID': w['DeviceID'] });
}
function AddWatchdogActionResponse(stack, name, responses, status) {
if (status != 200) {
messagebox("워치 독 액션", "감시 조치를 추가 할 수 없습니다. 오류 #" + status);
} else {
PullWatchdog();
}
}
function deleteWatchdogActions(e, i) {
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
setDialogMode(11, "감시 조치 삭제", 3, deleteWatchdogActionsOk, "이 워치 독에 대한 모든 작업을 삭제 하시겠습니까?", w);
haltEvent(e);
}
function deleteWatchdogActionsOk(b, w) {
amtstack.AMT_AgentPresenceWatchdog_DeleteAllActions(deleteWatchdogActionResponse, null, 0, { 'DeviceID': w['DeviceID'] });
}
function deleteWatchdogActionResponse(stack, name, responses, status) {
if (status != 200) {
messagebox("워치 독 액션", "감시 조치를 제거 할 수 없습니다. 오류 #" + status);
} else {
PullWatchdog();
}
}
// ###END###{AgentPresence}
// ###BEGIN###{SystemDefense}
//
// SYSTEM DEFENSE PANEL
//
var xxSystemDefense = null;
var xxSystemDefenceLinkedPolicy = {};
var xxUpdatingDefenseStats = false;
var xxFilterStatistics = [{}, {}]; // Wired and wireless interface stats
var xxFilterStatisticsTimer = null;
var xxFilterStatisticsTimerActive = false;
var xxSystemDefenceFilterEthernetTypes = { 2048: "모든 IP 패킷", 2054: "모든 ARP 패킷" };
var xxSystemDefenceFilterIPTypes = { 4: "IPv4", 6: "IPv6" };
var xxSystemDefenceFilterDesc = { 0: "허용, 계산", 1: "드롭, 카운트", 2: "속도 제한", 3: "허용하다", 4: "하락" };
var xxSystemDefenceFilters = { 'HdrProtocolID': 1, 'HdrDestAddress': 2, 'HdrDestMask': 2, 'HdrSrcAddress': 2, 'HdrSrcMask': 2, 'HdrSrcPortStart': 1, 'HdrSrcPortEnd': 1, 'HdrDestPortStart': 1, 'HdrDestPortEnd': 1, 'HdrSrcAddressEndOfRange': 2, 'HdrDestAddressEndOfRange ': 2, 'TCPFlagsOn': 3, 'TCPFlagsOff': 3 };
function PullSystemDefense() {
amtFirstPull |= 4;
amtstack.BatchEnum(null, ['AMT_SystemDefensePolicy', 'AMT_NetworkPortSystemDefensePolicy', 'AMT_Hdr8021Filter', 'AMT_IPHeadersFilter', 'AMT_NetworkFilter'], PullSystemDefenseResponse);
}
function PullSystemDefenseResponse(stack, name, responses, status) {
if (status == 200) {
xxSystemDefense = responses;
updateSystemDefense();
QV('go18', true); // Show System Defense Panel
if (urlvars['norefresh']) { UpdateDefenseStats(); } // If norefresh is set, pull the system defense stats now.
}
}
function updateSystemDefense() {
if (xxSystemDefense == null) return;
var x = '';
// Get active policies
xxSystemDefenceLinkedPolicy = {};
for (var i in xxSystemDefense['AMT_NetworkPortSystemDefensePolicy'].responses) {
var link = xxSystemDefense['AMT_NetworkPortSystemDefensePolicy'].responses[i];
var a = +getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'DeviceID')['Value'].substring(27);
var b = link['Dependent']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
var p = getItem(xxSystemDefense['AMT_SystemDefensePolicy'].responses, 'InstanceID', b);
xxSystemDefenceLinkedPolicy[a] = p;
}
// Global System Defense settings
x += TableStart();
var policyname = ('<i>' + "없음" + '</i>');
if (xxSystemDefenceLinkedPolicy[0]) { policyname = xxSystemDefenceLinkedPolicy[0]['PolicyName']; }
x += TableEntry("기본 유선 정책", addLink(policyname, 'changeDefaultPolicy(0)'));
/*
policyname = ('<i>' + "None" + '</i>');
if (xxSystemDefenceLinkedPolicy[1]) { policyname = xxSystemDefenceLinkedPolicy[1]['PolicyName']; }
x += TableEntry("Default Wireless Policy", addLink(policyname, 'changeDefaultPolicy(1)'));
*/
// Filter Statistics
for (var i = 0; i < 2; i++) {
var f = xxFilterStatistics[i];
for (var j in f) {
var c = f[j];
if (c == 1) c += " 패킷"; else c += " 패킷";
var jn = ((i==0)?"열광한":"무선 전화") + j;
x += TableEntry(jn, c);
}
}
x += TableEnd();
x += '<br>';
x += TableStart2();
x += '<tr><td class=r1 style=padding-left:15px;border:0><br>' + "인텔 &reg; AMT 시스템 방어 정책을 관리합니다." + '<br><br>';
if (xxSystemDefense['AMT_SystemDefensePolicy'].responses.length == 0) {
x += '<div style=padding-left:15px><i>' + "시스템 방어 정책이 없습니다." + '</i></div><br>';
} else {
for (var i in xxSystemDefense['AMT_SystemDefensePolicy'].responses) {
var policy = xxSystemDefense['AMT_SystemDefensePolicy'].responses[i];
var desc = '';
if (policy['FilterCreationHandles']) {
policy['FilterCreationHandles'] = MakeToArray(policy['FilterCreationHandles']);
var c = policy['FilterCreationHandles'].length;
desc = ', ' + c + ' filter' + (c > 1?'s':'');
}
x += '<div class=itemBar onclick=showPolicyDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(policy['PolicyName']) + '</b>' + desc + '</div></div>';
}
}
x += '<tr><td class=r1 style=padding-left:15px><br>' + "인텔 &reg; AMT 시스템 방어 필터를 관리합니다." + '<br><br>';
if (xxSystemDefense['AMT_Hdr8021Filter'].responses.length == 0 && xxSystemDefense['AMT_IPHeadersFilter'].responses.length == 0) {
x += '<div style=padding-left:15px><i>' + "시스템 방어 필터가 없습니다." + '</i></div><br>';
} else {
for (var i in xxSystemDefense['AMT_Hdr8021Filter'].responses) {
var filter = xxSystemDefense['AMT_Hdr8021Filter'].responses[i];
var desc = xxSystemDefenceFilterEthernetTypes[filter['HdrProtocolID8021']];
if (!desc) desc = "모든 이더넷 프로토콜" + filter['HdrProtocolID8021'];
desc += ', ' + xxSystemDefenceFilterDesc[filter['FilterProfile']];
if (filter['FilterProfile'] == 2) { desc += " ...에서" + filter['FilterProfileData'] + " 패킷 / 초"; }
if (filter['ActionEventOnMatch'] == true) desc += ", 경기 중 이벤트";
x += '<div class=itemBar onclick=showFilterDetails(0,' + i + ')><div style=padding-top:3px><b>' + (filter['FilterDirection'] == 0 ? '&#8592; ' : '&#8594; ') + EscapeHtml(filter['Name']) + '</b>, ' + desc + '</div></div>';
}
for (var i in xxSystemDefense['AMT_IPHeadersFilter'].responses) {
var filter = xxSystemDefense['AMT_IPHeadersFilter'].responses[i];
var desc = xxSystemDefenceFilterIPTypes[filter['HdrIPVersion']];
if (!desc) desc = "모든 이더넷 프로토콜" + filter['HdrIPVersion'];
desc += ', ' + xxSystemDefenceFilterDesc[filter['FilterProfile']];
if (filter['FilterProfile'] == 2) { desc += " ...에서" + filter['FilterProfileData'] + " 패킷 / 초"; }
if (filter['ActionEventOnMatch'] == true) desc += ", 경기 중 이벤트";
var filtercount = 0;
for (var j in xxSystemDefenceFilters) { if (filter[j]) filtercount++; }
if (filtercount > 0) desc += ', ' + filtercount + ' filter' + (filtercount>1?'s':'');
x += '<div class=itemBar onclick=showFilterDetails(1,' + i + ')><div style=padding-top:3px><b>' + (filter['FilterDirection'] == 0 ? '&#8592; ' : '&#8594; ') + EscapeHtml(filter['Name']) + '</b>, ' + desc + '</div></div>';
}
}
x += '<br><td class=r1>' + TableEnd(AddRefreshButton('PullSystemDefense()') + /*AddButton("Update Stats", 'UpdateDefenseStats()') +*/ AddButton("필터 추가 ...", 'AddDefenseFilter()') + AddButton("정책 추가 ...", 'AddDefensePolicy()'));
QH('id_TableSystemDefense', x);
if (xxFilterStatisticsTimer == null) {
xxFilterStatisticsTimerActive = false;
if (!urlvars['norefresh']) {
UpdateDefenseStats();
xxFilterStatisticsTimer = setInterval(UpdateDefenseStats, 5000);
}
}
}
function StopDefenseStatsTimer() {
if (xxFilterStatisticsTimer != null) { clearInterval(xxFilterStatisticsTimer); xxFilterStatisticsTimer = null; }
xxFilterStatisticsTimerActive = false;
}
function UpdateDefenseStats(n) {
if (!n && xxFilterStatisticsTimerActive == true) { return; }
xxFilterStatisticsTimerActive = true;
var network = n?n:0;
if (xxSystemDefenceLinkedPolicy[network]) {
var eref = '<a:Address></a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPort</w:ResourceURI><w:SelectorSet><w:Selector Name="DeviceID">Intel(r) AMT Ethernet Port ' + network + '</w:Selector></w:SelectorSet></a:ReferenceParameters>';
amtstack.AMT_SystemDefensePolicy_UpdateStatistics(eref, false, UpdateDefenseStats2, network, 0, { 'InstanceID': xxSystemDefenceLinkedPolicy[network]['InstanceID'] });
} else {
// No active policy, stop the timer
xxFilterStatistics[network] = {};
StopDefenseStatsTimer();
}
}
function UpdateDefenseStats2(stack, name, responses, status, network) {
if (status == 200) {
amtstack.Enum('AMT_ActiveFilterStatistics', UpdateDefenseStats3, network);
} else {
StopDefenseStatsTimer();
}
}
function UpdateDefenseStats3(stack, name, responses, status, network) {
var count = 0;
if (status == 200) {
xxFilterStatistics[network] = {};
for (var i in responses) {
var readcount = responses[i]['ReadCount'];
// var matched = responses[i]['FilterMatched'];
var name = getItem(responses[i]['Dependent']['ReferenceParameters']['SelectorSet']['Selector'][1]['Value']['EndpointReference']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'Name')['Value'];
xxFilterStatistics[network][name] = readcount;
count++;
}
updateSystemDefense();
}
xxFilterStatisticsTimerActive = false;
// If there is no statistics, stop the timer
if (count == 0) { StopDefenseStatsTimer(); } // TODO: Change this to allow for wireless
}
function changeDefaultPolicy(network) {
if (xxdialogMode) return;
var x = '';
x += '<div style=height:26px;margin-top:4px><select id=policySelection style=float:right;width:266px><option value=-1>' + "없음";
for (var i in xxSystemDefense['AMT_SystemDefensePolicy'].responses) { x += '<option value=' + i + ((xxSystemDefenceLinkedPolicy[network] && xxSystemDefense['AMT_SystemDefensePolicy'].responses[i]['InstanceID'] == xxSystemDefenceLinkedPolicy[network]['InstanceID']) ? ' selected' : '') + '>' + xxSystemDefense['AMT_SystemDefensePolicy'].responses[i]['PolicyName']; }
x += '</select><div style=padding-top:4px>' + "기본 정책" + '</div></div>';
setDialogMode(11, "기본 시스템 방어 정책", 3, changeDefaultPolicyOk, x, network);
}
function changeDefaultPolicyOk(button, network) {
var i = Q('policySelection').value;
var oldpolicy = xxSystemDefenceLinkedPolicy[network];
if (oldpolicy) { amtstack.Delete('AMT_NetworkPortSystemDefensePolicy', '<w:SelectorSet><w:Selector Name="Antecedent"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPort</w:ResourceURI><w:SelectorSet><w:Selector Name="CreationClassName">CIM_EthernetPort</w:Selector><w:Selector Name="DeviceID">Intel(r) AMT Ethernet Port ' + network + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector><w:Selector Name="Dependent"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://intel.com/wbem/wscim/1/amt-schema/1/AMT_SystemDefensePolicy</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + oldpolicy['InstanceID'] + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector></w:SelectorSet>', ((i == -1) ? PullSystemDefense : function () { })); }
if (i >= 0) {
var policy = xxSystemDefense['AMT_SystemDefensePolicy'].responses[i];
var eref = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPort</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="DeviceID">' + "인텔 AMT 이더넷 포트" + ' ' + network + '</Selector></SelectorSet></ReferenceParameters>';
var pref = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_SystemDefensePolicy</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">' + policy['InstanceID'] + '</Selector></SelectorSet></ReferenceParameters>';
amtstack.Create('AMT_NetworkPortSystemDefensePolicy', { 'Antecedent': eref, 'Dependent': pref }, changeDefaultPolicyOk2);
}
}
function changeDefaultPolicyOk2(stack, name, responses, status) {
if (status != 200) {
messagebox("기본 시스템 방어 정책", "정책, 오류를 설정할 수 없습니다" + status);
} else {
PullSystemDefense();
}
}
function AddDefenseFilter() {
if (xxdialogMode) return;
var x = '';
x += '<div style=height:26px;margin-top:4px><input id=filtername style=float:right;width:260px maxlength=16 onkeyup=AddDefenseFilterUpdate()><div style=padding-top:4px>' + "이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=filtertype style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=0>' + "이더넷 IP 패킷 필터" + '<option value=1>' + "이더넷 ARP 패킷 필터" + '<option value=2>' + "IPv4 패킷 필터" + '<option value=3>' + "IPv6 패킷 필터" + '</select><div style=padding-top:4px>' + "유형" + '</div></div>';
x += '<div style=height:26px;margin-top:4px id=ipfilterdiv><input id=ipfilter style=float:right;width:260px placeholder=\"' + "선택적 규칙" + '\" onkeyup=AddDefenseFilterUpdate()><div style=padding-top:4px>' + "일치 규칙" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=filterdir style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=0>' + "아웃 바운드 / 전송" + '<option value=1>' + "인바운드 / 수신" + '</select><div style=padding-top:4px>' + "방향" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=filterprofile style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=0>' + "허용, 계산" + '<option value=1>' + "드롭, 카운트" + '<option value=2>' + "속도 제한" + '<option value=3>' + "허용하다" + '<option value=4>' + "하락" + '</select><div style=padding-top:4px>' + "동작" + '</div></div>';
x += '<div style=height:26px;margin-top:4px id=filterdatadiv><input id=filterdata style=float:right;width:260px maxlength=8 onkeyup=AddDefenseFilterUpdate()><div style=padding-top:4px>' + "패킷 / 초" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=filteraction style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=false>' + "아무것도하지 마세요" + '<option value=1>' + "경기 중 이벤트" + '</select><div style=padding-top:4px>' + "이벤트 로그" + '</div></div>';
setDialogMode(11, "시스템 방어 필터 추가", 3, AddDefenseFilterOk, x);
AddDefenseFilterUpdate();
}
function AddDefenseFilterOk() {
if (Q('filtertype').value <= 1) {
// Add Ethernet IP or ARP filter
var protocol = (Q('filtertype').value == 0) ? 2048 : 2054; // IP : ARP
var filter = { 'InstanceID ': 0, 'Name': Q('filtername').value, 'CreationClassName': 0, 'SystemName': 0, 'SystemCreationClassName': 0, 'HdrProtocolID8021': protocol, 'FilterProfile': Q('filterprofile').value, 'FilterDirection': Q('filterdir').value, 'ActionEventOnMatch': Q('filteraction').value };
if (Q('filterprofile').value == 2) filter['FilterProfileData'] = Q('filterdata').value;
amtstack.Create('AMT_Hdr8021Filter', filter, AddDefenseFilterOk2);
} else {
// Add IPv4 or IPv6 Filter
var protocol = (Q('filtertype').value == 2) ? 4 : 6; // IPv4 : IPv6
var filter = { 'InstanceID ': 0, 'Name': Q('filtername').value, 'CreationClassName': 0, 'SystemName': 0, 'SystemCreationClassName': 0, 'HdrIPVersion': protocol, 'FilterProfile': Q('filterprofile').value, 'FilterDirection': Q('filterdir').value, 'ActionEventOnMatch': Q('filteraction').value };
// Parse the filter string
// https://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide/default.htm?turl=HTMLDocuments%2FWS-Management_Class_Reference%2FAMT_Hdr8021Filter.htm
var filterstrs = Q('ipfilter').value.split(',');
for (var i in filterstrs) {
var xx = filterstrs[i].indexOf('=');
var n = filterstrs[i].substring(0, xx);
var v = filterstrs[i].substring(xx + 1);
var t = xxSystemDefenceFilters[n];
if (!t) { n = "HDR" + n; t = xxSystemDefenceFilters[n]; }
if (t) {
// TODO: Parse v (the value) based on the type t.
if (t == 2 && protocol == 4) {
// IPv4 address
var ipsplit = v.split('.');
if (ipsplit.length == 4) {
//filter[n] = btoa(String.fromCharCode(parseInt(ipsplit[0]), parseInt(ipsplit[1]), parseInt(ipsplit[2]), parseInt(ipsplit[3])));
//filter[n] = [ parseInt(ipsplit[0]), parseInt(ipsplit[1]), parseInt(ipsplit[2]), parseInt(ipsplit[3]) ];
filter[n] = rstr2hex(String.fromCharCode(parseInt(ipsplit[0]), parseInt(ipsplit[1]), parseInt(ipsplit[2]), parseInt(ipsplit[3])));
}
} else {
// Other values
filter[n] = v;
}
}
}
if (Q('filterprofile').value == 2) filter['FilterProfileData'] = Q('filterdata').value;
amtstack.Create('AMT_IPHeadersFilter', filter, AddDefenseFilterOk2);
}
}
function AddDefenseFilterUpdate() {
var ok = Q('filtername').value.length > 0;
if (ok && Q('filterprofile').value == 2) { var i = parseInt(Q('filterdata').value); ok = (i > 0 && i < 0xFFFFFFFF); }
QE('idx_dlgOkButton', ok);
QV('filterdatadiv', Q('filterprofile').value == 2);
QV('ipfilterdiv', Q('filtertype').value >= 2);
}
function AddDefenseFilterOk2(stack, name, responses, status) {
if (status != 200) {
messagebox("시스템 방어 필터 추가", "필터를 추가 할 수 없습니다. 오류 #" + status);
} else {
PullSystemDefense();
}
}
function showFilterDetails(t, i) {
if (xxdialogMode) return;
var desc, filter, type, tn;
if (t == 0) {
tn = 'AMT_Hdr8021Filter';
type = "이더넷 트래픽";
filter = xxSystemDefense[tn].responses[i];
desc = xxSystemDefenceFilterEthernetTypes[filter['HdrProtocolID8021']];
if (!desc) desc = "모든 이더넷 프로토콜" + filter['HdrProtocolID8021'];
} else {
tn = 'AMT_IPHeadersFilter';
type = "IP 트래픽";
filter = xxSystemDefense[tn].responses[i];
desc = xxSystemDefenceFilterIPTypes[filter['HdrIPVersion']];
if (!desc) desc = "모든 IP 프로토콜" + filter['HdrIPVersion'];
}
var x = '';
x += addHtmlValue("이름", EscapeHtml(filter['Name']));
x += addHtmlValue("유형", type);
x += addHtmlValue("일치하는 트래픽", desc);
x += addHtmlValue("방향", filter['FilterDirection'] == 0 ? 'Outbound / Transmit' : 'Inbound / Receive');
if (t == 1) {
for (var j in xxSystemDefenceFilters) {
if (filter[j]) {
var n = j, v = filter[j], t = xxSystemDefenceFilters[j];
if (t == 2 && v.length == 4) { v = hex2rstr(v); v = v.charCodeAt(0) + '.' + v.charCodeAt(1) + '.' + v.charCodeAt(2) + '.' + v.charCodeAt(3); }
if (n.startsWith('Hdr')) n = n.substring(3);
x += addHtmlValue("필터" + n, v);
}
}
}
x += addHtmlValue("경기 중 이벤트", (filter['ActionEventOnMatch'] == true) ? 'Yes' : 'No');
setDialogMode(11, "이더넷 필터 #" + filter['InstanceID'], 5, showFilterDetailsOk, x, [tn, filter]);
}
function showFilterDetailsOk(b, tag) {
if (b == 2) { amtstack.Delete(tag[0], tag[1], deleteDefenseFilter); }
}
function deleteDefenseFilter(stack, name, responses, status) {
if (status != 200) {
messagebox("필터 제거", "필터를 제거 할 수 없습니다. 사용 중이 아닌지 확인하십시오.");
} else {
PullSystemDefense();
}
}
var xxAddDefensePolicyFilters;
function AddDefensePolicy() {
if (xxdialogMode) return;
xxAddDefensePolicyFilters = [];
var x = '';
x += '<div style=height:26px;margin-top:4px><input id=policyname title="<policy name>:<policy precedence number>" style=float:right;width:260px maxlength=16 onkeyup=AddDefensePolicyUpdate()><div style=padding-top:4px>' + "이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><select id=policytx title="' + "아웃 바운드 트래픽에 대한 기본 조치" + '" style=float:right;width:133px><option value=0>Allow<option value=1>' + "하락" + '<option value=2>' + "허용, 카운트" +'<option value=3>' + "드랍, 카운트" + '<option value=4>' + "허용, 카운트, 이벤트" + '<option value=5>' + "드랍, 카운트, 이벤트" + '</select><select id=policyrx style=float:right;width:133px title="' + "인바운드 트래픽에 대한 기본 조치" + '"><option value=0>' + "허용하다" + '<option value=1>' + "하락" + '<option value=2>' + "허용, 카운트" + '<option value=3>' + "드랍, 카운트" + '<option value=4>' + "허용, 카운트, 이벤트" + '<option value=5>' + "드랍, 카운트, 이벤트" + '</select><div style=padding-top:4px>' + "기본 TX / RX" + '</div></div>';
x += '<div id=policyFilters></div>';
if (xxSystemDefense['AMT_Hdr8021Filter'].responses.length > 0 || xxSystemDefense['AMT_IPHeadersFilter'].responses.length > 0) {
x += '<div style=height:26px;margin-top:4px><div style=float:right><select id=xfilter style=width:186px>';
for (var i in xxSystemDefense['AMT_Hdr8021Filter'].responses) {
var filter = xxSystemDefense['AMT_Hdr8021Filter'].responses[i];
x += '<option value=' + filter['InstanceID'] + '>' + filter['Name'];
}
for (var i in xxSystemDefense['AMT_IPHeadersFilter'].responses) {
var filter = xxSystemDefense['AMT_IPHeadersFilter'].responses[i];
x += '<option value=' + filter['InstanceID'] + '>' + filter['Name'];
}
x += '</select><input id=addFilterButton type=button value=Add style=width:80px onclick=addFilterButton()></div><div style=padding-top:4px>' + "필터 추가" + '</div></div>';
}
setDialogMode(11, "시스템 방어 정책 추가", 3, AddDefensePolicyOk, x);
AddDefensePolicyUpdate();
}
function addFilterButton() {
if (xxAddDefensePolicyFilters.indexOf(Q('xfilter').value) >= 0) return;
xxAddDefensePolicyFilters.push(Q('xfilter').value);
AddDefensePolicyUpdate();
}
function removeFilterButton(h) {
xxAddDefensePolicyFilters.splice(h, 1);
AddDefensePolicyUpdate();
}
function AddDefensePolicyUpdate() {
var ok = Q('policyname').value.split(':')[0].length > 0;
QE('idx_dlgOkButton', ok);
if (xxAddDefensePolicyFilters.length == 0) {
QH('policyFilters', '<br><i>' + "이 정책에는 필터가 없습니다." + '</i><br><br>');
} else {
var x = '';
for (var i in xxAddDefensePolicyFilters) {
x += '<div class=itemBar style=margin-right:0><div style=float:right>' + AddButton2("없애다", 'removeFilterButton(' + i + ')') + '</div><div style=padding-top:3px;max-width:260px;overflow:hidden><b>' + GetFilterById(xxAddDefensePolicyFilters[i])['Name'] + '</b></div></div>';
}
QH('policyFilters', x);
}
}
// TODO: Once loaded, we could make a table of "handle -> filter" where both filter types are mixed-in. Could make things simpler/smaller?
// We would only have one table to loop instead of two at a few places. This function would be removed completely.
function GetFilterById(h) {
for (var i in xxSystemDefense['AMT_Hdr8021Filter'].responses) { var filter = xxSystemDefense['AMT_Hdr8021Filter'].responses[i]; if (filter['InstanceID'] == h) return filter; }
for (var i in xxSystemDefense['AMT_IPHeadersFilter'].responses) { var filter = xxSystemDefense['AMT_IPHeadersFilter'].responses[i]; if (filter['InstanceID'] == h) return filter; }
}
function AddDefensePolicyOk() {
var tx = Q('policytx').value;
var rx = Q('policyrx').value;
var pri = 0;
var n = Q('policyname').value.split(':');
if (n.length == 2) pri = parseInt(n[1]);
var filter = { 'InstanceID ': 0, 'PolicyName': n[0], 'PolicyPrecedence': pri, 'TxDefaultCount': (tx > 1), 'TxDefaultDrop': (tx % 2 == 1), 'TxDefaultMatchEvent': (tx > 3), 'RxDefaultCount': (rx > 1), 'RxDefaultDrop': (rx % 2 == 1), 'RxDefaultMatchEvent': (rx > 3) };
if (xxAddDefensePolicyFilters.length > 0) filter['FilterCreationHandles'] = xxAddDefensePolicyFilters;
amtstack.Create('AMT_SystemDefensePolicy', filter, AddDefensePolicyOk2);
}
function AddDefensePolicyOk2(stack, name, responses, status) {
if (status != 200) {
messagebox("시스템 방어 정책 추가", "정책을 추가 할 수 없습니다. 오류 #" + status);
} else {
PullSystemDefense();
}
}
function showPolicyDetails(i) {
if (xxdialogMode) return;
var policy = xxSystemDefense['AMT_SystemDefensePolicy'].responses[i];
var x = '';
x += addHtmlValue("이름", EscapeHtml(policy['PolicyName']));
if (policy['PolicyPrecedence'] != 0) x += addHtmlValue("상위", policy['PolicyPrecedence']);
var action = (policy['TxDefaultDrop'] == true) ? "하락" : "허용하다";
if (policy['TxDefaultCount'] == true) action += "카운트";
if (policy['TxDefaultMatchEvent'] == true) action += ", 이벤트";
x += addHtmlValue("기본 TX 액션", action);
action = (policy['RxDefaultDrop'] == true) ? 'Drop' : 'Allow';
if (policy['RxDefaultCount'] == true) action += ', Count';
if (policy['RxDefaultMatchEvent'] == true) action += ', Event';
x += addHtmlValue("기본 RX 액션", action);
if (policy['FilterCreationHandles']) { for (var i in policy['FilterCreationHandles']) { x += addHtmlValue("필터 #" + (+i + 1), GetFilterById(policy['FilterCreationHandles'][i])['Name']); } }
setDialogMode(11, format("수단 #", policy['InstanceID'].substring(20)), 5, showPolicyDetailsOk, x, policy);
}
function showPolicyDetailsOk(b, tag) {
if (b == 2) { amtstack.Delete('AMT_SystemDefensePolicy', tag, deleteDefensePolicy); }
}
function deleteDefensePolicy(stack, name, responses, status) {
if (status != 200) {
messagebox("정책 제거", "정책을 제거 할 수 없습니다. 사용 중이 아닌지 확인하십시오.");
} else {
PullSystemDefense();
}
}
// ###END###{SystemDefense}
// ###BEGIN###{NetworkSettings}
// ###BEGIN###{Wireless}
//
// WIRELESS SETTINGS PANEL
//
var xxWireless;
function PullWireless() {
amtFirstPull |= 2;
try { if (amtwirelessif == -1) return; } catch (e) { } // If the wireless adapter has no MAC, don't show this.
// ###BEGIN###{!NetAuth}
amtstack.BatchEnum('', ['*CIM_WiFiPortCapabilities', '*CIM_WiFiPort', '*CIM_WiFiEndpoint', 'CIM_WiFiEndpointSettings', '*AMT_WiFiPortConfigurationService'], processWireless);
// ###END###{!NetAuth}
// ###BEGIN###{NetAuth}
amtstack.BatchEnum('', ['*CIM_WiFiPortCapabilities', '*CIM_WiFiPort', '*CIM_WiFiEndpoint', 'CIM_WiFiEndpointSettings', '*AMT_WiFiPortConfigurationService', 'CIM_IEEE8021xSettings'], processWireless);
// ###END###{NetAuth}
}
function wifiRefresh() { if (!xxdialogMode) PullWireless(); }
var xxWifiState = { 3: "비활성화", 32768: "S0에서 활성화", 32769: "S0, Sx / AC에서 활성화" };
var xxRadioState = { 2: "연결됨", 3: "떨어져서", 6: "켜기, 연결 끊기" };
var xxWifiAuthenticationMethod = { 1: "다른", 2: "열다", 3: "공용 열쇠", 4: "WPA PSK", 5: "WPA IEEE 802.1x", 6: "WPA2 PSK", 7: "WPA2 IEEE 802.1x", 32768: "WPA3 SAE IEEE 802.1x", 32769: "WPA3 OWE IEEE 802.1x" };
var xxWifiEncryptionMethod = { 1: "다른", 2: "WEP", 3: "TKIP-RC4", 4: "CCMP-AES", 5: "없음" }; // For 2 & 5, AuthenticationMethod must be 2 or 3. For 3 & 4 AuthenticationMethod must be 4,5,6 or 7
function processWireless(stack, name, responses, status) {
if (status == 200) { xxWireless = responses; } else { xxWireless = undefined; }
updateSystemStatus();
showWirelessInfo();
}
function showWirelessInfo() {
if (!xxWireless) return;
var i, j, s = '', sc, x = '<br><h2>' + "무선 프로파일" + '</h2>';
if (!(xxWireless['CIM_WiFiPortCapabilities'].response)) return;
// Show WIFI profiles sorted by priority
x += TableStart2();
x += '<tr><td class=r2 style=padding-left:15px><br>' + "인텔 &reg; AMT가 네트워크 연결에 사용할 무선 프로파일." + '<br><br>';
s = 0;
for(i = 0; i < 256; i++) {
for (j in xxWireless['CIM_WiFiEndpointSettings'].responses) {
sc = xxWireless['CIM_WiFiEndpointSettings'].responses[j];
if (sc['AuthenticationMethod'] == 1) continue; // Skip "Endpoint User Settings"
if (sc['Priority'] == i) {
var details = '';
// ###BEGIN###{NetAuth}
var netAuthProfile = null, netAuthProtocols = ['EAP-TLS', 'EAP-TTLS/MSCHAPv2', 'PEAPv0/EAP-MSCHAPv2', 'PEAPv1/EAP-GTC', 'EAP-FAST/MSCHAPv2', 'EAP-FAST/GTC', 'EAP-MD5', 'EAP-PSK', 'EAP-SIM', 'EAP-AKA', 'EAP-FAST/TLS'];
if (xxWireless['CIM_IEEE8021xSettings'].responses) {
for (var k in xxWireless['CIM_IEEE8021xSettings'].responses) {
if (xxWireless['CIM_IEEE8021xSettings'].responses[k]['ElementName'] == sc['ElementName']) { netAuthProfile = xxWireless['CIM_IEEE8021xSettings'].responses[k]; }
}
}
if (netAuthProfile) { details = ', ' + netAuthProtocols[netAuthProfile['AuthenticationProtocol']]; }
// ###END###{NetAuth}
x += '<div class=itemBar onclick=showWifiDetails(' + j + ')><div style=float:right>' + EscapeHtml(sc['SSID']) + ', ' + xxWifiAuthenticationMethod[sc['AuthenticationMethod']] + ', ' + xxWifiEncryptionMethod[sc['EncryptionMethod']] + details + ' &nbsp; ';
if (xxAccountAdminName) x += AddButton2("없애다", 'wifiRemoveButton(\"' + j + '\")');
x += '</div><div style=padding-top:3px><b>' + EscapeHtml(sc['ElementName']) + '</b></div></div>';
s++;
}
}
}
if (s == 0) x += '<i>' + "무선 프로파일이 없습니다" + '</i><br>';
// End of table
x += '<br><td class=r2>';
if (xxAccountAdminName) x += TableEnd(AddButton("새 프로필", 'showWifiNewProfile()')); else x += TableEnd('');
QH('id_TableWifi2', x + '<br>');
}
function showWifiStateDlg() {
if (xxdialogMode) return;
var s = '';
for (var i in xxWifiState) { s += '<label><input type=radio name=d11 id=wl' + i + ' value=' + i + ' ' + ((xxWireless['CIM_WiFiPort'].response['EnabledState'] == i)?'checked':'') + '>' + xxWifiState[i] + '</label><br>'; }
setDialogMode(11, "무선 상태", 3, wifiStateDlg, s);
}
function wifiStateDlg() { amtstack.CIM_WiFiPort_RequestStateChange( document.querySelector('input[name=d11]:checked').value, null, function() { amtstack.Get('CIM_WiFiPort', function(stack, name, response, status) { if (status == 200) { xxWireless['CIM_WiFiPort'].response = response.Body; showWirelessInfo(); } } ); } ); }
function showWifiSyncDlg() {
if (xxdialogMode) return;
var s = '';
s += '<label><input type=radio name=d11 id=wl0 value=0 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 0) ? 'checked' : '') + '>' + "비활성화" + '</label><br>';
s += '<label><input type=radio name=d11 id=wl0 value=1 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 1) ? 'checked' : '') + '>' + "가능" + '</label><br>';
setDialogMode(11, "Local Profile Sync", 3, showWifiSyncDlgEx, s);
}
function showWifiSyncDlgEx() {
var k = Clone(xxWireless['AMT_WiFiPortConfigurationService'].response);
k['localProfileSynchronizationEnabled'] = document.querySelector('input[name=d11]:checked').value;
amtstack.Put('AMT_WiFiPortConfigurationService', k, function () { amtstack.Get('AMT_WiFiPortConfigurationService', function (stack, name, response, status) { if (status == 200) { xxWireless['AMT_WiFiPortConfigurationService'].response = response.Body; showWirelessInfo(); } }); });
}
function showUefiWifiCoExDlg() {
if (xxdialogMode) return;
var s = '';
s += '<label><input type=radio name=d12 value=0 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled'] == false)?'checked':'') + '>Disabled</label><br>';
s += '<label><input type=radio name=d12 value=1 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled'] == true)?'checked':'') + '>Enabled</label><br>';
setDialogMode(11, "UEFI Wifi CoEx Profile Sharing", 3, UefiWifiCoExDlg, s);
}
function UefiWifiCoExDlg() {
var wifiportcfgsvc = Clone(xxWireless['AMT_WiFiPortConfigurationService'].response);
wifiportcfgsvc["UEFIWiFiProfileShareEnabled"]=document.querySelector('input[name=d12]:checked').value;
amtstack.Put('AMT_WiFiPortConfigurationService', wifiportcfgsvc, function(stack, name, responses, status) {if (status == 200) {PullWireless()}})
}
function showWifiDetails(h) {
if (xxdialogMode) return;
var i, sc = xxWireless['CIM_WiFiEndpointSettings'].responses[h], x = '<div style=text-align:left>';
x += addHtmlValue("프로필 이름", EscapeHtml(sc['ElementName']));
x += addHtmlValue("SSID", EscapeHtml(sc['SSID']));
x += addHtmlValue("입증", xxWifiAuthenticationMethod[sc['AuthenticationMethod']]);
x += addHtmlValue("암호화", xxWifiEncryptionMethod[sc['EncryptionMethod']]);
x += addHtmlValue("우선 순위", sc['Priority']);
// ###BEGIN###{NetAuth}
var netAuthProfile = null, netAuthProtocols = ['EAP-TLS', 'EAP-TTLS/MSCHAPv2', 'PEAPv0/EAP-MSCHAPv2', 'PEAPv1/EAP-GTC', 'EAP-FAST/MSCHAPv2', 'EAP-FAST/GTC', 'EAP-MD5', 'EAP-PSK', 'EAP-SIM', 'EAP-AKA', 'EAP-FAST/TLS'];
if (xxWireless['CIM_IEEE8021xSettings'].responses) {
for (var k in xxWireless['CIM_IEEE8021xSettings'].responses) {
if (xxWireless['CIM_IEEE8021xSettings'].responses[k]['ElementName'] == sc['ElementName']) { netAuthProfile = xxWireless['CIM_IEEE8021xSettings'].responses[k]; }
}
}
if (netAuthProfile) {
x += '<div style="width:100%;border-bottom:1px solid #000;margin-bottom:5px;margin-top:5px">802.11x</div>'
x += addHtmlValue("입증", netAuthProtocols[netAuthProfile['AuthenticationProtocol']]);
if (netAuthProfile['Domain']) { x += addHtmlValue("Domain", EscapeHtml(netAuthProfile['Domain'])); }
if (netAuthProfile['Username']) { x += addHtmlValue("사용자 이름", EscapeHtml(netAuthProfile['Username'])); }
}
// ###END###{NetAuth}
x += '</div>';
messagebox("무선 프로파일", x);
}
function wifiRemoveButton(h) {
if (xxdialogMode) return;
var sc = xxWireless['CIM_WiFiEndpointSettings'].responses[h];
QH('id_dialogMessage', format("무선 프로필 \"{0}\"을 (를) 제거 하시겠습니까?", sc['ElementName']));
setDialogMode(1, "무선 프로파일", 3, function () { removeWifiButtonEx(h) });
}
function removeWifiButtonEx(h) {
var sc = xxWireless['CIM_WiFiEndpointSettings'].responses[h];
amtstack.Delete('CIM_WiFiEndpointSettings', { InstanceID: sc['InstanceID'] }, removeWifiEntryResponse, 0, 1);
}
function removeWifiEntryResponse(stack, name, response, status, tag) {
if (methodcheck(response)) return;
// ###BEGIN###{!NetAuth}
amtstack.BatchEnum('', ['CIM_WiFiEndpointSettings'], function (stack, name, responses, status) {
if (status == 200) {
xxWireless['CIM_WiFiEndpointSettings'].responses = responses['CIM_WiFiEndpointSettings'].responses;
showWirelessInfo();
}
});
// ###END###{!NetAuth}
// ###BEGIN###{NetAuth}
amtstack.BatchEnum('', ['CIM_WiFiEndpointSettings', 'CIM_IEEE8021xSettings'], function (stack, name, responses, status) {
if (status == 200) {
xxWireless['CIM_WiFiEndpointSettings'].responses = responses['CIM_WiFiEndpointSettings'].responses;
xxWireless['CIM_IEEE8021xSettings'].responses = responses['CIM_IEEE8021xSettings'].responses;
showWirelessInfo();
}
});
// ###END###{NetAuth}
}
function showWifiNewProfile() {
if (xxdialogMode) return;
var x = '';
for (i = 1; i < 256; i++) {
var t = 1;
for (j in xxWireless['CIM_WiFiEndpointSettings'].responses) { if (xxWireless['CIM_WiFiEndpointSettings'].responses[j]['Priority'] == i) t = 0; }
if (t) { x += '<option value='+ i +'>'+ i; } // Option is a tag that is self closing.
}
QH('idx_d12pri', x);
// ###BEGIN###{NetAuth}
// Set certificates
var clientcertoptions = '<option value=-1>' + EscapeHtml("없음") + '</option>', servercertoptions = '<option value=-1>' + EscapeHtml("없음") + '</option>';
for (var i in xxCertificates) {
if (xxCertificates[i].TrustedRootCertficate) {
servercertoptions += '<option value="' + i + '">' + EscapeHtml(xxCertificates[i].XSubject['CN']) + '</option>';
} else if (xxCertificates[i].XPrivateKey) {
clientcertoptions += '<option value="' + i + '">' + EscapeHtml(xxCertificates[i].XSubject['CN']) + '</option>';
}
}
QH('idx_d12clientcert', clientcertoptions);
QH('idx_d12servercert', servercertoptions);
// ###END###{NetAuth}
var authOptions = '';
// ###BEGIN###{NetAuth}
authOptions += '<option value=32769>' + "WPA3 OWE IEEE 802.1x" + '</option>';
authOptions += '<option value=32768>' + "WPA3 SAE IEEE 802.1x" + '</option>';
authOptions += '<option value=7>' + "WPA2 IEEE 802.1x" + '</option>';
authOptions += '<option value=5>' + "WPA IEEE 802.1x" + '</option>';
// ###END###{NetAuth}
authOptions += '<option value=6>' + "WPA2 PSK" + '</option>';
authOptions += '<option value=4>' + "WPA PSK" + '</option>';
QH('idx_d12auth', authOptions);
idx_d12auth.value = 6;
idx_d12enc.value = 4;
idx_d12name.value = idx_d12ssid.value = idx_d12password1.value = idx_d12password2.value = '';
setDialogMode(12, "무선 프로파일 추가", 3, function () { addWifiProfile() });
updateWifiDialog();
}
function addWifiProfile() {
var sc, netAuthSettingsClientCert, netAuthSettingsServerCaCert;
var v = {
'__parameterType': 'instance',
'__namespace': amtstack.CompleteName('CIM_WiFiEndpointSettings'),
'ElementName': idx_d12name.value,
'InstanceID': 'Intel(r) AMT:WiFi Endpoint Settings ' + idx_d12name.value,
'AuthenticationMethod': idx_d12auth.value,
'EncryptionMethod': idx_d12enc.value,
'SSID': idx_d12ssid.value,
'Priority': idx_d12pri.value
};
if ((idx_d12auth.value == 4) || (idx_d12auth.value == 6)) { v['PSKPassPhrase'] = idx_d12password1.value; }
// ###BEGIN###{NetAuth}
if ((idx_d12auth.value == 5) || (idx_d12auth.value == 7) || (idx_d12auth.value == 32768) || (idx_d12auth.value == 32769)) {
sc = {
'__parameterType': 'instance',
'__namespace': amtstack.CompleteName('CIM_IEEE8021xSettings'),
'ElementName': '8021x-' + idx_d12name.value,
'InstanceID': '8021x-' + idx_d12name.value,
'ActiveInS0': (Q('idx_d12activeins0').value == 1),
'AuthenticationProtocol': Q('idx_d12protocol').value
};
if (Q('idx_d12roamingidentity').value != '') { sc['RoamingIdentity'] = Q('idx_d12roamingidentity').value; }
if (Q('idx_d12servername').value != '') { sc['ServerCertificateName'] = Q('idx_d12servername').value; sc['ServerCertificateNameComparison'] = Q('idx_d12servernamecompare').value; }
if (Q('idx_d12username').value != '') { sc['Username'] = Q('idx_d12username').value; }
if (Q('idx_d12password').value != '') { sc['Password'] = Q('idx_d12password').value; }
if (Q('idx_d12domain').value != '') { sc['Domain'] = Q('idx_d12domain').value; }
if (Q('idx_d12protocol').value > 3) { sc['ProtectedAccessCredential'] = Q('idx_d12pac').value; sc['PACPassword'] = Q('idx_d12pacpassword').value; }
if (parseInt(Q('idx_d12clientcert').value) >= 0) { netAuthSettingsClientCert = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_PublicKeyCertificate</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">' + xxCertificates[parseInt(Q('idx_d12clientcert').value)]['InstanceID'] + '</Selector></SelectorSet></ReferenceParameters>'; }
if (parseInt(Q('idx_d12servercert').value) >= 0) { netAuthSettingsServerCaCert = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_PublicKeyCertificate</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">' + xxCertificates[parseInt(Q('idx_d12servercert').value)]['InstanceID'] + '</Selector></SelectorSet></ReferenceParameters>'; }
}
// ###END###{NetAuth}
console.log('wifiepsettinginput', JSON.sstringify(v, null, 2));
console.log('netAuthProfile', JSON.sstringify(sc, null, 2));
console.log('netAuthSettingsClientCert', netAuthSettingsClientCert);
console.log('netAuthSettingsServerCaCert', netAuthSettingsServerCaCert);
amtstack.AMT_WiFiPortConfigurationService_AddWiFiSettings(
{
'__parameterType': 'reference',
'__resourceUri': amtstack.CompleteName('CIM_WiFiEndpoint'),
'Name': 'WiFi Endpoint 0'
}, v,
sc, netAuthSettingsClientCert, netAuthSettingsServerCaCert, removeWifiEntryResponse
);
}
function updateWifiDialog() {
var r = true;
var a = idx_d12auth.value;
var e = idx_d12enc.value;
//QV('id_d12e2', a < 4);
//QV('id_d12e3', a > 3);
//QV('id_d12e4', a > 3);
//QV('id_d12e5', a < 4);
if (a < 4 && (e == 3 || e == 4)) { idx_d12enc.value = 2; }
if (a > 3 && (e == 2 || e == 5)) { idx_d12enc.value = 3; }
if ((a == 32768) || (a == 32769)) { idx_d12enc.value = 4; }
QV('idx_d12pass', (a == 4) || (a == 6));
QV('idx_d12netauth', (a == 5) || (a == 7) || (a == 32768) || (a == 32769));
// Check if there is already a profile with this name
for (var j in xxWireless['CIM_WiFiEndpointSettings'].responses) { if (xxWireless['CIM_WiFiEndpointSettings'].responses[j]['ElementName'] == idx_d12name.value) { r = false; } }
if ((idx_d12name.value.length == 0) && (idx_d12ssid.value.length == 0)) { r = false; }
if (((a == 4) || (a == 6)) && ((idx_d12password1.value.length < 8) || (idx_d12password1.value.length > 63) || (idx_d12password1.value != idx_d12password2.value))) { r = false; }
QE('idx_dlgOkButton', r);
// ###BEGIN###{NetAuth}
updateNetAuthDialog();
// ###END###{NetAuth}
}
// ###BEGIN###{NetAuth}
function updateNetAuth2Dialog() {
QV('idx_d12servernamecomparediv', (Q('idx_d12servernamediv').value != ''));
QV('idx_d12pacdiv', (Q('idx_d12protocol').value > 3));
QV('idx_d12pacpassworddiv', (Q('idx_d12protocol').value > 3));
}
// ###END###{NetAuth}
// ###END###{Wireless}
// ###BEGIN###{NetAuth}
//
// 802.1x SETTINGS
//
function editNetAuthProfile() {
if (xxdialogMode) return;
// Set certificates
var clientcertoptions = '<option value=-1>' + EscapeHtml("없음") + '</option>', servercertoptions = '<option value=-1>' + EscapeHtml("없음") + '</option>';
for (var i in xxCertificates) {
if (xxCertificates[i].TrustedRootCertficate) {
servercertoptions += '<option value="' + i + '">' + EscapeHtml(xxCertificates[i].XSubject['CN']) + '</option>';
} else if (xxCertificates[i].XPrivateKey) {
clientcertoptions += '<option value="' + i + '">' + EscapeHtml(xxCertificates[i].XSubject['CN']) + '</option>';
}
}
QH('idx_d27clientcert', clientcertoptions);
QH('idx_d27servercert', servercertoptions);
// Set profile
var sc = amtsysstate['AMT_8021XProfile'].responses.Body;
Q('idx_d27enabled').value = sc['Enabled'] ? 1 : 0;
Q('idx_d27activeins0').value = (sc['ActiveInS0'] ? 1 : 0);
Q('idx_d27pxetimeout').value = sc['PxeTimeout'];
if (sc['Enabled']) {
Q('idx_d27protocol').value = sc['AuthenticationProtocol'];
Q('idx_d27roamingidentity').value = sc['RoamingIdentity'] ? sc['RoamingIdentity'] : '';
Q('idx_d27servername').value = sc['ServerCertificateName'] ? sc['ServerCertificateName'] : '';
Q('idx_d27servernamecompare').value = sc['ServerCertificateNameComparison'] ? sc['ServerCertificateNameComparison'] : 0;
Q('idx_d27username').value = sc['Username'] ? sc['Username'] : '';
Q('idx_d27password').value = sc['Password'] ? sc['Password'] : '';
Q('idx_d27domain').value = sc['Domain'] ? sc['Domain'] : '';
Q('idx_d27pac').value = sc['ProtectedAccessCredential'] ? sc['ProtectedAccessCredential'] : '';
Q('idx_d27pacpassword').value = sc['PACPassword'] ? sc['PACPassword'] : '';
var scInstanceId = -1, ccInstanceId = -1;
if (sc['ServerCertificateIssuer']) { scInstanceId = sc['ServerCertificateIssuer']['ReferenceParameters']['SelectorSet']['Selector']['Value']; }
if (sc['ClientCertificate']) { ccInstanceId = sc['ClientCertificate']['ReferenceParameters']['SelectorSet']['Selector']['Value']; }
for (var i in xxCertificates) {
if (xxCertificates[i]['InstanceID'] == scInstanceId) { Q('idx_d27servercert').value = i; }
if (xxCertificates[i]['InstanceID'] == ccInstanceId) { Q('idx_d27clientcert').value = i; }
}
}
setDialogMode(27, "802.1x Profile", 3, function () { setNetAuthProfile() });
updateNetAuthDialog();
}
function updateNetAuthDialog() {
QV('idx_d27protocoldiv', Q('idx_d27enabled').value == 1);
QV('idx_d27servernamediv', Q('idx_d27enabled').value == 1);
QV('idx_d27servernamecomparediv', (Q('idx_d27enabled').value == 1) && (Q('idx_d27servername').value != ''));
QV('idx_d27domaindiv', Q('idx_d27enabled').value == 1);
QV('idx_d27usernamediv', Q('idx_d27enabled').value == 1);
QV('idx_d27passworddiv', Q('idx_d27enabled').value == 1);
QV('idx_d27roamingidentitydiv', Q('idx_d27enabled').value == 1);
QV('idx_d27pacdiv', (Q('idx_d27enabled').value == 1) && (Q('idx_d27protocol').value > 3));
QV('idx_d27pacpassworddiv', (Q('idx_d27enabled').value == 1) && (Q('idx_d27protocol').value > 3));
QV('idx_d27clientcertdiv', Q('idx_d27enabled').value == 1);
QV('idx_d27servercertdiv', Q('idx_d27enabled').value == 1);
QV('idx_d27activeins0div', Q('idx_d27enabled').value == 1);
QV('idx_d27pxetimeoutdiv', Q('idx_d27enabled').value == 1);
}
function setNetAuthProfile() {
var sc = Clone(amtsysstate['AMT_8021XProfile'].responses.Body);
sc['Enabled'] = (Q('idx_d27enabled').value == 1);
if (sc['Enabled']) {
sc['ActiveInS0'] = (Q('idx_d27activeins0').value == 1);
sc['AuthenticationProtocol'] = Q('idx_d27protocol').value;
if (Q('idx_d27roamingidentity').value != '') { sc['RoamingIdentity'] = Q('idx_d27roamingidentity').value; } else { delete sc['RoamingIdentity']; }
if (Q('idx_d27servername').value != '') {
sc['ServerCertificateName'] = Q('idx_d27servername').value;
sc['ServerCertificateNameComparison'] = Q('idx_d27servernamecompare').value;
} else {
delete sc['ServerCertificateName'];
delete sc['ServerCertificateNameComparison'];
}
if (Q('idx_d27username').value != '') { sc['Username'] = Q('idx_d27username').value; } else { delete sc['Username']; }
if (Q('idx_d27password').value != '') { sc['Password'] = Q('idx_d27password').value; } else { delete sc['Password']; }
if (Q('idx_d27domain').value != '') { sc['Domain'] = Q('idx_d27domain').value; } else { delete sc['Domain']; }
if (Q('idx_d27protocol').value > 3) {
sc['ProtectedAccessCredential'] = Q('idx_d27pac').value;
sc['PACPassword'] = Q('idx_d27pacpassword').value;
} else {
delete sc['ProtectedAccessCredential'];
delete sc['PACPassword'];
}
if (parseInt(Q('idx_d27clientcert').value) >= 0) { sc['ClientCertificate'] = '<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_PublicKeyCertificate') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + xxCertificates[parseInt(Q('idx_d27clientcert').value)]['InstanceID'] + '</w:Selector></w:SelectorSet></a:ReferenceParameters>'; } else { delete sc['ClientCertificate']; }
if (parseInt(Q('idx_d27servercert').value) >= 0) { sc['ServerCertificateIssuer'] = '<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_PublicKeyCertificate') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + xxCertificates[parseInt(Q('idx_d27servercert').value)]['InstanceID'] + '</w:Selector></w:SelectorSet></a:ReferenceParameters>'; } else { delete sc['ServerCertificateIssuer']; }
sc['PxeTimeout'] = Q('idx_d27pxetimeout').value;
}
amtstack.Put('AMT_8021XProfile', sc, setNetAuthProfileEx);
}
function setNetAuthProfileEx(stack, name, response, status) {
if (status == 200) {
amtsysstate['AMT_8021XProfile'].responses.Body = amtsysstate['AMT_8021XProfile'].response = response.Body;
updateSystemStatus();
} else {
if (response.Header['WsmanError']) {
messagebox("802.1x Error", response.Header['WsmanError'].replace(/_/g, ' '));
} else {
messagebox("802.1x Error", "Error, Status = " + status);
}
}
}
// ###END###{NetAuth}
// ###END###{NetworkSettings}
// ###BEGIN###{HardwareInfo}
//
// HARDWARE INFORMATION PANEL
//
function PullHardware() {
amtstack.BatchEnum('', ['*CIM_ComputerSystemPackage', 'CIM_SystemPackaging', '*CIM_Chassis', 'CIM_Chip', '*CIM_Card', '*CIM_BIOSElement', 'CIM_Processor', 'CIM_PhysicalMemory', 'CIM_MediaAccessDevice', 'CIM_PhysicalPackage', '*CIM_Battery'], processHardware);
amtFirstPull |= 1; // Set the hardware info bit on, indicates we are pulling this information.
}
// http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf
var DMTFCPUStatus = ["알 수 없는", "가능", "사용자가 비활성화", "BIOS에 의해 비활성화 됨 (POST 오류)", "게으른", "다른"];
var DMTFMemType = ["알 수 없는", "다른", "음주", "동기식 DRAM", "캐시 DRAM", "에도", "EDRAM", "VRAM", "스램", "램", "ROM", "플래시", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR-2", "브람", "FB-DIMM", "DDR3", "FBD2", "DDR4", "LPDDR", "LPDDR2", "LPDDR3", "LPDDR4"];
var DMTFMemFormFactor = ['', "다른","알 수 없는","SIMM","한모금","칩","담그다","지퍼","독점 카드","DIMM","TSOP","칩의 행","림","SODIMM","스림","FB-DIM"];
var DMTFProcFamilly = { // Page 46 of DMTF document
191: "인텔 &reg; 코어 &trade; 2 듀오 프로세서",
192: "인텔 &reg; 코어 &trade; 2 솔로 프로세서",
193: "인텔 &reg; 코어 &trade; 2 익스트림 프로세서",
194: "인텔 &reg; 코어 &trade; 2 쿼드 프로세서",
195: "인텔 &reg; 코어 &trade; 2 익스트림 모바일 프로세서",
196: "인텔 &reg; 코어 &trade; 2 듀오 모바일 프로세서",
197: "인텔 &reg; 코어 &trade; 2 솔로 모바일 프로세서",
198: "인텔 &reg; 코어 &trade; i7 프로세서",
199: "듀얼 코어 인텔 &reg; 셀러론 &reg; 프로세서" };
var HardwareInventory;
function processHardware(stack, name, responses, status) {
if (status != 200) return;
var i, x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
HardwareInventory = responses;
QV('go2', true); // Show "Hardware Information" on left panel
// ###BEGIN###{!FileSaver}
x += TableEnd('<div>&nbsp;' + AddRefreshButton('PullHardware(1)') + " 하드웨어 정보는 시스템 부팅시 수집됩니다.");
// ###END###{!FileSaver}
// ###BEGIN###{FileSaver}
x += TableEnd('<div>&nbsp;' + AddRefreshButton('PullHardware(1)') + AddButton("저장...", 'SaveHardwareLog()') + " 하드웨어 정보는 시스템 부팅시 수집됩니다.");
// ###END###{FileSaver}
var ba = responses['CIM_Chassis'].response;
var bb = responses['CIM_Card'].response;
var v = responses['CIM_BIOSElement'].response['SoftwareElementID'];
x += '<br><h2>' + "플랫폼" + '</h2>';
x += FullTable({"컴퓨터 모델":ba['Model'], "제조사":ba['Manufacturer'], "버전":ba['Version'], "일련 번호":ba['SerialNumber'], "시스템 ID":guidToStr(responses['CIM_SystemPackaging'].responses[0]['PlatformGUID']).toLowerCase()}, '');
x += '<br><h2>' + "베이스 보드" + '</h2>';
x += FullTable({"제조사":bb['Manufacturer'], "상품명":bb['Model'], "버전":bb['Version'], "일련 번호":bb['SerialNumber'], "자산 태그":bb['Tag'], "교체 가능?":(bb['CanBeFRUed']==true)?'Yes':'No' },'');
x += '<br><h2>' + "BIOS" + '</h2>';
x += FullTable({"공급 업체":responses['CIM_BIOSElement'].response['Manufacturer'], "버전":v, "출시일":new Date(responses['CIM_BIOSElement'].response['ReleaseDate']['Datetime']).toLocaleDateString('en', {timeZone:'UTC'})},'');
x += '<br>';
for (i in responses['CIM_Processor'].responses) {
var p = responses['CIM_Processor'].responses[i];
var q = responses['CIM_Chip'].responses[i]; // This is a shortcut, we assume that the first entries in CIM_Chip are the processors, in the same order.
x += '<h2>' + "프로세서" + ' ' + (parseInt(i) + 1) + '</h2>';
x += FullTable({"제조사":trademarks(q['Manufacturer']), "가족":DMTFProcFamilly[p['Family']], "버전":trademarks(q['Version']), "최대 소켓 속도":p['MaxClockSpeed'] + " MHz", "상태":DMTFCPUStatus[p['CPUStatus']]},'');
}
x += '<br>';
for (i in responses['CIM_PhysicalMemory'].responses) {
var m = responses['CIM_PhysicalMemory'].responses[i];
x += '<h2>' + "메모리 모듈" + ' ' + (+i + 1) + '</h2>';
x += FullTable({"은행 라벨":m['BankLabel'], "제조사":m['Manufacturer'], "일련 번호":m['SerialNumber'], "크기":parseInt(m['Capacity'] / 0x100000) + " MB", "폼 팩터":DMTFMemFormFactor[m['FormFactor']], "유형":DMTFMemType[m['MemoryType']], "자산 태그":m['Tag'], "부품 번호":m['PartNumber']},'');
}
x += '<br>';
for (i in responses['CIM_MediaAccessDevice'].responses) {
var m = responses['CIM_MediaAccessDevice'].responses[i];
var n = responses['CIM_PhysicalPackage'].responses[+i + 1]; // This is a shortcut, we assume CIM_PhysicalPackage is the same as CIM_MediaAccessDevice except for the first entry.
x += '<h2>' + "저장 매체" + ' ' + (parseInt(i) + 1) + '</h2>';
x += FullTable({"모델":n['Model'],"일련 번호":(n['SerialNumber']==''?'Unknown':n['SerialNumber']), "크기":parseInt(Math.round(m['MaxMediaSize'] * 1000 / 0x100000)) + " MB"},'');
}
x += '<br>';
if (responses['CIM_Battery'].response != null) {
var battInfo = null;
for (i in responses['CIM_PhysicalPackage'].responses) { if (responses['CIM_PhysicalPackage'].responses[i].PackageType == 11) { battInfo = responses['CIM_PhysicalPackage'].responses[i]; } }
if (battInfo != null) {
x += '<h2>' + "Battery" + '</h2>';
var battdate = new Date(battInfo['ManufactureDate']['Datetime']).toDateString()
var batttype = ["다른", "알 수 없는", "Lead Acid", "Nickel Cadmium", "Nickel Metal Hydride", "Lithium-ion", "Zinc air", "Lithium Polymer"][responses['CIM_Battery'].response['Chemistry']];
var batt = { "Device name": responses['CIM_Battery'].response['DeviceID'], "제조사": battInfo['Manufacturer'], "Manufacture date": battdate, "일련 번호": battInfo['SerialNumber'], "유형": batttype, "Design capacity": responses['CIM_Battery'].response['DesignCapacity'] + ' ' + "mWatt-hours", "Design voltage": responses['CIM_Battery'].response['DesignVoltage'] + ' ' + "mVolts" };
if (battInfo['OtherIdentifyingInfo']) { batt["Other Info"] = battInfo['OtherIdentifyingInfo']; }
x += FullTable(batt, '');
}
}
x += '<br>';
QH('id_TableSysInfo', x);
updateSystemStatus();
}
// ###BEGIN###{FileSaver}
function SaveHardwareLog() {
if (!xxdialogMode && HardwareInventory) SaveJsonFile('IntelAmtHardware', 'hardware', "인텔 AMT 하드웨어 정보", HardwareInventory);
}
// ###END###{FileSaver}
// ###END###{HardwareInfo}
//
// POWER POLICY
//
var AmtSystemPowerSchemes = null;
function PullPowerPolicy() { amtstack.Enum('AMT_SystemPowerScheme', powerPolicyResponse); }
function powerPolicyResponse(stack, name, response, status) { AmtSystemPowerSchemes = response; updateSystemStatus(); }
function showPowerPolicyDlg(currentguid) {
if (xxdialogMode) return;
var s = '';
// Now find the name of the power schema in the AMT_SystemPowerScheme table
for (var j = 0; j < AmtSystemPowerSchemes.length; j++) {
var selected = ((AmtSystemPowerSchemes[j]['SchemeGUID'] == currentguid)?' checked':'');
s += '<input type=radio name=powerpolicy value=\"' + AmtSystemPowerSchemes[j]['InstanceID'] + '\" ' + selected + '>' + AmtSystemPowerSchemes[j]['Description'] + '<br>';
}
setDialogMode(11, "인텔 &reg; AMT 전원 정책", 3, showPowerPolicyDlgOk, s);
}
function showPowerPolicyDlgOk() {
var id = null, i = 0, e = document.getElementsByTagName('input');
for (; i < e.length; i++) { if (e[i].name == 'powerpolicy' && e[i].checked) { id = e[i].value; } }
amtstack.AMT_SystemPowerScheme_SetPowerScheme(showPowerPolicyDlgOkDone, id);
}
function showPowerPolicyDlgOkDone(stack, name, response, status) { if (status == 200) PullSystemStatus(); }
//
// USER INFORMATION PANEL
//
var xxAccountAdminName, xxAccountRealmInfo, xxAccountEnabledInfo = {}, xxAccountFetch, showHiddenAccounts = false;
function PullUserInfo() {
xxAccountFetch = 1;
delete xxAccountAdminName;
xxAccountRealmInfo = {};
amtstack.AMT_AuthorizationService_GetAdminAclEntry(getAdminAclEntryResponse);
amtstack.AMT_AuthorizationService_EnumerateUserAclEntries(1, enumerateUserAclEntriesResponse);
}
function getAdminAclEntryResponse(stack, name, response, status) {
if (status != 200) return;
xxAccountRealmInfo[-1] = { 'AccessPermission': 999, 'DigestUsername': response.Body['Username'], 'Realms':null };
xxAccountAdminName = response.Body['Username'];
updateAccounts();
}
function enumerateUserAclEntriesResponse(stack, name, response, status) {
if (status != 200) return;
//if (errcheck(status, stack)) return;
methodcheck(response);
QV('go11', true); // Show "User Accounts" on left panel
xxAccountFetch = response.Body['Handles'].length;
for (var i in response.Body['Handles']) {
var h = response.Body['Handles'][i];
amtstack.AMT_AuthorizationService_GetAclEnabledState(h, getAclEnabledStateResponse, h);
amtstack.AMT_AuthorizationService_GetUserAclEntryEx(h, getUserAclEntryExResponse, h);
}
updateAccounts();
}
function getUserAclEntryExResponse(stack, name, response, status, tag) {
xxAccountFetch--;
//if (errcheck(status, stack)) return;
//methodcheck(response);
if (status == 200) { // Sometimes Intel AMT will just freak out on this call, if it's the case, just carry on.
response.Body['Handle'] = tag;
if (!response.Body['Realms']) response.Body['Realms'] = [];
else if (!Array.isArray(response.Body['Realms'])) response.Body['Realms'] = [response.Body['Realms']]; // If "Realms" is not an array, it's because it's just one realm. Fix is so it's an array of one.
xxAccountRealmInfo[tag] = response.Body;
updateAccounts();
}
}
function getAclEnabledStateResponse(stack, name, response, status, tag) {
//if (errcheck(status, stack)) return;
if (status == 200) { // Sometimes Intel AMT will just freak out on this call, if it's the case, just carry on.
xxAccountEnabledInfo[tag] = response.Body;
updateAccounts();
}
}
function setAclEnabledStateResponse(stack, name, response, status, tag) {
if (errcheck(status, stack)) return;
methodcheck(response);
amtstack.AMT_AuthorizationService_GetAclEnabledState(tag, getAclEnabledStateResponse, tag);
}
function updateAccounts() {
if (xxAccountFetch > 0) return;
var x = TableStart2();
x += '<tr><td class=r1 style=padding-left:15px><br>' + "이 컴퓨터의 인텔 &reg; AMT 사용자 계정을 관리하십시오." + '<br><br>';
for (var i in xxAccountRealmInfo) {
var r = xxAccountRealmInfo[i], name, hidden = false, state = 0;
if (r['DigestUsername']) { name = r['DigestUsername']; hidden = (name[0] == '$' && name[1] == '$'); } else { name = GetSidString(atob(r['KerberosUserSid'])); }
if (xxAccountEnabledInfo[i] && name != '$$OsAdmin') { state = (xxAccountEnabledInfo[i]['Enabled'] == true)?1:2; }
if (showHiddenAccounts || !hidden) {
var rb = '';
if (r['AccessPermission'] != 999) {
if (state == 2) { rb += "장애인,"; }
var rc = 0;
for (i in r['Realms']) { if (amtstack.RealmNames[r["영역"][i]] != '') { rc++; } } // Count only realms that have a name, removing reserved realms.
if (r['Realms'].indexOf(20) >= 0) rb += "감사,";
if (r['Realms'].indexOf(3) >= 0) { rb += "관리자"; } else { if (rc == 1) { rb += "1 개 영역"; } else { rb += rc + " 영역"; } }
} else {
rb += "관리자";
r['Handle'] = -1;
}
x += '<div class=itemBar onclick=showUserDetails(' + r['Handle'] + ')><div style=float:right>';
if (state > 0 && xxAccountAdminName) x += ' ' + AddButton2((state == 1?'Disable':'Enable'), 'changeAccountStateButton(event,' + r['Handle'] + ',' + state + ')');
if (!hidden && xxAccountAdminName) x += ' ' + AddButton2("편집하다...", 'changeAccountButton(event,' + r['Handle'] + ')');
x += '</div><div style=padding-top:3px;width:330px;float:left;overflow-x:hidden title="' + name + '"><b>' + name + '</b></div><div style=padding-top:3px>' + rb + '</div></div>';
}
}
var y = '<div style=float:right;margin-right:8px><a title="' + "숨겨진 계정 전환" + '" style=color:gray;cursor:pointer onclick=toggleAccountButton()>' + (showHiddenAccounts?'&#x25B2;':'&#x25BC;') + '</a></div><div>&nbsp;' + AddRefreshButton('xxAccountFetch=999;PullUserInfo()');
if (xxAccountAdminName) y += AddButton("새 계정", 'newAccountButton()');
x += '<br><td class=r1>' + TableEnd(y + '</div>');
QH('id_TableUserAccounts', x);
}
function toggleAccountButton() {
showHiddenAccounts = !showHiddenAccounts;
updateAccounts();
}
function removeUserAclEntryResponse(stack, name, response, status, tag) {
if (methodcheck(response)) return;
PullUserInfo();
}
function changeAccountStateButton(e, h, s) {
haltEvent(e);
if (xxdialogMode) return;
amtstack.AMT_AuthorizationService_SetAclEnabledState(h, (s==1?false:true), setAclEnabledStateResponse, h);
}
function changeAccountButton(e, h) {
haltEvent(e);
if (xxdialogMode) return;
updateRealms(xxAccountRealmInfo[h]['Realms']);
d2username.value = xxAccountRealmInfo[h]['DigestUsername'] ? xxAccountRealmInfo[h]['DigestUsername'] : GetSidString(atob(xxAccountRealmInfo[h]['KerberosUserSid']));
d2password1.value = d2password2.value = '';
d2permission.value = xxAccountRealmInfo[h]['AccessPermission'];
setDialogMode(2, "계정 편집", ((h==-1)?3:7), function (button) { changeAccountButtonEx(h, button); }); // If handle is -1, only display OK/Cancel buttons, if not, also display delete button.
updateAccountDialog();
}
function newAccountButton() {
if (xxdialogMode) return;
updateRealms([]);
d2username.value = d2password1.value = d2password2.value = '';
d2permission.value = 2;
setDialogMode(2, "새 계정", 3, function () { changeAccountButtonEx(null, 1); });
updateAccountDialog();
}
function changeAccountButtonEx(h, button) {
if (button == 1) { // OK Button
var realms = [], username = d2username.value, permission = d2permission.value, password = d2password1.value, sid = GetSidByteArray(Q('d2username').value), d = null;
if (username.length == 0 || password != d2password2.value) { messagebox("계정 오류", "잘못된 매개 변수"); return; }
if (sid == null) { d = window.btoa(rstr_md5(username + ":" + amtsysstate['AMT_GeneralSettings'].response['DigestRealm'] + ":" + password)); } else { username = null; sid = btoa(sid); }
if (h != -1) { for (var y in amtstack.RealmNames) { if (((amtstack.RealmNames[y]) || (y == 3)) && Q('rx' + y).checked) { realms.push(y); } } }
if (h == null) { amtstack.AMT_AuthorizationService_AddUserAclEntryEx(username, d, sid, permission, realms, userAclEntryExResponse); }
else if (h == -1) { amtstack.AMT_AuthorizationService_SetAdminAclEntryEx(username, d, userAclEntryExResponse); }
else { amtstack.AMT_AuthorizationService_UpdateUserAclEntryEx(h, username, d, sid, permission, realms, userAclEntryExResponse); }
}
if (button == 2) { // Delete Button
amtstack.AMT_AuthorizationService_RemoveUserAclEntry(h, removeUserAclEntryResponse);
}
}
function userAclEntryExResponse(stack, name, response, status, tag) { if (methodcheck(response)) return; PullUserInfo(); }
function updateRealms(r) {
QV('id_d2permissions', r != null);
if (r != null) {
var x = '<li><label><input type=checkbox onchange=updateAccountDialog() id=rx3' + ((r.indexOf(3) >= 0)?' checked':'') + '>' + "관리자" + '</label></li><hr />';
for (var y in amtstack.RealmNames) { var c = ''; if (r.indexOf(parseInt(y)) >= 0) c = ' checked'; if (amtstack.RealmNames[y]) x += '<li><label><input type=checkbox onchange=updateAccountDialog() id=rx' + y + c + '>' + amtstack.RealmNames[y] + '</label></li>'; }
QH('id_d2realms', x);
}
}
function updateAccountDialog() {
var ok = true;
if (Q('id_d2permissions').style.display != 'none') { ok = false; for (var y in amtstack.RealmNames) { if (((amtstack.RealmNames[y]) || (y == 3)) && Q('rx' + y).checked) { ok = true; } } }
if (ok) { ok = ((d2username.value.length > 0) && (passwordcheck(d2password1.value)) && (d2password1.value == d2password2.value)); }
QE('idx_dlgOkButton', ok);
}
var xxUserPermissions = ["지역 만" , "네트워크 만", "모두 (로컬 및 네트워크)"];
function showUserDetails(h) {
if (xxdialogMode) return;
var a = xxAccountRealmInfo[h], x = '<div style=text-align:left>';
var i, n = a['DigestUsername'];
if (!n) n = GetSidString(atob(a['KerberosUserSid']));
x += addHtmlValue("이름", n);
if (xxAccountEnabledInfo[h]) { x += addHtmlValue("상태", ((xxAccountEnabledInfo[h]['Enabled'] == true)?"가능":"비활성화")); }
if (n == xxAccountAdminName) {
x += addHtmlValue("허가", "관리자");
} else {
x += addHtmlValue("허가", xxUserPermissions[a['AccessPermission']]);
var y = '';
if (a['Realms'].indexOf(3) >= 0) {
y = "관리자";
if (a['Realms'].indexOf(20) >= 0) y += "감사";
} else {
for (i in xxAccountRealmInfo[h]['Realms']) {
if (amtstack.RealmNames[a['Realms'][i]] != '') { // Remove blank reserved realms
if (y.length > 0) y += ",";
y += amtstack.RealmNames[a['Realms'][i]];
}
}
}
if (y.length == 0) y = "없음";
x += addHtmlValue("영역", '') + '<b>' + y + '</b>';
}
x += '</div>';
messagebox("계정" + n, x);
}
//
// WSMAN BROWSER PANEL
//
// ###BEGIN###{WsmanBrowser}
function wsmanQuery() {
QH('id_wsresults', '');
var selections = getSelectedOptions(Q('id_QuerySelect')), selections2 = [];
for (var x in selections) { if (QS('WSB-' + selections[x]).display == '') selections2.push(selections[x]); }
if (selections2.length == 0) return;
QE('id_p12querybutton', false);
if (selections2 && selections2.length > 0) { amtstack.BatchEnum("브라우저", selections2, browserResponse, null, true); } // This is the only BatchEnum where we want to continue and get an answer even if one of the calls fails.
}
function browserResponse(stack, name, responses, status) {
QE('id_p12querybutton', true);
var h = '';
for (var r in responses) {
var response = responses[r];
h += '<h2>' + r + '</h2><div style=margin-left:20px>';
if (response.status == 200) { if (response.responses.length == 0) { h += ('<br>' + "(빈)"); } else { h += ObjectToString(response.responses).replace(/Intel\(r\)/g, 'Intel&reg'); } } else { h += '<br><div style=color:red>' + "오류 #" + response.status + '</div>'; }
h += '</div><br>';
}
QH('id_wsresults', h);
}
function wsmanFilter() {
var filter = idx_browserFilter.value.toLowerCase();
for (var w in AllWsman) { QV('WSB-' + AllWsman[w], filter == '' || AllWsman[w].toLowerCase().indexOf(filter) >= 0); }
}
// ###END###{WsmanBrowser}
//
// Remote Terminal
//
// ###BEGIN###{Terminal}
function connectTerminal() {
if (!terminal) return;
if (terminal.State == 0) {
// ###BEGIN###{ComputerSelector}
terminal.digestRealmMatch = amtstack.wsman.comm.digestRealm;
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-MeshCentral2}
terminal.tlsv1only = amtstack.wsman.comm.tlsv1only;
terminal.Start(currentMeshNode._id, 16994, '*', '*', 0);
// ###END###{Mode-MeshCentral2}
// ###BEGIN###{ComputerSelector}
// ###BEGIN###{Mode-NodeWebkit}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
terminal.Start(currentcomputer._id, 0, 'x', 'x', 0, wsstack.comm, meshCentralServer);
} else {
// ###END###{MeshServerConnect}
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls'])
terminal.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
terminal.tlsv1only = amtstack.wsman.comm.tlsv1only;
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls'])
terminal.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
// ###END###{!Mode-NodeWebkit}
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-Firmware}
terminal.Start();
// ###END###{Mode-Firmware}
} else {
terminal.Stop();
}
}
function onTerminalStateChange(terminal, state) {
// console.log("onTerminalStateChange: " + state);
idx_connectbutton2.value = (state == 0) ? "잇다" : "분리";
Q('id_termstatus').textContent = StatusStrs[state];
QE('id_tpastebutton', state == 3);
// ###BEGIN###{!Mode-NodeWebkit}
QE('TermWD', state == 3);
// ###END###{!Mode-NodeWebkit}
switch (state) {
case 0:
terminal.m.TermResetScreen();
terminal.m.TermDraw();
if (xxdialogMode == 3) setDialogMode();
// ###BEGIN###{Mode-MeshCentral2}
QV('termRecordIcon', false);
// ###END###{Mode-MeshCentral2}
if (terminal.disconnectCode == 2) { // BUSY
messagebox("Remote Terminal", "The remote device is busy, a session may already be open.");
} else if (terminal.disconnectCode == 3) { // UNSUPPORTED
messagebox("Remote Terminal", "The device indicated that this type of connection of not supported.");
}
break;
case 3:
// ###BEGIN###{Mode-MeshCentral2}
if (terminal.serverIsRecording == true) { QV('termRecordIcon', true); }
// ###END###{Mode-MeshCentral2}
break;
}
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
}
function termPaste() { terminal.m.TermSendKeys(d3pastetextarea.value); return false; }
function termSendKey(k) { terminal.m.TermSendKey(k); return false; }
function termSendKeys() { var k = Q('termkeys').value; if (k < 1000) { termSendKey(k); } else { terminal.m.TermHandleKeyDown({ which: k - 889, repeat: false }); } }
// ###BEGIN###{TerminalSize}
function termToggleSize() {
if (terminal.m.width == 80) {
Q('id_tsizebutton').value = '100x30';
terminal.m.Init(100, 30);
} else {
Q('id_tsizebutton').value = '80x25';
terminal.m.Init(80, 25);
}
}
// ###END###{TerminalSize}
// ###BEGIN###{Terminal-Enumation-All}
var terminalEmulations = ["UTF8 터미널", "확장 ASCII", "인텔 ASCII"];
function termToggleType() {
terminal.m.terminalEmulation = (terminal.m.terminalEmulation + 1) % 3;
Q('id_ttypebutton').value = terminalEmulations[terminal.m.terminalEmulation];
}
// ###END###{Terminal-Enumation-All}
// ###BEGIN###{Terminal-FxEnumation-All}
function termToggleFx() {
Q('id_tfxkeysbutton').value = ["인텔 (F10 = ESC + [OM)", "대체 (F10 = ESC + 0)", "VT100 + (F10 = ESC + [OY)"][terminal.m.fxEmulation = (terminal.m.fxEmulation + 1) % 3];
}
// ###END###{Terminal-FxEnumation-All}
function termToggleCr() {
if (terminal.m.lineFeed == '\r\n') {
Q('id_tcrbutton').value = "LF";
terminal.m.lineFeed = '\n';
} else {
Q('id_tcrbutton').value = "CR + LF";
terminal.m.lineFeed = '\r\n';
}
}
// ###BEGIN###{FileSaver}
function terminalCaptureToggle(e) {
if (xxdialogMode) return;
// ###BEGIN###{TerminalReplay}
if ((e != null) && (e.shiftKey == true)) { terminalReplay(); return; }
if (terminalReplayTimer != null) { return; }
// ###END###{TerminalReplay}
if (terminal.m.capture == undefined) {
terminal.m.capture = ''; // Start terminal capture
// ###BEGIN###{!Mode-NodeWebkit}
idx_terminalCaptureButton.value = "캡처 중지";
// ###END###{!Mode-NodeWebkit}
} else {
if (terminal.m.capture.length > 0) {
var n = 'TerminalCapture', d = new Date();
if (amtsysstate) { n += '-' + amtsysstate['AMT_GeneralSettings'].response['HostName']; }
n += '-' + d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(terminal.m.capture), n + '.txt');
delete terminal.m.capture;
idx_terminalCaptureButton.value = "캡처 시작";
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('nwsaveas', n + '.txt');
chooser.addEventListener('change', function() {
require('fs').writeFile(this.value, terminal.m.capture, function () { });
delete terminal.m.capture;
}, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
} else {
delete terminal.m.capture;
// ###BEGIN###{!Mode-NodeWebkit}
idx_terminalCaptureButton.value = "캡처 시작";
// ###END###{!Mode-NodeWebkit}
}
}
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
// ###BEGIN###{TerminalReplay}
function terminalReplay() {
if (xxdialogMode) return;
if (terminalReplayTimer != null) {
clearInterval(terminalReplayTimer); terminalReplayBuffer = null; terminalReplayBufferPtr = 0; terminalReplayTimer = null;
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
} else {
setDialogMode(11, "터미널 캡처 열기", 3, terminalReplayEx, '<input id=termCaptureFile type=file style=width:100% accept=.txt>');
}
}
function terminalReplayEx() {
var x = Q('termCaptureFile');
if (x.files.length != 1) return;
var reader = new FileReader();
reader.onload = terminalReplayEx2;
reader.readAsBinaryString(x.files[0]);
}
var terminalReplayBuffer = null;
var terminalReplayBufferPtr = 0;
var terminalReplayTimer = null;
function terminalReplayEx2(file) {
terminal.m.TermResetScreen();
if (terminalReplayTimer != null) { clearInterval(terminalReplayTimer); terminalReplayTimer = null; }
terminalReplayBufferPtr = 0;
terminalReplayBuffer = file.target.result;
terminalReplayTimer = setInterval(terminalReplayEx3, 5);
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
}
function terminalReplayEx3() {
var len = ((terminalReplayBufferPtr - 1) < terminalReplayBuffer.length) ? 2 : 1;
var x = terminalReplayBuffer.substring(terminalReplayBufferPtr, terminalReplayBufferPtr + len);
terminal.m.ProcessData(x);
terminalReplayBufferPtr += len;
if (terminalReplayBufferPtr >= terminalReplayBuffer.length) {
clearInterval(terminalReplayTimer); terminalReplayBuffer = null; terminalReplayBufferPtr = 0; terminalReplayTimer = null;
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
}
}
// ###END###{TerminalReplay}
function terminal_FileSelectHandler(e) {
haltEvent(e);
if (terminal.State != 3 || e.dataTransfer == null || e.dataTransfer.files.length != 1) return;
var reader = new FileReader();
reader.onload = terminal_onSetupBinRead;
reader.readAsText(e.dataTransfer.files[0]);
}
function terminal_onSetupBinRead(file) {
d3pastetextarea.value = file.target.result;
setDialogMode(3, "풀", 3, termPaste)
}
// ###END###{Terminal}
//
// Remote Desktop
//
// ###BEGIN###{Desktop}
// ###BEGIN###{Desktop-Multi}
var desktopScreenInfo = null;
var desktopPollTimer = null;
// ###END###{Desktop-Multi}
// ###BEGIN###{DesktopInband}
var webRtcDesktop = null;
function webRtcDesktopReset() {
if (webRtcDesktop == null) return;
if (webRtcDesktop.softdesktop != null) { webRtcDesktop.softdesktop.Stop(); webRtcDesktop.softdesktop = null; }
if (webRtcDesktop.webchannel != null) { try { webRtcDesktop.webchannel.close(); } catch (e) { } webRtcDesktop.webchannel = null; }
if (webRtcDesktop.webrtc != null) { try { webRtcDesktop.webrtc.close(); } catch (e) { } webRtcDesktop.webrtc = null; }
webRtcDesktop = null;
// Switch back to hardware KVM
desktop.m.hold(false);
updateDesktopState();
// ###BEGIN###{DesktopInbandFiles}
p24files = null;
p24downloadFileCancel() // If any downloads are in process, cancel them.
p24uploadFileCancel(); // If any uploads are in process, cancel them.
QV('go24', false); // Files
if (currentView == 24) { go(14); }
// ###END###{DesktopInbandFiles}
}
/*
function webRtcDesktopProcessData(data) {
console.log('WebRTC data, len = ' + data.length);
}
*/
// ###END###{DesktopInband}
function connectDesktopButton(e) { desktop.disconnectCode = 0; connectDesktop(e); }
var connectDesktopConsent = false;
function connectDesktop(skipConsent) {
if (!desktop || xxdialogMode) return;
connectDesktopConsent = false; // TODO, this is not a good idea when calls are pending.
if (desktop.State == 0) {
// Check if user consent is needed
if ((skipConsent !== true) && (amtversion > 5) && ((amtsysstate == null) || (amtsysstate != null) && (amtsysstate['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != null) && (amtsysstate['IPS_OptInService'].response['OptInRequired'] != 0))) {
connectDesktopConsent = true; amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1); return; // User consent always required, ask for it before KVM.
}
// Encoding Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib, 16 = 4bit Color
desktop.m.useRLE = ((desktopsettings.encflags & 1) != 0);
desktop.m.bpp = (desktopsettings.encflags & 2) ? 2 : 1;
if ((amtversion > 15) && (amtsysstate != null) && (amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) {
desktop.m.lowcolor = amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported'] && ((desktopsettings.encflags & 16) != 0);
desktop.m.graymode = amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported'] && ((desktopsettings.encflags & 4) != 0);
desktop.m.useZLib = amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported'] && ((desktopsettings.encflags & 8) != 0);
desktop.m.decimationMode = ((amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0) ? desktopsettings.decimationMode : 0);
} else {
desktop.m.lowcolor = false;
desktop.m.graymode = false;
desktop.m.useZLib = false;
desktop.m.decimationMode = 0;
}
desktop.m.showmouse = desktopsettings.showmouse;
desktop.m.onScreenSizeChange = center;
// ###BEGIN###{ComputerSelector}
desktop.digestRealmMatch = amtstack.wsman.comm.digestRealm;
// ###END###{ComputerSelector}
// ###BEGIN###{DesktopInband}
desktop.m.onKvmData = function(x) {
//console.log('onKvmData (' + x.length + '): ' + x);
var data = null;
try { data = JSON.parse(x); } catch (e) {}
if ((data != null) && (data.action != null)) {
if (data.action == 'restart') {
// Clear WebRTC channel
webRtcDesktopReset();
desktop.m.sendKvmData(JSON.stringify({ action: 'present', ver: 1 }));
} else if ((data.action == 'present') && (webRtcDesktop == null)) {
// Setup WebRTC channel
webRtcDesktop = { platform: data.platform };
var configuration = null; //{ "iceServers": [ { 'urls': 'stun:stun.services.mozilla.com' }, { 'urls': 'stun:stun.l.google.com:19302' } ] };
if (typeof RTCPeerConnection !== 'undefined') { webRtcDesktop.webrtc = new RTCPeerConnection(configuration); }
else if (typeof webkitRTCPeerConnection !== 'undefined') { webRtcDesktop.webrtc = new webkitRTCPeerConnection(configuration); }
webRtcDesktop.webchannel = webRtcDesktop.webrtc.createDataChannel("DataChannel", {}); // { ordered: false, maxRetransmits: 2 }
webRtcDesktop.webchannel.onopen = function () {
// Switch to software KVM
if (urlvars && urlvars['kvmdatatrace']) { console.log('WebRTC Data Channel Open'); }
desktop.m.hold(true);
webRtcDesktop.webRtcActive = true;
webRtcDesktop.softdesktop = CreateKvmDataChannel(webRtcDesktop.webchannel, CreateAgentRemoteDesktop('Desk', Q('id_mainarea')), desktop.m);
webRtcDesktop.softdesktop.m.setRotation(desktop.m.rotation);
if (desktopsettings.quality) { webRtcDesktop.softdesktop.m.CompressionLevel = desktopsettings.quality; } // Number from 1 to 100. 50 or less is best.
if (desktopsettings.scaling) { webRtcDesktop.softdesktop.m.ScalingLevel = desktopsettings.scaling; }
webRtcDesktop.softdesktop.Start();
updateDesktopState();
// Check if we can get remote file access
// ###BEGIN###{DesktopInbandFiles}
QV('go24', true); // Files
downloadFile = null;
p24files = webRtcDesktop.softdesktop;
p24targetpath = '';
webRtcDesktop.softdesktop.onControlMsg = onFilesControlData;
webRtcDesktop.softdesktop.sendCtrlMsg(JSON.stringify({ action: 'ls', reqid: 1, path: '' })); // Ask for the root folder
// ###END###{DesktopInbandFiles}
}
webRtcDesktop.webchannel.onclose = function (event) { if (urlvars['kvmdatatrace']) { console.log('WebRTC Data Channel Closed'); } webRtcDesktopReset(); }
webRtcDesktop.webrtc.onicecandidate = function (e) {
if (e.candidate == null) {
desktop.m.sendKvmData(JSON.stringify({ action: 'offer', ver: 1, sdp: webRtcDesktop.webrtcoffer.sdp }));
} else {
webRtcDesktop.webrtcoffer.sdp += ('a=' + e.candidate.candidate + '\r\n'); // New candidate, add it to the SDP
}
}
webRtcDesktop.webrtc.oniceconnectionstatechange = function () {
if ((webRtcDesktop != null) && (webRtcDesktop.webrtc != null) && ((webRtcDesktop.webrtc.iceConnectionState == 'disconnected') || (webRtcDesktop.webrtc.iceConnectionState == 'failed'))) { /*console.log('WebRTC ICE Failed');*/ webRtcDesktopReset(); }
}
webRtcDesktop.webrtc.createOffer(function (offer) {
// Got the offer
webRtcDesktop.webrtcoffer = offer;
webRtcDesktop.webrtc.setLocalDescription(offer, function () { }, webRtcDesktopReset);
}, webRtcDesktopReset, { mandatory: { OfferToReceiveAudio: false, OfferToReceiveVideo: false } });
} else if ((data.action == 'answer') && (webRtcDesktop != null)) {
// Complete the WebRTC channel
webRtcDesktop.webrtc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: data.sdp }), function () { }, webRtcDesktopReset);
}
}
};
if ((amtversion > 15) || urlvars['kvmext']) { desktop.m.kvmExtChanged = updateDesktopState; } else { desktop.m.kvmExtChanged = null; }
// ###END###{DesktopInband}
desktop.m.frameRateDelay = ((desktopsettings.limitFrameRate == true)?200:0);
desktop.m.noMouseRotate = desktopsettings.noMouseRotate;
desktop.m.ReverseMouseWheel = desktopsettings.reverseMouseWheel;
// ###BEGIN###{Mode-MeshCentral2}
desktop.tlsv1only = amtstack.wsman.comm.tlsv1only;
desktop.Start(currentMeshNode._id, 16994, '*', '*', 0);
// ###END###{Mode-MeshCentral2}
// ###BEGIN###{ComputerSelector}
// ###BEGIN###{Mode-NodeWebkit}
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
desktop.Start(currentcomputer._id, 0, 'x', 'x', 0, wsstack.comm, meshCentralServer);
} else {
// ###END###{MeshServerConnect}
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
if ((amtsysstate) && (amtsysstate['IPS_ScreenConfigurationService'] != null) && ((amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState'] & 1) != 0)) {
amtstack.IPS_ScreenConfigurationService_SetSessionState(Q('id_DeskSB').checked == true ? 1 : 0, 3, function (stack, name, responses, status) {
if (status != 200) { Q('id_DeskSB').checked = false; } // Screen blanking command is not supported, uncheck the screen blanking
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
});
} else {
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
}
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
desktop.tlsv1only = amtstack.wsman.comm.tlsv1only;
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
if ((amtsysstate) && (amtsysstate['IPS_ScreenConfigurationService'] != null) && ((amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState'] & 1) != 0)) {
amtstack.IPS_ScreenConfigurationService_SetSessionState(Q('id_DeskSB').checked == true ? 1 : 0, 3, function (stack, name, responses, status) {
if (status != 200) { Q('id_DeskSB').checked = false; } // Screen blanking command is not supported, uncheck the screen blanking
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
});
} else {
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
}
// ###END###{!Mode-NodeWebkit}
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-Firmware}
desktop.Start();
// ###END###{Mode-Firmware}
// ###BEGIN###{Desktop-Multi}
PullDesktopDisplayInfo();
if (!urlvars['norefresh']) { desktopPollTimer = setInterval(PullDesktopDisplayInfo, 5000); }
// ###END###{Desktop-Multi}
} else {
desktop.Stop();
// ###BEGIN###{Desktop-Multi}
clearInterval(desktopPollTimer);
desktopPollTimer = null;
PullDesktopDisplayInfo();
// ###END###{Desktop-Multi}
// ###BEGIN###{DesktopInband}
webRtcDesktopReset();
// ###END###{DesktopInband}
}
}
// ###BEGIN###{Desktop-Multi}
function PullDesktopDisplayInfo() {
if ((amtversion > 7) && (desktop.State > 0)) { amtstack.BatchEnum('', ['*IPS_ScreenSettingData', '*IPS_KVMRedirectionSettingData'], ProcessDesktopDisplayInfo); } else { desktopScreenInfo = null; Q('id_DeskScreenSelector').innerHTML = '' }
}
// Update the currently active displays
function ProcessDesktopDisplayInfo(stack, name, responses, status) {
if (status != 200) { desktopScreenInfo = null; return; }
desktopScreenInfo = responses['IPS_ScreenSettingData'].responses.Body;
desktopScreenInfo.KVMRSD = responses['IPS_KVMRedirectionSettingData'].responses.Body;
UpdateDesktopDisplayInfo();
}
// Update screen icons
function UpdateDesktopDisplayInfo() {
var buttons = '', activeScreens = 0;
for (var i = 0; i < 3; i++) { if (desktopScreenInfo['IsActive'][i] == true) { activeScreens++; buttons += '<input type="button" ' + ((i == desktopScreenInfo.KVMRSD['DefaultScreen'])?'style="background-color:DodgerBlue"':'') + ' value="' + (i + 1) + '" title="Switch to screen ' + (i + 1) + '" onkeypress="return false" onkeydown="return false" onclick="desktopSwitchScreen(' + i + ')">&nbsp;'; } }
if (activeScreens > 1) { Q('id_DeskScreenSelector').innerHTML = buttons + '&nbsp;'; } else { Q('id_DeskScreenSelector').innerHTML = ''; }
}
// Request switch to a different desktop
function desktopSwitchScreen(x) {
var k = Clone(desktopScreenInfo.KVMRSD); k['DefaultScreen'] = x; amtstack.Put('IPS_KVMRedirectionSettingData', k, desktopSwitchScreenEx);
}
// Response to request for a different desktop
function desktopSwitchScreenEx(stack, name, responses, status) {
if (status == 200) { desktopScreenInfo.KVMRSD = responses.Body; UpdateDesktopDisplayInfo(); }
}
// ###END###{Desktop-Multi}
function onDesktopStateChange(desktop, state) {
var reconnect = false;
//console.log("onDesktopStateChange: " + state);
idx_connectbutton1.value = (state == 0) ? "잇다" : "분리";
var input = ((state == 3) && !urlvars['kvmviewonly']);
QE('id_DeskCAD', input);
QE('deskkeys', input);
QE('DeskWD', input);
// ###BEGIN###{DesktopType}
QE('id_DeskType', input);
// ###END###{DesktopType}
// ###BEGIN###{DesktopClipboard}
QE('id_DeskKvmClipButton', state == 3);
// ###END###{DesktopClipboard}
switch (state) {
case 0:
// ###BEGIN###{DesktopRecorder}
if (desktop.m.recordedData != null) { deskRecordSession(); }
// ###END###{DesktopRecorder}
// desktop.m.ResetScreen();
// ###BEGIN###{DesktopInband}
webRtcDesktopReset();
// ###END###{DesktopInband}
// ###BEGIN###{Mode-MeshCentral2}
QV('deskRecordIcon', false);
// ###END###{Mode-MeshCentral2}
if (desktop.disconnectCode == 2) { // BUSY
messagebox("원격 데스크탑", "The remote device is busy, a session may already be open.");
} else if (desktop.disconnectCode == 3) { // UNSUPPORTED
messagebox("원격 데스크탑", "The device indicated that this type of connection of not supported.");
} else if (desktop.disconnectCode == 50000) { // KVM-Disconnect
messagebox("원격 데스크탑", "KVM disconnection, this may indicate that Intel AMT is unable to capture the display (Try RLE8 encoding), or unsupported GPU.");
} else if (desktop.disconnectCode == 50001) { // Intel AMT disconnect, try to connect again if connection was more than 5 seconds long.
reconnect = (desktop.connectTime != null) && ((desktop.connectTime + 5000) < Date.now());
//console.log(desktop.disconnectCode, reconnect);
} else if (desktop.disconnectCode == 50002) { // KVM-BufferOverflow
messagebox("원격 데스크탑", "KVM disconnection that may be due to the display size and resolution being too large for the Intel AMT KVM buffer. Try RLE8 encoding or reducing the display resolution.");
}
break;
case 3:
// ###BEGIN###{DesktopInband}
if (amtversion >= 12) { desktop.m.sendKvmData(JSON.stringify({ action: 'present', ver: 1 })); } // If this is Intel AMT 12 or higher, send the soft-KVM presence indicator.
// ###END###{DesktopInband}
// ###BEGIN###{Mode-MeshCentral2}
if (desktop.serverIsRecording == true) { QV('deskRecordIcon', true); }
// ###END###{Mode-MeshCentral2}
break;
}
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
center();
updateDesktopState();
if (reconnect) { setTimeout(connectDesktop, 200); }
}
// Update remote desktop status
function updateDesktopState() {
// ###BEGIN###{DesktopInband}
var x = '';
if (desktop.State == 3) {
if ((webRtcDesktop) && (webRtcDesktop.webRtcActive == true)) {
x = "소프트 -KVM";
} else {
if (desktop.m && desktop.m.kvmExt) {
if (desktop.m.kvmExt.decimationState == 1) { x += ", Downscaled" }
if (desktop.m.kvmExt.compression == 1) { x += ", Compressed" }
}
}
}
Q('id_deskstatus').textContent = StatusStrs[desktop.State] + x;
// ###END###{DesktopInband}
// ###BEGIN###{!DesktopInband}
Q('id_deskstatus').textContent = StatusStrs[desktop.State];
// ###END###{!DesktopInband}
}
function showDesktopSettings() {
if (xxdialogMode) return;
applyDesktopSettings();
setDialogMode(7, "원격 데스크톱 설정", 3, showDesktopSettingsChanged);
}
function showDesktopSettingsChanged() {
desktopsettings.encflags = parseInt(idx_d7desktopmode.value);
// ###BEGIN###{DesktopFocus}
desktopsettings.showfocus = d7showfocus.checked;
if ((amtversion > 15) && (amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0)) { desktopsettings.decimationMode = parseInt(d7decimation.value); }
// ###END###{DesktopFocus}
desktopsettings.showmouse = d7showcursor.checked;
desktopsettings.showcad = d7showcad.checked;
desktopsettings.limitFrameRate = d7limitFrameRate.checked;
desktopsettings.noMouseRotate = d7noMouseRotate.checked;
desktopsettings.reverseMouseWheel = d7kvmrmw.checked;
// ###BEGIN###{DesktopInband}
desktopsettings.quality = d7bitmapquality.value;
desktopsettings.scaling = d7bitmapscaling.value;
// ###END###{DesktopInband}
try { localStorage.setItem('desktopsettings', JSON.stringify(desktopsettings)); } catch (ex) { }
applyDesktopSettings();
// ###BEGIN###{DesktopFocus}
if (desktopsettings.showfocus == false) { desktop.m.focusmode = 0; idx_deskFocusBtn.value = "모든 초점"; }
// ###END###{DesktopFocus}
desktop.m.frameRateDelay = (desktopsettings.limitFrameRate == true)?200:0;
if (desktop.State != 0) { desktop.disconnectCode = 0; desktop.Stop(); setTimeout(connectDesktop, 800); }
}
function applyDesktopSettings() {
// ###BEGIN###{DesktopFocus}
d7showfocus.checked = desktopsettings.showfocus;
// ###END###{DesktopFocus}
d7decimation.value = desktopsettings.decimationMode;
d7showcursor.checked = desktopsettings.showmouse;
d7showcad.checked = desktopsettings.showcad;
d7limitFrameRate.checked = desktopsettings.limitFrameRate;
d7noMouseRotate.checked = desktopsettings.noMouseRotate;
d7kvmrmw.checked = desktopsettings.reverseMouseWheel;
// ###BEGIN###{DesktopInband}
if (desktopsettings.quality) { d7bitmapquality.value = desktopsettings.quality; }
if (desktopsettings.scaling) { d7bitmapscaling.value = desktopsettings.scaling; }
QV('d7softkvmsettings', amtversion >= 12);
// ###END###{DesktopInband}
var encflags = desktopsettings.encflags; // Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib, 16 = 4bit Color
var x = '';
if ((amtversion > 15) && (amtsysstate != null) && (amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) {
if (!amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) { encflags = encflags & 11; } // Remove grayscale and lowcolor
if (!amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']) { encflags = encflags & 23; } // Remove zlib
if (amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) {
x += '<option id="d7exm1" value=21>' + "RLE4G, 16 Grays" + '</option>';
x += '<option id="d7exm2" value=5>' + "RLE8G, 256 Grays" + '</option>';
}
x += '<option value=1>' + "RLE8, 256 Colors" + '</option>';
x += '<option value=3>' + "RLE16, 64k Colors" + '</option>';
if (amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']) {
if (amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) {
x += '<option id="d7exm3" value=29>' + "ZRLE4G, Compressed Gray" + '</option>';
x += '<option id="d7exm4" value=13>' + "ZRLE8G, Compressed Gray" + '</option>';
}
x += '<option id="d7exm5" value=9>' + "ZRLE8, Compressed Color" + '</option>';
x += '<option id="d7exm6" value=11>' + "ZRLE16, Compressed Color" + '</option>';
}
QV('d7decimationspan', amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0);
} else {
encflags = encflags & 3; // Remove gray & zlib flags (4 and 8), keep 1 & 2
x += '<option value=1>' + "RLE8, 256 Colors" + '</option>';
x += '<option value=3>' + "RLE16, 64k Colors" + '</option>';
QV('d7decimationspan', false);
}
x += '<option value=0>' + "RAW8, 256 Colors" + '</option>';
x += '<option value=2>' + "RAW16, 16k Colors" + '</option>';
QH('idx_d7desktopmode', x);
idx_d7desktopmode.value = encflags;
// ###BEGIN###{DesktopFocus}
QV('idx_deskFocusBtn', desktopsettings.showfocus);
// ###END###{DesktopFocus}
QV('id_DeskCAD', desktopsettings.showcad);
}
var fullscreen = false;
var fullscreenonly = false;
function deskToggleFull(kvmonly) {
if (xxdialogMode) return;
if (fullscreenonly == true) {
// We are in full screen only mode
console.log('deskToggleFull1', fullscreenonly, urlvars['kvmonly']);
fullscreenonly = false;
if (urlvars['kvmonly'] == 1) {
//console.log('deskToggleFull2');
// It was initiated by a command line switch, exit now.
// ###BEGIN###{Mode-NodeWebkit}
require('nw.gui').Window.get().close();
// ###END###{Mode-NodeWebkit}
} else {
// It was initiated by a menu selection, disconnect now.
disconnect();
}
return;
}
fullscreenonly = kvmonly;
fullscreen = !fullscreen;
// ###BEGIN###{!Look-MeshCentral}
QV('id_topheader', !fullscreen);
// ###END###{!Look-MeshCentral}
QV('id_leftbar', !fullscreen);
QV('id_rdheader', !fullscreen);
QV('idx_deskFullBtn', !fullscreen);
QV('idx_deskFullBtn2', fullscreen);
if (fullscreen) {
// ###BEGIN###{!Look-MeshCentral}
QS('id_mainarea').top = 0;
// ###END###{!Look-MeshCentral}
QS('id_mainarea').left = 0;
QS('id_mainarea_pad').padding = 0;
} else {
// ###BEGIN###{!Look-MeshCentral}
// ###BEGIN###{!Look-ISDU}
QS('id_mainarea').top = '69px';
// ###END###{!Look-ISDU}
// ###BEGIN###{Look-ISDU}
QS('id_mainarea').top = '94px';
// ###END###{Look-ISDU}
// ###END###{!Look-MeshCentral}
QS('id_mainarea').left = '156px';
QS('id_mainarea_pad').padding = '8px';
}
center();
}
// ###BEGIN###{DesktopFocus}
function deskToggleFocus() {
desktop.m.focusmode = (desktop.m.focusmode + 64) % 192;
Q('idx_deskFocusBtn').value = ["모든 초점", "작은 초점", "큰 초점"][desktop.m.focusmode / 64];
}
// ###END###{DesktopFocus}
// ###BEGIN###{DesktopType}
// Remote desktop typing
function deskShowTypeDialog() {
if (xxdialogMode || desktop.State != 3) return;
Q('id_DeskType').blur();
var x = '<div>' + "텍스트를 입력하고 확인을 클릭하여 미국 영어 키보드를 사용하여 원격으로 입력하십시오. 계속하기 전에 원격 커서를 올바른 위치에 놓으십시오." + '<div>';
x += '<textarea id=d2typeText style="margin-top:5px;width:100%;height:184px;resize:none" maxlength=2000></textarea>';
setDialogMode(11, "원격 키보드 입력", 3, showDeskTypeEx, x);
Q('d2typeText').focus();
}
var AmtDeskTypeTimer = null;
var AmtDeskTypeContent = null;
var DeskTypeTranslate = { 39: 222, 42: 106, 43: 107, 44: 188, 45: 189, 46: 190, 47: 191, 59: 186, 61: 187, 91: 219, 92: 220, 93: 221, 96: 192, 191: 111 };
var DeskTypeShiftTranslate = { 33: 49, 34: 222, 35: 51, 36: 52, 37: 53, 38: 55, 40: 57, 41: 48, 58: 186, 60: 188, 62: 190, 63: 191, 64: 50, 94: 54, 95: 189, 106: 56, 107: 187, 123: 219, 124: 220, 125: 221, 126: 192 };
function showDeskTypeEx() {
var txt = Q('d2typeText').value, ltxt = Q('d2typeText').value.toUpperCase(), x = [], shift = false;
//if (desktop.contype == 2) {
// Intel AMT
for (var i in txt) { var a = txt.charCodeAt(i); x.push([a, 1], [a, 0]); }
AmtDeskTypeContent = x;
AmtDeskTypeTimer = setInterval(function () {
var key = AmtDeskTypeContent.shift();
if (desktop) { desktop.m.sendkey(key[0], key[1]); }
if ((desktop == null) || (AmtDeskTypeContent.length == 0)) { clearInterval(AmtDeskTypeTimer); AmtDeskTypeContent = null; }
}, 10);
/*
} else {
// MeshAgent
for (var i in txt) {
var a = txt.charCodeAt(i), b = ltxt.charCodeAt(i);
if (((a >= 65) && (a <= 90)) || ((a >= 97) && (a <= 122))) {
if ((a == b) && (shift == false)) { x.push([desktop.m.KeyAction.DOWN, 16]); shift = true; } // LShift down
if ((a != b) && (shift == true)) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // LShift up
} else if ((a >= 48) && (a <= 57)) {
if (shift == true) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // Shift up
} else if (DeskTypeTranslate[a]) {
if (shift == true) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // Shift up
b = DeskTypeTranslate[a];
} else if (DeskTypeShiftTranslate[a]) {
if (shift == false) { x.push([desktop.m.KeyAction.DOWN, 16]); shift = true; } // LShift down
b = DeskTypeShiftTranslate[a];
}
x.push([desktop.m.KeyAction.DOWN, b], [desktop.m.KeyAction.UP, b]);
}
if (shift == true) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // Shift up
desktop.m.SendKeyMsgKC(x);
}
*/
}
// ###END###{DesktopType}
// Send CTRL-ALT-DEL
function sendCAD() { if (!Q('id_DeskVO').checked) { desktop.m.sendcad(); } }
// Special keys
var deskkeysset = {
0: [[0xffe7, 1], [0xffe7, 0]], // Win
1: [[0xffe7, 1], [0xff54, 1], [0xff54, 0], [0xffe7, 0]], // Win+Down
2: [[0xffe7, 1], [0xff52, 1], [0xff52, 0], [0xffe7, 0]], // Win+Up
3: [[0xffe7, 1], [0x6c, 1], [0x6c, 0], [0xffe7, 0]], // Win+L
4: [[0xffe7, 1], [0x6d, 1], [0x6d, 0], [0xffe7, 0]], // Win+M
5: [[0xffe1, 1], [0xffe7, 1], [0x6d, 1], [0x6d, 0], [0xffe7, 0], [0xffe1, 0]], // Shift+Win+M
6: [[0xffbe, 1], [0xffbe, 0]], // F1
7: [[0xffbf, 1], [0xffbf, 0]], // F2
8: [[0xffc0, 1], [0xffc0, 0]], // F3
9: [[0xffc1, 1], [0xffc1, 0]], // F4
10: [[0xffc2, 1], [0xffc2, 0]], // F5
11: [[0xffc3, 1], [0xffc3, 0]], // F6
12: [[0xffc4, 1], [0xffc4, 0]], // F7
13: [[0xffc5, 1], [0xffc5, 0]], // F8
14: [[0xffc6, 1], [0xffc6, 0]], // F9
15: [[0xffc7, 1], [0xffc7, 0]], // F10
16: [[0xffc8, 1], [0xffc8, 0]], // F11
17: [[0xffc9, 1], [0xffc9, 0]], // F12
//18: [[0xffe1, 1], [0xffe9, 1], [65, 1], [65, 0], [0xffe9, 0], [0xffe1, 0]] // Left-Shift + Left-Alt + Print Screen
19: [[0xffe9, 1], [0xff09, 1], [0xff09, 0], [0xffe9, 0]], // Alt-Tab
20: [[0xffe7, 1], [0x72, 1], [0x72, 0], [0xffe7, 0]], // WIN+R
21: [[0xffe9, 1], [0xffc1, 1], [0xffc1, 0], [0xffe9, 0]], // Alt-F4
22: [[0xffe3, 1], [0x77, 1], [0x77, 0], [0xffe3, 0]], // Ctrl-W
23: [[0xffe7, 1], [0xff51, 1], [0xff51, 0], [0xffe7, 0]], // WIN+Left
24: [[0xffe7, 1], [0xff53, 1], [0xff53, 0], [0xffe7, 0]], // Win+Right
25: [[0xff0d, 1], [0xff0d, 0]] // Enter
}
// Send special keys to the remote side.
function deskSendKeys() {
if (Q('id_DeskVO').checked) return;
var ks = Q('deskkeys').value;
if (ks != null && deskkeysset[ks] != null && desktop.State != 0) {
for (var i = 0; i < deskkeysset[ks].length; i++) {
desktop.m.sendkey(deskkeysset[ks][i][0], deskkeysset[ks][i][1]);
}
}
}
// ###BEGIN###{DesktopClipboard}
// Toggle desktop session recording
function deskClipboard() {
if (xxdialogMode || (desktop == null) || (desktop.State != 3)) return;
var x = '';
x += "인텔 &reg; AMT 클립 보드로 보낼 텍스트를 입력하십시오." + '<br />';
x += '<select id=kvmClipEncoding style=width:100%;margin-top:8px><option value=0>' + "Text Encoding" + '<option value=1>' + "Hex Encoding" + '</select>';
x += '<textarea id=kvmClipText style=width:100%;height:120px;resize:none;margin-top:8px />';
setDialogMode(11, "클립 보드", 3, deskClipboardEx, x);
focusTextBox('kvmClipText');
if (xxKvmClipEnc != null) { Q('kvmClipEncoding').value = xxKvmClipEnc; }
if (xxKvmClipVal != null) { Q('kvmClipText').value = xxKvmClipVal; }
}
function deskClipboardEx() {
xxKvmClipEnc = Q('kvmClipEncoding').value;
xxKvmClipVal = Q('kvmClipText').value;
if (Q('kvmClipEncoding').value == 0) {
desktop.m.sendClipboardData(Q('kvmClipText').value.split('\\0').join('\0')); // Text encoded input
} else {
desktop.m.sendClipboardData(hex2rstr(Q('kvmClipText').value)); // Hex encoded input
}
}
// ###END###{DesktopClipboard}
// ###BEGIN###{FileSaver}
// ###BEGIN###{DesktopRecorder}
// Toggle desktop session recording
function deskRecordSession() {
if ((desktop == null) || (urlvars && urlvars['norecord'])) return;
if (desktop.m.recordedData == null) {
// Start recording
if ((desktop.State === 3) && (desktop.m.StartRecording())) { Q('DeskRecordButton').classList.remove('videoIcon'); Q('DeskRecordButton').classList.add('videoIconRed'); }
} else {
// Stop recording
Q('DeskRecordButton').classList.remove('videoIconRed');
Q('DeskRecordButton').classList.add('videoIcon');
var d = new Date(), n = 'AmtDesktopSesion-' + currentcomputer['name'] + '-' + d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
saveAs(data2blob(desktop.m.StopRecording().join('')), n + '.mcrec');
}
}
// ###END###{DesktopRecorder}
// ###END###{FileSaver}
// ###BEGIN###{FileSaver}
// Save the desktop image to file
function deskSaveImage() {
if (xxdialogMode || (desktop.State != 3) || (urlvars && urlvars['norecord'])) return;
var n = 'Desktop', d = new Date();
if (amtsysstate) { n += '-' + amtsysstate['AMT_GeneralSettings'].response['HostName']; }
n += '-' + d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
// ###BEGIN###{!Mode-NodeWebkit}
Q('Desk')['toBlob']( function (blob) { saveAs(blob, n + '.jpg'); } );
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var b64image = document.getElementById('Desk').toDataURL('image/png').split(',')[1];
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file');
chooser.setAttribute('nwsaveas', n + '.png');
chooser.addEventListener('change', function () { console.log('cc'); require('fs').writeFile(this.value, b64image, 'base64', function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
// Send special keys
//function sendSpecialKey() { var k = Q('specialkeylist').value; desktop.m.sendkey(k, 1); desktop.m.sendkey(k, 0); }
// ###BEGIN###{!DesktopInband}
function dmousedown(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mousedown(e); }
function dmouseup(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mouseup(e); }
function dmousemove(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mousemove(e); }
function dmousewheel(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mousewheel(e); }
// ###END###{!DesktopInband}
// ###BEGIN###{DesktopInband}
function dmousedown(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mousedown(e); desktop.m.sendKeepAlive(); } else { desktop.m.mousedown(e); } } }
function dmouseup(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mouseup(e); desktop.m.sendKeepAlive(); } else { desktop.m.mouseup(e); } } }
function dmousemove(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mousemove(e); desktop.m.sendKeepAlive(); } else { desktop.m.mousemove(e); } } }
function dmousewheel(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mousewheel(e); desktop.m.sendKeepAlive(); } else { desktop.m.mousewheel(e); } } }
// ###END###{DesktopInband}
function drotate(x) {
if (xxdialogMode) return;
var r = desktop.m.rotation + x;
desktop.m.setRotation(r);
// ###BEGIN###{DesktopInband}
if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null) && (webRtcDesktop.softdesktop.m != null)) {
webRtcDesktop.softdesktop.m.setRotation(r); }
// ###END###{DesktopInband}
center();
}
// ###BEGIN###{DesktopInbandFiles}
//
// Remote Files
//
var p24files = null;
var p24filetree = null;
var p24targetpath = null;
var p24filetreelocation = [];
function onFilesControlData(data) {
if ((data.length > 0) && (data.charCodeAt(0) != 123)) { p24gotDownloadBinaryData(data); return; }
data = JSON.parse(data);
if (data.action == 'download') { p24gotDownloadCommand(data); return; }
if (data.action == 'upload') { p24gotUploadData(data); return; }
if (data.action == 'pong') { return; }
data.path = data.path.replace(/\//g, '\\');
if ((p24filetree != null) && (data.path == p24filetree.path)) {
// This is an update to the same folder
var checkedNames = p24getCheckedNames();
p24filetree = data;
p24updateFiles(checkedNames);
} else {
// Make both paths use the same seperator not start with /
var x1 = data.path.split('/').join('\\');
var x2 = p24targetpath.split('/').join('\\');
while ((x1.length > 0) && (x1[0] == '\\')) { x1 = x1.substring(1); }
while ((x2.length > 0) && (x2[0] == '\\')) { x2 = x2.substring(1); }
if ((x1 == x2) || ((data.path == '\\') && (p24targetpath == ''))) {
// This is a different folder
p24filetree = data;
p24updateFiles();
}
}
}
function p24getCheckedNames() {
// Save all existing checked boxes
var checkedNames = [], checkboxes = document.getElementsByName('fd');
for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { checkedNames.push(p24filetree.dir[checkboxes[i].value].n) }; }
return checkedNames;
}
//var p24oldlinkpath = null;
function p24updateFiles(checkedNames) {
var html1 = '', html2 = '', displayPath = '<a style=cursor:pointer onclick=p24folderup(0)>' + "뿌리" + '</a>', fullPath = 'Root';
// Work on parsing the file path
var x = p24filetree.path.split('\\');
p24filetreelocation = [];
for (var i in x) { if (x[i] != '') { p24filetreelocation.push(x[i]); } } // Remove empty spaces
for (var i in p24filetreelocation) { displayPath += ' / <a style=cursor:pointer onclick=p24folderup(' + (parseInt(i) + 1) + ')>' + p24filetreelocation[i] + '</a>' } // Setup the path we display
var newlinkpath = p24filetreelocation.join('/');
// Sort the files
var filetreexx = p24sort_files(p24filetree.dir);
// Display all files and folders at this location
for (var i in filetreexx) {
// Figure out the name and shortname
var f = filetreexx[i], name = f.n, shortname;
shortname = name;
if (name.length > 70) { shortname = '<span title="' + EscapeHtml(name) + '">' + EscapeHtml(name.substring(0, 70)) + "..." + '</span>'; } else { shortname = EscapeHtml(name); }
name = EscapeHtml(name);
// Figure out the date
var fdatestr = '';
if (f.d != null) { var fdate = new Date(f.d), fdatestr = (fdate.getMonth() + 1) + '/' + (fdate.getDate()) + '/' + fdate.getFullYear() + ' ' + fdate.toLocaleTimeString() + '&nbsp;'; }
// Figure out the size
var fsize = '';
if (f.s != null) { fsize = getFileSizeStr(f.s); }
var h = '';
if (f.t < 3) {
var right = '', title = '';
h = '<div class=filelist file=999><input file=999 style=float:left name=fd class=fcb type=checkbox onchange=p24setActions() value="' + f.nx + '">&nbsp;<span style=float:right title=\"' + title + '\">' + right + '</span><span><div class=fileIcon' + f.t + '></div><a style=cursor:pointer onclick=p24folderset(\"' + encodeURIComponent(f.nx) + '\")>' + shortname + '</a></span></div>';
} else {
var link = shortname;
if (f.s > 0) { link = '<a rel=\"noreferrer noopener\" target=\"_blank\" style=cursor:pointer onclick=\'p24downloadfile("' + encodeURIComponent(newlinkpath + '/' + name) + '","' + encodeURIComponent(name) + '",' + f.s + ')\'>' + shortname + '</a>'; }
h = '<div class=filelist file=3><input file=3 style=float:left name=fd class=fcb type=checkbox onchange=p24setActions() value="' + f.nx + '">&nbsp;<span class=fsize>' + fdatestr + '</span><span style=float:right>' + fsize + '</span><span><div class=fileIcon' + f.t + '></div>' + link + '</span></div>';
}
if (f.t < 3) { html1 += h; } else { html2 += h; }
}
// Display the files and path
QH('p24files', html1 + html2);
QH('p24currentpath', displayPath);
QE('p24FolderUp', p24filetreelocation.length != 0);
// Re-check all boxes if needed using names
if (checkedNames != null) { var checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkedNames.indexOf(p24filetree.dir[checkboxes[i].value].n) >= 0) { checkboxes[i].checked = true; } } }
// Update the actions buttons
p24setActions();
}
function p24folderset(x) {
p24targetpath = joinPaths(p24filetree.path, p24filetree.dir[x].n).split('\\').join('/');
p24files.sendCtrlMsg(JSON.stringify({ action: 'ls', reqid: 1, path: p24targetpath }));
}
function p24folderup(x) {
if (x == null) { p24filetreelocation.pop(); } else { while (p24filetreelocation.length > x) { p24filetreelocation.pop(); } }
p24targetpath = p24filetreelocation.join('/');
p24files.sendCtrlMsg(JSON.stringify({ action: 'ls', reqid: 1, path: p24targetpath }));
}
var p24sortorder;
function p24sort_filename(a, b) { if (a.ln > b.ln) return (1 * p24sortorder); if (a.ln < b.ln) return (-1 * p24sortorder); return 0; }
function p24sort_timestamp(a, b) { if (a.d > b.d) return (1 * p24sortorder); if (a.d < b.d) return (-1 * p24sortorder); return 0; }
function p24sort_bysize(a, b) { if (a.s == b.s) return p24sort_filename(a, b); return (((a.s - b.s)) * p24sortorder); }
function p24sort_files(files) {
var r = [], sortselection = Q('p24sortdropdown').value;
for (var i in files) { files[i].nx = i; if (files[i].s == null) { files[i].s = 0; } if (files[i].n == null) { files[i].n = i; } files[i].ln = files[i].n.toLowerCase(); r.push(files[i]); }
p24sortorder = 1;
if (sortselection > 3) { p24sortorder = -1; sortselection -= 3; }
if (sortselection == 1) { r.sort(p24sort_filename); }
else if (sortselection == 2) { r.sort(p24sort_bysize); }
else if (sortselection == 3) { r.sort(p24sort_timestamp); }
return r;
}
function p24setActions() {
if (p24filetree == null) {
QE('p24DeleteFileButton', false);
QE('p24NewFolderButton', false);
QE('p24UploadButton', false);
QE('p24RenameFileButton', false);
QE('p24SelectAllButton', false);
Q('p24SelectAllButton').value = "모두 선택";
QE('p24RefreshButton', false);
QE('p24CutButton', false);
QE('p24CopyButton', false);
QE('p24PasteButton', false);
} else {
var cc = p24getFileSelCount(), tc = p24getFileCount(), sfc = p24getFileSelCount(false); // In order: number of entires selected, number of total entries, number of selected entires that are files (not folders)
var winAgent = (webRtcDesktop.platform == 'win32');
QE('p24DeleteFileButton', (cc > 0) && ((p24filetreelocation.length > 0) || (winAgent == false)));
QE('p24NewFolderButton', ((p24filetreelocation.length > 0) || (winAgent == false)));
QE('p24UploadButton', ((p24filetreelocation.length > 0) || (winAgent == false)));
QE('p24RenameFileButton', (cc == 1) && ((p24filetreelocation.length > 0) || (winAgent == false)));
QE('p24SelectAllButton', tc > 0);
Q('p24SelectAllButton').value = (cc > 0 ? "없음을 선택하십시오" : "모두 선택");
QE('p24RefreshButton', true);
QE('p24CutButton', (cc > 0) && (cc == sfc) && ((p24filetreelocation.length > 0) || (winAgent == false)));
QE('p24CopyButton', (cc > 0) && (cc == sfc) && ((p24filetreelocation.length > 0) || (winAgent == false)));
QE('p24PasteButton', ((p24filetreelocation.length > 0) || (winAgent == false)) && ((p24clipboard != null) && (p24clipboard.length > 0)));
}
}
function p24getFileSelCount(includeDirs) { var cc = 0; var checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if ((checkboxes[i].checked) && ((includeDirs != false) || (checkboxes[i].attributes.file.value == "3"))) cc++; } return cc; }
function p24getFileCount() { var cc = 0; var checkboxes = document.getElementsByName('fd'); return checkboxes.length; }
function p24selectallfile() { var nv = (p24getFileSelCount() == 0), checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = nv; } p24setActions(); }
function p24createfolder() { setDialogMode(11, "새 폴더", 3, p24createfolderEx, '<input type=text id=p24renameinput maxlength=64 onkeyup=p24fileNameCheck(event) style=width:100% />'); focusTextBox('p24renameinput'); p24fileNameCheck(); }
function p24createfolderEx() { p24files.sendCtrlMsg(JSON.stringify({ action: 'mkdir', reqid: 1, path: p24filetreelocation.join('/') + '/' + Q('p24renameinput').value })); p24folderup(999); }
function p24deletefile() { var cc = p24getFileSelCount(); setDialogMode(11, "지우다", 3, p24deletefileEx, (cc > 1) ? ('Delete ' + cc + ' selected items?') : ('Delete selected item?')); }
function p24deletefileEx() { var delfiles = [], checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { delfiles.push(p24filetree.dir[checkboxes[i].value].n); } } p24files.sendCtrlMsg(JSON.stringify({ action: 'rm', reqid: 1, path: p24filetreelocation.join('/'), delfiles: delfiles })); p24folderup(999); }
function p24renamefile() { var renamefile, checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { renamefile = p24filetree.dir[checkboxes[i].value].n; } } setDialogMode(11, "이름 바꾸기", 3, p24renamefileEx, '<input type=text id=p24renameinput maxlength=64 onkeyup=p24fileNameCheck(event) style=width:100% value="' + renamefile + '" />', { action: 'rename', path: p24filetreelocation.join('/'), oldname: renamefile }); focusTextBox('p24renameinput'); p24fileNameCheck(); }
function p24renamefileEx(b, t) { t.newname = Q('p24renameinput').value; p24files.sendCtrlMsg(JSON.stringify(t)); p24folderup(999); }
function p24fileNameCheck(e) { var x = isFilenameValid(Q('p24renameinput').value); QE('idx_dlgOkButton', x); if ((x == true) && (e != null) && (e.keyCode == 24)) { dialogclose(1); } }
function p24uploadFile() { setDialogMode(11, "파일 업로드", 3, p24uploadFileEx, '<input type=file name=files id=p24uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p24uploadinput\')" />'); updateUploadDialogOk('p24uploadinput'); }
function p24uploadFileEx() { p24doUploadFiles(Q('p24uploadinput').files); }
function updateUploadDialogOk(x) { QE('idx_dlgOkButton', Q(x).value != ''); }
var p24clipboard = null, p24clipboardFolder = null, p24clipboardCut = 0;
function p24copyFile(cut) { var checkboxes = document.getElementsByName('fd'); p24clipboard = []; p24clipboardCut = cut, p24clipboardFolder = p24targetpath; for (var i = 0; i < checkboxes.length; i++) { if ((checkboxes[i].checked) && (checkboxes[i].attributes.file.value == "3")) { p24clipboard.push(p24filetree.dir[checkboxes[i].value].n); } } p24updateClipview(); }
function p24pasteFile() { var x = ''; if ((p24clipboard != null) && (p24clipboard.length > 0)) { x = 'Confim ' + (p24clipboardCut == 0 ? 'copy' : 'move') + ' of ' + p24clipboard.length + ' entrie' + ((p24clipboard.length > 1) ? 's' : '') + ' to this location?' } setDialogMode(11, "풀", 3, p24pasteFileEx, x); }
function p24pasteFileEx() { p24files.sendCtrlMsg(JSON.stringify({ action: (p24clipboardCut == 0 ? 'copy' : 'move'), reqid: 1, scpath: p24clipboardFolder, dspath: p24targetpath, names: p24clipboard })); p24folderup(999); if (p24clipboardCut == 1) { p24clipboard = null, p24clipboardFolder = null, p24clipboardCut = 0; p24updateClipview(); } }
function p24updateClipview() { var x = ''; if ((p24clipboard != null) && (p24clipboard.length > 0)) { x = 'Holding ' + p24clipboard.length + ' entrie' + ((p24clipboard.length > 1) ? 's' : '') + ' for ' + (p24clipboardCut == 0 ? 'copy' : 'move') + ', <a onclick=p24clearClip() style=cursor:pointer>Clear</a>.' } QH('p24bottomstatus', x); p24setActions(); }
function p24clearClip() { p24clipboard = null; p24clipboardFolder = null; p24clipboardCut = 0; p24updateClipview(); }
function p24fileDragDrop(e) {
haltEvent(e);
QV('p24bigfail', false);
QV('p24bigok', false);
if (e.dataTransfer == null || e.dataTransfer.files.length == 0 || p24filetree == null) return;
if ((p24filetreelocation.length == 0) && (webRtcDesktop.platform == 'win32')) return // If this is Windows, do not accept files in the root folder
p24doUploadFiles(e.dataTransfer.files);
}
var p24dragtimer = null;
function p24fileDragOver(e) {
haltEvent(e);
if (p24dragtimer != null) { clearTimeout(p24dragtimer); p24dragtimer = null; }
var ac = (p24filetree != null); // Set to true if we can accept the file
if ((p24filetreelocation.length == 0) && (webRtcDesktop.platform == 'win32')) { ac = false; } // If this is Windows, do not accept files in the root folder
QV('p24bigok', ac);
QV('p24bigfail', !ac);
}
function p24fileDragLeave(e) {
haltEvent(e);
if (e.target.id != "p24filetable") {
QV('p24bigfail', false);
QV('p24bigok', false);
} else {
p24dragtimer = setTimeout(function () { QV('p24bigfail', false); QV('p24bigok', false); p24dragtimer = null; }, 200);
}
}
function getFileSizeStr(size) { if (size == 1) return "1 바이트"; return format("{0} 바이트", size); }
function joinPaths() { var x = []; for (var i in arguments) { var w = arguments[i]; if ((w != null) && (w != '')) { while (w.endsWith('/') || w.endsWith('\\')) { w = w.substring(0, w.length - 1); } while (w.startsWith('/') || w.startsWith('\\')) { w = w.substring(1); } x.push(w); } } return x.join('/'); }
var isFilenameValid = (function () { var x1 = /^[^\\/:\*\?"<>\|]+$/, x2 = /^\./, x3 = /^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; return function isFilenameValid(fname) { return x1.test(fname) && !x2.test(fname) && !x3.test(fname) && (fname[0] != '.'); } })();
function focusTextBox(x) { setTimeout(function () { Q(x).selectionStart = Q(x).selectionEnd = 65535; Q(x).focus(); }, 0); }
//
// FILES DOWNLOAD
//
var downloadFile; // Global state for file download
// Called by the html page to start a download, arguments are: path, file name and file size.
function p24downloadfile(x, y, z) {
if (xxdialogMode || downloadFile || !p24files) return;
downloadFile = { path: decodeURIComponent(x), file: decodeURIComponent(y), size: z, tsize: 0, data: '', state: 0, id: Math.random() }
//console.log('p24downloadFileCancel', downloadFile);
p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'start', id: downloadFile.id, path: downloadFile.path }));
setDialogMode(11, "파일 다운로드", 10, p24downloadFileCancel, '<div>' + downloadFile.file + '</div><br /><progress id=d2progressBar style=width:100% value=0 max=' + z + ' />');
}
// Called by the html page to cancel the download
function p24downloadFileCancel() { if (downloadFile != null) { setDialogMode(0); if (p24files != null) { p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'cancel', id: downloadFile.id })); } downloadFile = null; } }
// Called by the transport when download control command is received
function p24gotDownloadCommand(cmd) {
//console.log('p24gotDownloadCommand', cmd);
if ((downloadFile == null) || (cmd.id != downloadFile.id)) return;
if (cmd.sub == 'start') { downloadFile.state = 1; p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'startack', id: downloadFile.id })); }
else if (cmd.sub == 'cancel') { downloadFile = null; setDialogMode(0); }
}
// Called by the transport when binary data is received
function p24gotDownloadBinaryData(data) {
if (!downloadFile || downloadFile.state == 0) return;
try { data = atob(data); } catch (ex) { return; }
if ((data == null) || (data.length < 4)) return;
if (data.length > 4) {
downloadFile.tsize += data.length - 4; // Add to the total bytes received
downloadFile.data += data.substring(4); // Append the data, decode Base64
Q('d2progressBar').value = downloadFile.tsize; // Change the progress bar
}
if ((ReadInt(data, 0) & 1) != 0) { // Check end flag
saveAs(data2blob(downloadFile.data), downloadFile.file); downloadFile = null; setDialogMode(0); // Save the file
} else {
p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'ack', id: downloadFile.id })); // Send the ACK
}
}
//
// FILES UPLOAD
//
var uploadFile;
function p24doUploadFiles(files) {
if (xxdialogMode) return;
uploadFile = { xpath: p24filetreelocation.join('/'), xfiles: files, xfilePtr: -1 };
setDialogMode(11, "파일 업로드", 10, p24uploadFileCancel, '<div id=p24dfileName>' + "설정..." + '</div><br /><progress id=d2progressBar style=width:100% value=0 max=0 />', 99);
p24uploadNextFile();
}
// Push the next file
function p24uploadNextFile() {
uploadFile.xfilePtr++;
if (uploadFile.xfiles.length > uploadFile.xfilePtr) {
uploadFile.xptr = 0;
var file = uploadFile.xfiles[uploadFile.xfilePtr];
QH('p24dfileName', file.name);
Q('d2progressBar').max = file.size;
Q('d2progressBar').value = 0;
uploadFile.xreader = new FileReader();
uploadFile.xreader.onload = function () {
uploadFile.xdata = uploadFile.xreader.result;
p24files.sendCtrlMsg(JSON.stringify({ action: 'upload', sub: 'start', reqid: uploadFile.xfilePtr, path: uploadFile.xpath, name: file.name, size: uploadFile.xdata.byteLength }));
};
uploadFile.xreader.onerror = function () { p24uploadNextFile(); }
uploadFile.xreader.readAsArrayBuffer(file);
} else {
p24uploadFileCancel();
p24folderup(9999); // Refresh the file view
}
}
// Used to cancel the entire transfer, close the upload dialog box
function p24uploadFileCancel(button, tag) {
if (uploadFile != null) {
uploadFile = null;
setDialogMode(0);
if ((tag == 99) && (p24files != null)) { p24files.sendCtrlMsg(JSON.stringify({ action: 'upload', sub: 'cancel' })); }
}
}
// Receive upload ack from the mesh agent, use this to keep sending more data
function p24gotUploadData(cmd) {
if ((uploadFile == null) || (parseInt(uploadFile.xfilePtr) != parseInt(cmd.reqid))) { return; }
if (cmd.sub == 'start') {
p24uploadNextPart(false);
for (var i = 0; i < 8; i++) { p24uploadNextPart(true); } // Send 8 more blocks of 4 k to full the websocket.
} else if (cmd.sub == 'ack') {
p24uploadNextPart(false);
} else if (cmd.sub == 'error') {
p24uploadFileCancel();
}
}
function ab2str(buf) { return String.fromCharCode.apply(null, new Uint8Array(buf)); }
// Push the next part of the file into the websocket. If dataPriming is true, push more data only if it's not the last block of the file.
function p24uploadNextPart(dataPriming) {
var data = uploadFile.xdata, start = uploadFile.xptr, end = uploadFile.xptr + 4096;
if (end > data.byteLength) { if (dataPriming == true) { return; } end = data.byteLength; }
if (start == data.byteLength) {
p24uploadNextFile();
} else {
p24files.sendCtrlMsg(btoa(IntToStr((end != data.byteLength) ? 0x01000000 : 0x01000001) + ab2str(data.slice(start, end))));
uploadFile.xptr = end;
Q('d2progressBar').value = end;
}
}
// ###END###{DesktopInbandFiles}
// ###END###{Desktop}
//
// Remote IDER
//
// ###BEGIN###{IDER}
var ider;
var iderCodeBlock;
var iderTimer;
// ###BEGIN###{IDER-IMRSDK}
function iderStartIMR() {
// Setup the IDER session (NodeJS with IMRSDK.dll)
iderStop();
ider = CreateAmtRemoteIderIMR();
if (ider == null) return;
ider.digestRealmMatch = wsstack.comm.digestRealm;
ider.onStateChanged = onIderStateChange;
ider.m.onDialogPrompt = onIderDialogPrompt;
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
ider.m.Start(currentcomputer._id, 16992, 'x', 'x', 0, wsstack.comm, meshCentralServer);
} else {
// ###END###{MeshServerConnect}
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
ider.m.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], amtstack.wsman.comm.xtlsCertificate, wsstack.comm.xtlsoptions);
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
QV('IDERDiskMapButton', false); // Hide the disk heat map button since it's not supported.
}
function onIderSourceChange() {
var sel = Q('storagesourceoption').value;
QV('iderisofile', (sel & 1) == 0);
QV('iderimgfile', (sel & 2) == 0);
QV('iderisodrive', (sel & 1) != 0);
QV('iderimgdrive', (sel & 2) != 0);
}
// ###END###{IDER-IMRSDK}
function iderStart(e) {
if (xxdialogMode) return;
// ###BEGIN###{IDER-IMRSDK}
if ((e.shiftKey != true) && (require('os').platform() == 'win32')) { iderStartIMR(); return; }
// ###END###{IDER-IMRSDK}
// Setup the IDER session (WebSocket)
var x = '<div>' + "인텔 &reg; AMT 컴퓨터에 디스크 이미지 마운트-실험용." + '</div><br />';
x += '<div style=height:26px><input id=floppyImageInput type=file style=float:right;width:250px accept=".img"><div>' + NoBreak("플로피 (.img)") + '</div></div>';
x += '<div style=height:26px><input id=cdromImageInput type=file style=float:right;width:250px accept=".iso"><div>' + NoBreak("CDROM (.iso)") + '</div></div>';
x += '<div style=height:26px><select id=iderStartType style=float:right;width:250px><option value=0>' + "다음 부팅시" + '<option value=1>' + "우아한" + '<option value=2>' + "즉시" + '</select><div>' + "세션 시작" + '</div></div>';
setDialogMode(11, "스토리지 리디렉션", 3, iderStart2, x);
var iderurl = null;
try { iderurl = localStorage.getItem('iderurl'); } catch (ex) { }
if (iderurl) { Q('storageserverurl').value = iderurl.substring(1, iderurl.length - 1); }
}
function iderStart2() {
// Check the files
if ((Q('floppyImageInput').files.length != 1) && (Q('cdromImageInput').files.length != 1)) { messagebox("스토리지 리디렉션 오류", "하나 이상의 디스크 이미지 파일을 선택해야합니다."); return; }
if ((Q('floppyImageInput').files.length == 1) && ((Q('floppyImageInput').files[0].size % 512) != 0)) { messagebox("스토리지 리디렉션 오류", "잘못된 .img 파일입니다."); return; }
if ((Q('cdromImageInput').files.length == 1) && ((Q('cdromImageInput').files[0].size % 2048) != 0)) { messagebox("스토리지 리디렉션 오류", "잘못된 .iso 파일입니다."); return; }
// Fetch the files
var floppy = null, cdrom = null;
if (Q('floppyImageInput').files.length == 1) { floppy = Q('floppyImageInput').files[0]; }
if (Q('cdromImageInput').files.length == 1) { cdrom = Q('cdromImageInput').files[0]; }
if ((floppy != null) || (cdrom != null)) { iderStart3(floppy, cdrom, Q('iderStartType').value); }
}
function iderStart3(floppy, cdrom, iderStart) {
// Setup the IDER session
iderStop();
ider = CreateAmtRedirect(CreateAmtRemoteIder());
ider.onStateChanged = onIderStateChange;
ider.m.floppy = floppy;
ider.m.cdrom = cdrom;
ider.m.iderStart = iderStart;
// ###BEGIN###{ComputerSelector}
ider.digestRealmMatch = wsstack.comm.digestRealm;
// ###END###{ComputerSelector}
// ###BEGIN###{IDERStats}
ider.m.sectorStats = iderSectorStats;
// ###END###{IDERStats}
// ###BEGIN###{Mode-MeshCentral2}
ider.tlsv1only = amtstack.wsman.comm.tlsv1only;
ider.Start(currentMeshNode._id, 16994, '*', '*', 0);
// ###END###{Mode-MeshCentral2}
// ###BEGIN###{!Mode-MeshCentral2}
// ###BEGIN###{Mode-Firmware}
ider.Start();
// ###END###{Mode-Firmware}
// ###BEGIN###{!Mode-Firmware}
ider.tlsv1only = amtstack.wsman.comm.tlsv1only;
// ###BEGIN###{MeshServerConnect}
if (meshCentralServer != null) {
desktop.Start(currentcomputer._id, 0, 'x', 'x', 0, wsstack.comm, meshCentralServer);
} else {
// ###END###{MeshServerConnect}
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
// ###BEGIN###{!Mode-NodeWebkit}
ider.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
ider.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{MeshServerConnect}
}
// ###END###{MeshServerConnect}
// ###END###{!Mode-Firmware}
// ###END###{!Mode-MeshCentral2}
QV('IDERDiskMapButton', true); // Show the disk heat map button since it is supported.
}
function iderStop() {
// Stop the IDER session
if (ider) { ider.m.Stop(); ider.onStateChanged = null; ider.m.onDialogPrompt = null; delete ider; }
if (iderTimer) { clearInterval(iderTimer); delete iderTimer; }
// ###BEGIN###{IDERStats}
iderToggleDiskMap(false);
// ###END###{IDERStats}
}
function onIderStateChange(stack, state) {
QE('idx_IDER1', state != 3);
QE('idx_IDER2', state != 3);
// ###BEGIN###{Mode-MeshCentral2}
QE('idx_SIDER1', state != 3);
QE('idx_SIDER2', state != 3);
// ###END###{Mode-MeshCentral2}
QV('id_iderstatus', state == 3); center();
if (state == 3) {
if (!urlvars['norefresh']) { iderTimer = setInterval(onIderTimer, 500); }
onIderTimer();
} else {
if (iderTimer) { clearInterval(iderTimer); delete iderTimer; }
}
}
function onIderTimer() {
if (ider.m.Update) { ider.m.Update(); }
if (ider.m.bytesFromAmt == -1) { iderStop(); } else { QH('id_iderstatusstr', '<b>' + (ider.m.server?"섬기는 사람":'') + "IDE-R 세션 </ b>, 연결됨," + ider.m.bytesFromAmt + " 에," + ider.m.bytesToAmt + " 밖."); }
}
// ###BEGIN###{IDERStats}
var heatMapWidth = 600;
var heatMapDividor = {};
function iderSectorStats(mode, dev, total, start, len) {
var canvas = dev ? Q('cdromHeatMapCanvas') : Q('floppyHeatMapCanvas');
var ctx = canvas.getContext('2d');
if (mode == 0) {
heatMapDividor[dev] = 1;
if (total > 0) { while ((total / heatMapDividor[dev]) > 8000) { heatMapDividor[dev] *= 2; } }
if (dev) {
QV('cdromHeatMap', total)
QH('cdromHeatMapText', format("<b> CDROM </ b>에서 블록은 {0} 바이트입니다.", (2048 * heatMapDividor[dev])));
} else {
QV('floppyHeatMap', total);
QH('floppyHeatMapText', format("<b> 플로피 </ b>, 블록은 {0} 바이트입니다.", (512 * heatMapDividor[dev])));
}
}
var dividor = heatMapDividor[dev];
total = total / dividor;
start = start / dividor;
len = len / dividor;
var heatMapScale = 6;
if (mode == 0) {
canvas.height = ((Math.floor(total / (heatMapWidth / heatMapScale)) + ((total % heatMapWidth) ? 1 : 0)) * heatMapScale);
ctx.fillStyle = 'rgba(225,250,225,1)';
ctx.fillRect(0, 0, heatMapWidth, Math.floor(total / (heatMapWidth / heatMapScale)) * heatMapScale);
if (total % heatMapWidth) { ctx.fillRect(0, Math.floor(total / (heatMapWidth / heatMapScale)) * heatMapScale, (total % (heatMapWidth / heatMapScale)) * heatMapScale, heatMapScale); }
ctx.fillStyle = 'rgba(0,0,0,0.3)';
} else {
for (var i = start; i < start + len; i++) { sectorHeat(ctx, i, heatMapScale, dividor); }
}
}
function sectorHeat(ctx, sector, scale, dividor) {
ctx.fillRect((sector % (heatMapWidth / scale)) * scale, Math.floor(sector / (heatMapWidth / scale)) * scale, scale, scale);
}
function iderToggleDiskMap(x) {
var visible = (QS('iderHeatmap').display != 'none');
if (x == null) { x = !visible; }
if (xxdialogMode) { x = false; }
QS('iderHeatmap').display = x ? '' : 'none';
}
// ###END###{IDERStats}
function onIderDialogPrompt(sender, args, buttons) {
if (iderCodeBlock) { document.body.removeChild(iderCodeBlock); delete iderCodeBlock; }
if (args['js']) { var JS = document.createElement('script'); JS.text = args['js']; iderCodeBlock = document.body.appendChild(JS); }
setDialogMode(11, "스토리지 리디렉션", buttons ? buttons : 3, onIderDialogPromptOk, args['html']);
}
function onIderDialogPromptOk(button) {
if (button == 1) {
// ###BEGIN###{!Mode-NodeWebkit}
if (window['iderServerCall']) { ider.m.dialogPrompt(window['iderServerCall']()); } else { ider.m.dialogPrompt(); }
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
ider.m.dialogPrompt(iderUserConsent);
// ###END###{Mode-NodeWebkit}
} else {
iderStop();
}
}
// ###BEGIN###{Mode-NodeWebkit}
var restartIderFunction;
function iderUserConsent(func) {
restartIderFunction = func;
amtstack.IPS_OptInService_StartOptIn(iderUserConsent2, 0, 1);
}
function iderUserConsent2(stack, name, response, status) {
if (errcheck(status, stack)) return;
//console.log("powerActionResponseC1(" + name + "," + response + "," + status + ")");
if (response.Body['ReturnValue'] != 0) {
messagebox("사용자 동의 오류", response.Body.ReturnValueStr.replace(/_/g, ' '));
} else {
d6ConsentText.value = ''; // Reset user consent code to empty
setDialogMode(6, "사용자 동의", 11, iderUserConsent3);
checkConsentDisplay();
consentChanged();
}
}
function iderUserConsent3() {
//console.log('IPS_OptInService_SendOptInCode()');
amtstack.IPS_OptInService_SendOptInCode(d6ConsentText.value, iderUserConsent4, 0, 1);
}
function iderUserConsent4(stack, name, response, status) {
if (errcheck(status, stack)) return;
//console.log("powerActionResponseC2(" + name + "," + response + "," + status + ")");
if (response.Body['ReturnValue'] != 0) {
messagebox("사용자 동의 오류", response.Body.ReturnValueStr.replace('_',' '));
} else {
restartIderFunction();
}
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Mode-MeshCentral2}
// Server-side IDER
function iderServerStart() {
if (xxdialogMode) return;
// Setup the IDER session (NodeJS)
iderStop();
ider = CreateAmtRemoteServerIder();
if (ider == null) return;
ider.onStateChanged = onIderStateChange;
ider.m.sectorStats = iderSectorStats;
ider.m.onDialogPrompt = onIderDialogPrompt;
ider.tlsv1only = amtstack.wsman.comm.tlsv1only;
ider.Start(currentMeshNode._id, 16994, '*', '*', 0);
}
// ###END###{Mode-MeshCentral2}
// ###END###{IDER}
// ###BEGIN###{RemoteAccess}
//
// Remote Access
//
var xxRemoteAccess = null;
var xxEnvironementDetection = null;
var xxCiraServers = null;
var xxUserInitiatedCira = null;
var xxUserInitiatedEnabledState = { 32768: "비활성화", 32769: "BIOS 활성화", 32770: "OS 인 에이블", 32771: "BIOS 및 OS 활성화" };
var xxRemoteAccessCredentiaLinks = null;
var xxMPSUserPass = null;
var xxPolicies = null;
function PullRemoteAccess() {
// We only deal with remote access starting with Intel AMT 6 and beyond
// ###BEGIN###{Certificates}
var requests = ['*AMT_EnvironmentDetectionSettingData', 'AMT_ManagementPresenceRemoteSAP', 'AMT_RemoteAccessCredentialContext', 'AMT_RemoteAccessPolicyAppliesToMPS', 'AMT_RemoteAccessPolicyRule', '*AMT_UserInitiatedConnectionService', 'AMT_MPSUsernamePassword'];
// ###END###{Certificates}
// ###BEGIN###{!Certificates}
var requests = ['*AMT_EnvironmentDetectionSettingData', 'AMT_ManagementPresenceRemoteSAP', 'AMT_RemoteAccessCredentialContext', 'AMT_RemoteAccessPolicyAppliesToMPS', 'AMT_RemoteAccessPolicyRule', '*AMT_UserInitiatedConnectionService', 'AMT_MPSUsernamePassword', 'AMT_PublicKeyCertificate'];
// ###END###{!Certificates}
if (amtversion > 11) { requests.push('*IPS_HTTPProxyService', 'IPS_HTTPProxyAccessPoint'); }
amtstack.BatchEnum(null, requests, processRemote1);
}
function processRemote1(stack, name, responses, status) {
if ((amtversion > 11) && (status == 400)) {
// Check if only the HTTP proxy objects failed
status = 200;
if (responses['IPS_HTTPProxyAccessPoint'].status == 400) { delete responses['IPS_HTTPProxyAccessPoint']; }
if (responses['IPS_HTTPProxyService'].status == 400) { delete responses['IPS_HTTPProxyService']; }
for (var i in responses) { if (responses[i].status != 200) { status = responses[i].status; } }
}
if (status == 400) return;
if ((errcheck(status, stack)) || (responses['AMT_UserInitiatedConnectionService'] == undefined || responses['AMT_UserInitiatedConnectionService'].response == undefined)) return;
QV('go17', true); // Remote Access
xxRemoteAccess = responses;
xxEnvironementDetection = responses['AMT_EnvironmentDetectionSettingData'].response;
xxEnvironementDetection['DetectionStrings'] = MakeToArray(xxEnvironementDetection['DetectionStrings']);
xxCiraServers = responses['AMT_ManagementPresenceRemoteSAP'].responses;
xxUserInitiatedCira = responses['AMT_UserInitiatedConnectionService'].response;
xxRemoteAccessCredentiaLinks = responses['AMT_RemoteAccessCredentialContext'].responses;
xxMPSUserPass = responses['AMT_MPSUsernamePassword'].responses;
// Figure out policies attached to servers. Create a policy type to server table.
xxPolicies = { 'User': [], 'Alert': [], 'Periodic': [] };
for (var i in responses['AMT_RemoteAccessPolicyAppliesToMPS'].responses) {
var policy = responses['AMT_RemoteAccessPolicyAppliesToMPS'].responses[i];
var server = Clone(getItem(xxCiraServers, 'Name', getItem(policy['ManagedElement']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'Name')['Value']));
server.MpsType = policy['MpsType']; // MpsType was added in Intel AMT 11.6
var ptype = (getItem(policy['PolicySet']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyRuleName')['Value']).split(' ')[0];
xxPolicies[ptype].push(server);
}
updateRemoteAccess();
}
function updateRemoteAccess() {
if (xxEnvironementDetection == null) return;
var x = '', e = "비활성화", ciraProxySupport = (xxRemoteAccess['IPS_HTTPProxyService'] && xxRemoteAccess['IPS_HTTPProxyAccessPoint']);
if (xxEnvironementDetection['DetectionStrings'] && xxEnvironementDetection['DetectionStrings'].length > 0) { e = "사용," + xxEnvironementDetection['DetectionStrings'].length + ' ' + (xxEnvironementDetection['DetectionStrings'].length > 1?'domains':'domain'); }
// General settings
x += TableStart();
x += TableEntry("환경 감지", addLink(e, 'editEnvironmentDetection()'));
x += TableEntry("사용자 시작 옵션", addLinkConditional(xxUserInitiatedEnabledState[xxUserInitiatedCira['EnabledState']], 'editUserInitiatedCira()', xxAccountAdminName));
var y = ('<i>' + "없음" + '</i>');
if (xxPolicies['User'].length > 0) { y = ''; for (var i in xxPolicies['User']) { if (y.length > 0) y += ', '; y += xxPolicies['User'][i]['AccessInfo']; if (xxPolicies['User'][i].MpsType == 1) { y += ' (CILA)'; } } }
x += TableEntry("사용자 시작 연결", addLinkConditional(y, 'editMpsPolicy("User")', xxAccountAdminName));
var y = ('<i>' + "없음" + '</i>');
if (xxPolicies['Alert'].length > 0) { y = ''; for (var i in xxPolicies['Alert']) { if (y.length > 0) y += ', '; y += xxPolicies['Alert'][i]['AccessInfo']; if (xxPolicies['Alert'][i].MpsType == 1) { y += ' (CILA)'; } } }
x += TableEntry("경고 시작 연결", addLinkConditional(y, 'editMpsPolicy("Alert")', xxAccountAdminName));
var y = ('<i>' + "없음" + '</i>');
if (xxPolicies['Periodic'].length > 0) { y = ''; for (var i in xxPolicies['Periodic']) { if (y.length > 0) y += ', '; y += xxPolicies['Periodic'][i]['AccessInfo']; if (xxPolicies['Periodic'][i].MpsType == 1) { y += ' (CILA)'; } } }
var periodicPolicy = getItem(xxRemoteAccess['AMT_RemoteAccessPolicyRule'].responses, "PolicyRuleName", "주기적");
if (periodicPolicy) {
var exdata = atob(periodicPolicy['ExtendedData']);
if (ReadInt(exdata, 0) == 0) { y += format("{0} 초마다", ReadInt(exdata, 4)); }
if (ReadInt(exdata, 0) == 1) { var hours = ReadInt(exdata, 4); var minutes = ReadInt(exdata, 8); if (minutes < 10) minutes = '0' + minutes; y += ', at ' + hours + ":" + minutes + ' daily'; }
}
x += TableEntry("주기적 연결", addLinkConditional(y, 'editMpsPolicy("Periodic")', xxAccountAdminName));
x += TableEnd();
// Show MPS servers
x += '<br>';
x += TableStart2();
x += '<tr><td class=r1 style=padding-left:15px><br>' + "인텔 &reg; AMT 원격 관리 서버를 관리합니다." + '<br><br>';
if (xxCiraServers.length == 0) {
x += '<div style=padding-left:15px><br><i>' + "원격 서버가 없습니다." + '</i></div><br>';
} else {
for (var i in xxCiraServers) {
var desc = ':' + xxCiraServers[i]['Port'];
if (xxCiraServers[i]['CN']) desc += ', ' + xxCiraServers[i]['CN'];
x += '<div class=itemBar onclick=showServerDetails(' + i + ')><div style=padding-top:3px><b>' + xxCiraServers[i]['AccessInfo'] + '</b>' + EscapeHtml(desc) + '</div></div>';
}
}
// Show MPS proxies if supported
if (ciraProxySupport) {
x += '<br>' + "연결 관리에 사용되는 HTTP 프록시를 관리합니다." + '<br><br>';
var proxyService = xxRemoteAccess['IPS_HTTPProxyService'].response;
var proxies = xxRemoteAccess['IPS_HTTPProxyAccessPoint'].responses;
if (proxies.length == 0) {
x += '<div style=padding-left:15px><br><i>' + "프록시가 구성되지 않았습니다." + '</i></div><br>';
} else {
for (var i in proxies) {
//x += '<div class=itemBar onclick=showProxyDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(proxies[i]['AccessInfo']) + ':' + proxies[i]['ProxyPort'] + '</b> / ' + EscapeHtml(proxies[i]['NetworkDnsSuffix']) + '</div></div>';
x += '<div class=itemBar onclick=showProxyDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(proxies[i]['AccessInfo']) + ':' + proxies[i]['Port'] + '</b> / ' + EscapeHtml(proxies[i]['NetworkDnsSuffix']) + '</div></div>';
}
}
}
var addserverbutton = '';
if (xxAccountAdminName) {
addserverbutton = AddButton("서버 추가...", 'AddRemoteAccessServer()');
if (ciraProxySupport) { addserverbutton += AddButton("프록시 추가 ...", 'AddRemoteAccessProxy()'); }
}
x += '<br><td class=r1>' + TableEnd(AddRefreshButton('PullRemoteAccess()') + addserverbutton);
QH('id_TableRemoteAccess', x);
}
var xxEditMpsPolicyType;
function editMpsPolicy(type) {
var x = '', cilaSupport = ((amtversion > 11) || ((amtversion == 11) && (amtversionmin >= 6)));
xxEditMpsPolicyType = type;
var name = xxEditMpsPolicyType;
if (name == 'User') name = "시작된 사용자";
var policy = getItem(xxRemoteAccess['AMT_RemoteAccessPolicyRule'].responses, "PolicyRuleName", name);
x += '<div style=height:26px><select id=d2server1 style=float:right;width:206px onchange=editMpsPolicyUpdate()>';
x += '<option value=-1>' + "(없음)";
for (var i in xxCiraServers) { x += '<option value=' + i + '' + ((xxPolicies[type][0] && xxPolicies[type][0]['Name'] == xxCiraServers[i]['Name']) ? ' selected' : '') + '>' + xxCiraServers[i]['AccessInfo'] }
x += '</select><div>' + "기본 서버" + '</div></div>';
if (cilaSupport) { x += '<div style=height:26px><select id=d2server1cira style=float:right;width:206px onchange=editMpsPolicyUpdate()><option value=0>' + "CIRA-외부" + '<option value=1' + (((xxPolicies[type][0]) && (xxPolicies[type][0].MpsType == 1))?' selected':'') + '>' + "CILA-내부" + '</select><div>' + "기본 MPS 유형" + '</div></div>'; }
if (xxCiraServers.length > 1) {
x += '<div style=height:26px><select id=d2server2 style=float:right;width:206px onchange=editMpsPolicyUpdate()>';
x += '<option value=-1>' + "(없음)";
for (var i in xxCiraServers) { x += '<option value=' + i + '' + ((xxPolicies[type][1] && xxPolicies[type][1]['Name'] == xxCiraServers[i]['Name']) ? ' selected' : '') + '>' + xxCiraServers[i]['AccessInfo'] }
x += '</select><div>' + "보조 서버" + '</div></div>';
if (cilaSupport) { x += '<div style=height:26px><select id=d2server2cira style=float:right;width:206px onchange=editMpsPolicyUpdate()><option value=0>' + "CIRA-외부" + '<option value=1' + (((xxPolicies[type][1]) && (xxPolicies[type][1].MpsType == 1)) ? ' selected' : '') + '>' + "CILA-내부" + '</select><div>' + "보조 MPS 유형" + '</div></div>'; }
}
var t, v = 0;
if (policy) { v = policy['TunnelLifeTime']; }
x += '<div style=height:26px><input id=d2lifetime style=float:right;width:200px onchange=editMpsPolicyUpdate() value=' + v + '>';
x += '<div>' + "터널 수명 (초)" + '</div></div>';
if (type == 'Periodic') {
t = 0;
v = 3600;
if (policy) {
var xx = atob(policy['ExtendedData']);
t = ReadInt(xx, 0);
v = ReadInt(xx, 4);
if (t == 1) {
var mm = ReadInt(xx, 8);
if (mm < 10) mm = '0' + mm;
v += ':' + mm;
}
}
x += '<div style=height:26px><select id=d2ttype style=float:right;width:206px onchange=editMpsPolicyUpdate()>';
x += '<option value=0' + (t == 0 ? ' selected' : '') + '>' + "주기적, 시간 간격" + '<option value=1' + (t == 1 ? ' selected' : '') + '>' + "하루에 한 번 시간";
x += '</select><div>' + "트리거 타입" + '</div></div><div style=height:26px><input id=d2timer style=float:right;width:200px onkeyup=editMpsPolicyUpdate() value=' + v + '><div id=ttypelabel></div></div>';
}
setDialogMode(11, format("{0} 연결", type), 3, editMpsPolicyOk, x);
editMpsPolicyUpdate();
}
function editMpsPolicyUpdate() {
var cilaSupport = ((amtversion > 11) || ((amtversion == 11) && (amtversionmin >= 6)));
var ok = (xxCiraServers.length <= 1 || ((Q('d2server1').value == -1) || (Q('d2server1').value != Q('d2server2').value)));
if (ok == true && xxEditMpsPolicyType == 'Periodic' && Q('d2ttype').value == 1) { var hhmm = Q('d2timer').value.split(':'); if (hhmm.length != 2) ok = false; else { var hh = parseInt(hhmm[0]); var mm = parseInt(hhmm[1]); if (hh < 0 || hh > 23 || mm < 0 || mm > 59) ok = false; } }
QE('idx_dlgOkButton', ok);
if (xxCiraServers.length > 1) QE('d2server2', Q('d2server1').value != -1);
if (xxEditMpsPolicyType == 'Periodic') {
QE('d2timer', Q('d2server1').value != -1);
QH('ttypelabel', Q('d2ttype').value == 0 ? "트리거 간격 (초)" : "시간 (HH : MM)");
QE('d2ttype', Q('d2server1').value != -1);
}
QE('d2lifetime', Q('d2server1').value != -1);
// If we are on Intel AMT 11.6 or higher, enable the CIRA/CILA selector when needed.
if (cilaSupport) {
QE('d2server1cira', Q('d2server1').value > -1)
if (xxCiraServers.length > 1) { QE('d2server2cira', (Q('d2server1').value > -1) && (Q('d2server2').value > -1)); }
}
}
function editMpsPolicyOk() {
var name = xxEditMpsPolicyType;
if (name == 'User') { name = 'User Initiated'; }
if (getItem(xxRemoteAccess['AMT_RemoteAccessPolicyRule'].responses, 'PolicyRuleName', name)) {
// Remove old policy
amtstack.Delete('AMT_RemoteAccessPolicyRule', { 'PolicyRuleName': name }, editMpsPolicyOk2);
} else {
// No old policy to remove, skip this.
editMpsPolicyOk2();
}
}
function editMpsPolicyOk2(stack, name, responses, status) {
var cilaSupport = ((amtversion > 11) || ((amtversion == 11) && (amtversionmin >= 6)));
if (Q('d2server1').value == -1) { PullRemoteAccess(); return; }
var trigger = 0;
if (xxEditMpsPolicyType == 'Alert') trigger = 1;
if (xxEditMpsPolicyType == 'Periodic') trigger = 2;
// Setup extended data
var extendedData = null;
if (trigger == 2) {
var timertype = Q('d2ttype').value;
var exdata = IntToStr(Q('d2timer').value); // Interval trigger
if (timertype == 1) { var hhmm = Q('d2timer').value.split(':'); exdata = IntToStr(parseInt(hhmm[0])) + IntToStr(parseInt(hhmm[1])); } // Time of day trigger
extendedData = btoa(IntToStr(timertype) + exdata);
}
// Create the MPS server references
var server1, server2;
if (Q('d2server1').value >= 0) { server1 = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_ManagementPresenceRemoteSAP</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="Name">' + xxCiraServers[Q('d2server1').value]['Name'] + '</Selector></SelectorSet></ReferenceParameters>'; }
if (Q('d2server1').value >= 0 && xxCiraServers.length > 1 && Q('d2server2').value >= 0) { server2 = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_ManagementPresenceRemoteSAP</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="Name">' + xxCiraServers[Q('d2server2').value]['Name'] + '</Selector></SelectorSet></ReferenceParameters>'; }
// Put the CIRA/CILA servers in the right bins.
var ciraServers = [];
var cilaServers = [];
if (cilaSupport) {
// Only Intel AMT 11.6 supports this
if (server1) {
if (Q('d2server1cira').value == 0) { ciraServers.push(server1); } else { cilaServers.push(server1); }
if (server2) { if (Q('d2server2cira').value == 0) { ciraServers.push(server2); } else { cilaServers.push(server2); } }
}
} else {
// If older than Intel AMT 11.6, put all servers in the CIRA bucket.
if (server1) { ciraServers.push(server1); if (server2) { ciraServers.push(server2); } }
}
// Go ahead and create the new CIRA/CILA policy.
amtstack.AMT_RemoteAccessService_AddRemoteAccessPolicyRule(trigger, Q('d2lifetime').value, extendedData, ciraServers, cilaServers, PullRemoteAccess);
}
var editEnvironmentDetectionTmp;
function editEnvironmentDetection(a) {
if (a != 1) { editEnvironmentDetectionTmp = (xxEnvironementDetection['DetectionStrings']) ? Clone(xxEnvironementDetection['DetectionStrings']) : []; }
var x = '';
if (xxAccountAdminName) x += "인트라넷 도메인 접미사를 최대 5 개까지 입력하십시오. 컴퓨터가이 도메인 외부에 있으면 인텔 &reg; AMT 로컬 포트가 닫히고 원격 서버 연결이 활성화됩니다." + '<br><br>';
if (editEnvironmentDetectionTmp.length == 0) { x += '<i>' + "인트라넷 도메인이 없으며 환경 탐지가 비활성화되었습니다." + '</i><br>'; }
for (var i in editEnvironmentDetectionTmp) { x += '<div class=itemBar style=margin-right:0><div style=float:right>' + AddButton2("없애다", 'editEnvironmentDetectionRemove(' + i + ')') + '</div><div style=padding-top:3px;max-width:260px;overflow:hidden title="' + editEnvironmentDetectionTmp[i] + '"><b>' + editEnvironmentDetectionTmp[i] + '</b></div></div>'; }
if (xxAccountAdminName && editEnvironmentDetectionTmp.length < 5) { x += '<br><input id=edInput placeholder=intranet.org style=width:276px onkeyup=edInputChg() maxlength=63><input type=button id=edAdd value=Add style=width:80px;margin-left:5px onclick=editEnvironmentDetectionAdd()>'; }
if (a == 1) QH('id_dialogOptions', x); else setDialogMode(11, "환경 감지", xxAccountAdminName?3:1, editEnvironmentDetectionDlg, x);
edInputChg();
}
function editEnvironmentDetectionDlg() {
if (xxAccountAdminName) {
var t = Clone(xxEnvironementDetection);
t['DetectionStrings'] = editEnvironmentDetectionTmp;
//console.log('AMT_EnvironmentDetectionSettingData', t);
amtstack.Put('AMT_EnvironmentDetectionSettingData', t, editEnvironmentDetectionDlg2, 0, 1);
}
}
function editEnvironmentDetectionDlg2(stack, name, response, status) {
if (status != 200) { messagebox("환경 감지", format("서버를 추가하지 못했습니다 (상태 {0}).", status)); }
else if ((response.Body['ReturnValue']) && (response.Body['ReturnValue'] != 0)) { messagebox("환경 감지", response.Body.ReturnValueStr.replace(/_/g, ' ')); }
else { PullRemoteAccess(); }
}
function edInputChg() {
if (editEnvironmentDetectionTmp.length < 5) QE('edAdd', Q('edInput').value.length > 0);
}
function editEnvironmentDetectionAdd() {
editEnvironmentDetectionTmp.push(Q('edInput').value);
editEnvironmentDetection(1);
}
function editEnvironmentDetectionRemove(h) {
editEnvironmentDetectionTmp.splice(h, 1);
editEnvironmentDetection(1);
}
function editUserInitiatedCira() {
if (xxdialogMode) return;
var s = '';
for (var i in xxUserInitiatedEnabledState) { s += '<input type=radio name=d11 id=wl' + i + ' value=' + i + ' ' + ((xxUserInitiatedCira['EnabledState'] == i) ? 'checked' : '') + '>' + xxUserInitiatedEnabledState[i] + '<br>'; }
setDialogMode(11, "사용자 시작 터널", 3, editUserInitiatedCiraDlg, s);
}
function editUserInitiatedCiraDlg() { amtstack.AMT_UserInitiatedConnectionService_RequestStateChange(document.querySelector('input[name=d11]:checked').value, null, editUserInitiatedCiraDlg2); }
function editUserInitiatedCiraDlg2(stack, name, response, status) { if (status == 200) { amtstack.Get('AMT_UserInitiatedConnectionService', editUserInitiatedCiraDlg3, 0, 1); } }
function editUserInitiatedCiraDlg3(stack, name, response, status) { if (status == 200) { xxUserInitiatedCira = response.Body; updateRemoteAccess(); } }
var xxShowServerDetailsHandle;
function showServerDetails(h) {
xxShowServerDetailsHandle = h;
var server = xxCiraServers[h];
var x = '';
x += addHtmlValue("액세스 이름", server['AccessInfo']);
if (server['Port']) x += addHtmlValue("포트", server['Port']);
if (server['CN']) x += addHtmlValue("공통 이름", server['CN']);
var credentiallink = getElementWithContextSelectorValue(xxRemoteAccessCredentiaLinks, server['Name']);
if (credentiallink) {
var credentialselectorvalue = credentiallink['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
if (credentialselectorvalue.indexOf('Username') > 0) {
x += addHtmlValue("인증 유형", "사용자 및 패스 / 서버 인증 TLS");
x += addHtmlValue("원격 ID", getInstance(xxMPSUserPass, credentialselectorvalue)['RemoteID']);
} else {
x += addHtmlValue("인증 유형", "인증서 / 상호 인증 TLS");
// ###BEGIN###{!Certificates}
var c = getInstance(xxRemoteAccess['AMT_PublicKeyCertificate'].responses, credentialselectorvalue);
// ###END###{!Certificates}
// ###BEGIN###{Certificates}
var c = getInstance(xxCertificates, credentialselectorvalue);
// ###END###{Certificates}
x += addHtmlValue("인증서 이름", parseCertName(c['Subject'])['CN']);
}
}
var buttons = 1;
if (xxAccountAdminName) buttons = 5;
setDialogMode(11, "원격 서버 번호" + (h + 1), buttons, showServerDetailsOk, x);
}
function getElementWithContextSelectorValue(elements, value) {
for (var i in elements) {
elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector'] = MakeToArray(elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector']);
for (var j in elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector']) { if (elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector'][j]['Value'] == value) return elements[i]; }
}
return null;
}
function showServerDetailsOk(r) {
// Delete the selected CIRA server
if (r == 2) { amtstack.Delete('AMT_ManagementPresenceRemoteSAP', { 'Name': xxCiraServers[xxShowServerDetailsHandle]['Name'] }, showServerDetailsOk2); }
}
function showServerDetailsOk2(stack, name, responses, status) {
if (status == 408) { messagebox("원격 서버 제거", "서버를 제거 할 수 없으며 액세스가 거부되었습니다."); } else { PullRemoteAccess(); }
}
function parseCertName(x) {
var j, r = {}, xx = x.split(',');
for (var i in xx) { j = xx[i].indexOf('='); r[xx[i].substring(0, j)] = xx[i].substring(j + 1); }
return r;
}
function showProxyDetails(h) {
var proxy = xxRemoteAccess['IPS_HTTPProxyAccessPoint'].responses[h];
var x = addHtmlValue("액세스 이름", proxy['AccessInfo'] + ':' + proxy['ProxyPort']);
x += addHtmlValue("DNS 접미사", proxy['NetworkDnsSuffix']);
//x += addHtmlValue("Proxy type", ['Administrator', 'Operating system'][proxy['ProxyType']]);
x += addHtmlValue("프록시 유형", ['Administrator', 'Operating system'][proxy['Type']]);
//x += addHtmlValue("Last time used", proxy['LastTimeUsed']);
var buttons = 1;
if (xxAccountAdminName) { buttons = 5; }
setDialogMode(11, "HTTP 프록시 #" + (h + 1), buttons, showProxyDetailsOk, x, h);
}
function showProxyDetailsOk(r, h) {
// Delete the selected proxy server
var proxy = xxRemoteAccess['IPS_HTTPProxyAccessPoint'].responses[h];
if (r == 2) { amtstack.Delete('IPS_HTTPProxyAccessPoint', { 'Name': proxy['Name'] }, showProxyDetailsOk2); }
}
function showProxyDetailsOk2(stack, name, responses, status) {
if (status == 408) { messagebox("HTTP 프록시 제거", "HTTP 프록시를 제거 할 수 없으며 액세스가 거부되었습니다."); } else { PullRemoteAccess(); }
}
function AddRemoteAccessProxy() {
// AddRemoteAccessProxy Host name = 2, Ipv4 = 3, Ipv6 = 4
var x = '<div style=height:26px><select id=d2type style=float:right;width:206px onchange=AddRemoteAccessProxyUpdate()><option value=2>' + "호스트 이름 FQDN" + '<option value=3>' + "IPv4 주소" + '<option value=4>' + "IPv6 주소" + '</select><div>' + "연결 타입" + '</div></div>';
x += '<div style=height:26px><input id=d2host style=float:right;width:200px maxlength=255 onkeyup=AddRemoteAccessProxyUpdate()><div id=d2typespan></div></div>';
x += '<div style=height:26px><input id=d2port onkeypress="return (event.charCode == 0 || (event.charCode >= 48 && event.charCode <= 57))" style=float:right;width:200px onkeyup=AddRemoteAccessProxyUpdate()><div>' + "포트" + '</div></div>';
x += '<div style=height:26px><input id=d2domain style=float:right;width:200px maxlength=191 onkeyup=AddRemoteAccessProxyUpdate()><div>' + "DNS 접미사" + '</div></div>';
setDialogMode(11, "HTTP 프록시 추가", 3, AddRemoteAccessProxyOk, x);
AddRemoteAccessProxyUpdate();
}
function AddRemoteAccessProxyUpdate() {
var ok = (Q('d2host').value.length != 0) && (Q('d2domain').value.length != 0);
if ((Q('d2port').value.length == 0) || (parseInt(Q('d2port').value) > 65535)) { ok = false; }
QE('idx_dlgOkButton', ok);
QH('d2typespan', ['', '', "FQDN / 호스트 이름", "IPv4 주소", "IPv6 주소"][Q('d2type').value]);
}
function AddRemoteAccessProxyOk() {
amtstack.IPS_HTTPProxyService_AddProxyAccessPoint(Q('d2host').value, Q('d2type').value, parseInt(Q('d2port').value), Q('d2domain').value, AddRemoteAccessProxyOk2);
}
function AddRemoteAccessProxyOk2(stack, name, response, status) {
if (status != 200) {
messagebox("프록시 서버 추가", "프록시, 상태를 추가하지 못했습니다." + status);
} else if (response.Body['ReturnValue'] != 0) {
messagebox("프록시 서버 추가", response.Body.ReturnValueStr.replace(/_/g, ' '));
} else {
PullRemoteAccess();
}
}
function AddRemoteAccessServer() {
// ###BEGIN###{!Certificates}
var certs = xxRemoteAccess['AMT_PublicKeyCertificate'].responses;
// ###END###{!Certificates}
// ###BEGIN###{Certificates}
var certs = [];
for (var i in xxCertificates) { if (xxCertificates[i].XPrivateKey) { certs.push(xxCertificates[i]); } }
// ###END###{Certificates}
var x = '';
x += '<div style=height:26px><select id=d2type style=float:right;width:206px onchange=AddRemoteAccessServerUpdate()><option value=201>' + "호스트 이름 FQDN" + '<option value=3>' + "IPv4 주소" + '</select><div>' + "연결 타입" + '</div></div>';
x += '<div style=height:26px><input id=d2name style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div id=d2lname></div></div>';
x += '<div style=height:26px><input id=d2port onkeypress="return (event.charCode == 0 || (event.charCode >= 48 && event.charCode <= 57))" style=float:right;width:200px value=4433 onkeyup=AddRemoteAccessServerUpdate()><div>' + "서버 포트" + '</div></div>';
x += '<div style=height:26px id=d2ucn><input id=d2cn style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div>' + "서버 공통 이름" + '</div></div>';
x += '<div style=height:26px><select id=d2auth style=float:right;width:206px onchange=AddRemoteAccessServerUpdate()>';
if (certs.length > 0) { x += '<option value=1>' + "증명서"; }
x += '<option value=2>' + "아이디 / 비밀번호" + '</select><div>' + "인증 유형" + '</div></div>';
x += '<span id=d2utype>';
x += '<div style=height:26px><input id=d2user style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div>' + "사용자 이름" + '</div></div>';
x += '<div style=height:26px><input id=d2pass style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div>' + "강력한 비밀번호" + '</div></div>';
x += '</span>';
x += '<span id=d2ctype>';
x += '<div style=height:26px><select id=d2cert style=float:right;width:206px onchange=AddRemoteAccessServerUpdate()>';
for (var i in certs) { x += '<option value=' + certs[i]['InstanceID'].substring(34) + '>' + parseCertName(certs[i]['Subject'])['CN']; }
x += '</select><div>' + "증명서" + '</div></div></span>';
setDialogMode(11, "원격 서버 추가", 3, AddRemoteAccessServerOk, x);
AddRemoteAccessServerUpdate();
}
function AddRemoteAccessServerOk() {
var cref, user, pass, cn;
if (Q('d2auth').value == 1) {
cref = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_PublicKeyCertificate</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">Intel(r) AMT Certificate: Handle: ' + Q('d2cert').value + '</Selector></SelectorSet></ReferenceParameters>';
} else {
user = Q('d2user').value;
pass = Q('d2pass').value;
}
if (Q('d2cn').value.length > 0) cn = Q('d2cn').value;
amtstack.AMT_RemoteAccessService_AddMpServer(Q('d2name').value, Q('d2type').value, Q('d2port').value, Q('d2auth').value, cref, user, pass, cn, AddRemoteAccessServerOk2);
}
function AddRemoteAccessServerOk2(stack, name, response, status) {
if (status != 200) {
messagebox("인터넷 서버 추가", format("서버를 추가하지 못했습니다 (상태 {0}).", status));
} else if (response.Body['ReturnValue'] != 0) {
messagebox("인터넷 서버 추가", response.Body.ReturnValueStr.replace(/_/g, ' '));
} else {
PullRemoteAccess();
}
}
function AddRemoteAccessServerUpdate() {
var ok = (Q('d2name').value.length != 0);
if (Q('d2type').value == 3 && ok == true) { ok = (Q('d2cn').value.length != 0); }
if (Q('d2auth').value == 2 && ok == true) { ok = ((Q('d2user').value.length != 0) && (passwordcheck(Q('d2pass').value))); }
if ((Q('d2port').value.length == 0) || (parseInt(Q('d2port').value) > 65535)) { ok = false; }
if ((Q('d2name').value.indexOf(':') != -1) || ((Q('d2type').value == 3) && (Q('d2cn').value.indexOf(':') != -1))) { ok = false; }
QH('d2lname', (Q('d2type').value == 201) ? "호스트 이름" : "IPv4 주소");
QV('d2utype', Q('d2auth').value == 2);
QV('d2ucn', Q('d2type').value == 3);
QV('d2ctype', Q('d2auth').value == 1);
QE('idx_dlgOkButton', ok);
}
// ###END###{RemoteAccess}
//
// Edit Computer Name & DNS feature
//
function showEditNameDlg(x) {
if (xxdialogMode) return;
var t = amtsysstate['AMT_GeneralSettings'].response['HostName'], y = amtsysstate['AMT_GeneralSettings'].response['DomainName'];
if (y != null && y.length > 0) t += '.' + y;
var r = '<br><div style=height:26px><input id=d11name value="' + t + '" style=float:right;width:200px><div>' + "이름 및 도메인" + '</div></div>';
if (x == 1) {
var s = (amtsysstate['AMT_GeneralSettings'].response['SharedFQDN'] == true);
r += '<div style=height:26px><select id=d11fqdn style=float:right;width:200px><option value=true ' + (s?'selected':'') + '>' + "OS와 동일" + '<option value="false" ' + (s?'':'selected') + '>' + "OS와 다른 전용" + '</select><div>' + "이름 공유" + '</div></div>';
}
setDialogMode(11, "컴퓨터 이름", 3, editNameDlgOk, r);
}
function editNameDlgOk() {
var i = Q('d11name').value, j = i.indexOf('.'), k = '';
if (j >= 0) { k = i.substring(j + 1); i = i.substring(0, j); }
var clone = Clone(amtsysstate['AMT_GeneralSettings'].response);
clone['HostName'] = i;
clone['DomainName'] = k;
if (Q('d11fqdn')) { clone['SharedFQDN'] = d11fqdn.value; }
amtstack.Put('AMT_GeneralSettings', clone, function() { amtstack.Get('AMT_GeneralSettings', computerNameGet, 0, 1); }, 0, 1);
}
function computerNameGet(stack, name, response, status) {
if (status == 200) { amtsysstate['AMT_GeneralSettings'].response = response.Body; updateSystemStatus(); }
}
function showEditDnsDlg() {
if (xxdialogMode) return;
var g = amtsysstate['AMT_GeneralSettings'].response;
var v = 0;
if (g['DDNSUpdateByDHCPServerEnabled'] == true) v = 1;
if (g['DDNSUpdateEnabled'] == true) v = 2;
idx_d23ddns.value = v;
idx_d23interval.value = g['DDNSPeriodicUpdateInterval'];
idx_d23ttl.value = g['DDNSTTL'];
showEditDnsDlgChange();
setDialogMode(23, "동적 DNS 클라이언트", 3, showEditDnsDlgOk);
}
function showEditDnsDlgOk() {
var clone = Clone(amtsysstate['AMT_GeneralSettings'].response);
clone['DDNSUpdateEnabled'] = ((idx_d23ddns.value == 2)?true:false);
clone['DDNSUpdateByDHCPServerEnabled'] = ((idx_d23ddns.value == 1)?true:false);
if (idx_d23ddns.value == 2) {
clone['DDNSPeriodicUpdateInterval'] = idx_d23interval.value;
clone['DDNSTTL'] = idx_d23ttl.value;
}
amtstack.Put('AMT_GeneralSettings', clone, function() { amtstack.Get('AMT_GeneralSettings', computerNameGet, 0, 1); }, 0, 1);
}
function showEditDnsDlgChange() {
QE('idx_d23interval', idx_d23ddns.value == 2);
QE('idx_d23ttl', idx_d23ddns.value == 2);
}
//
// Intel AMT Features
//
function showFeaturesDlg() {
if (xxdialogMode || !xxAccountAdminName) return;
idx_d9redir.checked = amtfeatures[0], idx_d9kvm.checked = amtfeatures[3], idx_d9ider.checked = amtfeatures[2], idx_d9sol.checked = amtfeatures[1];
QV('idx_d9kvm_div', amtfeatures[3] != null);
setDialogMode(9, "인텔 &reg; AMT 기능", 3, featuresDlgOk)
}
function featuresDlgOk() {
var r = amtsysstate['AMT_RedirectionService'].response;
r['ListenerEnabled'] = idx_d9redir.checked;
r['EnabledState'] = 32768 + ((idx_d9ider.checked?1:0) + (idx_d9sol.checked?2:0));
amtstack.AMT_RedirectionService_RequestStateChange(r['EnabledState'],
function (stack, name, response, status) {
if (status != 200) { messagebox("오류", "RedirectionService, RequestStateChange 오류" + status); return; }
if (amtfeatures[3] != null) {
amtstack.CIM_KVMRedirectionSAP_RequestStateChange((idx_d9kvm.checked) ? 2 : 3, 0,
function (stack, name, response, status) {
if (status != 200) { messagebox("오류", "KVMRedirectionSAP, RequestStateChange 오류" + status); return; }
amtstack.Put('AMT_RedirectionService', r, function (stack, name, response, status) {
if (status != 200) { messagebox("오류", "리디렉션 서비스 PUT 오류" + status); return; }
amtstack.Get('AMT_RedirectionService', featuresDlgGet1, 0, 1);
amtstack.Get('CIM_KVMRedirectionSAP', featuresDlgGet2, 0, 1)
}, 0, 1) }
);
}
}
);
}
function featuresDlgGet1(stack, name, response, status) {
if (status == 200) { amtsysstate['AMT_RedirectionService'].response = response.Body; updateSystemStatus(); }
}
function featuresDlgGet2(stack, name, response, status) {
if (status == 200) { amtsysstate['CIM_KVMRedirectionSAP'].response = response.Body; updateSystemStatus(); }
}
//
// Intel AMT Boot Features
//
function showEnableBootServiceDlg() {
if (xxdialogMode) return;
if (amtsysstate['CIM_BootService'].response['EnabledState'] != null) {
QV('d26rpediv', amtversion > 15);
if (amtversion > 15) {
idx_d26rpe1.checked = (amtsysstate['CIM_BootService'].response['EnabledState'] & 2)
idx_d26rpe0.checked = !idx_d26rpe1.checked;
}
idx_d26ocr1.checked = (amtsysstate['CIM_BootService'].response['EnabledState'] & 1)
idx_d26ocr0.checked = !idx_d26ocr1.checked;
}
setDialogMode(26, "Boot Features", 3, showEnableBootServiceDlgOk)
}
function showEnableBootServiceDlgOk() {
var v = 32768 + parseInt(document.querySelector('input[name=d26a]:checked').value);
if (amtversion > 15) { v += parseInt(document.querySelector('input[name=d26b]:checked').value); }
amtstack.CIM_BootService_RequestStateChange(v, null, showEnableBootServiceDlgResponse, v);
}
function showEnableBootServiceDlgResponse(stack, name, response, status, tag) {
if (status == 200) {
if (response.Body['ReturnValueStr'] != 'SUCCESS') { messagebox("Boot Features Error", response.Body['ReturnValueStr']); }
amtstack.Get('CIM_BootService', showEnableBootServiceDlgResponse2, tag);
PullSystemStatus();
} else {
if (response.Header['WsmanError']) {
messagebox("Boot Features Error", response.Header['WsmanError'].replace(/_/g, ' '));
} else {
messagebox("Boot Features Error", "Error, Status = " + status);
}
}
}
function showEnableBootServiceDlgResponse2(stack, name, response, status, tag) {
if ((status == 200) && (response.Body['EnabledState'] != tag)) { messagebox("Boot Features Error", "Unable to set OCR/RPE, check that these features are enabled in BIOS."); }
}
//
// Intel AMT User Consent
//
function showConsentDlg() {
if (xxdialogMode) return;
var optinrequired = amtsysstate['IPS_OptInService'].response['OptInRequired'];
idx_d10none.checked = (optinrequired == 0);
idx_d10kvm.checked = (optinrequired == 1);
idx_d10all.checked = (optinrequired == 0xFFFFFFFF);
setDialogMode(10, "사용자 동의", 3, consentDlgOk)
}
function consentDlgOk() {
amtsysstate['IPS_OptInService'].response['OptInRequired'] = document.querySelector('input[name=d10]:checked').value;
amtstack.Put('IPS_OptInService', amtsysstate['IPS_OptInService'].response, function() { amtstack.Get('IPS_OptInService', consentGet, 0, 1); }, 0, 1);
}
function consentGet(stack, name, response, status) {
if (status == 200) { PullSystemStatus(); }
}
//
// NETWORK SETTINGS
//
// ###BEGIN###{NetworkSettings}
/*
IPv6 %AddrType%:
0 - Address generated from: fe80::/64 + Interface ID,
1 - Address generated from: [Router advertised prefix] + [Interface ID],
2 - Global IPv6 address obtained from DHCPv6 Server,
3 - IPv6 unicast address configured by the user,
4 - Returned by FW for IPv6 addresses that are not owned by FW (such as IPv6 router address, configuration server address etc.)
IPv6 %AddrState%:
0 - DAD is still in process for this address,
1 - Address is valid and may be used for new communication,
2 - Address is deprecated and should not be used for new communication,
3 - Covers both the preferred and deprecated states,
4 - The valid lifetime of the address has expired,
5 - An interface ID collision has been detected for this address when performing DAD,
6 - Returned by FW for IPv6 addresses that are not owned by FW (such as IPv6 router address, configuration server address etc.
*/
// ipv6addrtype are element 0 to 4, ipv6addrstate are 5 and after. Merged both arrays to cut down size
var ipv6addrtype = ["현지 주소 연결", "네트워크 로컬 주소", "전 세계 주소", "사용자 구성", "허용되지 않음", "아빠가 진행중", "유효한", "더 이상 사용되지 않음", "선호 / 비추천", "만료", "충돌", "허용되지 않음"];
function showIPv6AddrDlg(netifid, addrstr) {
if (xxdialogMode) return;
var x = TableStart();
t = addrstr.split(',');
for (var i = 0; i < t.length; i += 3) {
x += TableEntry('<b>' + t[i] + '</b><br><span style=font-size:10px>' + ipv6addrtype[t[i + 1]] + "," + ipv6addrtype[+t[i + 2] + 5] + '</span>', '');
}
setDialogMode(11, (netifid == 0 ? "유선 인터페이스 용 IPv6 주소" : "무선 인터페이스 용 IPv6 주소"), 1, null, x + TableEnd());
}
function showIPv6StateDlg(netifid, state) {
if (xxdialogMode || !amtsysstate) return;
var zz = amtsysstate['IPS_IPv6PortSettings'].responses[netifid];
ipv6manual = (netifid == 0 && (isIpAddress(zz['IPv6Address']) || isIpAddress(zz['DefaultRouter']) || isIpAddress(zz['PrimaryDNS']) || isIpAddress(zz['SecondaryDNS'])));
QV('id_d21manualdiv', netifid == 0);
QV('id_d21subnetdiv', false);
QV('d21o0', true);
QV('d21l0', true);
QH('d21l0', "IPv6 비활성화");
QH('d21l1', "IPv6 사용, 자동");
QH('d21l2', "IPv6 사용, 자동 + 수동 주소");
d21o0.checked = !state;
d21o1.checked = state && !ipv6manual;
d21o2.checked = state && ipv6manual;
idx_d21address.value = isIpAddress(zz['IPv6Address'],'');
idx_d21gateway.value = isIpAddress(zz['DefaultRouter'],'');
idx_d21dns1.value = isIpAddress(zz['PrimaryDNS'],'');
idx_d21dns2.value = isIpAddress(zz['SecondaryDNS'],'');
setDialogMode(21, (netifid == 0 ? "유선 인터페이스에 대한 IPv6 지원" : "무선 인터페이스에 대한 IPv6 지원"), 3, function () { showIPv6StateDlgOk(netifid) })
updateIPSetupDlg();
}
function showIPv6StateDlgOk(netifid) {
var selector = '<w:SelectorSet><w:Selector Name="InstanceID">Intel(r) IPS IPv6 Settings ' + netifid + '</w:Selector></w:SelectorSet>';
var zz = amtsysstate['IPS_IPv6PortSettings'].responses[netifid];
if (netifid == 0) { // We can only set IPv6 manual address for wired interface
if (d21o1.checked) { // Fully automatic, clear all addresses
zz['IPv6Address'] = zz['DefaultRouter'] = zz['PrimaryDNS'] = zz['SecondaryDNS'] = '::';
amtstack.Put('IPS_IPv6PortSettings', zz, showIPv6StateDlgDone, null, 0, selector);
}
if (d21o2.checked) { // Manual, set addresses
zz['IPv6Address'] = (idx_d21address.value == '') ? '::' : idx_d21address.value.toLocaleLowerCase();
zz['DefaultRouter'] = (idx_d21gateway.value == '') ? '::' : idx_d21gateway.value.toLocaleLowerCase();
zz['PrimaryDNS'] = (idx_d21dns1.value == '') ? '::' : idx_d21dns1.value.toLocaleLowerCase();
zz['SecondaryDNS'] = (idx_d21dns2.value == '') ? '::' : idx_d21dns2.value.toLocaleLowerCase();
amtstack.Put('IPS_IPv6PortSettings', zz, showIPv6StateDlgDone, null, 0, selector);
}
}
// This code enables/disables IPv6 for a given interface.
var elementSettings = amtsysstate['CIM_ElementSettingData'].responses;
for (var i = 0; i < elementSettings.length; i++) {
if (elementSettings[i]['SettingData'] && elementSettings[i]['SettingData']['ReferenceParameters']['SelectorSet']['Selector']['Value'] == ('Intel(r) IPS IPv6 Settings ' + netifid)) {
var CreationClassName = getItem(elementSettings[i]['ManagedElement']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'CreationClassName').Value;
var DeviceID = getItem(elementSettings[i]['ManagedElement']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'DeviceID').Value;
var selector2 = '<w:SelectorSet><w:Selector Name="ManagedElement"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/' + CreationClassName + '</w:ResourceURI><w:SelectorSet><w:Selector Name="CreationClassName">' + CreationClassName + '</w:Selector><w:Selector Name="DeviceID">' + DeviceID + '</w:Selector><w:Selector Name="SystemCreationClassName">CIM_ComputerSystem</w:Selector><w:Selector Name="SystemName">Intel(r) AMT</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector><w:Selector Name="SettingData"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://intel.com/wbem/wscim/1/ips-schema/1/IPS_IPv6PortSettings</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">Intel(r) IPS IPv6 Settings ' + netifid + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector></w:SelectorSet>';
var clone = Clone(elementSettings[i]);
clone['IsCurrent'] = ((d21o0.checked) ? 2 : 1);
amtstack.Put('CIM_ElementSettingData', clone, showIPv6StateDlgDone, null, 0, selector2);
}
}
}
function showIPv6StateDlgDone(stack, name, response, status) {
if (status == 200) {
amtsysstate = undefined;
PullSystemStatus();
} else {
messagebox("IPv6 지원", format("IPv6 상태를 설정할 수 없습니다. 오류 {0}", status));
}
}
function showPingActionDlg() {
if (xxdialogMode) return;
var g = amtsysstate['AMT_GeneralSettings'].response;
var v = (g['PingResponseEnabled'] == true) + ((g['RmcpPingResponseEnabled'] == true) << 1);
d20a.checked = (v == 0);
d20b.checked = (v == 1);
d20c.checked = (v == 2);
d20d.checked = (v == 3);
setDialogMode(20, "인텔 &reg; AMT 핑 응답", 3, showPingActionDlgOk);
}
function showPingActionDlgOk() {
var clone = Clone(amtsysstate['AMT_GeneralSettings'].response);
var v = document.querySelector('input[name=d20]:checked').value;
clone['PingResponseEnabled'] = ((v & 1) != 0);
clone['RmcpPingResponseEnabled'] = ((v & 2) != 0);
amtstack.Put('AMT_GeneralSettings', clone, PullSystemStatus, 0, 1);
}
function showIPSetupDlg() {
if ((xxdialogMode) || (amtsysstate == null)) return;
var x = amtsysstate['AMT_EthernetPortSettings'].responses[0];
QV('id_d21ipaddrsync', amtversion > 6);
if (amtversion > 6) { Q('d21ipsync').checked = x['IpSyncEnabled']; };
QV('id_d21manualdiv', true);
QV('id_d21subnetdiv', true);
QV('d21o0', false);
QV('d21l0', false);
QH('d21l1', "DHCP 서버를 사용한 자동 구성");
QH('d21l2', "아래 IPv4 설정을 사용한 정적 구성");
d21o1.checked = (x['DHCPEnabled'] == true);
d21o2.checked = !d21o1.checked;
idx_d21address.value = isIpAddress(x['IPAddress'],'');
idx_d21subnet.value = isIpAddress(x['SubnetMask'],'');
idx_d21gateway.value = isIpAddress(x['DefaultGateway'],'');
idx_d21dns1.value = isIpAddress(x['PrimaryDNS'],'');
idx_d21dns2.value = isIpAddress(x['SecondaryDNS'],'');
updateIPSetupDlg();
setDialogMode(21, "IPv4 설정", 3, showIPSetupDlgOk)
}
function updateIPSetupDlg() {
var ok = true;
if (d21o2.checked && (Q('d21l2').innerHTML == "IPv6 사용, 자동 + 수동 주소") && (idx_d21address.value.split(':').length < 2)) { ok = false; }
QE('idx_dlgOkButton', ok);
idx_d21address.disabled = idx_d21subnet.disabled = idx_d21gateway.disabled = idx_d21dns1.disabled = idx_d21dns2.disabled = !(d21o2.checked && ((amtversion < 7) || (Q('d21ipsync').checked == false)));
}
function showIPSetupDlgOk() {
var x = Clone(amtsysstate['AMT_EthernetPortSettings'].responses[0]);
x['DHCPEnabled'] = d21o1.checked;
delete x['IPAddress'];
delete x['SubnetMask'];
delete x['DefaultGateway'];
delete x['PrimaryDNS'];
delete x['SecondaryDNS'];
if (amtversion > 6) { x['IpSyncEnabled'] = Q('d21ipsync').checked; }
if ((d21o1.checked == false) && (Q('d21ipsync').checked == false)) { // || (amtversion < 7)
x['IPAddress'] = idx_d21address.value;
x['SubnetMask'] = idx_d21subnet.value;
x['DefaultGateway'] = idx_d21gateway.value;
if (idx_d21dns1.value != '') x['PrimaryDNS'] = idx_d21dns1.value;
if (idx_d21dns2.value != '') x['SecondaryDNS'] = idx_d21dns2.value;
}
amtstack.Put('AMT_EthernetPortSettings', x, showIPSetupDlgDone, 0, 1, x);
}
function showIPSetupDlgDone(stack, name, response, status) {
if (status == 200) {
amtsysstate = undefined;
PullSystemStatus();
} else {
messagebox("IPv4 설정", format("네트워크 매개 변수를 설정할 수 없습니다. 오류 {0}", status));
}
}
// ###END###{NetworkSettings}
// ###BEGIN###{PowerControl}
//
// POWER ACTIONS
//
amtPowerBootCapabilities = null;
function showPowerActionDlg() {
if (xxdialogMode) return;
statusbox("파워 액션", "기능 확인 중 ...");
amtstack.Get('AMT_BootCapabilities', powerActionResponse00, 0, 1);
}
function showPowerActionDlg() {
if (xxdialogMode) return;
var powerState = 3;
try {
var x = amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'];
if (x == 2) { powerState = 1; } else { powerState = 2; }
} catch (ex) { }
amtPowerBootCapabilities = amtsysstate['AMT_BootCapabilities'].response;
QH('d5actionSelect', '');
if (powerState & 2) { addOption('d5actionSelect', "파워 업", 2); }
if (powerState & 1) {
addOption('d5actionSelect', "초기화", 10);
addOption('d5actionSelect', "전원 사이클", 5);
addOption('d5actionSelect', "전력 다운", 8);
}
if (amtPowerBootCapabilities['ForceDiagnosticBoot'] == true) {
if (powerState & 2) { addOption('d5actionSelect', "진단 전원 켜기", 300); }
if (powerState & 1) { addOption('d5actionSelect', "진단으로 재설정", 301); }
}
if ((amtversion > 9) && (powerState & 1)) {
addOption('d5actionSelect', "대기 모드에서 OS 웨이크", 500);
addOption('d5actionSelect', "OS 절전", 501);
addOption('d5actionSelect', "소프트 오프", 12);
addOption('d5actionSelect', "소프트 리셋", 14);
addOption('d5actionSelect', "자다", 4);
addOption('d5actionSelect', "동면", 7);
}
if (amtPowerBootCapabilities['BIOSSetup'] == true) {
if (powerState & 2) { addOption('d5actionSelect', "BIOS 전원", 100); }
if (powerState & 1) { addOption('d5actionSelect', "BIOS로 재설정", 101); }
}
if (amtPowerBootCapabilities['SecureErase'] == true) {
if (powerState & 2) { addOption('d5actionSelect', "안전한 지우기 기능", 104); }
if (powerState & 1) { addOption('d5actionSelect', "안전한 지우기로 재설정", 105); }
}
if ((amtPowerBootCapabilities['PlatformErase'] != null) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && (amtsysstate['CIM_BootService'].response['EnabledState'] & 2)) {
if (powerState & 2) { addOption('d5actionSelect', "Power up to Platform Erase", 106); }
if (powerState & 1) { addOption('d5actionSelect', "Reset to Platform Erase", 107); }
}
// ###BEGIN###{IDER}
if (powerState & 1) { addOption('d5actionSelect', "IDE-R 플로피로 재설정", 200); }
if (powerState & 2) { addOption('d5actionSelect', "IDE-R 플로피 전원 켜기", 201); }
if (powerState & 1) { addOption('d5actionSelect', "IDE-R CDROM으로 재설정", 202); }
if (powerState & 2) { addOption('d5actionSelect', "IDE-R CDROM 전원 켜기", 203); }
// ###END###{IDER}
if (powerState & 1) { addOption('d5actionSelect', "PXE로 재설정", 400); }
if (powerState & 2) { addOption('d5actionSelect', "PXE 전원 켜기", 401); }
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
if (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] === true) {
if (powerState & 1) { addOption('d5actionSelect', "Reset to HTTPS Boot", 600); }
if (powerState & 2) { addOption('d5actionSelect', "Power on to HTTPS Boot", 601); }
}
// ###END###{PowerControl-OneClick}
addOption('d5actionSelect', "맞춤 작업 ...", 999);
// ###END###{PowerControl-Advanced}
if (amtversion > 5) { addOption('d5actionSelect', "사용자 동의 ...", 998); } // On AMT 5 and higher, offer the option of doing user consent alone.
setDialogMode(5, "파워 액션", 3, powerActionDlgCheck);
}
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
function oneClickFileSelect() { QE('idx_dlgOkButton', Q('ocrfile').files.length == 1); }
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
function powerActionDlgCheck() {
AmtOcrPba = null;
AmtOcrPbaLength = 0;
var action = d5actionSelect.value;
// ###BEGIN###{PowerControl-Advanced}
// ###BEGIN###{PowerControl-OneClick}
if ((action == 600) || (action == 601)) {
// ###BEGIN###{Mode-NodeWebkit}
// If the connection to intel AMT is not TLS, warn and exit now.
if (wsstack.comm.xtlsCertificate == null) { messagebox("파워 액션", "This feature requires a TLS connection to Intel AMT"); return; }
// ###END###{Mode-NodeWebkit}
var x = "Select a disk image for remote boot." + '<br /><br /><input id=ocrfile type=file onchange=oneClickFileSelect() accept=".iso">';
setDialogMode(11, "HTTPS Boot", 3, function () {
var files = Q('ocrfile').files;
if (files.length != 1) return;
setupWebServer(urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress);
webserver.setupBootImage(files[0].path, (urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress));
powerActionDlg();
}, x);
QE('idx_dlgOkButton', false);
return;
}
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
if ((action == 500) || (action == 501)) {
// Perform OS wake from standby or OS sleep (Intel AMT 10+)
amtstack.RequestOSPowerStateChange((action == 501)?3:2, function (stack, name, response, status) {
if (status == 200) { QH('id_dialogMessage', "전원 작업이 완료되었습니다."); } else { QH('id_dialogMessage', format("전원 작업 오류 # {0}.", status)); }
setDialogMode(1, "파워 액션", 0);
setTimeout(function () { setDialogMode(0); }, 1300);
});
} else if ((action == 104) || (action == 105)) {
var x = ("Intel&reg; Remote Secure Erase 실행을 확인 하시겠습니까?" + '<br>' + "필요한 경우 보안 지우기 비밀번호를 입력하십시오." + '<br>');
x += ('<br><div style=height:16px><input type=password id=rsepass maxlength=32 style=float:right;width:240px><div>' + "암호" + '</div></div>');
x += ('<br><div style=color:red>' + "<b> 경고 : </ b> 원격 시스템의 데이터를 지 웁니다." + '</div>');
// ###BEGIN###{Mode-NodeWebkit}
if (wsstack.comm.xtlsFingerprint == null) { x += ('<div style=color:red>' + "<b> 경고 : </ b> TLS가 사용되지 않으며 비밀번호는 일반 상태로 전송됩니다." + '</div>'); }
// ###END###{Mode-NodeWebkit}
rsepass = 1;
setDialogMode(11, "파워 액션", 3, powerActionDlg, x);
} else if ((action == 106) || (action == 107)) {
powerActionDlgRPE();
// ###BEGIN###{PowerControl-OneClick}
} else if ((action == 999) && (amtversion >= 15)) {
statusbox("파워 액션", "Checking boot sources...");
amtstack.BatchEnum('', ['CIM_BootSourceSetting'], powerActionDlgCheck00, true);
// ###END###{PowerControl-OneClick}
} else {
powerActionDlg();
}
}
function powerActionDlgRPE(advanced) {
var x = ("Confirm execution of Intel&reg; Remote Platform Erase?" + '<br>');
x += ('<br><div style=color:red>' + "<b> 경고 : </ b> 원격 시스템의 데이터를 지 웁니다." + '</div>');
var actionTaken = [], platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'];
if (platfromEraseSupport & (1 << 1)) { actionTaken.push('<label><input id=rpef1 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Pyrite Revert" + '</label>'); }
if (platfromEraseSupport & (1 << 2)) { actionTaken.push('<label><input id=rpef2 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Secure Erase All SSDs" + '</label>'); }
if (platfromEraseSupport & (1 << 3)) { actionTaken.push('<label><input id=rpef3 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Verify Storage Erase" + '</label>'); }
if (platfromEraseSupport & (1 << 6)) { actionTaken.push('<label><input id=rpef6 type=checkbox onchange=powerActionDlgRPEValidate()>' + "TPM Clear" + '</label>'); }
if (platfromEraseSupport & (1 << 16)) { actionTaken.push('<label><input id=rpef16 type=checkbox onchange=powerActionDlgRPEValidate()>' + "OEM Custom Action" + '</label>'); }
if (platfromEraseSupport & (1 << 25)) { actionTaken.push('<label><input id=rpef25 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Clear BIOS NVM Variables" + '</label>'); }
if (platfromEraseSupport & (1 << 26)) { actionTaken.push('<label><input id=rpef26 type=checkbox onchange=powerActionDlgRPEValidate()>' + "BIOS Reload of Golden Configuration" + '</label>'); }
if (platfromEraseSupport & (1 << 31)) { actionTaken.push('<label><input id=rpef31 type=checkbox onchange=powerActionDlgRPEValidate()>' + "CSME Unconfigure" + '</label>'); }
if (actionTaken.length > 0) { x += (format('<br />' + "Select the actions to take:" + '<br /><br /><div style=margin-left:16px>{0}</div><br />', actionTaken.join('<br />'))); }
x += '<div id=rpepsid style=margin-top:4px;margin-bottom:4px;display:none>' + addHtmlValue("Pyrite PSID", '<input id=rpepsidx style=width:210px maxlength=64 type=input>') + '</div>';
x += '<div id=rpessdpass style=margin-top:4px;margin-bottom:4px;display:none>' + addHtmlValue("SSD Master Password", '<input id=rpessdpassx style=width:210px maxlength=64 type=input>') + '</div>';
x += '<div id=rpeeomdata style=margin-top:4px;margin-bottom:4px;display:none>' + addHtmlValue("OEM Data (HEX)", '<input id=rpeoemdatax style=width:210px maxlength=256 type=input>') + '</div>';
setDialogMode(11, "파워 액션", 3, powerActionDlgRPEEx, x, advanced);
QE('idx_dlgOkButton', false);
}
function powerActionDlgRPEValidate() {
var rpeFlags = 0, platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'], sf = [1, 2, 3, 6, 16, 25, 26, 31];
for (var i in sf) { if (platfromEraseSupport & (1 << sf[i])) { if (Q('rpef' + sf[i]).checked) { rpeFlags += (1 << sf[i]); } } }
QV('rpessdpass', rpeFlags & 4);
QV('rpeeomdata', rpeFlags & (1 << 16));
QE('idx_dlgOkButton', rpeFlags);
}
var platfromEraseTLV = null;
function powerActionDlgRPEEx(b, advanced) {
var rpeFlags = 0, platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'], sf = [1, 2, 3, 6, 16, 25, 26, 31];
for (var i in sf) { if (platfromEraseSupport & (1 << sf[i])) { if (Q('rpef' + sf[i]).checked) { rpeFlags += (1 << sf[i]); } } }
var tlv = makeUefiBootParam(1, rpeFlags, 4), tlvlen = 1;
if (rpeFlags & 2) { tlv += makeUefiBootParam(10, Q('rpepsidx').value); tlvlen++; }
if (rpeFlags & 4) { tlv += makeUefiBootParam(20, Q('rpessdpassx').value); tlvlen++; }
if ((rpeFlags & (1 << 16)) && (Q('rpeoemdatax').value != '')) { tlv += makeUefiBootParam(20, hex2rstr(Q('rpeoemdatax').value), null, 11); tlvlen++; }
platfromEraseTLV = { tlv: btoa(tlv), tlvlen: tlvlen };
if (advanced) {
// Attempt user consent
statusbox("파워 액션", "상태 확인 중 ...");
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
} else {
powerActionDlg();
}
}
// ###BEGIN###{PowerControl-OneClick}
var AmtOcrPba = null;
var AmtOcrPbaLength = 0;
function powerActionDlgCheck00(stack, name, response, status) {
if (status != 200) { messagebox("파워 액션", format("GET CIM_BootSourceSetting, Error #{0}", status) + ((response.Header && response.Header.WsmanError) ? (', ' + response.Header.WsmanError) : '')); return; }
var bootSources = response.CIM_BootSourceSetting.responses;
AmtOcrPba = {};
for (var i = 0; i < bootSources.length; i++) {
var instanceid = bootSources[i]['InstanceID'];
if ((instanceid != null) && instanceid.toString().startsWith('Intel(r) AMT: Force OCR UEFI Boot')) {
try {
var arr = instanceid.trim().split(' ');
idx = parseInt(arr[arr.length - 1]);
AmtOcrPba[parseInt(idx)] = { instance: bootSources[i]['BIOSBootString'], bootstr: bootSources[i]['BootString'] };
AmtOcrPbaLength++;
} catch (e) { }
}
}
powerActionDlg();
}
// ###END###{PowerControl-OneClick}
function powerActionDlg() {
//if (amtversion == 0) return;
//if (amtversion > 6) { amtstack.Get('IPS_OptInService', powerActionResponse0); } else { amtstack.Get('AMT_BootSettingData', powerActionResponse1); }
var action = d5actionSelect.value;
// ###BEGIN###{PowerControl-Advanced}
if (action == 999) { showAdvPowerDlg(); return; }
// ###END###{PowerControl-Advanced}
if (action == 998) { amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1); return; }
// Some actions will not work if KVM/SOL/IDER are connected. If we perform these, disconnect now.
if ((action < 10) && (action > 2) && (urlvars['noredirdisconnect'] == null)) {
// ###BEGIN###{Desktop}
if (desktop.State == 3) connectDesktop();
// ###END###{Desktop}
// ###BEGIN###{Terminal}
if (terminal.State == 3) connectTerminal();
// ###END###{Terminal}
// ###BEGIN###{IDER}
if ((ider != undefined) && (ider.state == 3)) iderStop();
// ###END###{IDER}
}
statusbox("파워 액션", "상태 확인 중 ...");
if ((rsepass != null) && (rsepass === 1)) { rsepass = Q('rsepass').value; }
var uc = true; // Check if we need to ask for user consent
if (amtversion < 6) uc = false; // Below AMT 6, user consent does not exist.
if ((currentView == 13) && (action == 8)) uc = false; // if in terminal, don't ask for it if power down.
if ((currentView != 13) && (action <= 10)) uc = false; // if not in terminal, don't ask for basic operations.
if (uc) {
// Attempt user consent
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
} else {
// Skip user consent
amtstack.Get('AMT_BootSettingData', powerActionResponse1, 0, 1);
}
}
// ###BEGIN###{PowerControl-Advanced}
var AvdPowerDlg;
function showAdvPowerDlg() {
try { Q('idx_d24Command').value = (amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] == 2)?10:2; } catch (ex) { }
// Available force boot options
var forceBootDeviceOptions = '<option value=0>None</option><option id="ForceDVDBootOption" value=1>Force CD/DVD Boot</option><option id="ForcePXEBootOption" value=2>Force PXE Boot</option><option id="ForceHDBootOption" value=3>Force Hard Disk Boot</option><option id="ForceDiagBootOption" value=4>Force Diagnostic Boot</option>';
// Show boot capabilities
QV('d24dBiosPause', amtPowerBootCapabilities['BIOSPause'] == true);
QV('d24dBiosSecureBoot', amtPowerBootCapabilities['BIOSSecureBoot'] == true);
QV('d24dReflashBios', amtPowerBootCapabilities['BIOSReflash'] == true);
QV('d24dBiosSetup', amtPowerBootCapabilities['BIOSSetup'] == true);
QV('ForceDVDBootOption', amtPowerBootCapabilities['ForceCDorDVDBoot'] == true);
QV('ForceDiagBootOption', amtPowerBootCapabilities['ForceDiagnosticBoot'] == true);
QV('ForceHDBootOption', amtPowerBootCapabilities['ForceHardDriveBoot'] == true);
//QV('', amtPowerBootCapabilities['ForceHardDriveSafeModeBoot'] == true);
//QV('', amtPowerBootCapabilities['ForceWinREBoot'] == true);
QV('ForcePXEBootOption', amtPowerBootCapabilities['ForcePXEBoot'] == true);
// ###BEGIN###{PowerControl-OneClick}
if ((AmtOcrPbaLength > 0) && (amtPowerBootCapabilities['ForceUEFIPBABoot'] == true)) {
forceBootDeviceOptions += '<option id="ForceUEFIBootOption" value=5>Force OCR UEFI Boot Option</option>';
var x = '';
for (var i in AmtOcrPba) { x += '<option value=' + i + '>' + AmtOcrPba[i].instance + '</option>'; }
QH('idx_d24customBootMediaIndex', x);
}
var httpsBootPossible = ((meshCentralServer == null) && (wsstack.comm.xtlsCertificate != null)) || (meshCentralServer!=null && ((currentcomputer.conn & 4) == 4) && currentcomputer.tls == 1) || (meshCentralServer!=null && ((currentcomputer.conn & 2) == 2) )
if ((amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible) { forceBootDeviceOptions += '<option id="ForceHttpBootOption" value=6>Force OCR UEFI HTTPS Boot (.iso)</option>'; }
if ((amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible) { forceBootDeviceOptions += '<option id="ForceHttpUrlBootOption" value=7>Force OCR UEFI HTTPS Boot (url)</option>'; }
// ###END###{PowerControl-OneClick}
QV('d24dForceProgressEvents', amtPowerBootCapabilities['ForcedProgressEvents'] == true);
QV('d24dUseIDER', amtPowerBootCapabilities['IDER'] == true);
QV('d24dLockKeyboard', amtPowerBootCapabilities['KeyboardLock'] == true);
QV('d24dLockPowerButton', amtPowerBootCapabilities['PowerButtonLock'] == true);
QV('d24dLockResetButton', amtPowerBootCapabilities['ResetButtonLock'] == true);
QV('d24dSerialOverLan', amtPowerBootCapabilities['SOL'] == true);
QV('d24dSecureErase', amtPowerBootCapabilities['SecureErase'] == true);
QV('d24dPlatformErase', (amtPowerBootCapabilities['PlatformErase'] != null) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && ((amtsysstate['CIM_BootService'].response['EnabledState'] & 2) != 0));
QV('d24dFirmwareReset', amtPowerBootCapabilities['ConfigurationDataReset'] == true);
QV('d24dLockSleepButton', amtPowerBootCapabilities['SleepButtonLock'] == true);
QV('d24dUserPasswordBypass', amtPowerBootCapabilities['UserPasswordBypass'] == true);
QV('idx_d24Verbocity1', amtPowerBootCapabilities['VerbosityQuiet'] == true);
QV('idx_d24Verbocity2', amtPowerBootCapabilities['VerbosityVerbose'] == true);
QV('idx_d24Verbocity3', amtPowerBootCapabilities['VerbosityScreenBlank'] == true);
QV('d24p500', amtversion > 9);
QV('d24p501', amtversion > 9);
QH('idx_d24ForceBootDevice', forceBootDeviceOptions);
setDialogMode(24, "커스텀 파워 액션", 3, showAdvPowerDlgOk);
showAdvPowerDlgChange();
}
function showAdvPowerDlgChange() {
var ok = true;
QV('idd_d24IDERBootDevice', Q('d24UseIDER').checked);
QV('idd_d24RSEPass', Q('d24SecureErase') ? Q('d24SecureErase').checked : false);
// ###BEGIN###{Mode-NodeWebkit}
QV('idd_d24RSEPassTlsWarn', (wsstack.comm.xtlsFingerprint == null) && (Q('d24SecureErase') ? Q('d24SecureErase').checked : false));
// ###END###{Mode-NodeWebkit}
// If this is a OS power state change, gray out all of the options.
var ospower = ((Q('idx_d24Command').value >= 500) && (Q('idx_d24Command').value < 600));
QE('idx_d24ForceBootDevice', !ospower);
QE('idx_d24BootMediaIndex', !ospower);
QE('idd_d24IDERBootDevice', !ospower);
QE('idx_d24Verbocity', !ospower);
QE('idd_d24RSEPass', !ospower);
// If the boot source is not "None" (0), disable all boot settings.
//var bootSettingOpts = ['d24BiosPause', 'd24BiosSecureBoot', 'd24BiosSetup', 'd24ForceProgressEvents', 'd24LockPowerButton', 'd24LockResetButton', 'd24LockSleepButton', 'd24LockKeyboard', 'd24UserPasswordBypass', 'd24ReflashBios', 'd24SafeMode', 'd24UseIDER', 'd24SerialOverLan', 'd24SecureErase'];
//if ((idx_d24ForceBootDevice.value > 0) && (idx_d24ForceBootDevice.value < 5)) { for (var i in bootSettingOpts) { Q(bootSettingOpts[i]).checked = false; } }
//for (var i in bootSettingOpts) { QE(bootSettingOpts[i], idx_d24ForceBootDevice.value == 0); }
// ###BEGIN###{PowerControl-OneClick}
var bootSourceIndex = Q('idx_d24ForceBootDevice').value;
QV('idx_d24bootSource', bootSourceIndex < 5);
QV('idx_d24customBootSource', bootSourceIndex == 5)
QV('idx_d24diskImage', bootSourceIndex == 6);
QV('idx_d24diskImageUrl', bootSourceIndex == 7);
QV('idx_d24diskImageHttpTimeout', (bootSourceIndex == 7) && (amtversion > 16));
if ((bootSourceIndex == 6) && (Q('idx_d24ocrBootFile').files.length != 1)) { ok = false; }
if ((bootSourceIndex == 7) && (Q('idx_d24ocrBootUrl').value.trim().toLowerCase().startsWith('https://') == false)) { ok = false; }
if ((bootSourceIndex == 7) && (amtversion > 16)) {
var timeout = parseInt(Q('idx_d24ocrBootHttpBootTimeout').value);
if (isNaN(timeout) || (timeout > 65535) || (timeout < 0)) { ok = false; }
}
// ###END###{PowerControl-OneClick}
QE('idx_dlgOkButton', ok);
}
function showAdvPowerDlgOk() {
// ###BEGIN###{PowerControl-OneClick}
var forceBootSelection = Q('idx_d24ForceBootDevice').value;
// ###BEGIN###{Mode-NodeWebkit}
if (((forceBootSelection == 5) || (forceBootSelection == 6) || (forceBootSelection == 7)) &&
(((meshCentralServer == null) && (wsstack.comm.xtlsCertificate == null)) || (meshCentralServer!=null && ((currentcomputer.conn & 4) == 4) && currentcomputer.tls == 0))) {
messagebox("파워 액션", "This feature requires a TLS connection to Intel AMT"); return;
}
// ###END###{Mode-NodeWebkit}
if (forceBootSelection == 6) {
var files = Q('idx_d24ocrBootFile').files;
if (files.length == 1) {
setupWebServer(urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress);
webserver.setupBootImage(files[0].path, (urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress));
}
}
// ###END###{PowerControl-OneClick}
var action = Q('idx_d24Command').value;
if ((action == 500) || (action == 501)) {
// Perform OS wake from standby or OS sleep (Intel AMT 10+)
amtstack.RequestOSPowerStateChange((action == 501) ? 3 : 2, function (stack, name, response, status) {
if (status == 200) { QH('id_dialogMessage', "전원 작업이 완료되었습니다."); } else { QH('id_dialogMessage', format("전원 작업 오류 # {0}.", status)); }
setDialogMode(1, "파워 액션", 0);
setTimeout(function () { setDialogMode(0); }, 1300);
});
} else {
// Fetch all of the user data
AvdPowerDlg = {};
AvdPowerDlg.Action = Q('idx_d24Command').value;
AvdPowerDlg.BIOSPause = Q('d24BiosPause').checked;
AvdPowerDlg.BIOSSecureBoot = Q('d24BiosSecureBoot').checked;
AvdPowerDlg.BIOSSetup = Q('d24BiosSetup').checked;
AvdPowerDlg.BootMediaIndex = Q('idx_d24BootMediaIndex').value;
AvdPowerDlg.FirmwareVerbosity = Q('idx_d24Verbocity').value;
AvdPowerDlg.ForcedProgressEvents = Q('d24ForceProgressEvents').checked;
AvdPowerDlg.IDERBootDevice = Q('idx_d24IDERBootDevice').value; // 0 = Boot on Floppy, 1 = Boot on IDER
AvdPowerDlg.LockKeyboard = Q('d24LockKeyboard').checked;
AvdPowerDlg.LockPowerButton = Q('d24LockPowerButton').checked;
AvdPowerDlg.LockResetButton = Q('d24LockResetButton').checked;
AvdPowerDlg.LockSleepButton = Q('d24LockSleepButton').checked;
AvdPowerDlg.ReflashBIOS = Q('d24ReflashBios').checked;
AvdPowerDlg.UseIDER = Q('d24UseIDER').checked;
AvdPowerDlg.UseSOL = Q('d24SerialOverLan').checked;
AvdPowerDlg.UseSafeMode = Q('d24SafeMode').checked;
AvdPowerDlg.UserPasswordBypass = Q('d24UserPasswordBypass').checked;
AvdPowerDlg.SecureErase = Q('d24SecureErase').checked;
AvdPowerDlg.PlatformErase = Q('d24PlatformErase').checked
AvdPowerDlg.FirmwareReset = Q('d24FirmwareReset').checked;
if ((AvdPowerDlg.SecureErase === true) && (Q('d24rsepass').value.length > 0)) { AvdPowerDlg.RSEPassword = Q('d24rsepass').value; }
if (AvdPowerDlg.PlatformErase === true) {
// Ask additional information about RPE
powerActionDlgRPE(true);
} else {
// Attempt user consent
statusbox("파워 액션", "상태 확인 중 ...");
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
}
}
}
// ###END###{PowerControl-Advanced}
function powerActionResponse0(stack, name, response, status) {
//if (errcheck(status, stack)) return; // TODO: If AMT 5 or below, this will error and we need to skip user consent.
if (status != 200) {
if (connectDesktopConsent) { connectDesktop(true); } else { messagebox("파워 액션", format("오류 # {0}", status)); }
return;
}
//console.log('powerActionResponse0(' + name + ',' + ObjectToString2(response) + ',' + status + ')');
//console.log("OptInRequired:", response.Body['OptInRequired']);
//console.log("OptInState:", response.Body['OptInState']);
//console.log(response);
if (((response.Body['OptInRequired'] == 0xFFFFFFFF) || (connectDesktopConsent && (response.Body['OptInRequired'] != 0))) && (response.Body['OptInState'] != 3) && (response.Body['OptInState'] != 4)) {
if (response.Body['OptInState'] == 2) {
amtstack.IPS_OptInService_CancelOptIn(null);
d6ConsentText.value = ''; // Reset user consent code to empty
setDialogMode(6, "사용자 동의", 11, powerActionSendConsent);
checkConsentDisplay();
consentChanged();
return;
}
//console.log("Opt-in Required.", response.Body['OptInRequired']);
statusbox("파워 액션", "옵트 인 시작 중 ...");
amtstack.IPS_OptInService_StartOptIn(powerActionResponseC1, 0, 1);
} else {
if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); return; }
if (d5actionSelect.value == 998) { messagebox("사용자 동의", "사용자 동의가 필요하지 않습니다."); return; }
statusbox("파워 액션", "부팅 설정 가져 오기 ...");
amtstack.Get('AMT_BootSettingData', powerActionResponse1, 0, 1);
}
}
function powerActionResponseC1(stack, name, response, status) {
//if (errcheck(status, stack)) return;
//console.log('powerActionResponseC1', name, status, response);
if (status != 200) { if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); } else { messagebox("파워 액션", format("오류 #", status)); } return; }
//console.log("powerActionResponseC1(" + name + "," + ObjectToString2(response) + "," + status + ")");
if (response.Body['ReturnValue'] != 0) {
if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); } else { messagebox("사용자 동의 오류", response.Body.ReturnValueStr.replace(/_/g, ' ')); }
} else {
d6ConsentText.value = ''; // Reset user consent code to empty
setDialogMode(6, "사용자 동의", 11, powerActionSendConsent);
checkConsentDisplay();
consentChanged();
// Check if the machine is powered down, if it is, power it up for user consent.
amtstack.Enum('CIM_ServiceAvailableToElement', function(stack, name, responses, status) {
if (errcheck(status, stack)) return;
amtsysstate['CIM_ServiceAvailableToElement'].responses = responses;
updateSystemStatus();
if ((amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0)) {
if (amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] != 2) {
// System is not on, power it on now.
amtstack.RequestPowerStateChange(2, function (stack, name, response, status) { });
}
}
});
}
}
//function powerActionCancelConsent() { amtstack.IPS_OptInService_CancelOptIn(null); }
function powerActionSendConsent(buttons) {
console.log('powerActionSendConsent', buttons);
if (buttons == 0) {
// Cancel button
amtstack.IPS_OptInService_CancelOptIn(function () { });
connectDesktopConsent = false;
desktop.Stop();
} else {
// OK Button
statusbox("파워 액션", "사용자 동의를 보내는 중 ...");
amtstack.IPS_OptInService_SendOptInCode(d6ConsentText.value, powerActionResponseC2, 0, 1);
}
}
function powerActionResponseC2(stack, name, response, status) {
//if (errcheck(status, stack)) return;
if (status != 200) { messagebox("파워 액션", format("오류 # {0}", status)); return; }
//console.log("powerActionResponseC2(" + name + "," + ObjectToString2(response) + "," + status + ")");
if (response.Body['ReturnValue'] != 0) {
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
} else {
if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); return; }
if (d5actionSelect.value == 998) { messagebox("사용자 동의", "사용자 동의에 성공했습니다."); return; } // This was just a user consent request, no need to go further.
statusbox("파워 액션", "상태 확인 중 ...");
amtstack.Get('AMT_BootSettingData', powerActionResponse1, 0, 1);
}
}
function powerActionResponse1(stack, name, response, status) {
//if (errcheck(status, stack)) return;
if (status != 200) { messagebox("파워 액션", format("오류 # {0}", status)); return; }
//console.log("powerActionResponse1(" + name + "," + ObjectToString2(response) + "," + status + ")");
var action = d5actionSelect.value;
var r = response.Body;
r['ConfigurationDataReset'] = false;
// Clean up parameters
delete r['WinREBootEnabled'];
delete r['UEFILocalPBABootEnabled'];
delete r['UEFIHTTPSBootEnabled'];
delete r['SecureBootControlEnabled'];
delete r['BootguardStatus'];
delete r['OptionsCleared'];
delete r['BIOSLastStatus'];
delete r['UefiBootParametersArray'];
delete r['RPEEnabled'];
// ###BEGIN###{PowerControl-Advanced}
if (action == 999) {
r['BIOSPause'] = AvdPowerDlg.BIOSPause;
r['EnforceSecureBoot'] = AvdPowerDlg.BIOSSecureBoot;
r['BIOSSetup'] = AvdPowerDlg.BIOSSetup;
r['BootMediaIndex'] = AvdPowerDlg.BootMediaIndex;
r['FirmwareVerbosity'] = AvdPowerDlg.FirmwareVerbosity;
r['ForcedProgressEvents'] = AvdPowerDlg.ForcedProgressEvents;
r['IDERBootDevice'] = AvdPowerDlg.IDERBootDevice; // 0 = Boot on Floppy, 1 = Boot on IDER
r['LockKeyboard'] = AvdPowerDlg.LockKeyboard;
r['LockPowerButton'] = AvdPowerDlg.LockPowerButton;
r['LockResetButton'] = AvdPowerDlg.LockResetButton;
r['LockSleepButton'] = AvdPowerDlg.LockSleepButton;
r['ReflashBIOS'] = AvdPowerDlg.ReflashBIOS;
r['UseIDER'] = AvdPowerDlg.UseIDER;
r['UseSOL'] = AvdPowerDlg.UseSOL;
r['UseSafeMode'] = AvdPowerDlg.UseSafeMode;
r['UserPasswordBypass'] = AvdPowerDlg.UserPasswordBypass;
if (r['SecureErase'] != null) {
r['SecureErase'] = ((AvdPowerDlg.SecureErase) && (amtPowerBootCapabilities['SecureErase'] == true));
if ((r['SecureErase'] == true) && (AvdPowerDlg.RSEPassword)) { r['RSEPassword'] = AvdPowerDlg.RSEPassword; }
}
if (r['PlatformErase'] != null) {
if ((amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && (amtsysstate['CIM_BootService'].response['EnabledState'] & 2) && ((AvdPowerDlg.PlatformErase) && (amtPowerBootCapabilities['PlatformErase'] != null) && ((amtPowerBootCapabilities['PlatformErase'] & 1) != 0))) {
r['PlatformErase'] = true;
r['UefiBootParametersArray'] = platfromEraseTLV.tlv;
r['UefiBootNumberOfParams'] = platfromEraseTLV.tlvlen;
} else {
r['PlatformErase'] = false;
}
}
if (r['ConfigurationDataReset'] != null) { r['ConfigurationDataReset'] = AvdPowerDlg.FirmwareReset; }
} else {
// ###END###{PowerControl-Advanced}
r['BIOSPause'] = false;
r['EnforceSecureBoot'] = false;
r['BIOSSetup'] = (action > 99 && action < 104);
r['BootMediaIndex'] = 0;
r['FirmwareVerbosity'] = 0;
r['ForcedProgressEvents'] = false;
r['IDERBootDevice'] = ((action == 202) || (action == 203))?1:0; // 0 = Boot on Floppy, 1 = Boot on IDER
r['LockKeyboard'] = false;
r['LockPowerButton'] = false;
r['LockResetButton'] = false;
r['LockSleepButton'] = false;
r['ReflashBIOS'] = false;
r['UseIDER'] = ((action > 199) && (action < 300));
//r['UseSOL'] = ((currentView == 13) && (action != 8) && (action != 300) && (action != 301)); // If we are looking at the terminal, turn on SOL. SOL can't be used with diagnostic mode (300/301)
r['UseSOL'] = ((currentView == 13) && (action != 8) && (action < 300)); // If we are looking at the terminal, turn on SOL.
r['UseSafeMode'] = false;
r['UserPasswordBypass'] = false;
if (r['SecureErase'] != null) {
r['SecureErase'] = (((action == 104) || (action == 105)) && (amtPowerBootCapabilities['SecureErase'] == true));
if ((r['SecureErase'] === true) && (rsepass.length > 0)) { r['RSEPassword'] = rsepass; }
}
if (r['PlatformErase'] != null) {
if ((amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && (amtsysstate['CIM_BootService'].response['EnabledState'] & 2) && (((action == 106) || (action == 107)) && (amtPowerBootCapabilities['PlatformErase'] != null) && (((amtPowerBootCapabilities['PlatformErase'] & 1)) != 0))) {
r['PlatformErase'] = true;
r['UefiBootParametersArray'] = platfromEraseTLV.tlv;
r['UefiBootNumberOfParams'] = platfromEraseTLV.tlvlen;
} else {
r['PlatformErase'] = false;
}
}
if (r['ConfigurationDataReset'] != null) { r['ConfigurationDataReset'] = false; }
rsepass = null;
// ###BEGIN###{PowerControl-Advanced}
}
// ###BEGIN###{PowerControl-OneClick}
// Add OCR TLV parameters if firmware supports OCR and Force HTTPS Boot is requested
if ((action == 999) && (Q('idx_d24ForceBootDevice').value == 7)) { // Force UEFI HTTPS Boot using URL
const bootUrl = new URL(Q('idx_d24ocrBootUrl').value.trim());
const bootUrlUsername = bootUrl.username;
const bootUrlPassword = bootUrl.password;
bootUrl.username = bootUrl.password = '';
var uefiParams = makeUefiBootParam(1, bootUrl.href) + makeUefiBootParam(20, 1, 1) + makeUefiBootParam(30, 0, 2);
if (bootUrlUsername != '') { uefiParams += makeUefiBootParam(40, bootUrlUsername); } // HTTP basic auth username
if (bootUrlPassword != '') { uefiParams += makeUefiBootParam(41, bootUrlPassword); } // HTTP basic auth password
if (amtversion > 16) {
var timeout = parseInt(Q('idx_d24ocrBootHttpBootTimeout').value);
if (timeout > 0) { uefiParams += makeUefiBootParam(30, timeout, 2); }
}
r['UefiBootParametersArray'] = btoa(uefiParams);
r['UefiBootNumberOfParams'] = 3;
r['BootMediaIndex'] = 0; // Do not use boot media index for One Click Recovery (OCR)
} else if ((action == 600) || (action == 601) || ((action == 999) && (Q('idx_d24ForceBootDevice').value == 6))) { // Force UEFI HTTPS Boot
// Check if using built-in webserver or external webserver
r['UefiBootParametersArray'] = webserver.lastBootImageArgs.args;
r['UefiBootNumberOfParams'] = webserver.lastBootImageArgs.argscount;
r['BootMediaIndex'] = 0; // Do not use boot media index for One Click Recovery (OCR)
} else if ((action == 999) && (Q('idx_d24ForceBootDevice').value == 5)) {
var bootstr = AmtOcrPba[Q('idx_d24customBootMediaIndex').value].bootstr;
console.log('OCR BootStr: ' + bootstr);
r['UefiBootParametersArray'] = btoa(makeUefiBootParam(2, bootstr) + makeUefiBootParam(3, bootstr.length, 2)); // EFI_DEVICE_PATH (2) + EFI_DEVICE_PATH-LENGTH (3)
r['UefiBootNumberOfParams'] = 2;
r['BootMediaIndex'] = 0; // Do not use boot media index for One Click Recovery (OCR)
}
// ###END###{PowerControl-OneClick}
// ###END###{PowerControl-Advanced}
//if (((action == 104) || (action == 105)) && !r['SecureErase']) { /*console.log("This Intel&reg; AMT does not support Secure Erase");*/ cleanup(); return; }
console.log("부팅 동작 : " + action);
console.log("부팅 설정 설정 : " + ObjectToString2(r));
statusbox("파워 액션", "부팅 설정 ...");
// Set the boot order to null, this is needed for some AMT versions that don't clear this automatically.
amtstack.CIM_BootConfigSetting_ChangeBootOrder(null, function (stack, name, response, status) {
if (status != 200) { messagebox("파워 액션", format("PUT CIM_BootConfigSetting_ChangeBootOrder, Error #{0}", status) + ((response.Header && response.Header.WsmanError) ? (', ' + response.Header.WsmanError) : '')); return; }
if (response.Body['ReturnValue'] != 0) { messagebox("Change Boot Order", "(1) Change Boot Order returns "+ response.Body.ReturnValueStr); return; }
amtstack.Put('AMT_BootSettingData', r, powerActionResponse2, 0, 1);
}, 0, 1);
}
function powerActionResponse2(stack, name, response, status, tag) {
//console.log("powerActionResponse2(" + name + "," + response + "," + status + ")");
if (status != 200) { messagebox("파워 액션", format("PUT AMT_BootSettingData, 오류 # {0}", status) + ((response.Header && response.Header.WsmanError) ? (', ' + response.Header.WsmanError) : '')); return; }
//if (status == 408) { messagebox("Power Action", "Access denied."); return; }
//if (errcheck(status, stack)) return;
//console.log("Setup next boot...");
statusbox("파워 액션", "다음 부팅 설정 중 ...");
amtstack.SetBootConfigRole(1, powerActionResponse3x, 0, 1);
}
function powerActionResponse3x(stack, name, response, status) {
//console.log("powerActionResponse3x(" + name + "," + response + "," + status + ")");
var action = d5actionSelect.value, bootSource = null;
// ###BEGIN###{PowerControl-Advanced}
if (action == 999) {
// ###BEGIN###{!PowerControl-OneClick}
if (idx_d24ForceBootDevice.value > 0) { bootSource = ['Force CD/DVD Boot', 'Force PXE Boot', 'Force Hard-drive Boot', 'Force Diagnostic Boot'][idx_d24ForceBootDevice.value - 1]; }
// ###END###{!PowerControl-OneClick}
// ###BEGIN###{PowerControl-OneClick}
if (idx_d24ForceBootDevice.value > 0) { bootSource = ['Force CD/DVD Boot', 'Force PXE Boot', 'Force Hard-drive Boot', 'Force Diagnostic Boot', 'Force OCR UEFI Boot Option ' + Q('idx_d24customBootMediaIndex').value, 'Force OCR UEFI HTTPS Boot', 'Force OCR UEFI HTTPS Boot'][idx_d24ForceBootDevice.value - 1]; }
// ###END###{PowerControl-OneClick}
} else {
// ###END###{PowerControl-Advanced}
if (action == 300 || action == 301) { bootSource = 'Force Diagnostic Boot'; }
if (action == 400 || action == 401) { bootSource = 'Force PXE Boot'; }
// ###BEGIN###{PowerControl-Advanced}
if (action == 600 || action == 601) { bootSource = 'Force OCR UEFI HTTPS Boot'; }
}
// Resetting Force boot data in case it was changed so that it won't be used on the next power action
Q('idx_d24ForceBootDevice').value = 0;
// ###END###{PowerControl-Advanced}
console.log('ChangeBootOrder: ' + bootSource);
amtstack.CIM_BootConfigSetting_ChangeBootOrder((bootSource == null)?bootSource:'<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootSourceSetting</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">Intel(r) AMT: ' + bootSource + '</Selector></SelectorSet></ReferenceParameters>', powerActionResponse3);
}
var targetPowerAction = 0;
function powerActionResponse3(stack, name, response, status) {
//console.log('powerActionResponse3(' + name + ',' + response + ',' + status + ')');
if (errcheck(status, stack)) return;
if (response.Body['ReturnValue'] != 0) { messagebox("Change Boot Order", "(2) Change Boot Order returns "+ response.Body.ReturnValueStr); return; }
//console.log("Performing Power State Change...");
statusbox("파워 액션", "전원 작업 수행 중 ...");
var action = d5actionSelect.value;
if (action == 100 || action == 201 || action == 203 || action == 300 || action == 401 || action == 601) action = 2; // Power up
if (action == 101 || action == 200 || action == 202 || action == 301 || action == 400 || action == 600) action = 10; // Reset
if (action == 104) action = 2; // Power on with Remote Secure Erase
if (action == 105) action = 10; // Reset with Remote Secure Erase
if (action == 106) action = 2; // Power on with Remote Platfrom Erase
if (action == 107) action = 10; // Reset with Remote Platfrom Erase
// ###BEGIN###{PowerControl-Advanced}
if (action == 999) action = AvdPowerDlg.Action;
targetPowerAction = action;
//console.log('RequestPowerStateChange:' + action);
if (action == 11) { action = 10; }
if (action < 999) { console.log('RequestPowerStateChange(' + action + ')'); amtstack.RequestPowerStateChange(action, powerActionResponse4); } else { messagebox("파워 액션", "다음 부팅 동작 세트"); }
// ###END###{PowerControl-Advanced}
// ###BEGIN###{!PowerControl-Advanced}
targetPowerAction = action;
amtstack.RequestPowerStateChange(action, powerActionResponse4);
// ###END###{!PowerControl-Advanced}
}
function powerActionResponse4(stack, name, response, status) {
//console.log("powerActionResponse4(" + name + "," + response + "," + status + ")");
if (status == 200) {
// Done!
//console.log("Action Completed.");
QH('id_dialogMessage', "전원 작업이 완료되었습니다.");
setDialogMode(1, "파워 액션", 0);
setTimeout(function() { setDialogMode(0); }, 1300);
}
// console.log("Power State Error: " + status);
// Sometimes Intel AMT with not respond and this will timeout. Try to pull the power state
amtstack.Get('CIM_AssociatedPowerManagementService', powerActionResponse5, 0, 1);
}
function powerActionResponse5(stack, name, response, status) {
//console.log("powerActionResponse5(" + name + "," + response + "," + status + ")");
/*
if (errcheck(status, stack)) return;
var powerstate = parseInt(response.Body['PowerState']);
console.log("powerstate: " + powerstate);
if (targetPowerAction == powerstate) {
console.log("Action Completed. ");
} else {
console.log("Power State Error: " + status + ", CurrentState=" + powerstate + ", TargetState=" + targetPowerAction);
}
*/
}
function consentChanged() { QE('idx_dlgOkButton', d6ConsentText.value.length == 6); }
function changeConsentDisplay() { xxchangeConsentDisplay = true; checkConsentDisplay(); }
function checkConsentDisplay() { /*console.log("Getting display information...");*/ amtstack.Get('IPS_SecIOService', checkConsentDisplayResponse1); }
var xxchangeConsentDisplay = false;
function checkConsentDisplayResponse1(stack, name, response, status) {
// console.log('checkConsentDisplayResponse1(' + name + ',' + response + ',' + status + ')');
if (status == 200) {
if (response.Body['DefaultScreen']) response.Body['DefaultScreen'] = parseInt(response.Body['DefaultScreen']);
if (response.Body['NumberOfScreens']) response.Body['NumberOfScreens'] = parseInt(response.Body['NumberOfScreens']);
if (xxchangeConsentDisplay == true) {
xxchangeConsentDisplay = false;
// Change consent screen settings
response.Body['DefaultScreen'] = d6Display.value;
amtstack.Put('IPS_SecIOService', response.Body, checkConsentDisplayResponse1);
} else {
d6Display.value = response.Body['DefaultScreen'];
QV('d6ThirdDisplay', response.Body['NumberOfScreens'] > 2);
}
} else {
//console.log("Display Error: " + status);
}
}
// ###END###{PowerControl}
// ###BEGIN###{Storage}
//
// Storage
//
var xxStorage = null;
var xxStorageVendors = [];
var xxStorageApplications = [];
function PullStorage() {
amtFirstPull |= 8;
wsstack.comm.PerformAjax('', PullStorageResponse, null, 0, '/amt-storage/', 'GET');
}
function PullStorageResponse(data, status, tag) {
if (amtstack.PendingBatchOperations == 0) refreshButtons(true); // If nothing is being done, re-enable refresh buttons
if (status == 200) {
QV('go21', true); // Show Storage Panel
var len; // Remove all chars that are below 32, this will allow parsing even the the firmware gives us garbage.
for (var i = 0; i < 32; i++) { do { len = data.length; data = data.replace(String.fromCharCode(i), ''); } while (len > data.length); }
//data = '{"information": {"version": 1.1,"realms": 7765759,"user": "admin"},"content": [{"name": "index.htm","size": 38864},{"vendor": "User","app": "SDK","name": "Sample.html","size": 26760,"link": "SDK Sample"},{"vendor": "User","app": "SDK","name": "ws.js","size": 42575,"link": "SDK Sample"},{"vendor": "User","app": "SDK","name": "btp.min.css","size": 121265,"link": "SDK Sample"},{"vendor": "User","app": "SDK","name": "logo.png","size": 2803,"link": "SDK Sample"}]}';
try { xxStorage = JSON.parse(data); } catch (e) { return; }
xxStorageVendors = [];
xxStorageApplications = [];
var content = xxStorage['content'];
if (Array.isArray(content)) {
// New flat format, convert to tree format.
var newcontent = {};
for (var i in content) {
var vendor = content[i]['vendor'] ? content[i]['vendor'] : '';
if (!newcontent[vendor]) { newcontent[vendor] = {}; }
var app = content[i]['app'] ? content[i]['app'] : '';
if (!newcontent[vendor][app]) { newcontent[vendor][app] = {}; }
if (content[i]['name']) { newcontent[vendor][app][content[i]['name']] = content[i]; }
}
xxStorage['content'] = content = newcontent;
} else {
// Tree format, move index.htm and logon.htm
if (content['index.htm'] || content['logon.htm']) { content[''] = { '': {} }; }
if (content['index.htm']) { content['']['']['index.htm'] = content['index.htm']; delete content['index.htm']; }
if (content['logon.htm']) { content['']['']['logon.htm'] = content['logon.htm']; delete content['logon.htm']; }
}
// Display all storage files
var count = 0, x = TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "이 컴퓨터의 인텔 &reg; AMT 스토리지를 관리합니다." + '<br><br>';
var ii, jj, xx = '', links = '', linkid = 30;
for (var i in content) {
var jcount = 0;
for (var j in content[i]) {
jcount++;
var kcount = 0;
for (var k in content[i][j]) {
kcount++;
if (i != ii || j != jj) {
if (xx != '') { x += xx; xx = '<br>'; }
ii = i; jj = j;
if (i != '') { xx += EscapeHtml(i + ' / ' + j); } else { xx += "뿌리"; }
}
//var handle = "\"" + i + "\",\"" + j + "\",\"" + k + "\"";
var handle = '\"' + i + ((i != '') ? '/' : '') + j + ((j != '') ? '/' : '') + k + '\"';
xx += '<div class=itemBar onclick=showStorageDetails("' + i + '","' + j + '","' + k + '",' + handle + ')><div style=float:right>';
// ###BEGIN###{Mode-Firmware}
xx += AddButton2("열다", 'OpenFromStorage(' + handle + ',event)');
// ###END###{Mode-Firmware}
// ###BEGIN###{Mode-LMS}
xx += ' ' + AddButton2("열다", 'OpenFromStorage(' + handle + ',event)');
// ###END###{Mode-LMS}
// ###BEGIN###{FileSaver}
xx += ' ' + AddButton2("다운로드", 'DownloadFromStorage(' + handle + ',\"' + k + '\",event)');
// ###END###{FileSaver}
xx += '</div><div style=padding-top:3px><b>' + EscapeHtml(k) + '</b>, <i>' + content[i][j][k]['size'] + " 바이트" + '</i></div></div>';
// ###BEGIN###{Mode-Firmware}
if (content[i][j][k]['link'] && i != '') { links += '<p id=go' + linkid + ' class=nav1 onclick=goiFrame(event,' + linkid + ',"/amt-storage/' + i + '/' + j + '/' + k + '") title="' + i + ' / ' + j + '"><a>' + content[i][j][k]['link'] + '</a></p>'; linkid++; }
// ###END###{Mode-Firmware}
count++;
if (xxStorageVendors.indexOf(i) == -1) xxStorageVendors.push(i);
if (xxStorageApplications.indexOf(j) == -1) xxStorageApplications.push(j);
}
if (kcount == 0) { // Clear empty application & vendor
wsstack.comm.PerformAjax('', function () { }, null, 0, '/amt-storage/' + i + '/' + j, 'DELETE');
wsstack.comm.PerformAjax('', function () { }, null, 0, '/amt-storage/' + i, 'DELETE');
}
}
if (jcount == 0) { wsstack.comm.PerformAjax('', function () { }, null, 0, '/amt-storage/' + i, 'DELETE'); } // Clear empty vendor
}
if (xx != '') x += xx;
if (count == 0) { x += '<div style=padding-left:15px><br><i>' + "파일이 없습니다." + '</i></div><br>'; }
var uploadSupport = false;
try { var reader = new FileReader(); uploadSupport = ((reader != null) && (reader.readAsBinaryString != null)); } catch (ex) { console.log(ex); }
x += '<br><td class=r1>' + TableEnd(AddRefreshButton('PullStorage()') + (uploadSupport ? AddButton("업로드 ...", 'UploadToStorage()') : '')
// ###BEGIN###{Mode-NodeWebkit}
//+ AddButton("Upload Application...", 'UploadAppToStorage()')
// ###END###{Mode-NodeWebkit}
);
// ###BEGIN###{Mode-Firmware}
//QH('storagelinks', links);
// ###END###{Mode-Firmware}
QH('id_TableSystemStorage', x);
} else {
QH('id_TableSystemStorage', "스토리지 데이터를로드 할 수 없습니다 ..." + '<br/>' + AddButton("새롭게 하다", 'PullStorage()'));
}
}
function showStorageDetails(i, j, k, h) {
if (xxdialogMode) return;
var x = '', item = xxStorage['content'][i][j][k];
if (i != '') x += addHtmlValue("공급 업체", i);
if (j != '') x += addHtmlValue("신청", j);
x += addHtmlValue("이름", k);
x += addHtmlValue("크기", item['size'] + ' bytes');
if (item['link']) { x += addHtmlValue("링크", item['link']); }
setDialogMode(11, "보관 아이템", 5, showStorageDetailsEx, x, h);
}
function showStorageDetailsEx(buttons, handle) {
if (buttons == 2) { wsstack.comm.PerformAjax('', storageDeleteResponse, null, 0, '/amt-storage/' + handle, 'DELETE'); }
}
function storageDeleteResponse(data, status) {
if (status != 200) {
messagebox("저장", format("파일 (ERR {0})을 삭제할 수 없습니다. 컴퓨터 전원이 켜져 있는지 확인하십시오.", status));
} else {
PullStorage();
}
}
// ###BEGIN###{FileSaver}
function DownloadFromStorage(handle, filename, e) {
if (xxdialogMode) return;
haltEvent(e);
wsstack.comm.PerformAjax('', DownloadFromStorageEx, filename, 0, '/amt-storage/' + handle, 'GET');
}
function DownloadFromStorageEx(data, status, tag) {
if ((status != 200) || (data == null)) { console.log(status, 'Data = null'); return; }
saveAs(data2blob(data), tag);
}
// ###END###{FileSaver}
function OpenFromStorage(handle, e) {
if (xxdialogMode) return;
haltEvent(e);
// ###BEGIN###{Mode-Firmware}
var newWindow = window.open('/amt-storage/' + handle, '_blank', 'noopener,noreferrer');
// ###END###{Mode-Firmware}
// ###BEGIN###{!Mode-Firmware}
var newWindow = window.open('http://' + wsstack.comm.host + ':' + wsstack.comm.port + '/amt-storage/' + handle, '_blank', 'noopener,noreferrer');
// ###END###{!Mode-Firmware}
newWindow.opener = null;
newWindow.focus();
}
function PushToStorage(vendorAppnameFilename, data, append) {
var tag = null;
if (data.length > 7000) { tag = [vendorAppnameFilename, data.substring(7000)]; data = data.substring(0, 7000); }
wsstack.comm.PerformAjax(data, PushToStorageResponse, tag, 0, '/amt-storage/' + vendorAppnameFilename + (append == true ? '?append=' : ''), 'PUT');
}
function PushToStorageResponse(data, status, tag) {
if (status != 200) { messagebox("저장", format("파일 (ERR {0})을 푸시 할 수 없습니다. 컴퓨터 전원이 켜져 있는지 확인하십시오.", status)); } else {
if (tag != null) { PushToStorage(tag[0], tag[1], true); } else { PullStorage(); }
}
}
function UploadToStorage(file, filename) {
if (xxdialogMode) return;
if (!filename) { filename = ''; }
var x = '';
x += '<br>' + "스토리지에 업로드 할 작은 파일을 선택하고 공급 업체, 응용 프로그램 및 파일 이름을 입력하십시오." + '<br>';
if (!file) {
x += '<br><div style=height:20px><input type=file id=mstoragefile style=float:right;width:240px onchange=SetStorageName()><div>Upload file</div></div>';
} else {
x += '<br><div style=height:20px><input id=mstoragefile style=float:right;width:240px readonly disabled=disabled value="' + filename + '" ><div>' + "파일 업로드" + '</div></div>';
}
x += '<br><div style=height:16px><input id=mstoragevendor placeholder="' + "공급 업체" + '" list=mstoragevendorlist maxlength=11 style=float:right;width:240px><div>' + "공급 업체 이름" + '</div></div>';
x += '<br><div style=height:16px><input id=mstorageapplication placeholder="' + "앱" + '" list=mstorageapplicationlist maxlength=11 style=float:right;width:240px><div>' + "응용 프로그램 이름" + '</div></div>';
x += '<br><div style=height:16px><input id=mstoragefilename placeholder="' + "파일 이름" + '" maxlength=11 style=float:right;width:240px><div>' + "파일 이름" + '</div></div>';
x += '<br><div style=height:16px><input id=mstoragetype placeholder=application/octet-stream list=mstoragetypelist style=float:right;width:240px><div>' + "MIME 유형" + '</div></div>';
x += '<br><div style=height:16px><input id=mstoragelink style=float:right;width:240px><div title=\"' + "설정된 경우 기본 웹 페이지에서이 콘텐츠에 대한 링크를 만듭니다." + '\">' + "링크" + '</div></div><br>';
x += '<datalist id=mstoragevendorlist>';
for (var i in xxStorageVendors) { x += '<option value="' + xxStorageVendors[i] + '">'; }
x += '</datalist>';
x += '<datalist id=mstorageapplicationlist>';
for (var i in xxStorageApplications) { x += '<option value="' + xxStorageApplications[i] + '">'; }
x += '</datalist><datalist id=mstoragetypelist><option value="application/octet-stream"><option value="image/jpeg"><option value="text/html"><option value="text/plain"></datalist>';
setDialogMode(11, "스토리지 업로드", 3, UploadToStorageEx, x, file);
if (file) { SetStorageName(filename); }
}
// ###BEGIN###{Mode-NodeWebkit}
/*
var UploadAppToStorageFileList;
function UploadAppToStorage() {
if (xxdialogMode) return;
require('fs').readdir('.', function read(err, data) {
var filelist = [], filecount = 0;
if (err == null) { for (var i in data) { if ((data[i].endsWith('.gz')) || (data[i].endsWith('.br'))) { filelist.push(data[i]); filecount++; } } }
if (filecount > 0) {
var x = '';
x += "Select the web application to upload, this will replace the Intel&reg; AMT default web pages." + '<br><br><div style=height:26px><select id=mwebappsel style=float:right;width:240px>';
for (var i in filelist) { x += '<option value=' + i + '>' + filelist[i].substring(0, filelist[i].length - 3) + '</option>'; }
x += '</select><div>' + "Web Application" + '</div></div>';
setDialogMode(11, "Storage Application Upload", 3, UploadAppToStorageEx, x, filelist);
}
});
}
function UploadAppToStorageEx(b, filelist) {
var file = filelist[Q('mwebappsel').value];
require('fs').readFile(file, 'binary', function read(err, data) {
if (err == null) { PushToStorage('index.htm', '<metadata><headers><h>Content-Encoding: ' + (file.endsWith('.br')?'br':'gzip') + '</h><h>Content-Type: text/html</h></headers></metadata>' + data); }
});
}
*/
// ###END###{Mode-NodeWebkit}
function UploadToStorageEx(button, tag) {
if (!tag) {
var x = Q('mstoragefile');
if (x.files.length != 1) return;
var reader = new FileReader();
reader.onload = UploadToStorageEx2;
reader.filename = x.files[0].name;
reader.readAsBinaryString(x.files[0]);
} else {
var reader = new FileReader();
reader.onload = UploadToStorageEx2;
reader.filename = Q('mstoragefile').value;
reader.readAsBinaryString(tag);
}
}
function SetStorageName(filename) {
if (!filename) {
var x = Q('mstoragefile');
if (x.files.length == 1) { filename = x.files[0].name; } else { filename = ''; }
}
filename = filename.split(' ').join('');
var filenameSplit = filename.split('-');
if (filenameSplit.length == 3 && filenameSplit[0].length < 12 && filenameSplit[1].length < 12) {
Q('mstoragevendor').value = filenameSplit[0];
Q('mstorageapplication').value = filenameSplit[1];
filename = filenameSplit[2];
}
filename = filename.split('-').join('');
if (filename.endsWith('.gz')) filename = filename.substring(0, filename.length - 3);
if (filename.endsWith('.htm') || filename.endsWith('.html')) Q('mstoragetype').value = 'text/html';
else if (filename.endsWith('.txt')) Q('mstoragetype').value = 'text/plain';
if (filename.length > 11) filename = filename.substring(0, 11);
Q('mstoragefilename').value = filename;
}
function UploadToStorageEx2(file) {
var vaf, vendor = Q('mstoragevendor').value;
var app = Q('mstorageapplication').value;
var filename = Q('mstoragefilename').value;
if (filename == '') filename = 'Filename';
var mimetype = Q('mstoragetype').value;
if (mimetype == '') mimetype = 'application/octet-stream';
var link = Q('mstoragelink').value;
if (vendor == '' && app == '' && (filename.toLowerCase() == 'logon.htm' || filename.toLowerCase() == 'index.htm')) {
vaf = filename.toLowerCase();
} else {
if (vendor == '') vendor = 'Vendor';
if (app == '') app = 'App';
vaf = vendor + '/' + app + '/' + filename;
}
var data = '<metadata><headers>';
var filename = file.target.filename;
if (!filename) { filename = Q('mstoragefile').files[0].name; }
if (filename.endsWith('.gz')) { data += '<h>Content-Encoding: gzip</h>'; }
data += '<h>Content-Type: ' + mimetype + '</h></headers>'; // <h>X-UA-Compatible: IE=Edge</h>
if (link != '') data += '<link>' + link + '</link>';
data += '</metadata>' + file.target.result;
PushToStorage(vaf, data);
}
// ###END###{Storage}
// ###BEGIN###{Alarms}
//
// Alarm Panel
//
function _fmtdatetime(str) {
return str.replace('T',' ').replace('Z','');
}
function _fmtinterval(str) {
var cl = str.replace('T', '').substring(str.indexOf('P') + 1);
cl = ' ' + cl.replace('D', " 일").replace('H', " 시간").replace('M'," 의사록");
cl = cl.replace(" 1 일", " 1 일").replace(" 1 시간", " 1 시간").replace(" 1 분 "," 1 분 ");
return cl.substring(0, cl.length - 1);
}
function _fmttimepad(str) {
str = '' + str;
while (str.length < 2) { str = '0' + str; }
return str;
}
var xxAlarms = null;
function PullAlarms() {
var x = TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "알람 깨우기를 관리합니다." + '<br><br>';
amtstack.Enum('IPS_AlarmClockOccurrence', function(stack, name, response, status) {
if (status == 200) {
QV('go23', true);
if (response.length > 0) {
xxAlarms = response;
for (var i = 0; i < response.length; i++) {
var waketime = new Date(response[i]['StartTime']['Datetime']);
var details = '<b>' + response[i]['ElementName'] + '</b>, ' + "일어나" + ' ' + waketime.toLocaleString().replace(', ', " ...에서");
if (response[i]['Interval'] != undefined) { details += " 그리고 각각" + _fmtinterval(response[i]['Interval']['Interval']); }
if (response[i]['DeleteOnCompletion'] == true) { details += "완료되면 삭제"; }
x += '<div class=itemBar onclick=showAlertDetails(' + i + ')><div style=float:right>';
if (xxAccountAdminName) x += ' ' + AddButton2("편집하다...", 'showAddAlarm(" + i + ")');
x += '</div><div style=padding-top:3px;width:auto;float:left;overflow-x:hidden>' + details + '</div></div>';
}
} else {
xxAlarms = null;
x += '<div style=padding-left:15px><br><i>' + "등록 된 깨우기 경보가 없습니다." + '</i></div><br>';
}
var y = '<div>&nbsp;' + AddRefreshButton('PullAlarms()');
if (xxAccountAdminName) { y += AddButton2("모든 알람 제거", 'RemoveAllAlarms()', xxAlarms ? '' : 'disabled') + AddButton("더하다", 'showAddAlarm()'); }
x += '<br><td class=r1>' + TableEnd(y + '</div>');
QH('id_TableAlarm', x);
}
}, null, true);
}
function prepareAlarmOccurenceTemplate(id, nm, start, interval, del) {
return '<d:AlarmTemplate xmlns:d=\"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService\" xmlns:s=\"http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence\"><s:InstanceID>' + id + '</s:InstanceID><s:StartTime><p:Datetime xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + start + '</p:Datetime></s:StartTime><s:Interval><p:Interval xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + interval + '</p:Interval></s:Interval><s:DeleteOnCompletion>' + del + '</s:DeleteOnCompletion></d:AlarmTemplate>';
}
function RemoveAllAlarms(){
setDialogMode(1, "모든 알람 해제", 3, RemoveAllAlarmsEx, "모든 알람 해제를 확인 하시겠습니까?");
}
function RemoveAllAlarmsEx() {
var deleteCount = xxAlarms.length;
for (var a in xxAlarms) { amtstack.Delete('IPS_AlarmClockOccurrence', xxAlarms[a], function(stack, name, response, status) { if (--deleteCount == 0) { PullAlarms(); }}); }
}
function showAddAlarm(alrm){
if (xxdialogMode) return;
QE('d25alarm_name', !alrm);
if (alrm != undefined) {
var alarm = xxAlarms[alrm], waketime = new Date(alarm['StartTime']['Datetime']);
Q('d25alarm_name').value = alarm['ElementName'];
Q('d25alarm_sdate').value = waketime.getFullYear() + '-' + _fmttimepad(waketime.getMonth() + 1) + '-' + _fmttimepad(waketime.getDate());
Q('d25alarm_stime').value = waketime.getHours() + ':' + _fmttimepad(waketime.getMinutes()) + ':' + _fmttimepad(waketime.getSeconds());
if (alarm['Interval']) {
var j = alarm['Interval']['Interval'].replace('P','').replace('T','').replace('D','D,').replace('H','H,').replace('M','M,').split(','), k = [0, 0, 0];
for (var i in j) {
var jl = j[i].length - 1;
if (j[i][jl] == 'D') { k[0] = parseInt(j[i].substring(0, jl)); }
if (j[i][jl] == 'H') { k[1] = parseInt(j[i].substring(0, jl)); }
if (j[i][jl] == 'M') { k[2] = parseInt(j[i].substring(0, jl)); }
}
Q('d25alarm_interval').value = k.join('-');
} else {
Q('d25alarm_interval').value = '';
}
Q('d25alarm_doc').value = (alarm['DeleteOnCompletion'] == true)?1:0;
} else {
var currentTime = new Date();
currentTime.setDate(new Date().getDate() + 1);
Q('d25alarm_name').value = '';
Q('d25alarm_sdate').value = currentTime.getFullYear() + '-' + _fmttimepad(currentTime.getMonth() + 1) + '-' + _fmttimepad(currentTime.getDate());
Q('d25alarm_stime').value = currentTime.getHours() + ':' + _fmttimepad(currentTime.getMinutes()) + ':00';
Q('d25alarm_interval').value = '';
Q('d25alarm_doc').value = 0;
}
setDialogMode(25, "새 알람 추가", (alrm != undefined)?7:3, showAddAlarmOk, '', alrm);
alertDialogUpdate();
}
function alertDialogUpdate() {
var il = Q('d25alarm_interval').value.split('-').length;
var ok = (Q('d25alarm_name').value.length > 0) && (Q('d25alarm_sdate').value.split('-').length == 3) && (Q('d25alarm_stime').value.split(':').length == 3) && ((il == 1) || (il == 3));
QE('idx_dlgOkButton', ok);
}
function showAddAlarmOk(button, alrm) {
if (button == 2) { showAlertDetailsDelete(button, alrm); return; }
var alarm_name = Q('d25alarm_name').value;
var x1 = Q('d25alarm_sdate').value.split('-');
var x2 = Q('d25alarm_stime').value.split(':');
var t = new Date(x1[0], x1[1] - 1, x1[2], x2[0], x2[1], x2[2], 0); // Month is 0 = JAN, 11 = DEC
var alarm_starttime = _fmttimepad(t.getUTCFullYear()) + '-' + _fmttimepad(t.getUTCMonth() + 1) + '-' + _fmttimepad(t.getUTCDate()) + 'T' + _fmttimepad(t.getUTCHours()) + ':' + _fmttimepad(t.getUTCMinutes()) + ':' + _fmttimepad(t.getUTCSeconds()) + 'Z';
var x = Q('d25alarm_interval').value.split('-');
if (x.length != 3) { x = [0, 0, 0]; }
var alarm_interval = 'P' + x[0] + 'DT' + x[1] + 'H' + x[2] + 'M';
var alarm_doc = (Q('d25alarm_doc').value == 1);
var tpl = prepareAlarmOccurenceTemplate(alarm_name, alarm_name, alarm_starttime, alarm_interval, alarm_doc);
if (alrm == undefined) {
wsstack.ExecMethodXml(amtstack.CompleteName('AMT_AlarmClockService'), 'AddAlarm', tpl,
function (ws, resuri, response, status) {
if (status != 200) { messagebox("알람 추가", format("알람을 추가하지 못했습니다. 상태 : {0}. <br/> 알람이 미래인지 확인하십시오.", status)); return; }
if (response.Body['ReturnValue'] != 0) { messagebox("알람 추가", format("알람 {0}을 (를) 추가하지 못했습니다. <br/> 향후 알람을 확인하십시오.", response.Body['ReturnValueStr'])); return; }
PullAlarms();
}
);
} else {
var alarmx = Clone(xxAlarms[alrm]);
alarmx['StartTime'] = '<p:Datetime xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + alarm_starttime + '</p:Datetime>';
alarmx['Interval'] = '<p:Interval xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + alarm_interval + '</p:Interval>';
alarmx['DeleteOnCompletion'] = alarm_doc;
amtstack.Put('IPS_AlarmClockOccurrence', alarmx, function (ws, resuri, response, status) {
if (status != 200) { messagebox("알람 편집", format('Failed to change alarm. Status: {0}.<br/>Verify the alarm for at a future time.', status)); return; }
PullAlarms();
}, null, null, { 'InstanceID' : alarmx['InstanceID']});
}
}
function showAlertDetails(i) {
if (xxdialogMode) return;
var alarm = xxAlarms[i], waketime = new Date(alarm['StartTime']['Datetime']);
var x = '<div style=text-align:left>' + addHtmlValue("이름", alarm['ElementName']) + addHtmlValue("웨이크 타임", waketime.toLocaleString().replace(', ', ' at '));
if (alarm['Interval'] != undefined) { x += addHtmlValue("내부의", _fmtinterval(alarm['Interval']['Interval'])); }
x += addHtmlValue("깨어 난 후", (alarm['DeleteOnCompletion'] == true)?"알람 삭제":"알람 유지") + '</div>';
messagebox(format("알람 {0}", alarm['ElementName']), x);
setDialogMode(11, "경보" + alarm['ElementName'], 5, showAlertDetailsDelete, x, i);
}
function showAlertDetailsDelete(button, tag) {
if (button == 2) { amtstack.Delete('IPS_AlarmClockOccurrence', xxAlarms[tag], function(stack, name, response, status) { PullAlarms(); }); }
}
// ###END###{Alarms}
// ###BEGIN###{Scripting}
//
// Scripting
//
// Called by the "Run Script..." button. Display a dialog box to ask for the script file.
function script_runScriptDlg() {
if (xxdialogMode || scriptstate) return;
setDialogMode(11, "스크립트 실행", 3, script_runScriptDlgOk, '<br><input id=scriptopen type=file style=width:100% accept=.mescript>');
}
// Once the script file is selected, decode the script here.
function script_runScriptDlgOk(r) {
if (r != 1) return;
var x = Q('scriptopen');
if (x.files.length != 1) return;
var reader = new FileReader();
reader.onload = script_onScriptRead;
reader.readAsBinaryString(x.files[0]);
}
// Called once the script is decoded, get the script setup and start running it.
function script_onScriptRead(file) {
var x;
try { x = JSON.parse(file.target.result); } catch (e) {}
// ###BEGIN###{Scripting-Editor}
if (currentView == 20) {
// Load script into editor
if (x['scriptText']) Q('scriptarea').value = x['scriptText'];
if (x['mescript']) Q('compiledarea').value = rstr2hex(atob(x['mescript']));
if (x['blocks']) { script_setBuildBlocks(x['blocks']); scriptViewButton(1); } else { script_setBuildBlocks(); scriptViewButton(0); }
if (x['scriptBlocks']) { script_BlockScript = x['scriptBlocks']; } else { if (!script_BuildingBlocks) { script_BlockScript = []; } }
// Update the scriptBlocks to the latest blocks. This is does because we may update an existing script to new blocks.
for (var i in script_BlockScript) {
var block = script_BlockScript[i];
var xblock = script_BuildingBlocks[block['xname']];
if (xblock) {
var b = Clone(xblock); // Clone a new block, then set all the variables.
b['id'] = block['id'];
b['xname'] = block['xname'];
for (var j in b.vars) { if (block.vars[j]) { b.vars[j]['value'] = block.vars[j]['value']; } }
script_BlockScript[i] = b;
}
}
// Reset the script state
fupdatescript();
delete scriptstate;
resetScriptButton();
return;
}
// ###END###{Scripting-Editor}
var startvars = { '_interactive':1 };
// ###BEGIN###{Certificates}
startvars['_certificates'] = 1;
// ###END###{Certificates}
// ###BEGIN###{!Mode-Firmware}
startvars['_mode'] = 'Firmware';
// ###END###{!Mode-Firmware}
// ###BEGIN###{!Mode-MeshCentral2}
startvars['_mode'] = 'MeshCentral2';
// ###END###{!Mode-MeshCentral2}
// ###BEGIN###{Mode-NodeWebkit}
startvars['_mode'] = 'NodeWebkit';
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Mode-LMS}
startvars['_mode'] = 'LMS';
// ###END###{Mode-LMS}
// ###BEGIN###{Mode-WebSite}
startvars['_mode'] = 'WebSite';
// ###END###{Mode-WebSite}
if (x && x['mescript']) scriptstate = script_setup(atob(x['mescript']), startvars);
if (scriptstate) {
scriptstate.wsstack = wsstack;
scriptstate.amtstack = amtstack;
scriptstate.onStep = script_updateScriptState;
scriptstate.onConsole = script_console;
scriptstate.start(100);
} else {
messagebox("스크립트 실행", "잘못된 스크립트 파일입니다.");
}
}
// Called when the script changes state, displays the green status bar at the top of the web page.
function script_updateScriptState() {
if (scriptstate) {
QV('id_scriptstatus', scriptstate.state > 0); center();
if (scriptstate.state == 0) {
// ###BEGIN###{Mode-NodeWebkit}
if (urlvars['autoexit']) { // Exit if script finished running
require('nw.gui').Window.get().close();
//require('nw.gui').App.quit();
return;
}
// ###END###{Mode-NodeWebkit}
scriptstate = undefined;
}
}
}
// Called by a running script to update the console. The last message in the console is displayed in the top green bar.
function script_console(msg) {
if (msg.indexOf('INFO: ') == 0) { msg = msg.substring(6); }
if (msg.indexOf('SUCCESS: ') == 0) { msg = msg.substring(9); }
if (msg.indexOf('ERROR: ') == 0) { msg = msg.substring(7); }
QH('id_scriptstatusstr', ', ' + msg);
}
// Called by the "Stop" button on the script status bar. Causes the script to stop.
function script_Stop() {
if (scriptstate) {
if (scriptstate.dialog == true) { setDialogMode(0); }
scriptstate.stop();
scriptstate.state = 0;
script_updateScriptState();
}
}
// ###END###{Scripting}
// ###BEGIN###{Scripting-Editor}
var script_BuildingBlocks; // List of block that can be used to build a script. This is shown on the list side.
var script_StartingBuildingBlocks; // List of block that can be used to build a script when you get started.
var script_BlockScript = []; // List of blocks that are part of the current script.
var script_BlockScriptSelectedId = null; // The identifier of the currently selected block.
var script_BuilderView = 0; // 0 = Editor View, 1 = Builder View
var editscriptstate; // This is the instance of the script runner used by the editor. This is different from the runner used by the web page.
// ###BEGIN###{!Mode-Firmware}
function scriptLoadStartingBlocks() {
// ###BEGIN###{!Mode-NodeWebkit}
var request = new XMLHttpRequest();
request.onload = function() {
if (request.status >= 200 && request.status < 400) {
// Success
var x;
try { x = JSON.parse(request.responseText); } catch (e) {}
if ((x) && (x['blocks'])) { script_StartingBuildingBlocks = x['blocks']; script_setBuildBlocks(script_StartingBuildingBlocks); }
}
};
request.onerror = function() { console.log('Failed to get script blocks'); };
request.open('GET', 'scriptblocks.txt', true);
request.send();
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var content;
require('fs').readFile('scriptblocks.txt', 'utf8', function read(err, data) {
if (err == null) {
var x;
try { x = JSON.parse(data); } catch (e) {}
if (x['blocks']) { script_StartingBuildingBlocks = x['blocks']; script_setBuildBlocks(script_StartingBuildingBlocks); }
}
});
// ###END###{Mode-NodeWebkit}
}
// ###END###{!Mode-Firmware}
// Called by the "View Editor" or "View Builder" button to toggle between the view modes.
// If there is no construction blocks, display the script editor only.
function scriptViewButton(x) {
script_BuilderView = x;
QV('scripteditor', x == 0);
QV('scriptbuilder', x == 1);
QV('viewEditorButton', script_BuildingBlocks && (x == 1));
QV('viewBuilderButton', script_BuildingBlocks && (x == 0));
}
// Display the list of construction script block on the left side.
function script_setBuildBlocks(blocks) {
script_BuildingBlocks = blocks;
var x = '';
if (blocks) {
for (var i in blocks) {
if (i.charCodeAt(0) != 95) {
x += '<div id=sblock_' + i + ' style=cursor:pointer;background-color:#ccc;width:auto;padding:5px;margin:2px ondblclick=script_faddblock("' + i + '") draggable=true ondragstart=script_fondragstart(event,this) ondragend=script_fondragend(event,this) title="' + blocks[i]['desc'] + '"';
// ###BEGIN###{ContextMenus}
var cmenus = [];
cmenus.push("더하다" + '#script_faddblock("' + i + '")');
cmenus.push("편집하다..." + '#script_feditblock("' + i + '")');
x += ' cm=\"' + cmenus.join('|') + '\"';
// ###END###{ContextMenus}
x += '>' + blocks[i]['name'] + '</div>';
}
}
}
QH('blocks', x);
script_fonfilterchanged();
scriptViewButton(script_BuildingBlocks?1:0);
}
// Add a new block to the end of the block script. This is called when you right click on a block and hit "Add" in the context menu.
function script_faddblock(h) {
var b = Clone(script_BuildingBlocks[h]); // To add a new block to the script, clone the block, assign it a random id and set the xname to the name of the block.
b['id'] = Math.random();
b['xname'] = h;
script_BlockScript.push(b); // Now that a block is created, add it at the end of the script and set it as the selected block.
script_BlockScriptSelectedId = script_BlockScript.length - 1;
fupdatescript(); // Re-display the list of script blocks. The selected block will also be highlighted.
}
// Edit a script block
function script_feditblock(h) {
if (xxdialogMode) return;
setDialogMode(11, format("{0} 편집", script_BuildingBlocks[h]['name']), 3, script_feditblockEx, 'Edit this block? This operation will reset the block editor and load the block code into the code editor.', h);
}
// Called when the script block edit dialog is closed.
function script_feditblockEx(button, h) {
script_newScriptDlgOk();
scriptViewButton(0);
var x = '', b = script_BuildingBlocks[h];
x += '##!BLOCK!##\r\n#id=' + h + '\r\n#name=' + b['name'] + '\r\n#desc=' + b['desc'] + '\r\n##!BLOCK!##\r\n';
for (var i in b['vars']) {
var v = b['vars'][i];
x += '##!VAR!##\r\n#id=' + i + '\r\n#name=' + v['name'] + '\r\n#desc=' + v['desc'] + '\r\n#type=' + v['type'] + '\r\n';
if (v['maxlength']) { x += '#maxlength=' + v['maxlength'] + '\r\n'; }
if (v['values']) { for (var j in v['values']) { x += '#values-' + j +'=' + v['values'][j] + '\r\n'; } }
x += '#value=' + v['value'] + '\r\n##SWAP %%%' + i + '%%% ' + v['value'] + '\r\n';
}
x += '##!VAR!##\r\n##SWAP %%%~%%% 0\r\n\r\n##!BLOCK!##\r\n' + b['code'] + '\r\n##!BLOCK!##\r\n';
Q('scriptarea').value = x;
}
function script_fConvertScriptToJsonBlock(script) {
var result = {}, scriptparts = script.split('##!BLOCK!##\n'), scriptlines = scriptparts[1].split('\n');
// Parse information part
for (var i in scriptlines) {
var s = scriptlines[i].split('=');
if (s.length == 2) { result[s[0].substring(1)] = s[1]; }
}
// Parse variables part
result['vars'] = {};
scriptvariables = scriptparts[2].split('##!VAR!##\n');
for (var i in scriptvariables) {
scriptlines = scriptvariables[i].split('\n');
var v = {}, values = {}, valueslen = 0;
for (var j in scriptlines) {
var s = scriptlines[j].split('=');
if ((s.length == 2) && (s[1])) {
if ((s[0]) && (s[0].length > 0)) {
if (s[0].substring(0, 8) == '#values-') {
values[s[0].substring(8)] = s[1];
valueslen++;
} else {
v[s[0].substring(1)] = s[1];
}
}
}
}
if (v.id) {
if (valueslen > 0) { v['values'] = values; }
var id = v.id;
delete v.id;
result['vars'][id] = v;
}
}
// Parse code part
result['code'] = scriptparts[3];
// Package the result
var id = result.id;
delete result.id;
var r = {};
r[id] = result;
return JSON.stringify(r, null, ' ');
}
/*
// If the delete key is pressed, delete the block
function script_fonkeypress(e) {
if (xxdialogMode) return;
if (e.key == 'Delete' && script_BlockScriptSelectedId != null) {
//delete script_BlockScript[script_BlockScriptSelectedId];
script_BlockScript.splice(script_BlockScriptSelectedId, 1);
script_BlockScriptSelectedId = null;
fupdatescript();
}
}
*/
// Filer the list of blocks on the left side list.
function script_fonfilterchanged() {
var filter = Q('blockfilter').value.toLowerCase();
for (var i in script_BuildingBlocks) {
// Script blocks that start with "_" are hidden blocks and should never be shown.
if (i.charCodeAt(0) != 95) { QV('sblock_' + i, (script_BuildingBlocks[i]['name'].toLowerCase().indexOf(filter) >= 0 || script_BuildingBlocks[i]['desc'].toLowerCase().indexOf(filter) >= 0)); }
}
}
// Called when you click on a block. If you double click, on a block, do like pressing on the "Edit..." button.
var script_fonclickDblClickDetectIndex = null;
var script_fonclickDblClickDetectTime = null;
function script_fonclick(e, t) {
// ###BEGIN###{ContextMenus}
hideContextMenu(); // Any click on this area must close the context menu
// ###END###{ContextMenus}
if (xxdialogMode) return;
script_BlockScriptSelectedId = null;
if (t) { t = fgetParentWithId(t); if (t.id.startsWith('xblock_')) { script_BlockScriptSelectedId = t.id.substring(7); } } // Figure out what block was clicked on
fupdatescript(); // This will show the currently selected block in a different color.
haltEvent(e);
// Figure out if this is a double click. We need two clicks on the same object within 250ms.
if (script_fonclickDblClickDetectIndex == script_BlockScriptSelectedId && (new Date().getTime() - script_fonclickDblClickDetectTime) < 250) { return script_foneditclick(script_BlockScriptSelectedId); }
script_fonclickDblClickDetectIndex = script_BlockScriptSelectedId;
script_fonclickDblClickDetectTime = new Date().getTime();
}
// Script block drag & drop functions, allow the user to create and move script blocks.
function script_fondragstart(e, t) { if (xxdialogMode) return; t = fgetParentWithId(t); t.style.opacity = '0.4'; e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('scriptbuilder/block', t.id); }
function script_fondragend(e, t) { if (xxdialogMode) return; t = fgetParentWithId(t); t.style.opacity = '1.0'; }
function script_fondragenter(e, t) { if (xxdialogMode) return; fgetParentWithId(t).style['border-top'] = 'solid 2px black'; }
function script_fondragleave(e, t) { if (xxdialogMode) return; e = e.originalEvent || e; var currentElement = document.elementFromPoint(e.pageX, e.pageY); if (!t.contains(currentElement)) { fgetParentWithId(t).style['border-top'] = 'none'; } }
// Called when you drop a block on the block script area. This code will add or move a block into it's new place.
function script_fondrop(e, t) {
if (xxdialogMode) return;
t = fgetParentWithId(t);
var b, x = e.dataTransfer.getData('scriptbuilder/block'), dp = parseInt(t.id.substring(7));
if (x == '') { documentFileSelectHandler(e); return; }
if (x.startsWith("sblock_")) {
// Create a new script block
b = Clone(script_BuildingBlocks[x.substring(7)]);
b['id'] = Math.random();
b['xname'] = x.substring(7);
} else {
// Pull an existing script block from the list
var i = parseInt(x.substring(7));
b = script_BlockScript[i];
script_BlockScript.splice(i, 1);
if (dp > i) dp--;
}
if (t.id == 'scriptblocks') {
// Put the block at the end of the list
if (b) script_BlockScript.push(b);
script_BlockScriptSelectedId = script_BlockScript.length - 1;
} else {
// Insert the block within the list, above the drop point
script_BlockScript.splice(dp, 0, b);
script_BlockScriptSelectedId = dp;
}
fupdatescript();
haltEvent(e);
}
// Called when you hit "Edit..." on a block, displays a dialog box with all block attributes.
function script_foneditclick(h) {
if (xxdialogMode) return;
var block = script_BlockScript[h];
script_BlockScriptSelectedId = h;
fupdatescript();
if (block != null) {
var b = block['vars'] ? 7 : 5;
var c = block['desc'] + '<br><br>';
if (block['vars']) {
// For each variable in a block, add the proper input control for this variable and set the control to the current value.
for (var i in block['vars']) {
var d = block['vars'][i]['value'];
var attributes = '';
// Block values can be on type 1:Text,2:Number,3:DropDownList,4:password,5:MultiSelect
if (block['vars'][i]['maxlength']) attributes += (' maxlength=' + block['vars'][i]['maxlength']);
if (block['vars'][i]['type'] == 2) { attributes += ' onkeypress=\'return numbersOnly(event)\'' }
if (block['vars'][i]['type'] == 1 || block['vars'][i]['type'] == 2) { d = '<input title="' + block['vars'][i]['desc'] + '" id=scriptXvalue_' + i + ' value="' + block['vars'][i]['value'] + '" ' + attributes + ' style=width:100%></input>'; }
if (block['vars'][i]['type'] == 3) {
d = '<select title=\'' + block['vars'][i]['desc'] + '\' id=scriptXvalue_' + i + ' style=width:100%;padding:0;margin:0>';
for (var j in block['vars'][i]['values']) { d += '<option value=' + j + (j == block['vars'][i]['value'] ? ' selected' : '') + '>' + block['vars'][i]['values'][j] + '</option>'; }
d += '</select>';
}
if (block['vars'][i]['type'] == 4) { d = '<input type=password autocomplete=off title="' + block['vars'][i]['desc'] + '" id=scriptXvalue_' + i + ' value="' + block['vars'][i]['value'] + '" ' + attributes + ' style=width:100%></input>'; }
if (block['vars'][i]['type'] == 5) { d = ''; }
if (block['vars'][i]['type'] == 6) { d = '<input type=file title="' + block['vars'][i]['desc'] + '" id=scriptXvalue_' + i + ' ' + attributes + ' style=width:100%></input>'; }
c += '<table style=width:100% title="' + block['vars'][i]['desc'] + '"><td style=width:120px>' + block['vars'][i]['name'] + '<td><b>' + d + '</b></table>';
if (block['vars'][i]['type'] == 5) {
var x = '';
c += '<ul id=scriptXvalue_' + i + ' style="list-style-type:none;height:100px;overflow:auto;width:100%;border:1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0">';
for (var y in block['vars'][i]['values']) {
var xc = '';
if (block['vars'][i]['value'].indexOf(y) >= 0) xc = ' checked';
c += '<li><label><input type=checkbox id=scriptXvaluex_' + i + '-' + y + '' + xc + '>' + block['vars'][i]['values'][y] + '</label></li>';
}
c += '</ul>';
}
}
}
}
// Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 11 only)
setDialogMode(11, block.name, b, script_foneditclickEx, c, h);
}
// Called when the script block edit dialog is closed.
function script_foneditclickEx(button, tag) {
if (xxdialogMode) return;
if (button == 2) {
// Delete this block
script_BlockScript.splice(tag, 1);
if (script_BlockScriptSelectedId == tag) { script_BlockScriptSelectedId = null; }
} else {
// Change this block with new arguments
var block = script_BlockScript[tag];
if (block['vars']) {
for (var i in block['vars']) {
if (block['vars'][i]['type'] == 5) {
block['vars'][i]['value'] = [];
for (var y in block['vars'][i]['values']) { if (Q('scriptXvaluex_' + i + '-' + y).checked) block['vars'][i]['value'].push(y); }
} else if (block['vars'][i]['type'] == 6) {
var x = Q('scriptXvalue_' + i);
if (x.files.length == 1) {
var reader = new FileReader();
reader.onload = function(file) { block['vars'][i]['value'] = btoa(file.target.result); fupdatescript(); };
reader.readAsBinaryString(x.files[0]);
}
} else {
block['vars'][i]['value'] = Q('scriptXvalue_' + i).value;
}
}
}
}
fupdatescript();
}
// Starting with a child element, go up one parent at a time until we find an element with an ID.
function fgetParentWithId(x) { while (!x.id) { x = x.parentElement; } return x; }
// Displays the list of script blocks to the HTML page. Each block is displayed with it's name, attributes and an edit button.
function fupdatescript() {
var x = '';
for (var i in script_BlockScript) {
x += '<div id=xblock_' + i + ' style=cursor:pointer;min-height:24px;background-color:#' + ((script_BlockScriptSelectedId == i) ? 'aaa' : 'ccc') + ';width:auto;padding:5px;margin:2px draggable=true onclick=script_fonclick(event,this) ondragenter=script_fondragenter(event,this) ondragleave=script_fondragleave(event,this) ondragstart=script_fondragstart(event,this) ondragend=script_fondragend(event,this) ondrop=script_fondrop(event,this) title="' + script_BlockScript[i]['desc'] + '"';
// ###BEGIN###{ContextMenus}
var cmenus = [];
cmenus.push("편집하다..." + '#script_foneditclick('+i+')');
cmenus.push("지우다" + '#script_foneditclickEx(2,'+i+')');
x += ' cm=\'' + cmenus.join('|') + '\'';
// ###END###{ContextMenus}
x += '><input style=float:right type=button value=Edit... onclick=script_foneditclick(' + i + ')><div style=font-size:16px><b>' + script_BlockScript[i].name + '</b>';
if (script_BlockScript[i]['vars']) {
var r = 0;
x += '<table class="scriptBlockVar us" cellpadding=0 cellspacing=0 style=width:100%;border-radius:5px;margin-top:8px>';
for (var j in script_BlockScript[i]['vars']) {
var v = script_BlockScript[i]['vars'][j]['value'];
if (script_BlockScript[i]['vars'][j]['type'] == 4 && script_BlockScript[i]['vars'][j]['value'].length > 0) v = '*****';
if (script_BlockScript[i]['vars'][j]['type'] == 3) v = script_BlockScript[i]['vars'][j]['values'][script_BlockScript[i]['vars'][j]['value']];
if (script_BlockScript[i]['vars'][j]['type'] == 6) {
if (script_BlockScript[i]['vars'][j]['value']) { v = "이진 파일," + script_BlockScript[i]['vars'][j]['value'].length + " 바이트"; } else { v = "미 설정"; }
}
x += '<tr title="' + script_BlockScript[i]['vars'][j]['desc'] + '"><td width=200px style="' + (r > 0 ? 'border-top:1px solid #a810a8' : '') + '"><p>' + script_BlockScript[i]['vars'][j]['name'] + '<td style="' + (r > 0 ? 'border-top:1px solid #a810a8' : '') + '">' + v;
r++;
}
x += '<tr><td style=height:3px></table>';
}
x += '</div></div>';
}
if (x == '') { x = '<div style=\"padding:15px;color:gray\">' + "왼쪽에서이 스크립팅 상자로 블록을 끌어다 놓아 스크립트를 시작하십시오." + '<div>'; }
QH('scriptblocks', x + '<div style=height:80px></div>');
for (var i in script_BlockScript) { QS('xblock_' + i).borderLeft = (script_CurrentHighlightBlock == i) ? '3px solid black' : ''; }
script_blocksToScript();
}
// Convert the list of blocks into a script that can be compiled
function script_blocksToScript() {
var script = '';
if (script_BuildingBlocks) {
if (script_BuildingBlocks['_start']) { script += '##### Starting Block #####\r\n' + script_BuildingBlocks['_start']['code'] + '\r\n\r\n'; }
for (var i in script_BlockScript) {
var code = script_BlockScript[i]['code'];
code = code.split('%%%~%%%').join(i);
for (var j in script_BlockScript[i]['vars']) { code = code.split('%%%' + j + '%%%').join(script_BlockScript[i]['vars'][j]['value']); }
script += '##### Block: ' + script_BlockScript[i]['name'] + ' #####\r\nHighlightBlock __t ' + i + '\r\n' + code + '\r\n\r\n';
}
if (script_BuildingBlocks['_end']) { script += '##### Ending Block #####\r\n' + script_BuildingBlocks['_end']['code'] + '\r\nHighlightBlock\r\n'; }
}
Q('scriptarea').value = script;
}
// Highlight a script block. This is useful to know what block the script is currently running
var script_CurrentHighlightBlock;
function script_HighlightBlock(runner, x) {
if (runner == editscriptstate) { // Only highlight blocks if the scrpt editor is running the script. If running a script on the page, don't highlight blocks in the editor.
script_CurrentHighlightBlock = x;
for (var i in script_BlockScript) { QS('xblock_' + i).borderLeft = (script_CurrentHighlightBlock == i) ? '3px solid black' : ''; }
}
}
// Called by the "New..." button to reset the script editor to the start
function script_newScriptDlg() {
if (xxdialogMode) return;
setDialogMode(11, "새로운 스크립트", 3, script_newScriptDlgOk, '<br>' + "스크립트 편집기를 재설정하고 지우시겠습니까?");
}
// Clear the script editor
function script_newScriptDlgOk() {
script_setBuildBlocks(script_StartingBuildingBlocks);
script_BlockScript = [];
script_BlockScriptSelectedId = null;
delete editscriptstate;
scriptViewButton(script_BuildingBlocks?1:0);
QH('variables', '');
Q('scriptarea').value = '';
resetScriptButton();
}
// Compile and reset a script to the starting position
function resetScriptButton() {
// Compile the script
breakScriptButton();
Q('compiledarea').value = rstr2hex(script_compile(Q('scriptarea').value, function(m) { messagebox("스크립트 컴파일 오류", m); }));
delete editscriptstate;
// Reset the script environment
Q('console').value = '';
QH('variables', '');
QH('EditScriptStatus', "중지");
if (script_BuilderView == 1) { fupdatescript(); }
if (Q('compiledarea').value.length == 0) return;
// Create a new script runtime object
var startvars = { '_interactive':1 };
// ###BEGIN###{Certificates}
startvars['_certificates'] = 1;
// ###END###{Certificates}
// ###BEGIN###{!Mode-Firmware}
startvars['_mode'] = 'Firmware';
// ###END###{!Mode-Firmware}
// ###BEGIN###{!Mode-MeshCentral2}
startvars['_mode'] = 'MeshCentral2';
// ###END###{!Mode-MeshCentral2}
// ###BEGIN###{Mode-NodeWebkit}
startvars['_mode'] = 'NodeWebkit';
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Mode-LMS}
startvars['_mode'] = 'LMS';
// ###END###{Mode-LMS}
// ###BEGIN###{Mode-WebSite}
startvars['_mode'] = 'WebSite';
// ###END###{Mode-WebSite}
editscriptstate = script_setup(hex2rstr(Q('compiledarea').value), startvars);
editscriptstate.wsstack = wsstack;
editscriptstate.amtstack = amtstack;
editscriptstate.onStep = editscript_updateScriptState;
editscriptstate.onConsole = editscript_console;
editscript_updateScriptState(editscriptstate);
}
// Start running the script
function runScriptButton() {
if (editscriptstate == null) resetScriptButton();
if (editscriptstate == null) return;
editscriptstate.start(100);
}
// Stop/Pause the script
function breakScriptButton() {
if (editscriptstate == null) return;
editscriptstate.stop();
}
// Run one step of the script
function stepScriptButton() {
if (editscriptstate == null) resetScriptButton();
if (editscriptstate == null) return;
breakScriptButton();
editscriptstate.step();
}
// Display a new line into the script console
function editscript_console(msg) {
Q('console').value += (msg + '\n');
}
// Update the script state information and displayed variables
var script_states = ["중지", "달리는", "일시 중지됨"];
function editscript_updateScriptState(runstate) {
// Update variables
var r = '';
if (runstate && runstate != null) {
var vs = [];
for (var i in runstate.variables) { if (!i.startsWith('__')) vs.push(i); }
vs.sort();
//for (var i in vs) { r += vs[i] + ' = ' + script_toString(runstate.variables[vs[i]]) + "\n"; }
for (var i in vs) {
if (typeof runstate.variables[vs[i]] == 'object') {
r += '<b>' + vs[i] + '</b> = ' + ObjectToStringEx(runstate.variables[vs[i]], 2) + '<br>';
} else {
r += '<b>' + vs[i] + '</b> = ' + EscapeHtml(script_toString(runstate.variables[vs[i]])) + '<br>';
}
}
}
QH('variables', r);
// Update state
r = "중지됨, 스크립트 없음";
if (runstate && runstate != null) { r = script_states[runstate.state]; if (runstate.state > 0) r += ', ' + runstate.ip + ' : ' + script_decompile(runstate.script, runstate.ip); }
if (r.length > 50) { r = r.substring(0, 50) + "..."; }
QH('EditScriptStatus', r);
}
// Return a string from any input, if the input is an object, stringify it.
function script_toString(x) { if (typeof x == 'object') return JSON.stringify(x); return x; }
// ###BEGIN###{FileSaver}
// Save a script to disk, start by showing a dialog box to prompt to the filename.
function script_saveScript(e) {
if (xxdialogMode || scriptstate) return;
if (e && (e.shiftKey == true)) {
// Save as script block
setDialogMode(11, "스크립트 블록", 1, null, '<br><textarea id=scriptSaveScriptJsonBlock style=width:100%;height:200px;resize:vertical />');
QH('scriptSaveScriptJsonBlock', script_fConvertScriptToJsonBlock(Q('scriptarea').value));
} else {
// Save as .mescript file
// ###BEGIN###{!Mode-NodeWebkit}
setDialogMode(11, "Save Script", 3, script_saveScriptOk, '<br><input id=scriptsavename style=width:100% value=test.mescript >');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', "파일")
chooser.setAttribute('nwsaveas', "script.mescript");
chooser.addEventListener('change', function() {
require('fs').writeFile(this.value, JSON.stringify({
'scriptText': Q('scriptarea').value,
'mescript': btoa(script_compile(Q('scriptarea').value)),
'blocks': script_StartingBuildingBlocks,
'scriptBlocks': script_BlockScript
}, null, ' ').replace(/\n/g, '\r\n'), function () { });
}, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
}
// Once the filename is selected, save the file.
function script_saveScriptOk() {
if (xxdialogMode) return;
var x = JSON.stringify({
'scriptText': Q('scriptarea').value,
'mescript': btoa(script_compile(Q('scriptarea').value)),
'blocks': script_StartingBuildingBlocks,
'scriptBlocks': script_BlockScript
}, null, ' ');
saveAs(data2blob(x), Q('scriptsavename').value);
}
// ###END###{FileSaver}
// ###END###{Scripting-Editor}
// ###BEGIN###{CertificateManager}
//
// Certificate Manager
//
/*
function issueCertButtonOk() {
var certopen = getInputElement('certopen');
var files = xxDragDropCertFiles;
if (certopen) files = certopen.files;
if (files && files.length == 1) {
// Issue a certificate using this file
var reader = new FileReader();
reader.onload = issueCertButtonOk2;
reader.readAsBinaryString(files[0]);
} else {
// Issue a certificate using a dummy CA
issueCertButtonOk3(null);
}
}
*/
var certificateStore = [];
var currentCertificate = null;
function cert_updateCertificateList() {
var x = '', certcount = 0;
if (currentCertificate == null && certificateStore.length > 0) { currentCertificate = certificateStore[0]; }
certificateStore.sort(function (a, b) { var aa = a.cert.subject.getField('CN').value; var bb = b.cert.subject.getField('CN').value; if (aa > bb) { return 1; } if (aa < bb) { return -1; } return 0; });
for (var y in certificateStore) {
try {
var certificate = certificateStore[y], name = certificate.cert.subject.getField('CN').value, extra = [];
if (certificate['tlsauth']) { extra.push('<span title="' + "이 인증서는이 콘솔을 Intel AMT에 인증하는 데 사용됩니다." + '">' + "TLS 인증" + '</span>'); }
if (certificate['trusted'] == true) { extra.push('<span title="' + "이 인증서로 서명 한 인증서를 신뢰합니다." + '">' + "신뢰" + '</span>'); }
if (certificate['privateKey']) { extra.push('<span title="' + "이 인증서에 대한 개인 키가 있습니다." + '">' + "개인 키" + '</span>'); }
x += '<div style=margin:4px;cursor:pointer>';
x += '<img src=images-commander/cert' + ((certificate['privateKey'])?'2':'1') + '.png style=vertical-align:text-top;float:left;background-color:white;height:28px height=32 width=32 />';
x += '<div id=LCR-' + certificate['h'] + ' class=g1 style=float:left;height:28px>&nbsp;</div><div id=RCR-' + certificate['h'] + ' class=g2 style=float:right;height:28px>&nbsp;</div><div style=height:28px ';
// ###BEGIN###{ContextMenus}
var cmenus = [];
cmenus.push("전망..." + '#cert_view(' + certificate['h'] +'")');
if (certificate['privateKey']) { cmenus.push("새 인증서 발급 ..." + '#cert_issueNew(' + certificate['h'] + ')'); }
cmenus.push(".cer로 내보내기 ..." + '#cert_saveCertCer(' + certificate['h'] + ')');
if (certificate['privateKey']) { cmenus.push(".p12로 내보내기 ..." + '#cert_saveCertP12(' + certificate['h'] + ')'); }
x += ' cm=\'' + cmenus.join('|') + '\'';
// ###END###{ContextMenus}
x += ' onclick=\'cert_select(event, ' + certificate['h'] + ')\' id=CR-' + certificate['h'] + ' ondblclick=cert_view(' + certificate['h'] + ')>';
//x += '<input id=SC-' + certificate['h'] + ' type=checkbox style=float:left;margin-top:8px onclick=cert_onCertificateChecked()' + (certificate.checked?' checked':'') + ' />';
x += '<div style=float:right><span style=font-size:14px>' + extra.join(', ') + '</span>&nbsp;<input type=button value="' + "전망..." + '" onclick=cert_view(' + certificate['h'] + ')>&nbsp;</div><div style=padding-top:2px>&nbsp;';
// ###BEGIN###{Look-BrandedCommander}
//x += '<img src=images-BrandedCommander/ComputerIcon.png style=vertical-align:text-top />&nbsp;';
// ###END###{Look-BrandedCommander}
//x += '<img src=certificate.png style=vertical-align:text-top height=28 width=24 />';
x += '<b style=font-size:16px>' + EscapeHtml(name) + '</b></div></div></div>';
certcount++;
} catch (e) { delete certificateStore[y]; }
}
QV('id_certStartScreen', certcount == 0);
QH('id_certManagerMainArea', x);
cert_select();
}
function cert_view(h) {
if (xxdialogMode) return;
var x = '', certificate = getCertificate(h), cert = certificate.cert, commonName = cert.subject.getField('CN').value;
var fingerprint = '', fingerprint2 = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex().toUpperCase();
for (i = 0; i < fingerprint2.length; i++) { if ((i != 0) && (i % 2 == 0)) { fingerprint += ':'; } fingerprint += fingerprint2.substring(i, i + 1); }
x += '<img src=images-commander/cert' + ((certificate['privateKey']) ? '2' : '1') + '.png style=vertical-align:text-top;float:right;height:28px height=32 width=32 />';
x += '<input id=certTrustedCheck type=checkbox>' + "신뢰할 수있는 인증서입니다" + '<br>';
var extKeyUsage = null;
for (var i in certificate.cert.extensions) { if (certificate.cert.extensions[i].id == '2.5.29.37') { extKeyUsage = certificate.cert.extensions[i]; } }
if ((certificate['privateKey']) && (extKeyUsage != null) && (extKeyUsage['2.16.840.1.113741.1.2.1'] == true)) { x += '<div><input id=certMutualAuth type=checkbox>' + "TLS 콘솔 인증에 사용" + '<br></div>'; }
x += '<br>';
// ###BEGIN###{FileSaver}
var y = atob(certificate['certbin']).length + " 바이트" + '<a style=cursor:pointer;color:blue onclick=cert_saveCertCer(' + h + ',1)>' + NoBreak(".cer 저장") + '</a>';
if (certificate['privateKey']) { y += ', <a style=cursor:pointer;color:blue onclick=cert_saveCertP12(' + h + ')>' + NoBreak(".p12 저장") + '</a>'; }
y += ', <a style=cursor:pointer;color:blue onclick=cert_saveCertCer(' + h + ',2)>' + NoBreak(".pem 저장") + '</a>';
x += addHtmlValueNoTitle("증명서", y);
// ###END###{FileSaver}
// ###BEGIN###{!FileSaver}
//x += addHtmlValueNoTitle("Certificate", c.X509Certificate.length + " bytes");
// ###END###{!FileSaver}
// Decode certificate usages
y = [];
if (extKeyUsage != null) {
if (extKeyUsage.clientAuth == true) { y.push(NoBreak("TLS 클라이언트")); }
if (extKeyUsage.codeSigning == true) { y.push(NoBreak("코드 서명")); }
if (extKeyUsage.emailProtection == true) { y.push("이메일"); }
if (extKeyUsage.serverAuth == true) { y.push(NoBreak("TLS 서버")); }
if (extKeyUsage['2.16.840.1.113741.1.2.1'] == true) { y.push(NoBreak("인텔 &reg; AMT 콘솔")); }
if (extKeyUsage['2.16.840.1.113741.1.2.2'] == true) { y.push(NoBreak("인텔 &reg; AMT 에이전트")); }
if (extKeyUsage['2.16.840.1.113741.1.2.3'] == true) { y.push(NoBreak("인텔 &reg; AMT 활성화")); }
if (extKeyUsage.timeStamping == true) { y.push(NoBreak("타임 스탬핑")); }
if (y.length > 0) { x += addHtmlValueNoTitle("인증서 사용법", y.join(', ') + '.') + '<br clear=all />'; }
}
x += '<br><div style=\"border-bottom:1px solid gray\"><i>' + "인증서 주체" + '</i></div><br>';
for (var i in xxCertSubjectNames) { var a = cert.subject.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
x += addHtmlValueNoTitle("지문", fingerprint.substring(0,29) + '<br />' + fingerprint.substring(30));
x += '<br><div style="border-bottom:1px solid gray"><i>' + "발급자 인증서" + '</i></div><br>';
for (var i in xxCertSubjectNames) { var a = cert.issuer.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
setDialogMode(11, "증명서-" + EscapeHtml(commonName), 5, cert_viewex, x, certificate);
Q('certTrustedCheck').checked = (certificate['trusted'] == true);
if (certificate['privateKey'] && Q('certMutualAuth')) { Q('certMutualAuth').checked = (certificate['tlsauth'] == true); }
}
function cert_saveCertCer(h,type) {
var certificate = getCertificate(h), cert = certificate.cert, commonName = cert.subject.getField('CN').value;
// ###BEGIN###{!Mode-NodeWebkit}
//saveAs(data2blob(xxCertificates[h].X509Certificate), xxCertificates[h].XSubject['CN'] + '.cer');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
if (type == 1) { // .cer format
chooser.setAttribute('nwsaveas', commonName + '.cer');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, certificate['certbin'], 'base64', function () { }); }, false);
} else if (type == 2) { // .pem format
chooser.setAttribute('nwsaveas', commonName + '.pem');
chooser.addEventListener('change', function () {
var ptr = 0, xcert = '';
// Write the public certificate
while (ptr < certificate['certbin'].length) { xcert += certificate['certbin'].substring(ptr, ptr + Math.min(certificate['certbin'].length - ptr, 64)) + '\r\n'; ptr += 64; }
xcert = '-----BEGIN CERTIFICATE-----\r\n' + xcert + '-----END CERTIFICATE-----\r\n';
if (certificate['privateKeyBin']) { xcert += '\r\n' + certificate['privateKeyBin']; } // Write the private key
require('fs').writeFile(this.value, xcert, function () { });
}, false);
}
chooser.click();
setDialogMode(0);
// ###END###{Mode-NodeWebkit}
}
function cert_saveCertP12(h) {
// Prompt to the PKCS12 password
var x = "인증서 개인 키 비밀번호를 입력하십시오." + '<br/><br/><div style=height:26px><input id=idx_filepass1 type=password onkeyup=cert_saveCertP12Update() style=float:right;width:200px><div>' + "암호" + '</div></div><div style=height:26px><input id=idx_filepass2 type=password onkeyup=cert_saveCertP12Update() style=float:right;width:200px><div>' + "암호" + '</div></div>';
setDialogMode(11, "인증서 비밀번호", 3, cert_saveCertP12b, x, h);
cert_saveCertP12Update();
}
function cert_saveCertP12Update() {
QE('idx_dlgOkButton', (Q('idx_filepass1').value == Q('idx_filepass2').value) && (Q('idx_filepass1').value.length > 0));
}
function cert_saveCertP12b(b, h) {
var certificate = getCertificate(h), cert = certificate.cert, commonName = cert.subject.getField('CN').value, pass = Q('idx_filepass1').value;
// ###BEGIN###{!Mode-NodeWebkit}
//saveAs(data2blob(xxCertificates[h].X509Certificate), xxCertificates[h].XSubject['CN'] + '.cer');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
chooser.setAttribute('nwsaveas', commonName + '.p12');
chooser.addEventListener('change', function() {
require('fs').writeFile(this.value, forge.util.encode64(forge.asn1.toDer(forge.pkcs12.toPkcs12Asn1(certificate['privateKey'], certificate['cert'], pass)).getBytes()), 'base64', function () { });
}, false);
chooser.click();
setDialogMode(0);
// ###END###{Mode-NodeWebkit}
}
function cert_viewex(b, certificate) {
if (b == 2) {
cert_removeCertificateEx(certificate['h']);
} else {
var update = 0;
if (certificate['trusted'] != Q('certTrustedCheck').checked) { certificate['trusted'] = Q('certTrustedCheck').checked; update = 1; }
if ((certificate['privateKey']) && Q('certMutualAuth') && (certificate['tlsauth'] != Q('certMutualAuth').checked)) {
for (var y in certificateStore) { certificateStore[y]['tlsauth'] = false; }
certificate['tlsauth'] = Q('certMutualAuth').checked;
update = 1;
}
if (update == 1) { cert_updateCertificateList(); cert_saveCertificates(); }
}
}
function cert_removeCertificateEx(h) {
cert_deleteCertificatesEx(2, [ getCertificate(h) ]);
}
function cert_select(e, h) {
if (h) { currentCertificate = getCertificate(h); /*updateComputerDetails();*/ }
for (var y in certificateStore) {
var certificate = certificateStore[y];
var sel = (currentCertificate != null && certificate['h'] == currentCertificate['h']);
QS('CR-' + certificate['h'])['background-color'] = sel ? '#a0a0a0' : '#c9c9c9';
Q('LCR-' + certificate['h']).classList.remove('g1');
Q('LCR-' + certificate['h']).classList.remove('g1s');
Q('RCR-' + certificate['h']).classList.remove('g2');
Q('RCR-' + certificate['h']).classList.remove('g2s');
Q('LCR-' + certificate['h']).classList.add(sel ? 'g1s' : 'g1');
Q('RCR-' + certificate['h']).classList.add(sel ? 'g2s' : 'g2');
}
QE('IssueCertButton', (currentCertificate != null) && (currentCertificate['privateKey']));
}
function getCertificate(h) { for (var i in certificateStore) { if (certificateStore[i]['h'] == h) return certificateStore[i]; } return null; }
function getCertificateWithKeyCount(h) { for (var i in certificateStore) { var c = 0; if (certificateStore[i]['privateKey']) { c++; } } return c; }
function getTlsAuthCertificate() { for (var i in certificateStore) { if (certificateStore[i]['tlsauth'] == true) return certificateStore[i]; } return null; }
function cert_onCertificateChecked() {
for (var y in certificateStore) { certificateStore[y].checked = Q('SC-' + certificateStore[y]['h']).checked; }
}
function cert_deleteCertificates() {
if (xxdialogMode) return;
// Figure out how many certificates are selected.
var clist = [];
for (var y in certificateStore) { if (certificateStore[y].checked == true) { clist.push(certificateStore[y]); } }
if (clist.length == 0) { clist.push(currentCertificate); }
if (clist.length == 1) {
setDialogMode(11, "인증서 삭제", 3, cert_deleteCertificatesEx, '<br>' + "인증서 1 개를 삭제 하시겠습니까?", clist);
} else {
setDialogMode(11, "인증서 삭제", 3, cert_deleteCertificatesEx, '<br>' + format("{0} 인증서를 삭제 하시겠습니까?", clist.length), clist);
}
}
function cert_deleteCertificatesEx(button, clist) {
for (var i in clist) {
var handleToDelete = clist[i]['h'];
if ((currentCertificate != null) && (currentCertificate['h'] == handleToDelete)) { currentCertificate = null; }
for (x = 0; x < certificateStore.length; x++) { if (certificateStore[x]['h'] == handleToDelete) { certificateStore.splice(x, 1); } }
}
cert_saveCertificates();
cert_updateCertificateList();
//updateComputerDetails();
}
function cert_loadCertificates() {
// ###BEGIN###{Mode-NodeWebkit}
var ctext = null;
try { ctext = localStorage.getItem('certificates'); } catch (ex) { }
if (ctext) {
try { computerlist = JSON.parse(ctext); } catch (e) {
if (ctext.length > 512) { // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
var crypto = require('crypto'), k = ctext.substring(0, 512), crypted = ctext.substring(512), decipher = crypto.createDecipher('aes-256-ctr', k), dec = decipher.update(crypted, 'hex', 'utf8');
dec += decipher.final('utf8');
var certificateStore2 = JSON.parse(dec);
if (Array.isArray(certificateStore2) == false) { certificateStore2 = []; }
for (var i in certificateStore2) {
try {
certificateStore2[i].checked = false;
if (certificateStore2[i]['certbin']) { certificateStore2[i]['cert'] = forge.pki.certificateFromAsn1(forge.asn1.fromDer(atob(certificateStore2[i]['certbin']))); }
if (certificateStore2[i]['privateKeyBin']) { certificateStore2[i]['privateKey'] = forge.pki.privateKeyFromPem(certificateStore2[i]['privateKeyBin']); }
} catch (e) { delete certificateStore2[i]; }
}
certificateStore = [];
for (var i in certificateStore2) { if (typeof certificateStore2[i] == 'object') certificateStore.push(certificateStore2[i]); }
}
}
}
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
//var ctext = null;
//try { ctext = localStorage.getItem('computers'); } catch (ex) { }
//if (ctext) { computerlist = JSON.parse(ctext); }
// ###END###{!Mode-NodeWebkit}
cert_updateCertificateList();
}
function cert_saveCertificates() {
// ###BEGIN###{Mode-NodeWebkit}
const crypto = require('crypto');
crypto.randomBytes(256, function(err, buf) {
if (err) throw err; // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
var k = buf.toString('hex'), cipher = crypto.createCipher('aes-256-ctr', k), crypted = cipher.update(JSON.stringify(certificateStore), 'utf8', 'hex');
crypted += cipher.final('hex');
try { localStorage.setItem('certificates', k + crypted); } catch (ex) { }
});
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
//try { localStorage.setItem('computers', JSON.stringify(computerlist)); } catch (ex) { }
// ###END###{!Mode-NodeWebkit}
}
function cert_createNew() {
if (xxdialogMode) return;
var x = '';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certcn style=float:right;width:230px><div style=padding-top:4px>' + "공통 이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certo style=float:right;width:230px><div style=padding-top:4px>' + "조직" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certst style=float:right;width:230px><div style=padding-top:4px>' + "시 /도" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certc style=float:right;width:230px><div style=padding-top:4px>' + "국가" + '</div></div>';
setDialogMode(11, "루트 인증서 생성", 3, cert_createNewEx, x);
cert_createNew_Update();
}
function cert_createNew_Update() {
x = (getInputElement('certcn').value != '' && getInputElement('certo').value != '' && getInputElement('certst').value != '' && getInputElement('certc').value != '');
QE('idx_dlgOkButton', x);
}
// --- Extended Key Usage OID's ---
// 1.3.6.1.5.5.7.3.1 = TLS Server certificate
// 1.3.6.1.5.5.7.3.2 = TLS Client certificate
// 2.16.840.1.113741.1.2.1 = Intel AMT Remote Console
// 2.16.840.1.113741.1.2.2 = Intel AMT Local Console
// 2.16.840.1.113741.1.2.3 = Intel AMT Client Setup Certificate (Zero-Touch)
function cert_createNewEx(b, rootCert) {
// Generate a keypair and create an X.509v3 certificate
var keys = forge.pki.rsa.generateKeyPair(2048);
var cert = forge.pki.createCertificate();
cert.publicKey = keys.publicKey;
cert.serialNumber = '' + Math.floor((Math.random() * 100000) + 1);
cert.validity.notBefore = new Date(2018, 0, 1);
//cert.validity.notBefore.setFullYear(cert.validity.notBefore.getFullYear() - 1); // Create a certificate that is valid one year before, to make sure out-of-sync clocks don't reject this cert.
cert.validity.notAfter = new Date(2049, 11, 31);
//cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 20);
var attrs = [
{ name: 'commonName', value: Q('certcn').value },
{ name: 'countryName', value: Q('certc').value },
{ shortName: 'ST', value: Q('certst').value },
{ name: 'organizationName', value: Q('certo').value }
];
cert.setSubject(attrs);
if (rootCert) {
// Use root attributes
cert.setIssuer(rootCert['cert'].subject.attributes);
} else {
// Use our own attributes
cert.setIssuer(attrs);
}
if (rootCert == undefined) {
// Create a root certificate
cert.setExtensions([{
name: 'basicConstraints',
cA: true
}, {
name: 'nsCertType',
sslCA: true,
emailCA: true,
objCA: true
}, {
name: 'subjectKeyIdentifier'
}]);
} else {
// Figure out the extended key usages
var extKeyUsage = { name: 'extKeyUsage' }
if (Q('d11_cu1').checked) { extKeyUsage['2.16.840.1.113741.1.2.1'] = true; extKeyUsage.clientAuth = true; }
if (Q('d11_cu2').checked) { extKeyUsage['2.16.840.1.113741.1.2.2'] = true; extKeyUsage.clientAuth = true; }
if (Q('d11_cu3').checked) { extKeyUsage['2.16.840.1.113741.1.2.3'] = true; extKeyUsage.clientAuth = true; }
if (Q('d11_cu4').checked) { extKeyUsage.serverAuth = true; }
if (Q('d11_cu5').checked) { extKeyUsage.clientAuth = true; }
if (Q('d11_cu6').checked) { extKeyUsage.emailProtection = true; }
if (Q('d11_cu7').checked) { extKeyUsage.codeSigning = true; }
if (Q('d11_cu8').checked) { extKeyUsage.timeStamping = true; }
// Create a leaf certificate
cert.setExtensions([{
name: 'basicConstraints'
}, {
name: 'keyUsage',
keyCertSign: true,
digitalSignature: true,
nonRepudiation: true,
keyEncipherment: true,
dataEncipherment: true
}, extKeyUsage, {
name: 'nsCertType',
client: Q('d11_cu5').checked,
server: Q('d11_cu4').checked,
email: Q('d11_cu6').checked,
objsign: Q('d11_cu7').checked,
}, {
name: 'subjectKeyIdentifier'
} ]);
}
// Self-sign certificate
if (rootCert) {
cert.sign(rootCert['privateKey'], forge.md.sha256.create());
} else {
cert.sign(keys.privateKey, forge.md.sha256.create());
}
// Save the certificate in the store
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(hex2rstr(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex())), 'privateKey': keys.privateKey, 'privateKeyBin': forge.pki.privateKeyToPem(keys.privateKey), 'checked': false });
cert_saveCertificates();
cert_updateCertificateList();
}
function cert_issueNew() {
if (xxdialogMode) return;
var x = '';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certcn style=float:right;width:230px><div style=padding-top:4px>' + "공통 이름" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certo style=float:right;width:230px><div style=padding-top:4px>' + "조직" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certst style=float:right;width:230px><div style=padding-top:4px>' + "시 /도" + '</div></div>';
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certc style=float:right;width:230px><div style=padding-top:4px>' + "국가" + '</div></div>';
x += '<div>Certificate Usages</div><ul style="list-style-type:none;height:100px;overflow:auto;width:100%;border: 1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0">';
x += '<li><label><input type=checkbox id=d11_cu1>' + "인텔 &reg; AMT 콘솔" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu2>' + "인텔 &reg; AMT 에이전트" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu3>' + "인텔 &reg; AMT 활성화" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu4>' + "TLS 서버 (HTTPS)" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu5>' + "TLS 클라이언트 (HTTPS)" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu6>' + "이메일 보호" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu7>' + "코드 서명" + '</label></li>';
x += '<li><label><input type=checkbox id=d11_cu8>' + "타임 스탬프" + '</label></li>';
x += '</ul>';
setDialogMode(11, format("{0}이 서명 한 인증서 발급", currentCertificate.cert.subject.getField('CN').value), 3, cert_createNewEx, x, currentCertificate);
cert_issueNew_Update();
}
function cert_issueNew_Update() {
x = (getInputElement('certcn').value != '' && getInputElement('certo').value != '' && getInputElement('certst').value != '' && getInputElement('certc').value != '');
QE('idx_dlgOkButton', x);
}
function cert_importCert() {
if (xxdialogMode) return;
// ###BEGIN###{Mode-NodeWebkit}
var chooser = Q('certOpenFile');
if (chooser.getAttribute('eventset') != 1) {
chooser.setAttribute('eventset', '1');
chooser.addEventListener('change', cert_importCertOk, false);
}
chooser.value = null;
chooser.click();
// ###END###{Mode-NodeWebkit}
}
function cert_importCertOk2(e) {
haltEvent(e);
if (e.dataTransfer.files.length == 1) {
var reader = new FileReader();
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.p12') || e.dataTransfer.files[0].name.toLowerCase().endsWith('.pfx')) {
reader.onload = cert_importCertOkP12;
} else {
reader.onload = cert_importCertOkCER;
}
reader.readAsBinaryString(e.dataTransfer.files[0]);
}
}
function cert_importCertOk() {
var x = Q('certOpenFile');
if (x.files.length != 1) return;
var reader = new FileReader();
if (x.files[0].name.toLowerCase().endsWith('.p12') || x.files[0].name.toLowerCase().endsWith('.pfx')) { reader.onload = cert_importCertOkP12; } else { reader.onload = cert_importCertOkCER; }
reader.readAsBinaryString(x.files[0]);
}
function cert_importCertOkP12(file) {
// Prompt to the PKCS12 password
var x = "선택한 인증서 파일에는 비밀번호가 필요합니다." + '<br/><br/><div style=height:26px><input id=idx_filepass type=password style=float:right;width:200px><div>' + "암호" + '</div></div>';
setDialogMode(11, "인증서 비밀번호", 3, cert_importCertOkP12b, x, file);
}
function cert_importCertOkP12b(button, file) {
// Try to decode the PKCS12 file
var p12;
try { p12 = forge.pkcs12.pkcs12FromAsn1(forge.asn1.fromDer(file.target.result), Q('idx_filepass').value); } catch (e) { setDialogMode(11, "인증서 파일", 1, function() {}, "인증서 비밀번호가 잘못되었거나 파일을 디코딩 할 수 없습니다."); return; }
var bags1 = p12.getBags({bagType: forge.pki.oids.certBag});
var cert = bags1[forge.pki.oids.certBag][0].cert;
var bags2 = p12.getBags({bagType: '1.2.840.113549.1.12.10.1.2'})
var key = bags2['1.2.840.113549.1.12.10.1.2'][0].key;
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(hex2rstr(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex())), 'privateKey': key, 'privateKeyBin': forge.pki.privateKeyToPem(key), 'checked': false });
cert_saveCertificates();
cert_updateCertificateList();
}
function cert_importCertOkCER(file) {
var cert, str = file.target.result;
var pemcert = cert_getMiddleString(str, '-----BEGIN CERTIFICATE-----', '-----END CERTIFICATE-----');
var pemkey = cert_getMiddleString(str, '-----BEGIN PRIVATE KEY-----', '-----END PRIVATE KEY-----');
if (pemkey == null) { pemkey = cert_getMiddleString(str, '-----BEGIN RSA PRIVATE KEY-----', '-----END RSA PRIVATE KEY-----'); }
if (pemcert != null) {
// Try to decode the .PEM file
try { cert = forge.pki.certificateFromPem(pemcert); } catch (e) { setDialogMode(11, "인증서 파일", 1, function () { }, "PEM 파일을 디코딩 할 수 없습니다."); return; }
if (pemkey == null) {
// Public key only
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()), 'checked': false });
} else {
// Public and private key
var privatekey;
try { privatekey = forge.pki.privateKeyFromPem(pemkey); } catch (e) { setDialogMode(11, "인증서 파일", 1, function () { }, "PEM 개인 키를 해독 할 수 없습니다."); return; }
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()), 'privateKey': privatekey, 'privateKeyBin': forge.pki.privateKeyToPem(privatekey), 'checked': false });
}
} else {
// Try to decode the .CER file, public key only
try { cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(str)); } catch (e) { setDialogMode(11, "인증서 파일", 1, function () { }, "인증서 파일을 디코딩 할 수 없습니다."); return; }
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(file.target.result), 'checked': false });
}
cert_saveCertificates();
cert_updateCertificateList();
}
function cert_getMiddleString(str, start, end) { var a = str.indexOf(start), b = str.indexOf(end); if ((a == -1) || (b == -1) || (b < a)) return null; return str.substring(a, b + end.length); }
// ###END###{CertificateManager}
// ###BEGIN###{USBSetup}
//
// USB SETUP.BIN
//
function usb_newSetupBin() {
if (xxdialogMode) return;
idx_d14version.value = 4;
idx_d14consume.value = 1;
setDialogMode(14, "새로운 Setup.bin 파일 만들기", 3, usb_newSetupBinOk);
}
function usb_newSetupBinOk(r) {
if (r == 1) { setupbin = AmtSetupBinCreate(idx_d14version.value, idx_d14consume.value); } // OK Button
usb_displaySetupBin();
}
function usb_openSetupBin() {
if (xxdialogMode) return;
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
chooser.setAttribute('accept', '.bin')
chooser.addEventListener('change', function() {
setupbin = AmtSetupBinDecode(require('fs').readFileSync(this.value, 'binary'));
if (!setupbin) { messagebox("파일 열기", "잘못되거나 손상된 setup.bin 파일. 열 수가없는."); } else { usb_displaySetupBin(); }
}, false);
chooser.value = null;
chooser.click();
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{!Mode-NodeWebkit}
setDialogMode(15, "Open Setup.bin file", 3, usb_openSetupBinOk);
// ###END###{!Mode-NodeWebkit}
}
function usb_openSetupBinOk() {
var x = Q('d15setupbinfile');
if (x.files.length != 1) return;
var reader = new FileReader();
reader.onload = usb_onSetupBinRead;
reader.readAsBinaryString(x.files[0]);
}
// ###BEGIN###{FileSaver}
function usb_saveSetupBin() {
if (xxdialogMode || !setupbin) return;
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(AmtSetupBinEncode(setupbin)), 'setup.bin');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
chooser.setAttribute('nwsaveas', 'setup.bin');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, AmtSetupBinEncode(setupbin), 'binary', function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
function usb_onSetupBinRead(file) {
setupbin = AmtSetupBinDecode(file.target.result);
if (!setupbin) { messagebox("파일 열기", "잘못되거나 손상된 setup.bin 파일. 열 수가없는."); } else { usb_displaySetupBin(); }
}
function usb_displaySetupBin() {
QV('id_StartupScreen', !setupbin);
// ###BEGIN###{FileSaver}
QV('id_saveSetupBin', setupbin);
// ###END###{FileSaver}
if (!setupbin) { return QH('id_SetupBinArea', ''); }
// Update record count
var consumed = 0;
for (var i in setupbin.records) { if ((setupbin.records[i].flags & 1) == 0) { consumed++; } }
setupbin.dataRecordsConsumed = consumed;
// Main Header
var x = '<table onclick=usb_editheader(event) class="log1 us" cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px;cursor:pointer><tr><td><p><td>';
x += '<tr><td class=r2 style=padding-left:15px>';
x += '<div style=float:right;margin-right:12px onclick=usb_addRecordSetupBin()><a><u title=\'' + "새 레코드 추가" + '\'>' + "레코드 추가" + '</u></a></div>';
x += '<div><strong>' + format("인텔 &reg; AMT Setup.bin 파일 버전 {0}. {1}", setupbin.majorVersion, + setupbin.minorVersion) + '</strong>.</div>';
x += (((setupbin.flags & 1) == 0) ? 'Records will be consumed.' : 'Records will not be consumed.');
x += '<br>' + format("레코드 : {0}, 소비 : {1}", setupbin.records.length, setupbin.dataRecordsConsumed)+ '<br>';
x += '<tr style=height:4px></table>';
// Display each record
for (var i in setupbin.records) {
var rec = setupbin.records[i];
x += '<div style=height:4px></div><table class="log1 us" cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td><tr><td class=r2 style=padding-left:15px;cursor:pointer>';
x += '<div style=float:right;margin-right:12px onclick="usb_addvariable(event,' + i + ')"><a><u title="' + "새 변수 추가" + '">' + "변수 추가" + '</u></a></div>';
x += '<div onclick=\'usb_editrecord(event, ' + i + ')\'>' + "레코드 번호" + '<strong>' + (+i + 1) + '</strong>. ' + "이 기록은 다음과 같습니다 " + '<strong>' + ((rec.flags & 1) ? "유효한" : "소비") + ((rec.flags & 2) ? ", 스크램블" : '') + '</strong></div>';
// Display each variable
for (var j in rec.variables) {
var v = rec.variables[j], val = v.value;
if (AmtSetupBinVarIds[v.moduleid][v.varid][2] && AmtSetupBinVarIds[v.moduleid][v.varid][2][val]) { val = AmtSetupBinVarIds[v.moduleid][v.varid][2][val]; }
if (v.moduleid == 2 && v.varid == 8) {
var hashtype = val.charCodeAt(0);
if (hashtype >= 0 && hashtype <= 3) {
var hashsize = [20, 32, 48][hashtype - 1];
var hash = rstr2hex(val.substring(1, hashsize + 1));
var hashnamesize = val.charCodeAt(1 + hashsize);
var hashname = val.substring(2 + hashsize, 2 + hashsize + hashnamesize)
val = ['SHA1', 'SHA256', 'SHA384'][hashtype - 1] + ', ' + hashname + ', ' + hash;
}
}
if (v.moduleid == 2 && v.varid == 17) {
val = val.charCodeAt(3) + '.' + val.charCodeAt(2) + '.' + val.charCodeAt(1) + '.' + val.charCodeAt(0);
}
x += '<div style=margin-right:12px><table onclick=\'usb_editvariable(event,' + i + ',' + j + ')\' class=\'itemBar us\' cellpadding=0 cellspacing=0 style=width:100%;border-radius:4px;margin-top:2px;margin-bottom:2px;padding:0><tr><td><p style=float:right;margin-right:8px><b>' + val + '</b><p>' + v['desc'] + '<tr style=height:4px></table></div>';
}
x += '<tr style=height:4px></table>';
}
QH('id_SetupBinArea', x);
}
function usb_addRecordSetupBin() {
if (xxdialogMode) return;
d13valid.checked = 1;
d13scramble.checked = 0;
QV('d13ScrambledRecordSpan', setupbin.majorVersion > 3);
setDialogMode(13, "새로운 기록 #", 3, usb_addRecordSetupBinOk);
}
function usb_addRecordSetupBinOk() {
var r = {};
r.typeIdentifier = 1;
r.flags = (d13valid.checked ? 1 : 0) + (d13scramble.checked ? 2 : 0);
r.chunkCount = 0;
r.headerByteCount = 0;
r.number = 0;
r.variables = [];
setupbin.records.push(r);
usb_displaySetupBin();
}
function usb_editheader(e) {
if (xxdialogMode) return;
haltEvent(e);
idx_d14version.value = setupbin.majorVersion;
idx_d14consume.value = (setupbin.flags & 1);
setDialogMode(14, "헤더 편집", 7, usb_editheaderok);
}
function usb_editheaderok(r) {
if (r == 2) {
delete setupbin;
} else {
setupbin.majorVersion = idx_d14version.value;
setupbin.flags = idx_d14consume.value;
}
usb_displaySetupBin();
}
function usb_editrecord(e, i) {
if (xxdialogMode) return;
selectedRecord = i;
selectedVariable = -1;
haltEvent(e);
d13valid.checked = (setupbin.records[selectedRecord].flags & 1);
d13scramble.checked = (setupbin.records[selectedRecord].flags & 2);
QV('d13ScrambledRecordSpan', setupbin.majorVersion > 3);
setDialogMode(13, format("레코드 번호 {0} 편집", (i + 1)), 7, usb_editrecordok);
}
function usb_editrecordok(r) {
if (r == 1) { setupbin.records[selectedRecord].flags = (d13valid.checked ? 1 : 0) + (d13scramble.checked ? 2 : 0); } // Edit Record
if (r == 2) { setupbin.records.splice(selectedRecord, 1); } // Delete Record
usb_displaySetupBin();
}
function usb_editvariable(e, i, j) {
if (xxdialogMode) return;
selectedRecord = i;
selectedVariable = j;
var modid = setupbin.records[i].variables[j].moduleid;
var varid = setupbin.records[i].variables[j].varid;
d16type.value = modid + '-' + varid;
d16type.disabled = true;
usb_ond16typechange();
QV('d16genericvalue', false);
QV('d16customvalue', false);
if (modid == 2 && varid == 8) {
var x = '<div style=height:26px><select id=idx_d16valc1 style=float:right;width:260px onchange=usb_ond16checkhash()><option value=1>' + "SHA1" + '</option>';
if (setupbin.majorVersion >= 3) { x += '<option value=2>SHA256</option><option value=3>' + "SHA384" + '</option>'; }
x += '</select><div>' + "해시 유형" + '</div></div>';
x += '<div style=height:26px><input id=idx_d16valc2 style=float:right;width:260px onkeyup=usb_ond16checkhash()><div>' + "해시 (HEX)" + '</div></div>';
x += '<div style=height:26px><input id=idx_d16valc3 style=float:right;width:260px onkeyup=usb_ond16checkhash() maxlength=31><div>' + "해시 이름" + '</div></div>';
QH('d16customvalue', x);
QV('d16customvalue', true);
var val = setupbin.records[i].variables[j].value;
var hashtype = val.charCodeAt(0);
if (hashtype >= 0 && hashtype <= 3) {
var hashsize = [20, 32, 48][hashtype - 1];
var hash = rstr2hex(val.substring(1, hashsize + 1));
var hashnamesize = val.charCodeAt(1 + hashsize);
var hashname = val.substring(2 + hashsize, 2 + hashsize + hashnamesize)
val = ["SHA1", "SHA256", "SHA384"][hashtype - 1] + ', ' + hashname + ', ' + hash;
Q('idx_d16valc1').value = hashtype;
Q('idx_d16valc2').value = hash;
Q('idx_d16valc3').value = hashname;
}
usb_ond16checkhash();
} else if (modid == 2 && varid == 17) { // Provisioning server address
QV('d16genericvalue', true);
var ip = setupbin.records[i].variables[j].value;
idx_d16value1.value = idx_d16value2.value = ip.charCodeAt(3) + '.' + ip.charCodeAt(2) + '.' + ip.charCodeAt(1) + '.' + ip.charCodeAt(0);
} else {
QV('d16genericvalue', true);
idx_d16value1.value = idx_d16value2.value = setupbin.records[i].variables[j].value;
}
haltEvent(e);
setDialogMode(16, format("레코드 # {0}, 변수 # {1} 편집", (i + 1), (j + 1)), 7, usb_editvariableok);
}
function usb_editvariableok(r) {
if (r == 1) { // OK
var ids = d16type.value.split('-');
var modid = +ids[0];
var varid = +ids[1];
var value = '';
var vardescription = AmtSetupBinVarIds[modid][varid];
if ((modid == 2) && (varid == 8)) {
value = String.fromCharCode(Q('idx_d16valc1').value) + hex2rstr(Q('idx_d16valc2').value) + String.fromCharCode(Q('idx_d16valc3').value.length) + Q('idx_d16valc3').value;
} else {
if (vardescription[2]) { value = idx_d16value1.value; } else { value = idx_d16value2.value; }
}
if ((modid == 2) && (varid == 17)) { // Provisioning server address
var ipSplit = value.split('.');
if (ipSplit.length != 4) return;
value = String.fromCharCode(parseInt(ipSplit[3]), parseInt(ipSplit[2]), parseInt(ipSplit[1]), parseInt(ipSplit[0]));
}
setupbin.records[selectedRecord].variables[selectedVariable].value = value;
}
if (r == 2) { setupbin.records[selectedRecord].variables.splice(selectedVariable, 1); } // Delete
usb_displaySetupBin();
}
function usb_addvariable(e, i) {
if (xxdialogMode) return;
selectedRecord = i;
d16type.value = '1-1';
d16type.disabled = false;
idx_d16value1.value = idx_d16value2.value = '';
usb_ond16typechange();
haltEvent(e);
setDialogMode(16, format("레코드 # {0}에 변수 추가", (i + 1)), 3, usb_addvariableok);
}
function usb_addvariableok() {
var ids = d16type.value.split('-');
var modid = +ids[0];
var varid = +ids[1];
var value = '';
var vardescription = AmtSetupBinVarIds[modid][varid];
if ((modid == 2) && (varid == 8)) {
value = String.fromCharCode(Q('idx_d16valc1').value) + hex2rstr(Q('idx_d16valc2').value) + String.fromCharCode(Q('idx_d16valc3').value.length) + Q('idx_d16valc3').value;
} else {
if (vardescription[2]) { value = idx_d16value1.value; } else { value = idx_d16value2.value; }
}
if ((modid == 2) && (varid == 17)) { // Provisioning server address
var ipSplit = value.split('.');
if (ipSplit.length != 4) return;
value = String.fromCharCode(parseInt(ipSplit[3]), parseInt(ipSplit[2]), parseInt(ipSplit[1]), parseInt(ipSplit[0]));
}
// Create a new variable
var v = {};
v.moduleid = modid;
v.varid = varid;
v.length = -1;
v.type = AmtSetupBinVarIds[modid][varid][0];
v.desc = AmtSetupBinVarIds[modid][varid][1];
v.value = value;
setupbin.records[selectedRecord].variables.push(v);
setupbin.records[selectedRecord].variables.sort(AmtSetupBinVariableCompare); // Sort the variables
usb_displaySetupBin();
}
function usb_ond16typechange() {
var ids = d16type.value.split('-');
var modid = +ids[0];
var varid = +ids[1];
var vardescription = AmtSetupBinVarIds[modid][varid];
QV('d16genericvalue', false);
QV('d16customvalue', false);
if (modid == 2 && varid == 8) {
var x = '<div style=height:26px><select id=idx_d16valc1 style=float:right;width:260px onchange=usb_ond16checkhash()><option value=1>' + "SHA1" + '</option>';
if (setupbin.majorVersion >= 3) { x += ('<option value=2>' + "SHA256" + '</option><option value=3>' + "SHA384" + '</option>'); }
x += '</select><div>' + "해시 유형" + '</div></div>';
x += '<div style=height:26px><input id=idx_d16valc2 style=float:right;width:260px onkeyup=usb_ond16checkhash()><div>' + "해시 (HEX)" + '</div></div>';
x += '<div style=height:26px><input id=idx_d16valc3 style=float:right;width:260px onkeyup=usb_ond16checkhash() maxlength=31><div>' + "해시 이름" + '</div></div>';
QV('d16customvalue', true);
QH('d16customvalue', x);
usb_ond16checkhash();
} else {
QV('d16genericvalue', true);
if (vardescription[2]) {
QV('idx_d16value1', true);
QV('idx_d16value2', false);
var options = '';
for (var i in vardescription[2]) { options += '<option value="' + i + '">' + vardescription[2][i] }
QH('idx_d16value1', options);
} else {
QV('idx_d16value1', false);
QV('idx_d16value2', true);
}
}
}
function usb_ond16checkhash() {
var hashtype = Q('idx_d16valc1').value;
var hashlen = hex2rstr(Q('idx_d16valc2').value).length;
QE('idx_dlgOkButton', (Q('idx_d16valc3').value.length > 0) && ((hashtype == 1) && (hashlen == 20)) || ((hashtype == 2) && (hashlen == 32)) || ((hashtype == 3) && (hashlen == 48)));
}
var usb_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
function usb_computeChecksum(s) {
var A = 0;
for (var i = 0; i < s.length; i++) A += s.charCodeAt(i);
return usb_alphabet[A % 36];
}
function usb_generateRandomPid() {
var pid = '';
for (var i = 0; i < 7; i++) { pid += usb_alphabet[random(36)]; }
return pid + usb_computeChecksum(pid);
}
function usb_generateRandomPps()
{
var pps = '', s;
for (var j = 0; j < 8; j++) {
s = '';
for (var i = 0; i < 3; i++) s += usb_alphabet[random(36)];
pps += s + usb_computeChecksum(s);
}
return pps;
}
// ###END###{USBSetup}
// ###BEGIN###{SessionRecording}
var recFile = null;
var recFilePtr = 0;
var recFileStartTime = 0;
var recFileLastTime = 0;
var recFileEndTime = 0;
var recFileMetadata = null;
var recFileProtocol = 0;
var agentDesktop = null;
var agentTerminal = null;
var amtDesktop = null;
var srec_playing = 0; // 0 = Stopped, 1 = Pausing, 2 = Playing
var readState = 0;
var waitTimer = null;
var waitTimerArgs = null;
var srec_deskAspectRatio = 0;
var currentDeltaTimeTotalSec = 0;
function readNextBlock(func) {
if ((recFilePtr + 16) > recFile.size) { QS('srec_progressbar').width = '100%'; func(-1); } else {
var fr = new FileReader();
fr.onload = function () {
var type = ReadShort(this.result, 0);
var flags = ReadShort(this.result, 2);
var size = ReadInt(this.result, 4);
var time = (ReadInt(this.result, 8) << 32) + ReadInt(this.result, 12);
if ((recFilePtr + 16 + size) > recFile.size) { QS('srec_progressbar').width = '100%'; func(-1); } else {
var fr2 = new FileReader();
fr2.onload = function () {
recFilePtr += (16 + size);
if (recFileEndTime == 0) {
// File pointer progress bar
QS('srec_progressbar').width = Math.floor(100 * (recFilePtr / recFile.size)) + '%';
} else {
// Time progress bar
QS('srec_progressbar').width = Math.floor(((recFileLastTime - recFileStartTime) / (recFileEndTime - recFileStartTime)) * 100) + '%';
}
func(type, flags, time, this.result);
};
fr2.readAsBinaryString(recFile.slice(recFilePtr + 16, recFilePtr + 16 + size));
}
};
fr.readAsBinaryString(recFile.slice(recFilePtr, recFilePtr + 16));
}
}
function readLastBlock(func) {
if (recFile.size < 32) { func(-1); } else {
var fr = new FileReader();
fr.onload = function () {
var type = ReadShort(this.result, 0);
var flags = ReadShort(this.result, 2);
var size = ReadInt(this.result, 4);
var time = (ReadInt(this.result, 8) << 32) + ReadInt(this.result, 12);
if ((type == 3) && (size == 16) && (this.result.substring(16, 32) == 'MeshCentralMCREC')) { func(type, flags, time); } else { func(-1); }
};
fr.readAsBinaryString(recFile.slice(recFile.size - 32, recFile.size));
}
}
function addInfo(name, value) { if (value == null) return ''; return addInfoNoEsc(name, EscapeHtml(value)); }
function addInfoNoEsc(name, value) {
if (value == null) return '';
return '<span style=color:gray>' + EscapeHtml(name) + '</span>:&nbsp;<span style=font-size:20px;color:black>' + value + '</span><br/>';
}
function processFirstBlock(type, flags, time, data) {
recFileProtocol = 0;
if ((type != 1) || (flags != 0)) { cleanup(); return; }
try { recFileMetadata = JSON.parse(data) } catch (ex) { cleanup(); return; }
if ((recFileMetadata == null) || (recFileMetadata.magic != 'MeshCentralRelaySession') || (recFileMetadata.ver != 1)) { cleanup(); return; }
var x = '';
x += addInfo("시각", recFileMetadata.time);
if (recFileEndTime != 0) {
var secs = Math.floor((recFileEndTime - time) / 1000);
if (secs > 1) { x += addInfo("지속", format("{0} 초", secs)); } else { x += addInfo("지속", "1 초"); }
}
x += addInfo("사용자 이름", recFileMetadata.username);
x += addInfo("UserID", recFileMetadata.userid);
x += addInfo("SessionID", recFileMetadata.sessionid);
if (recFileMetadata.ipaddr1 && recFileMetadata.ipaddr2) { x += addInfo("구애", format("{0}에서 {1}", recFileMetadata.ipaddr1, recFileMetadata.ipaddr2)); }
x += addInfo("노드 ID", recFileMetadata.nodeid);
if (recFileMetadata.protocol) {
var p = recFileMetadata.protocol;
if (p == 1) { p = "MeshCentral 터미널"; }
else if (p == 2) { p = "MeshCentral 데스크탑"; }
else if (p == 100) { p = "인텔 &reg; AMT WSMAN"; }
else if (p == 101) { p = "인텔 &reg; AMT 리디렉션"; }
else if (p == 200) { p = "인텔 &reg; AMT KVM"; }
x += addInfoNoEsc("실험 계획안", p);
}
QV('srec_DeskParent', false);
QV('srec_TermParent', false);
if (recFileMetadata.protocol == 1) {
// MeshCentral remote terminal
recFileProtocol = 1;
x += '<br /><br /><span style=color:gray>' + "재생 / 일시 정지하려면 [space]를 누르십시오." + '</span>';
QE('srec_PlayButton', true);
QE('srec_PauseButton', false);
QE('srec_RestartButton', false);
QV('srec_toggleviewmode', false);
recFileStartTime = recFileLastTime = time;
}
else if (recFileMetadata.protocol == 2) {
// MeshCentral remote desktop
recFileProtocol = 2;
x += '<br /><br /><span style=color:gray>' + "재생 / 일시 정지하려면 [space]를 누르십시오." + '</span>';
QE('srec_PlayButton', true);
QE('srec_PauseButton', false);
QE('srec_RestartButton', false);
QV('srec_toggleviewmode', true);
recFileStartTime = recFileLastTime = time;
agentDesktop = CreateAgentRemoteDesktop('srec_Desk');
agentDesktop.onScreenSizeChange = srec_deskAdjust;
agentDesktop.State = 3;
srec_deskAdjust();
}
else if (recFileMetadata.protocol == 101) {
// Intel AMT Redirection
recFileProtocol = 101;
x += '<br /><br /><span style=color:gray>' + "재생 / 일시 정지하려면 [space]를 누르십시오." + '</span>';
QE('srec_PlayButton', true);
QE('srec_PauseButton', false);
QE('srec_RestartButton', false);
QV('srec_toggleviewmode', true);
recFileStartTime = recFileLastTime = time;
amtDesktop = CreateAmtRemoteDesktop('srec_Desk');
amtDesktop.onScreenSizeChange = srec_deskAdjust;
amtDesktop.State = 3;
amtDesktop.Start();
srec_deskAdjust();
} else if (recFileMetadata.protocol == 200) {
// Intel AMT Midstream KVM
recFileProtocol = 200;
x += '<br /><br /><span style=color:gray>' + "재생 / 일시 정지하려면 [space]를 누르십시오." + '</span>';
QE('srec_PlayButton', true);
QE('srec_PauseButton', false);
QE('srec_RestartButton', false);
QV('srec_toggleviewmode', true);
recFileStartTime = recFileLastTime = time;
amtDesktop = CreateAmtRemoteDesktop('srec_Desk');
amtDesktop.onScreenSizeChange = srec_deskAdjust;
amtDesktop.State = 3;
amtDesktop.Start();
if (recFileMetadata.bpp) { amtDesktop.bpp = recFileMetadata.bpp; }
if (recFileMetadata.graymode) { amtDesktop.graymode = recFileMetadata.graymode; }
if (recFileMetadata.lowcolor) { amtDesktop.lowcolor = recFileMetadata.lowcolor; }
amtDesktop.state = 3;
srec_deskAdjust();
}
QV('srec_metadatadiv', true);
QH('srec_metadatadiv', x);
QH('srec_deskstatus', recFile.name);
}
function processBlock(type, flags, time, data) {
if (type < 0) { srec_pause(); return; }
var waitTime = Math.round((time - recFileLastTime) * parseFloat(Q('srec_PlaySpeed').value));
if (waitTime < 5) {
processBlockEx(type, flags, time, data);
} else {
waitTimerArgs = [type, flags, time, data]
waitTimer = setTimeout(function () { waitTimer = null; processBlockEx(waitTimerArgs[0], waitTimerArgs[1], waitTimerArgs[2], waitTimerArgs[3]); }, waitTime);
}
}
function processBlockEx(type, flags, time, data) {
if (srec_playing == 0) return;
var flagBinary = (flags & 1) != 0, flagUser = (flags & 2) != 0;
// Update the clock
var deltaTimeTotalSec = Math.floor((time - recFileStartTime) / 1000);
if (currentDeltaTimeTotalSec != deltaTimeTotalSec) {
currentDeltaTimeTotalSec = deltaTimeTotalSec;
var deltaTimeHours = Math.floor(deltaTimeTotalSec / 3600);
deltaTimeTotalSec -= (deltaTimeHours * 3600)
var deltaTimeMinutes = Math.floor(deltaTimeTotalSec / 60);
deltaTimeTotalSec -= (deltaTimeHours * 60)
var deltaTimeSeconds = Math.floor(deltaTimeTotalSec);
QH('srec_timespan', pad2(deltaTimeHours) + ':' + pad2(deltaTimeMinutes) + ':' + pad2(deltaTimeSeconds))
}
if ((type == 2) && flagBinary && !flagUser) {
// Device --> User data
if (recFileProtocol == 1) {
// MeshCentral Terminal
agentTerminal.ProcessData(data);
} else if (recFileProtocol == 2) {
// MeshCentral Remote Desktop
agentDesktop.ProcessData(data);
} else if (recFileProtocol == 101) {
// Intel AMT KVM
if ((readState == 0) && (rstr2hex(data).startsWith('4100000000000000'))) {
// We are not authenticated, KVM data starts here.
readState = 1;
if (data.length > 8) {
var view = new Uint8Array(data.length - 8);
for (var i = 8; i < data.length; i++) { view[i] = data.charCodeAt(i); }
amtDesktop.ProcessBinaryData(view.buffer);
}
} else if (readState == 1) {
var view = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) { view[i] = data.charCodeAt(i); }
amtDesktop.ProcessBinaryData(view.buffer);
}
} else if (recFileProtocol == 200) {
// Intel AMT midstream KVM
var view = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) { view[i] = data.charCodeAt(i); }
amtDesktop.ProcessBinaryData(view.buffer);
}
} else if ((type == 2) && flagBinary && flagUser) {
// User --> Device data
if (recFileProtocol == 101) {
// Intel AMT KVM
if (rstr2hex(data) == '0000000008080001000700070003050200000000') { console.log('RGB8'); amtDesktop.bpp = 1; } // Switch to 1 byte per pixel, 256 colors
if (rstr2hex(data) == '000000000808000100FF00000000000000000000') { console.log('GRAY8'); amtDesktop.bpp = 1; obj.graymode = true; } // Switch to 1 byte per pixel, 256 grays
if (rstr2hex(data) == '0000000008040001000F00000000000000000000') { console.log('GRAY4'); amtDesktop.bpp = 1; obj.graymode = true; obj.lowcolor = true; } // Switch to 1 byte per pixel, 16 grays
}
}
// This is a PNG screenshot of the display, load it and render it.
if ((type == 3) && (recFileProtocol == 200)) {
var tile = new Image();
tile.src = 'data:image/png;base64,' + btoa(data);
tile.onload = function () { amtDesktop.canvas.drawImage(tile, 0, 0); }
tile.error = function () { }
}
recFileLastTime = time;
if (srec_playing == 2) { readNextBlock(processBlock); }
}
function srec_cleanup() {
recFile = null;
recFilePtr = 0;
recFileMetadata = null;
srec_playing = 0;
if (agentDesktop != null) { agentDesktop.Canvas.clearRect(0, 0, agentDesktop.CanvasId.width, agentDesktop.CanvasId.height); agentDesktop = null; }
if (amtDesktop != null) { amtDesktop.canvas.clearRect(0, 0, amtDesktop.canvasid.width, amtDesktop.canvasid.height); amtDesktop = null; }
readState = 0;
waitTimerArgs = null;
currentDeltaTimeTotalSec = 0;
recFileEndTime = 0;
agentTerminal = null;
if (waitTimer != null) { clearTimeout(waitTimer); waitTimer = null; }
QH('srec_deskstatus', '');
QE('srec_PlayButton', false);
QE('srec_PauseButton', false);
QE('srec_RestartButton', false);
QS('srec_progressbar').width = '0px';
QH('srec_timespan', '00:00:00');
QV('srec_metadatadiv', true);
QH('srec_metadatadiv', '<div style="width:100%;text-align:center;color:gray;margin-top:26px"><span style="font-size:20px">' + "녹화 된 세션 플레이어" + '</span><div style="margin:4px">' + ".mcrec 파일을 끌어다 놓거나 \"파일 열기 ... \"를 클릭하십시오." + '</div></div>');
QV('srec_DeskParent', false);
QV('srec_TermParent', false);
QV('srec_toggleviewmode', false);
}
function srec_ondrop(e) {
haltEvent(e);
// Check if these are files we can upload, remove all folders.
if (e.dataTransfer == null) return;
var files = [];
for (var i in e.dataTransfer.files) {
if ((e.dataTransfer.files[i].type != null) && (e.dataTransfer.files[i].size != null) && (e.dataTransfer.files[i].size != 0) && (e.dataTransfer.files[i].name.endsWith('.mcrec'))) {
files.push(e.dataTransfer.files[i]);
}
}
if (files.length == 0) return;
srec_cleanup();
recFile = files[0];
recFilePtr = 0;
readNextBlock(processFirstBlock);
readLastBlock(function (type, flags, time) { if (type == 3) { recFileEndTime = time; } else { recFileEndTime = 0; } });
srec_restart();
}
function srec_openfile() {
var x = '<input type=file name=files id=srec_p2fileinput style=width:100% accept=".mcrec" onchange="openfileChanged()" />';
setDialogMode(11, "파일 열기 ...", 3, srec_openfileEx, x);
QE('idx_dlgOkButton', false);
}
function srec_openfileEx() {
var xfiles = Q('srec_p2fileinput').files;
if (xfiles != null) { var files = []; for (var i in xfiles) { if ((xfiles[i].type != null) && (xfiles[i].size != null) && (xfiles[i].size != 0) && (xfiles[i].name.endsWith('.mcrec'))) { files.push(xfiles[i]); } } }
if (files.length == 0) return;
srec_cleanup();
recFile = files[0];
recFilePtr = 0;
readNextBlock(processFirstBlock);
readLastBlock(function (type, flags, time) { if (type == 3) { recFileEndTime = time; } else { recFileEndTime = 0; } });
Q('srec_OpenFileButton').blur();
}
function openfileChanged() {
var xfiles = Q('srec_p2fileinput').files;
if (xfiles != null) { var files = []; for (var i in xfiles) { if ((xfiles[i].type != null) && (xfiles[i].size != null) && (xfiles[i].size != 0) && (xfiles[i].name.endsWith('.mcrec'))) { files.push(xfiles[i]); } } }
QE('idx_dlgOkButton', files.length == 1);
}
function srec_togglePause() {
if (recFile != null) { if (srec_playing == 2) { srec_pause(); } else { if (recFilePtr != recFile.size) { srec_play(); } } } return false;
}
function srec_play() {
Q('srec_PlayButton').blur();
if ((srec_playing == 2) || (recFileProtocol == 0)) return;
srec_playing = 2;
QV('srec_metadatadiv', false);
QE('srec_PlayButton', false);
QE('srec_PauseButton', true);
QE('srec_RestartButton', false);
if ((recFileProtocol == 2) || (recFileProtocol == 101) || (recFileProtocol == 200)) {
QV('srec_DeskParent', true);
QV('srec_TermParent', false);
} else if ((recFileProtocol == 1) && (agentTerminal == null)) {
QV('srec_DeskParent', false);
QV('srec_TermParent', true);
agentTerminal = CreateAmtRemoteTerminal('srec_Term', {});
agentTerminal.State = 3;
agentTerminal.heightLock = 1;
}
readNextBlock(processBlock);
}
function srec_pause() {
Q('srec_PauseButton').blur();
if (srec_playing < 2) return;
srec_playing = 1;
QE('srec_PlayButton', recFilePtr != recFile.size);
QE('srec_PauseButton', false);
QE('srec_RestartButton', recFilePtr != 0);
if (waitTimer != null) {
clearTimeout(waitTimer);
waitTimer = null;
processBlockEx(waitTimerArgs[0], waitTimerArgs[1], waitTimerArgs[2], waitTimerArgs[3]);
waitTimerArgs = null;
}
}
function srec_restart() {
Q('srec_RestartButton').blur();
if (srec_playing == 0) return;
recFilePtr = 0;
readState = 0;
currentDeltaTimeTotalSec = 0;
QV('srec_metadatadiv', true);
QE('srec_PlayButton', true);
QE('srec_PauseButton', false);
QE('srec_RestartButton', false);
QS('srec_progressbar').width = '0px';
QH('srec_timespan', '00:00:00');
QV('srec_DeskParent', false);
QV('srec_TermParent', false);
if (agentDesktop) {
agentDesktop.Canvas.clearRect(0, 0, agentDesktop.CanvasId.width, agentDesktop.CanvasId.height);
}
if (amtDesktop) {
amtDesktop.canvas.clearRect(0, 0, amtDesktop.canvasid.width, amtDesktop.canvasid.height);
amtDesktop = CreateAmtRemoteDesktop('srec_Desk');
amtDesktop.onScreenSizeChange = srec_deskAdjust;
amtDesktop.State = 3;
amtDesktop.Start();
if (recFileMetadata.protocol == 200) {
if (recFileMetadata.bpp) { amtDesktop.bpp = recFileMetadata.bpp; }
if (recFileMetadata.graymode) { amtDesktop.graymode = recFileMetadata.graymode; }
if (recFileMetadata.lowcolor) { amtDesktop.lowcolor = recFileMetadata.lowcolor; }
amtDesktop.state = 3;
srec_deskAdjust();
}
}
if (agentTerminal) { agentTerminal = null; }
}
function clearConsoleMsg() {
//QH('srec_p11DeskConsoleMsg', '');
}
// Toggle the web page to full screen
function srec_toggleAspectRatio(toggle) {
if (toggle === 1) { srec_deskAspectRatio = ((srec_deskAspectRatio + 1) % 3); }
srec_deskAdjust();
}
function srec_deskAdjust() {
var parentH = Q('srec_DeskParent').clientHeight, parentW = Q('srec_DeskParent').clientWidth;
var deskH = Q('srec_Desk').height, deskW = Q('srec_Desk').width;
QS('srec_Desk')['margin-top'] = null;
QS('srec_Desk')['margin-left'] = null;
if (srec_deskAspectRatio == 2) {
// Scale mode
QS('srec_Desk')['margin-top'] = null;
QS('srec_Desk').height = '100%';
QS('srec_Desk').width = '100%';
QS('srec_DeskParent').overflow = 'hidden';
} else if (srec_deskAspectRatio == 1) {
// Zoomed mode
QS('srec_Desk')['margin-top'] = '0px';
QS('srec_Desk').height = deskH + 'px';
QS('srec_Desk').width = deskW + 'px';
QS('srec_DeskParent').overflow = 'scroll';
} else {
// Fixed aspect ratio
if ((parentH / parentW) > (deskH / deskW)) {
var hNew = ((deskH * parentW) / deskW) + 'px';
QS('srec_Desk').height = hNew;
QS('srec_Desk').width = '100%';
QS('srec_Desk')['margin-top'] = ((parentH - ((deskH * parentW) / deskW)) / 2) + 'px';
} else {
var wNew = ((deskW * parentH) / deskH) + 'px';
QS('srec_Desk').height = '100%';
QS('srec_Desk').width = wNew;
QS('srec_Desk')['margin-left'] = ((parentW - ((deskW * parentH) / deskH)) / 2) + 'px'
}
QS('srec_DeskParent').overflow = 'hidden';
}
}
function pad2(num) { var s = '00' + num; return s.substr(s.length - 2); }
// ###END###{SessionRecording}
//
// POPUP DIALOG
//
// undefined = Hidden, 1 = Generic Message
var xxdialogMode;
var xxdialogFunc;
var xxdialogButtons;
var xxdialogTag;
// Display a dialog box
// Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 11 only)
function setDialogMode(x, y, b, f, c, tag) {
xxdialogMode = x;
xxdialogFunc = f;
xxdialogButtons = b;
xxdialogTag = tag;
QE('idx_dlgOkButton', true);
QV('idx_dlgOkButton', b & 1);
QV('idx_dlgCancelButton', b & 2);
QV('id_dialogclose', b & 2);
QV('idx_dlgDeleteButton', b & 4);
if (y) QH('id_dialogtitle', y);
for (var i = 1; i < 28; i++) { QV('dialog' + i, i == x); } // Edit this line when more dialogs are added
QV('dialog', x);
if (c) { if (x == 11) { QH('id_dialogOptions', c); } else { QH('id_dialogMessage', c); } }
// ###BEGIN###{IDERStats}
if (xxdialogMode != 0) { iderToggleDiskMap(false); }
// ###END###{IDERStats}
}
function dialogclose(x) {
var f = xxdialogFunc, b = xxdialogButtons, t = xxdialogTag;
setDialogMode();
if (((b & 8) || x) && f) f(x, t);
}
function center() {
QS('dialog').left = ((((getDocWidth() - 400) / 2)) + 'px');
// ###BEGIN###{Desktop}
var sh = 0, mh = (Q('id_mainarea').offsetHeight - ((fullscreen == false)?126:53));
// ###BEGIN###{Scripting}
if (QS('id_scriptstatus').display == '') sh += 32; // If script status is displayed, reduce max-height by 22 pixels
// ###END###{Scripting}
// ###BEGIN###{IDER}
if (QS('id_iderstatus').display == '') sh += 32; // If ider status is displayed, reduce max-height by 22 pixels
// ###END###{IDER}
QS('id_mainarea_pad').height = (Q('id_mainarea').offsetHeight - sh - ((fullscreen == false)?16:0)) + 'px';
QS('Desk')['max-height'] = (mh - sh) + 'px';
QS('Desk')['max-width'] = (Q('id_mainarea').offsetWidth - ((fullscreen == false)?32:0)) + 'px';
if (Q('id_DeskParent').offsetWidth != 0) { QS('Desk')['max-width'] = Q('id_DeskParent').offsetWidth; }
if (fullscreen) {
QS('id_mainarea_pad')['overflow-y'] = 'hidden';
var h = (mh - sh - Q('Desk').offsetHeight) / 2;
QS('Desk')['margin-top'] = h + 'px';
QS('Desk')['margin-bottom'] = h + 'px';
} else {
QS('id_mainarea_pad')['overflow-y'] = 'scroll';
QS('Desk')['margin-top'] = '0';
QS('Desk')['margin-bottom'] = '0';
}
// ###END###{Desktop}
// ###BEGIN###{Storage}
//QS('id_mainarea_frame').height = Q('id_mainarea').offsetHeight;
// ###END###{Storage}
// ###BEGIN###{SessionRecording}
srec_deskAdjust();
// ###END###{SessionRecording}
}
function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); }
//
// GENERIC METHODS
//
// ###BEGIN###{FileSaver}
function SaveJsonFile(name, name2, desc, data) {
var n = '', r = {}, d = new Date();
if (amtsysstate) {
n = '-' + amtsysstate['AMT_GeneralSettings'].response['HostName'];
r = {'webappversion':version,'description':desc,'hostname':amtsysstate['AMT_GeneralSettings'].response['HostName'],'localtime':Date(),'utctime':new Date().toUTCString(),'isotime':new Date().toISOString()};
if (HardwareInventory) r['systemid'] = guidToStr(HardwareInventory['CIM_ComputerSystemPackage'].response['PlatformGUID'].toLowerCase());
}
n += '-' + d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);;
r[name2] = data;
// ###BEGIN###{!Mode-NodeWebkit}
saveAs(data2blob(JSON.stringify(r, null, ' ').replace(/\n/g, '\r\n')), name + n + '.json');
// ###END###{!Mode-NodeWebkit}
// ###BEGIN###{Mode-NodeWebkit}
var chooser = document.createElement('input');
chooser.setAttribute('type', 'file')
chooser.setAttribute('nwsaveas', name + n + '.json');
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, JSON.stringify(r, null, ' ').replace(/\n/g, '\r\n'), function () { }); }, false);
chooser.click();
// ###END###{Mode-NodeWebkit}
}
// ###END###{FileSaver}
var httpErrorTable = {
200: "확인",
401: "인증 오류",
408: "타임 아웃 에러",
601: "WSMAN 구문 분석 오류",
602: "HTTP 응답 헤더를 구문 분석 할 수 없습니다",
603: "예기치 않은 HTTP 열거 형 응답",
604: "예기치 않은 HTTP 풀 응답",
// ###BEGIN###{Mode-NodeWebkit}
998: "잘못된 TLS 인증서",
// ###END###{Mode-NodeWebkit}
997: "잘못된 다이제스트 영역"
}
function errcheck(s, stack) {
if (wsstack == null || amtstack != stack) return true;
if (s != 200 && s != 9) {
setDialogMode();
wsstack.comm.FailAllError = 999; // Cause all new responses to be silent
amtstack.CancelAllQueries(999);
QH('id_messageviewstr', ((httpErrorTable[s])?(httpErrorTable[s]):(format("오류 # {0}", s))));
// ###BEGIN###{Mode-MeshCentral2}
if (s == 401) { QH('id_messageviewstr', "인증 오류" + '<br /><br /><input type=button value=\"' + "Set new credentials" + '\" onclick=meshcentral2credCallback(true)></input>'); }
// ###END###{Mode-MeshCentral2}
go(100);
QS('id_progressbar').width = 0;
// ###BEGIN###{ComputerSelector}
Q('id_messageviewbutton').focus();
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-NodeWebkit}
if (s == 998) {
//console.log('errcheck', wsstack.comm.xtlsCertificate.fingerprint);
if (wsstack.comm.xtlsCertificate != null) {
showTlsCert(11, '<img style=float:left;margin-right:8px src=warning.png width=48 height=48><div style=min-height:48px;display:table><div style=display:table-cell;vertical-align:middle>' + "다음 인증서와 연결된 인텔 &reg; AMT. 이것이 예상 인증서가 아닌 경우 연결을 끊으려면 취소를 누르십시오." + '</div></div>', wsstack.comm.xtlsCertificate, 1);
}
}
// ###END###{Mode-NodeWebkit}
}
return (s != 200);
}
// ###BEGIN###{Storage}
function goiFrame(e,x,y) {
if (xxdialogMode) return;
go(x);
// ###BEGIN###{Mode-NodeWebkit}
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
y = (currentcomputer['tls']==0?'http://':'https://') + ports.host + ':' + ports.http + y;
// ###END###{Mode-NodeWebkit}
if ((e.shiftKey == true) || (Q('id_StorageIFrame').src.endsWith(y) == false)) Q('id_StorageIFrame').src = y;
QV('id_mainarea_pad', false);
QV('id_mainarea_frame', true);
}
// ###END###{Storage}
function go(x, force) {
if (xxdialogMode && force != 1) return;
// ###BEGIN###{Mode-NodeWebkit}
// Remove left bar selection
var leftBarItems = ['LeftMenuMyDevices', 'LeftMenuMyCerts', 'LeftMenuMyUsb'];
// ###BEGIN###{SessionRecording}
leftBarItems.push('LeftMenuPlayer');
// ###END###{SessionRecording}
for (var i in leftBarItems) { Q(leftBarItems[i]).classList.remove('lbbuttonsel'); Q(leftBarItems[i]).classList.remove('lbbuttonsel2'); }
if (x == 101) { Q('LeftMenuMyDevices').classList.add('lbbuttonsel2'); }
if (x == 103) { Q('LeftMenuMyCerts').classList.add('lbbuttonsel2'); }
if (x == 102) { Q('LeftMenuMyUsb').classList.add('lbbuttonsel2'); }
if (x == 104) { Q('LeftMenuPlayer').classList.add('lbbuttonsel2'); }
QV('LeftSideToolBar', ((x >= 101) && (x <= 104)));
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Storage}
QV('id_mainarea_frame', false);
QV('id_mainarea_pad', true);
// ###END###{Storage}
// ###BEGIN###{ComputerSelector}
QV('id_computerSelector', x == 101);
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-LMS}
QV('id_lmsMainPanel', x == 101);
// ###END###{Mode-LMS}
// ###BEGIN###{USBSetup}
QV('id_usbSetupPanel', x == 102);
// ###END###{USBSetup}
// ###BEGIN###{CertificateManager}
QV('id_certManagerPanel', x == 103);
// ###END###{CertificateManager}
// ###BEGIN###{SessionRecording}
QV('id_sessionPlayerPanel', x == 104);
// ###END###{SessionRecording}
QV('id_messageview', x == 100);
QV('id_mainview', x < 100);
for (var i = 0; i < 80; i++) { // Edit this line when adding a new screen
QV('p' + i, i == x);
var q = QS('go' + i);
// ###BEGIN###{Look-Intel}
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
// ###END###{Look-Intel}
// ###BEGIN###{Look-ISDU}
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
// ###END###{Look-ISDU}
// ###BEGIN###{Look-BrandedCommander}
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
// ###END###{Look-BrandedCommander}
// ###BEGIN###{Look-Unite}
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
// ###END###{Look-Unite}
// ###BEGIN###{Look-Commander}
if (q) { q['background-color'] = ((i == x)?'gray':''); }
// ###END###{Look-Commander}
// ###BEGIN###{Look-MeshCentral}
if (q) { q['background-color'] = ((i == x)?'gray':''); }
// ###END###{Look-MeshCentral}
}
currentView = x;
// ###BEGIN###{Look-ISDU}
QV('id_isdu-image1', x == 11);
QV('id_isdu-image2', x == 8);
QV('id_isdu-image3', x == 14 || x == 13);
QV('id_isdu-image4', x == 1 || x == 0);
QV('id_isdu-image5', x == 6 || x == 15);
QV('id_isdu-image6', x == 18 || x == 19);
QV('id_isdu-image7', x == 16 || x == 12 || x == 2);
QV('id_isdu-image8', x == 17);
// ###END###{Look-ISDU}
// ###BEGIN###{Look-BrandedCommander}
// ###BEGIN###{!Mode-Firmware}
QV('id_isdu-image1', x == 11);
QV('id_isdu-image2', x == 8);
QV('id_isdu-image3', x == 14 || x == 13);
QV('id_isdu-image4', x == 1 || x == 0);
QV('id_isdu-image5', x == 6 || x == 15);
QV('id_isdu-image6', x == 18 || x == 19);
QV('id_isdu-image7', x == 16 || x == 12 || x == 2);
QV('id_isdu-image8', x == 17);
// ###END###{!Mode-Firmware}
// ###END###{Look-BrandedCommander}
// ###BEGIN###{Mode-NodeWebkit}
NW_SetupMainMenu(x);
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Desktop}
center();
// ###END###{Desktop}
}
function portsFromHost(host, tls) {
host = decodeURIComponent(host);
var x = host.split(':'), hp = ((tls == 0) ? 16992 : 16993), rp = ((tls == 0) ? 16994 : 16995);
if (x[0].indexOf('[') == 0) { // IPv6 address
x = host.split(']:');
if (x.length == 1) { return { host: host.substring(1, host.length - 1), http: hp, redir: rp } }
if (x.length > 1) { var y = x[1].split(':'); if (y.length > 0) { hp = parseInt(y[0]); } if (y.length > 1) { rp = parseInt(y[1]); } }
return { host: x[0].substring(1), http: hp, redir: rp }
}
if (x.length > 1) { hp = parseInt(x[1]); }
if (x.length > 2) { rp = parseInt(x[2]); }
return { host: x[0], http: hp, redir: rp }
}
function addLink(x, f) { return '<a style=cursor:pointer;color:blue onclick=\'' + f + '\'>&diams; ' + x + '</a>'; }
function addLinkConditional(x, f, c) { if (c) return addLink(x, f); return x; }
function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
function addOption(q, t, i) { var option = document.createElement('option'); option.text = t; option.value = i; Q(q).add(option); }
function addDisabledOption(q, t, i) { var option = document.createElement('option'); option.text = t; option.value = i; option.disabled = 1; Q(q).add(option); }
function passwordcheck(p) { if (p.length < 8) return false; var upper = 0, lower = 0, number = 0, nonalpha = 0; for (var i in p) { var c = p.charCodeAt(i); if ((c > 64) && (c < 91)) { upper = 1; } else if ((c > 96) && (c < 123)) { lower = 1; } else if ((c > 47) && (c < 58)) { number = 1; } else { nonalpha = 1; } } return ((upper + lower + number + nonalpha) == 4); }
function methodcheck(r) { if (r && r != null && r.Body && r.Body['ReturnValue'] != 0) { messagebox("통화 오류", r.Header['Method'] + ': ' + (r.Body.ReturnValueStr + '').replace('_', ' ')); return true; } return false; }
function TableStart() { return '<table class=\'log1 us\' cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=200px><p><td>'; }
function TableStart2() { return '<table class=\'log1 us\' cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td>'; }
function TableEntry(n, v) { return '<tr><td class=r1><p>' + n + '<td class=r1>' + v; }
function FullTable(x, e) { var r = TableStart(); for (i in x) { if (i && x[i]) r += TableEntry(i, x[i]); } return r + TableEnd(e); }
function TableEnd(n) { return '<tr><td colspan=2><p>' + (n?n:'') + '</table>'; }
function AddButton(v, f) { return '<input type=button value=\'' + v + '\' onclick=\'' + f + '\' style=margin:4px>'; }
function AddButton2(v, f, s) { return '<input type=button value=\'' + v + '\' onclick=\'' + f + '\' ' + s + '>'; }
function AddRefreshButton(f) { return '<input type=button name=refreshbtn value="' + "새롭게 하다" + '" onclick=\'refreshButtons(false);' + f + '\' style=margin:4px ' + (refreshButtonsState==false?'disabled':'') + '>'; }
function MoreStart() { return '<a style=cursor:pointer;color:blue id=morexxx1 onclick=QV(\"morexxx1\",false);QV(\"morexxx2\",true)>&#x25BC; ' + "More" + '</a><div id=morexxx2 style=display:none><br><hr>'; };
function MoreEnd() { return '<a style=cursor:pointer;color:blue onclick=QV(\"morexxx2\",false);QV(\"morexxx1\",true)>&#x25B2; ' + "Less" + '</a></div>'; };
function getSelectedOptions(sel) { var opts = [], opt; for (var i = 0, len = sel.options.length; i < len; i++) { opt = sel.options[i]; if (opt.selected) { opts.push(opt.value); } } return opts; }
function getInstance(x, y) { for (var i in x) { if (x[i]['InstanceID'] == y) return x[i]; } return null; }
function getItem(x, y, z) { for (var i in x) { if (x[i][y] == z) return x[i]; } return null; }
function guidToStr(g) { return g.substring(6, 8) + g.substring(4, 6) + g.substring(2, 4) + g.substring(0, 2) + '-' + g.substring(10, 12) + g.substring(8, 10) + '-' + g.substring(14, 16) + g.substring(12, 14) + '-' + g.substring(16, 20) + '-' + g.substring(20); }
function getUrlVars() { var j, hash, vars = [], hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); for (var i = 0; i < hashes.length; i++) { j = hashes[i].indexOf('='); if (j > 0) { vars[hashes[i].substring(0, j)] = hashes[i].substring(j + 1, hashes[i].length); } } return vars; }
function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; }
function getDocHeight() { if (window.innerHeight) return window.innerHeight; if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientHeight != 0) return document.documentElement.clientHeight; return document.getElementsByTagName('body')[0].clientHeight; }
function addHtmlValue(t, v) { return '<div style=height:20px><div style=float:right;width:220px;overflow:hidden><b title="' + v + '">' + v + '</b></div><div>' + t + '</div></div>'; }
function addHtmlValueNoTitle(t, v) { return '<div style=height:20px><div style=float:right;width:220px;overflow:hidden>' + v + '</b></div><div>' + t + '</div></div>'; }
function numbersOnly(e, x) { return (event.charCode == 0) || (event.charCode == x) || (event.charCode >= 48 && event.charCode <= 57); }
function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
// ###BEGIN###{**ClosureAdvancedMode}
// Google closure advanced mode externs
window['cleanup'] = cleanup;
window['disconnect'] = disconnect;
window['dialogclose'] = dialogclose;
window['go'] = go;
window['QV'] = QV;
window['numbersOnly'] = numbersOnly;
window['syncClock'] = syncClock;
window['showLinkPolicyDlg'] = showLinkPolicyDlg;
// ###BEGIN###{PowerControl}
window['showPowerActionDlg'] = showPowerActionDlg;
// ###BEGIN###{PowerControl-Advanced}
window['showAdvPowerDlg'] = showAdvPowerDlg;
window['showAdvPowerDlgChange'] = showAdvPowerDlgChange;
// ###END###{PowerControl-Advanced}
// ###END###{PowerControl}
window['showFeaturesDlg'] = showFeaturesDlg;
window['showConsentDlg'] = showConsentDlg;
// ###BEGIN###{NetworkSettings}
window['showPingActionDlg'] = showPingActionDlg;
window['showIPSetupDlg'] = showIPSetupDlg;
window['updateIPSetupDlg'] = updateIPSetupDlg;
window['showIPv6StateDlg'] = showIPv6StateDlg;
window['showIPv6AddrDlg'] = showIPv6AddrDlg;
// ###END###{NetworkSettings}
window['PullSystemStatus'] = PullSystemStatus;
window['changeAccountButton'] = changeAccountButton;
window['changeAccountStateButton'] = changeAccountStateButton;
window['newAccountButton'] = newAccountButton;
window['showUserDetails'] = showUserDetails;
window['showEditDnsDlg'] = showEditDnsDlg;
window['showEditDnsDlgChange'] = showEditDnsDlgChange;
window['setDialogMode'] = setDialogMode;
window['PullUserInfo'] = PullUserInfo;
window['toggleAccountButton'] = toggleAccountButton;
window['showEditNameDlg'] = showEditNameDlg;
window['updateAccountDialog'] = updateAccountDialog;
window['refreshButtons'] = refreshButtons;
window['showPowerPolicyDlg'] = showPowerPolicyDlg;
// ###BEGIN###{HardwareInfo}
window['PullHardware'] = PullHardware;
// ###BEGIN###{FileSaver}
window['SaveHardwareLog'] = SaveHardwareLog;
// ###END###{FileSaver}
// ###END###{HardwareInfo}
// ###BEGIN###{WsmanBrowser}
// ###BEGIN###{FileSaver}
window['saveEntireAmtState'] = saveEntireAmtState;
// ###END###{FileSaver}
// ###END###{WsmanBrowser}
// ###BEGIN###{ContextMenus}
window['handleContextMenu'] = handleContextMenu;
window['hideContextMenu'] = hideContextMenu;
// ###END###{ContextMenus}
// ###BEGIN###{Mode-NodeWebkit}
window['showTlsCert'] = showTlsCert;
window['downloadTlsCert'] = downloadTlsCert;
// ###END###{Mode-NodeWebkit}
// ###BEGIN###{Desktop}
window['connectDesktopButton'] = connectDesktopButton;
window['connectDesktop'] = connectDesktop;
window['deskToggleFull'] = deskToggleFull;
window['showDesktopSettings'] = showDesktopSettings;
window['dmousedown'] = dmousedown;
window['dmouseup'] = dmouseup;
window['dmousemove'] = dmousemove;
window['drotate'] = drotate;
window['sendCAD'] = sendCAD;
// ###BEGIN###{FileSaver}
window['deskSaveImage'] = deskSaveImage;
// ###END###{FileSaver}
// ###BEGIN###{DesktopFocus}
window['deskToggleFocus'] = deskToggleFocus;
// ###END###{DesktopFocus}
// ###BEGIN###{Desktop-Multi}
window['desktopSwitchScreen'] = desktopSwitchScreen;
// ###END###{Desktop-Multi}
// ###END###{Desktop}
// ###BEGIN###{Desktop-Settings}
window['showDesktopSettingsDlg'] = showDesktopSettingsDlg;
window['showDesktopSettingsDlgUpdate'] = showDesktopSettingsDlgUpdate;
// ###END###{Desktop-Settings}
// ###BEGIN###{Terminal}
window['connectTerminal'] = connectTerminal;
window['termPaste'] = termPaste;
window['termSendKey'] = termSendKey;
// ###BEGIN###{FileSaver}
window['terminalCaptureToggle'] = terminalCaptureToggle;
// ###END###{FileSaver}
// ###BEGIN###{TerminalSize}
window['termToggleSize'] = termToggleSize;
// ###END###{TerminalSize}
window['termToggleFx'] = termToggleFx;
// ###BEGIN###{Terminal-Enumation-All}
window['termToggleType'] = termToggleType;
// ###END###{Terminal-Enumation-All}
window['termPaste'] = termPaste;
// ###END###{Terminal}
// ###BEGIN###{IDER}
window['iderStart'] = iderStart;
window['iderStop'] = iderStop;
// ###BEGIN###{IDERStats}
window['iderToggleDiskMap'] = iderToggleDiskMap;
// ###END###{IDERStats}
// ###END###{IDER}
// ###BEGIN###{RemoteAccess}
window['editEnvironmentDetection'] = editEnvironmentDetection;
window['editEnvironmentDetectionAdd'] = editEnvironmentDetectionAdd;
window['editUserInitiatedCira'] = editUserInitiatedCira;
window['editMpsPolicy'] = editMpsPolicy;
window['showServerDetails'] = showServerDetails;
window['AddRemoteAccessServer'] = AddRemoteAccessServer;
window['AddRemoteAccessServerUpdate'] = AddRemoteAccessServerUpdate;
window['edInputChg'] = edInputChg;
window['editMpsPolicyUpdate'] = editMpsPolicyUpdate;
window['editEnvironmentDetectionRemove'] = editEnvironmentDetectionRemove;
// ###END###{RemoteAccess}
// ###BEGIN###{EventLog}
window['showEventDetails'] = showEventDetails;
window['PullEventLog'] = PullEventLog;
window['FreezeLog'] = FreezeLog;
window['ClearLog'] = ClearLog;
window['eventFilter'] = eventFilter;
// ###BEGIN###{FileSaver}
window['SaveEventLog'] = SaveEventLog;
// ###END###{FileSaver}
// ###END###{EventLog}
// ###BEGIN###{AuditLog}
window['PullAuditLog'] = PullAuditLog;
window['auditFilter'] = auditFilter;
window['showAuditDetails'] = showAuditDetails;
// ###BEGIN###{FileSaver}
window['SaveAuditLog'] = SaveAuditLog;
// ###END###{FileSaver}
// ###END###{AuditLog}
// ###BEGIN###{Certificates}
window['PullCertificates'] = PullCertificates;
window['showCertDetails'] = showCertDetails;
window['addCertButton'] = addCertButton;
window['issueCertButton'] = issueCertButton;
window['showSetTlsSecurityDlg'] = showSetTlsSecurityDlg;
window['showSetTlsSecurityDlgUpdate'] = showSetTlsSecurityDlgUpdate;
window['showKeyPairDetails'] = showKeyPairDetails;
window['addCertButtonUpdate'] = addCertButtonUpdate;
window['issueCertButtonUpdate'] = issueCertButtonUpdate;
// ###BEGIN###{FileSaver}
window['downloadCert'] = downloadCert;
// ###END###{FileSaver}
// ###END###{Certificates}
// ###BEGIN###{AgentPresence}
window['addWatchdogAction'] = addWatchdogAction;
window['deleteWatchdogActions'] = deleteWatchdogActions;
window['PullWatchdog'] = PullWatchdog;
window['AddWatchdog'] = AddWatchdog;
window['AddWatchdogUpdate'] = AddWatchdogUpdate;
window['addWatchdogActionUpdate'] = addWatchdogActionUpdate;
window['showWatchdogDetails'] = showWatchdogDetails;
window['GenerateWatchdogGuid'] = GenerateWatchdogGuid;
// ###END###{AgentPresence}
// ###BEGIN###{SystemDefense}
window['changeDefaultPolicy'] = changeDefaultPolicy;
window['AddDefenseFilter'] = AddDefenseFilter;
window['AddDefenseFilterUpdate'] = AddDefenseFilterUpdate;
window['showFilterDetails'] = showFilterDetails;
window['AddDefensePolicy'] = AddDefensePolicy;
window['addFilterButton'] = addFilterButton;
window['removeFilterButton'] = removeFilterButton;
window['AddDefensePolicyUpdate'] = AddDefensePolicyUpdate;
window['showPolicyDetails'] = showPolicyDetails;
window['deleteDefensePolicy'] = deleteDefensePolicy;
// ###END###{SystemDefense}
// ###BEGIN###{Wireless}
window['showWifiStateDlg'] = showWifiStateDlg;
window['showWifiDetails'] = showWifiDetails;
window['wifiRemoveButton'] = wifiRemoveButton;
window['showWifiNewProfile'] = showWifiNewProfile;
window['updateWifiDialog'] = updateWifiDialog;
window['wifiRefresh'] = wifiRefresh;
// ###END###{Wireless}
// ###BEGIN###{WsmanBrowser}
window['wsmanQuery'] = wsmanQuery;
window['wsmanFilter'] = wsmanFilter;
window['QH'] = QH;
window['QV'] = QV;
// ###END###{WsmanBrowser}
// ###BEGIN###{Alarms}
window['PullAlarms'] = PullAlarms;
window['RemoveAllAlarms'] = RemoveAllAlarms;
window['showAddAlarm'] = showAddAlarm;
window['showAlertDetails'] = showAlertDetails;
window['alertDialogUpdate'] = alertDialogUpdate;
// ###END###{Alarms}
// ###BEGIN###{ComputerSelector}
window['computerConnect'] = computerConnect;
window['toolmenuclick'] = toolmenuclick;
window['computerFilterFunc'] = computerFilterFunc;
window['computerSelect'] = computerSelect;
// ###BEGIN###{ComputerSelector-Local}
window['updateComputerDialog'] = updateComputerDialog;
window['computerEdit'] = computerEdit;
window['addComputer'] = addComputer;
window['newComputerList'] = newComputerList;
window['openComputerList'] = openComputerList;
window['saveComputerList'] = saveComputerList;
// ###END###{ComputerSelector-Local}
// ###BEGIN###{Scripting}
window['computerStopScript'] = computerStopScript;
window['mscript_runScriptDlg'] = mscript_runScriptDlg;
window['onComputerChecked'] = onComputerChecked;
window['mscript_showComputerScriptOutput'] = mscript_showComputerScriptOutput;
// ###END###{Scripting}
// ###BEGIN###{ComputerSelectorScanner}
// ###BEGIN###{Mode-NodeWebkit}
window['showScanDialog'] = showScanDialog;
window['showScanDialogUpdate'] = showScanDialogUpdate;
// ###END###{Mode-NodeWebkit}
// ###END###{ComputerSelectorScanner}
// ###END###{ComputerSelector}
// ###BEGIN###{Mode-LMS}
window['lmsRefresh'] = lmsRefresh;
window['lmsConfigure'] = lmsConfigure;
window['lmsLogin'] = lmsLogin;
window['lmsConfigureLogin'] = lmsConfigureLogin;
window['lmsUpdateLoginDialog'] = lmsUpdateLoginDialog;
window['lmsShowVersionsDlg'] = lmsShowVersionsDlg;
window['lmsActivate'] = lmsActivate;
window['lmsDeactivate'] = lmsDeactivate;
window['toolmenuclick'] = toolmenuclick;
window['lmsShowTrustedHashesDlg'] = lmsShowTrustedHashesDlg;
// ###END###{Mode-LMS}
// ###BEGIN###{Storage}
window['SetStorageName'] = SetStorageName;
window['showStorageDetails'] = showStorageDetails;
window['PullStorage'] = PullStorage;
window['UploadToStorage'] = UploadToStorage;
window['goiFrame'] = goiFrame;
// ###BEGIN###{Mode-Firmware}
window['OpenFromStorage'] = OpenFromStorage;
// ###END###{Mode-Firmware}
// ###BEGIN###{Mode-LMS}
window['OpenFromStorage'] = OpenFromStorage;
// ###END###{Mode-LMS}
// ###BEGIN###{FileSaver}
window['DownloadFromStorage'] = DownloadFromStorage;
// ###END###{FileSaver}
// ###BEGIN###{Mode-NodeWebkit}
window['UploadAppToStorage'] = UploadAppToStorage;
// ###END###{Mode-NodeWebkit}
// ###END###{Storage}
// ###BEGIN###{Scripting}
window['script_runScriptDlg'] = script_runScriptDlg;
window['script_Stop'] = script_Stop;
// ###END###{Scripting}
// ###BEGIN###{Scripting-Editor}
// ###BEGIN###{FileSaver}
window['script_saveScript'] = script_saveScript;
// ###END###{FileSaver}
window['resetScriptButton'] = resetScriptButton;
window['runScriptButton'] = runScriptButton;
window['breakScriptButton'] = breakScriptButton;
window['stepScriptButton'] = stepScriptButton;
window['scriptViewButton'] = scriptViewButton;
window['script_fonfilterchanged'] = script_fonfilterchanged;
window['script_fonclick'] = script_fonclick;
window['script_fondragstart'] = script_fondragstart;
window['script_fondragend'] = script_fondragend;
window['script_fondragenter'] = script_fondragenter;
window['script_fondragleave'] = script_fondragleave;
window['script_fondrop'] = script_fondrop;
window['script_foneditclick'] = script_foneditclick;
window['script_foneditclickEx'] = script_foneditclickEx;
// ###END###{Scripting-Editor}
// ###BEGIN###{USBSetup}
window['usb_newSetupBin'] = usb_newSetupBin;
window['usb_openSetupBin'] = usb_openSetupBin;
window['usb_addRecordSetupBin'] = usb_addRecordSetupBin;
window['usb_addvariable'] = usb_addvariable;
window['usb_editheader'] = usb_editheader;
window['usb_editrecord'] = usb_editrecord;
window['usb_editvariable'] = usb_editvariable;
window['usb_ond16typechange'] = usb_ond16typechange;
// ###BEGIN###{FileSaver}
window['usb_saveSetupBin'] = usb_saveSetupBin;
// ###END###{FileSaver}
// ###END###{USBSetup}
// ###BEGIN###{Mode-MeshCentral2}
window['connectButtonfunction'] = connectButtonfunction;
// ###END###{Mode-MeshCentral2}
// ###END###{**ClosureAdvancedMode}
// Get things started
startup();
</script>
</div></div></body></html>