1
0
mirror of https://github.com/Ylianst/MeshCommander synced 2025-12-06 06:03:20 +00:00
Files
MeshCommander/index_ja.html
Ylian Saint-Hilaire 023d6f2145 Added 802.11x support.
2022-02-28 17:53:59 -08:00

13995 lines
871 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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="ja" 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">Intel<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">Intel<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">MeshCommander</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">Intel<sup style="font-size:10px">®</sup>&nbsp;Active Management Technology</p>
<!-- ###END###{Look-Intel-AMT} -->
<!-- ###BEGIN###{Look-Intel-SM} -->
<p class="top1">Intel<sup style="font-size:10px">®</sup>&nbsp;Standard Manageability</p>
<!-- ###END###{Look-Intel-SM} -->
<!-- ###BEGIN###{Look-Intel-SBT} -->
<p class="top1">Intel<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">Intel<sup style="font-size:10px">®</sup> AMT USB Setup.bin Manager</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">Intel<sup style="font-size:10px">®</sup> AMT USB Setup.bin Manager</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>Serial-over-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} -->
</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="アイダー" 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="アイダー" 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)" onmousewheel="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">Win + Down</option>
<option value="2">Win + Up</option>
<option value="3">Win + L</option>
<option value="4">Win + M</option>
<option value="20">Win + 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=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="スクリプトの1つのステップを実行する" 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、および@$^*+-のいずれかを含む最小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、および@$^*+-のいずれかを含む最小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、および@$^*+-のいずれかを含む最小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="このフィールドが入力されている場合、この値はhostportの代わりに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">3番目のディスプレイ</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>
</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">Serial-over-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()">
<option id="idx_d12auth_wpa3" value="32768">WPA3 SAE</option>
<!--<option value="7">WPA2 IEEE 802.1x</option>-->
<option value="6">WPA2 PSK</option>
<!--<option value="5">WPA IEEE 802.1x</option>-->
<option value="4">WPA PSK</option>
<!--<option value="3">Shared Key</option>-->
<!--<option value="2">Open</option>-->
</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">無し</option>
</select>
<div>暗号化</div>
</div>
<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>
<!-- ###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>暗号化を使用します。ファイルにはIntel®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、および@$^*+-のいずれかを含む最小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()">Serial-over-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()">
<option value="0">無し</option>
<option id="ForceDVDBootOption" value="1">CD / DVDブートを強制する</option>
<option id="ForcePXEBootOption" value="2">PXEブートを強制する</option>
<option id="ForceHDBootOption" value="3">強制的にハードディスクを起動</option>
<option id="ForceDiagBootOption" value="4">診断ブートを強制</option>
<!-- ###BEGIN###{PowerControl-OneClick} -->
<option id="ForceUEFIBootOption" value="5">Force OCR UEFI Boot Option</option>
<option id="ForceHttpBootOption" value="6">Force OCR UEFI HTTPS Boot (.iso)</option>
<option id="ForceHttpUrlBootOption" value="7">Force OCR UEFI HTTPS Boot (url)</option>
<!-- ###END###{PowerControl-OneClick} -->
</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>
<!-- ###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>
</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="OK" 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.3';
// ###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
// ###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); }
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コンピュータを追加...", 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("Intel&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>' + "このアカウントにはIntel&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("ケルベロス"); } 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("認証", "ケルベロス");
} else {
x += addComputerDetailsEntry("認証", "ケルベロス/" + 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("Intel&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サーバーに接続しました。 [OK]をクリックして同意して接続します。", 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 = "インテル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("Eメール"); }
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, "接続は現在保護されていません。 [OK]をクリックしてTLSでIntel AMTをセットアップし、安全な接続に切り替えます。");
} else {
setDialogMode(11, "TLSに切り替え", 3, switchToTls1, "接続は現在保護されておらず、Intel AMTはすでにTLSでセットアップされています。 [OK]をクリックして、安全な接続に切り替えます。");
}
}
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'];
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) && (amtstack.wsman.comm.xtls == 1)) query.push('*CIM_BootService');
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, "インテル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("Intel&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 = ["プライマリディスプレイ", "セカンダリディスプレイ", "第3ディスプレイ"][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)?"秒オプトイン":"2番目のオプトイン"); }
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 ((amtstack.wsman.comm.xtls == 1) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] != null)) {
var enabledBootStateStr = { 0: "わからない", 1: "その他の", 2: "有効", 3: "無効", 4: "シャットダウン", 5: "適用できません", 6: "有効だがオフライン", 7: "テスト中", 8: "据え置き", 9: "休止", 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 (xxWireless['AMT_BootCapabilities'].response['UEFIWiFiCoExistenceAndProfileShare']!=null && xxWireless['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("pingに応答する", addLinkConditional(["無効", "ICMP応答", "RMCP応答", "ICMPおよびRMCP応答"][gs['PingResponseEnabled'] + (gs['RmcpPingResponseEnabled'] << 1)], 'showPingActionDlg()', xxAccountAdminName));
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>' + "第3ディスプレイ" + '</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 = ["わからない", "その他の", "有効", "無効", "シャットダウン", "適用できません", "有効だがオフライン", "テスト中", "据え置き", "休止", "起動"];
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', "Intel 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 && (xxTlsCurrentCert == null || xxTlsCurrentCert == i)) { 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="' + "name1、name2" + '"><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 = [ "わからない", "その他の", "有効", "無効", "シャットダウン", "適用できません", "有効だがオフライン", "テスト中", "据え置き", "休止", "起動" ];
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("デバイスID", '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">' + "IntelrAMTイーサネットポート" + ' ' + 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.
amtstack.BatchEnum('', ['*CIM_WiFiPortCapabilities', '*CIM_WiFiPort', '*CIM_WiFiEndpoint', 'CIM_WiFiEndpointSettings', '*AMT_WiFiPortConfigurationService', '*AMT_BootCapabilities'], processWireless);
}
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" };
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) {
x += '<div class=itemBar onclick=showWifiDetails(' + j + ')><div style=float:right>' + EscapeHtml(sc['SSID']) + ', ' + xxWifiAuthenticationMethod[sc['AuthenticationMethod']] + ', ' + xxWifiEncryptionMethod[sc['EncryptionMethod']] + ' &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", sc['SSID']);
x += addHtmlValue("認証", xxWifiAuthenticationMethod[sc['AuthenticationMethod']]);
x += addHtmlValue("暗号化", xxWifiEncryptionMethod[sc['EncryptionMethod']]);
x += addHtmlValue("優先", sc['Priority']);
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;
amtstack.Enum('CIM_WiFiEndpointSettings', function(stack, name, responses, status) { if (status == 200) { xxWireless['CIM_WiFiEndpointSettings'].responses = responses; showWirelessInfo(); } } );
}
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);
QV('idx_d12auth_wpa3', amtversion > 13);
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() {
amtstack.AMT_WiFiPortConfigurationService_AddWiFiSettings(
{
'__parameterType': 'reference',
'__resourceUri': amtstack.CompleteName('CIM_WiFiEndpoint'),
'Name': 'WiFi Endpoint 0'
}, {
'__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,
'PSKPassPhrase': idx_d12password1.value
},
null, null, null, 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) { idx_d12enc.value = 4; }
// 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; } }
QE('idx_dlgOkButton', r == true && (idx_d12name.value.length > 0) && (idx_d12ssid.value.length > 0) && (idx_d12password1.value.length > 7) && (idx_d12password1.value == idx_d12password2.value));
}
// ###END###{Wireless}
// ###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", "キャッシュDRAM", "江戸", "エドラム", "VRAM", "SRAM", "羊", "ROM", "閃光", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR-2", "BRAM", "FB-DIMM", "DDR3", "FBD2", "DDR4", "LPDDR", "LPDDR2", "LPDDR3", "LPDDR4"];
var DMTFMemFormFactor = ['', "その他の","わからない","SIMM","SIP","チップ","浸漬","ZIP","専有カード","DIMM","TSOP","チップの列","RIMM","SODIMM","スリミング","FB-DIM"];
var DMTFProcFamilly = { // Page 46 of DMTF document
191: "インテル&reg;Core&trade;2 Duoプロセッサー",
192: "インテル&reg;Core&trade;2 Soloプロセッサー",
193: "インテル&reg;Core&trade;2 Extremeプロセッサー",
194: "インテル&reg;Core&trade;2 Quadプロセッサー",
195: "インテル&reg;Core&trade;2 Extremeモバイルプロセッサー",
196: "インテル&reg;Core&trade;2 Duoモバイルプロセッサー",
197: "インテル&reg;Core&trade;2 Soloモバイルプロセッサー",
198: "インテル&reg;Core&trade;i7プロセッサー",
199: "デュアルコアインテル&reg;Celeron&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', "Intel 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", "Intel 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['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != undefined) && (amtsysstate['IPS_OptInService'].response['OptInRequired'] == 0xFFFFFFFF)) {
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;
// ###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 = "、Soft-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;
// ###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;
// ###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>' + "テキストを入力して[OK]をクリックし、US英語キーボードを使用してリモートで入力します。続行する前に、リモートカーソルを正しい位置に置いてください。" + '<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
}
// 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("ストレージリダイレクトエラー", "少なくとも1つのディスクイメージファイルを選択する必要があります。"); 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' : '') + '>' + "時刻、1日1回";
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 ? "トリガー間隔(秒)" : "時刻HHMM");
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("エラー", "RedirectionService 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 = ["ローカルアドレスをリンク", "ネットワークローカルアドレス", "グローバルアドレス", "ユーザー構成", "禁じられている", "DADが進行中", "有効", "非推奨", "推奨/非推奨", "期限切れ", "衝突", "禁じられている"];
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 Ping応答", 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 powerActionResponse00(stack, name, response, status) {
if (status == 200) {
var powerState = 3;
try {
var x = amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'];
if (x == 2) { powerState = 1; } else { powerState = 2; }
} catch (ex) { }
amtPowerBootCapabilities = response.Body;
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);
} else {
messagebox("パワーアクション", format("システム機能を取得できません。エラー{0}", status));
}
}
// ###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>' + "必要に応じて、Secure Eraseパスワードを入力します。" + '<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 << 2)) { actionTaken.push('<label><input id=rpef2 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Secure Erase All SSDs" + '</label>'); }
if (platfromEraseSupport & (1 << 6)) { actionTaken.push('<label><input id=rpef6 type=checkbox onchange=powerActionDlgRPEValidate()>' + "TPM Clear" + '</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 > 1) { x += (format('<br />' + "Select the actions to take:" + '<br /><br /><div style=margin-left:16px>{0}</div><br />', actionTaken.join('<br />'))); }
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>';
setDialogMode(11, "パワーアクション", 3, powerActionDlgRPEEx, x, advanced);
QE('idx_dlgOkButton', false);
}
function powerActionDlgRPEValidate() {
var rpeFlags = 0, platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'], sf = [2,6,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);
QE('idx_dlgOkButton', rpeFlags);
}
var platfromEraseTLV = null;
function powerActionDlgRPEEx(b, advanced) {
var rpeFlags = 0, platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'], sf = [1, 2, 6, 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++; }
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) { }
// 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}
QV('ForceUEFIBootOption', false);
if ((AmtOcrPbaLength > 0) && (amtPowerBootCapabilities['ForceUEFIPBABoot'] == true)) {
QV('ForceUEFIBootOption', true);
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) )
QV('ForceHttpBootOption', (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible);
QV('ForceHttpUrlBootOption', (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible);
// ###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);
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);
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;}
// ###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 && 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', action, 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) {
if (buttons == 0) {
// Cancel button
amtstack.IPS_OptInService_CancelOptIn(function() {});
} 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) && (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;
}
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) && (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;
}
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
r['UefiBootParametersArray'] = btoa(makeUefiBootParam(1, Q('idx_d24ocrBootUrl').value.trim()) + makeUefiBootParam(20, 1, 1) + makeUefiBootParam(30, 0, 2));
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=\"' + "設定されている場合、メインWebページからこのコンテンツへのリンクを作成します" + '\">' + "リンク" + '</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 += AddButton("すべてのアラームを削除", 'RemoveAllAlarms()') + 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("Eメール"); }
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("ユーザーID", recFileMetadata.userid);
x += addInfo("セッションID", recFileMetadata.sessionid);
if (recFileMetadata.ipaddr1 && recFileMetadata.ipaddr2) { x += addInfo("住所", format("{0}〜{1}", recFileMetadata.ipaddr1, recFileMetadata.ipaddr2)); }
x += addInfo("NodeID", 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>' + "[スペース]を押して再生/一時停止します。" + '</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>' + "[スペース]を押して再生/一時停止します。" + '</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>' + "[スペース]を押して再生/一時停止します。" + '</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>' + "[スペース]を押して再生/一時停止します。" + '</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 < 27; 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: "OK",
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>