Merge branch 'Ylianst:master' into master

This commit is contained in:
silversword411 2022-07-06 08:10:56 -04:00 committed by GitHub
commit 22495b4350
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 7589 additions and 7434 deletions

View File

@ -69,7 +69,7 @@
"meshId": "Gruppen-ID", "meshId": "Gruppen-ID",
"serverId": "Server-ID", "serverId": "Server-ID",
"setup": "Konfiguration", "setup": "Konfiguration",
"update": "Updates", "update": "Aktualisierung",
"install": "Installieren", "install": "Installieren",
"uninstall": "Deinstallation", "uninstall": "Deinstallation",
"connect": "Verbinden", "connect": "Verbinden",
@ -86,7 +86,7 @@
"GESTARTET", "GESTARTET",
"NICHT GESTARTET" "NICHT GESTARTET"
], ],
"statusDescription": "Aktueller Agentenstatus", "statusDescription": "Aktueller Agentstatus",
"agentVersion": "Neue Version", "agentVersion": "Neue Version",
"elevation": "Zum Installieren/Deinstallieren dieser Software sind erhöhte Berechtigungen erforderlich.", "elevation": "Zum Installieren/Deinstallieren dieser Software sind erhöhte Berechtigungen erforderlich.",
"graphicalerror": "Die grafische Version dieses Installationsprogramms kann auf diesem System nicht ausgeführt werden", "graphicalerror": "Die grafische Version dieses Installationsprogramms kann auf diesem System nicht ausgeführt werden",

View File

@ -57,6 +57,9 @@ module.exports = function CreateAmtRemoteIder() {
var IDE_ModeSence_Ls120Error_Recovery_Array = new Buffer([0x00, 0x12, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00]); var IDE_ModeSence_Ls120Error_Recovery_Array = new Buffer([0x00, 0x12, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00]);
var IDE_ModeSence_CDError_Recovery_Array = new Buffer([0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00]); var IDE_ModeSence_CDError_Recovery_Array = new Buffer([0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00]);
// CD info and performance
var RD_CD_DiskInfo = new Buffer([0x00, 0x20, 0x0e, 0x01, 0x01, 0x01, 0x01, 0x20, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
var RD_CD_Performance = new Buffer([0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00]);
// Private method, called by parent when it change state // Private method, called by parent when it change state
obj.xxStateChange = function (newstate) { obj.xxStateChange = function (newstate) {
@ -528,6 +531,12 @@ module.exports = function CreateAmtRemoteIder() {
obj.SendDataToHost(dev, true, r, featureRegister & 1); obj.SendDataToHost(dev, true, r, featureRegister & 1);
} }
break; break;
case 0x51: // READ_DISK_INFORMATION
obj.SendDataToHost(dev, true, RD_CD_DiskInfo, featureRegister & 1);
break;
case 0xAC: // GET_PERFORMANCE
obj.SendDataToHost(dev, true, RD_CD_Performance, featureRegister & 1);
break;
default: // UNKNOWN COMMAND default: // UNKNOWN COMMAND
if (obj.debug) console.log("IDER: Unknown SCSI command", cdb[0]); if (obj.debug) console.log("IDER: Unknown SCSI command", cdb[0]);
obj.SendCommandEndResponse(0, 0x05, dev, 0x20, 0x00); obj.SendCommandEndResponse(0, 0x05, dev, 0x20, 0x00);

View File

@ -30,7 +30,6 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
const fs = require('fs'); const fs = require('fs');
var obj = {}; var obj = {};
obj.debug = false;
obj.protocol = 3; // IDER obj.protocol = 3; // IDER
obj.bytesToAmt = 0; obj.bytesToAmt = 0;
obj.bytesFromAmt = 0; obj.bytesFromAmt = 0;
@ -38,7 +37,7 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
obj.tx_timeout = 0; // Default 0 obj.tx_timeout = 0; // Default 0
obj.heartbeat = 20000; // Default 20000 obj.heartbeat = 20000; // Default 20000
obj.version = 1; obj.version = 1;
obj.acc = ""; obj.acc = null;
obj.inSequence = 0; obj.inSequence = 0;
obj.outSequence = 0; obj.outSequence = 0;
obj.iderinfo = null; obj.iderinfo = null;
@ -46,47 +45,50 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
obj.iderStart = 0; // OnReboot = 0, Graceful = 1, Now = 2 obj.iderStart = 0; // OnReboot = 0, Graceful = 1, Now = 2
obj.floppy = null; obj.floppy = null;
obj.cdrom = null; obj.cdrom = null;
obj.floppySize = null;
obj.cdromSize = null;
obj.floppyReady = false; obj.floppyReady = false;
obj.cdromReady = false; obj.cdromReady = false;
//obj.pingTimer = null;
obj.sectorStats = null; obj.sectorStats = null;
obj.debug = false;
// Private method // Private method
function debug() { if (obj.debug) { console.log(...arguments); } } function debug() { if (obj.debug) { console.log(...arguments); } }
// Mode Sense // Mode Sense
var IDE_ModeSence_LS120Disk_Page_Array = String.fromCharCode(0x00, 0x26, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x10, 0xA9, 0x08, 0x20, 0x02, 0x00, 0x03, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00); var IDE_ModeSence_LS120Disk_Page_Array = Buffer.from([0x00, 0x26, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x10, 0xA9, 0x08, 0x20, 0x02, 0x00, 0x03, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00]);
var IDE_ModeSence_3F_LS120_Array = String.fromCharCode(0x00, 0x5c, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x16, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x10, 0xA9, 0x08, 0x20, 0x02, 0x00, 0x03, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x11, 0x24, 0x31); var IDE_ModeSence_3F_LS120_Array = Buffer.from([0x00, 0x5c, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x16, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x10, 0xA9, 0x08, 0x20, 0x02, 0x00, 0x03, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x11, 0x24, 0x31]);
var IDE_ModeSence_FloppyDisk_Page_Array = String.fromCharCode(0x00, 0x26, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x04, 0xB0, 0x02, 0x12, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00); var IDE_ModeSence_FloppyDisk_Page_Array = Buffer.from([0x00, 0x26, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x04, 0xB0, 0x02, 0x12, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00]);
var IDE_ModeSence_3F_Floppy_Array = String.fromCharCode(0x00, 0x5c, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x16, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x04, 0xb0, 0x02, 0x12, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x11, 0x24, 0x31); var IDE_ModeSence_3F_Floppy_Array = Buffer.from([0x00, 0x5c, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x16, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x04, 0xb0, 0x02, 0x12, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x11, 0x24, 0x31]);
var IDE_ModeSence_CD_1A_Array = String.fromCharCode(0x00, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); var IDE_ModeSence_CD_1A_Array = Buffer.from([0x00, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
//var IDE_ModeSence_CD_1B_Array = String.fromCharCode(0x00, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); //var IDE_ModeSence_CD_1B_Array = Buffer.from([0x00, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
var IDE_ModeSence_CD_1D_Array = String.fromCharCode(0x00, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); var IDE_ModeSence_CD_1D_Array = Buffer.from([0x00, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
var IDE_ModeSence_CD_2A_Array = String.fromCharCode(0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); var IDE_ModeSence_CD_2A_Array = Buffer.from([0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
//var IDE_ModeSence_CD_01_Array = String.fromCharCode(0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00); //var IDE_ModeSence_CD_01_Array = Buffer.from([0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00]);
var IDE_ModeSence_3F_CD_Array = String.fromCharCode(0x00, 0x28, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); var IDE_ModeSence_3F_CD_Array = Buffer.from([0x00, 0x28, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
// 0x46 constant data // 0x46 constant data
var IDE_CD_ConfigArrayHeader = String.fromCharCode(0x00, 0x00,0x00, 0x28, 0x00, 0x00, 0x00, 0x08); var IDE_CD_ConfigArrayHeader = Buffer.from([0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08]);
var IDE_CD_ConfigArrayProfileList = String.fromCharCode(0x00, 0x00, 0x03, 0x04, 0x00, 0x08, 0x01, 0x00); var IDE_CD_ConfigArrayProfileList = Buffer.from([0x00, 0x00, 0x03, 0x04, 0x00, 0x08, 0x01, 0x00]);
var IDE_CD_ConfigArrayCore = String.fromCharCode(0x00, 0x01, 0x03, 0x04, 0x00, 0x00, 0x00, 0x02); var IDE_CD_ConfigArrayCore = Buffer.from([0x00, 0x01, 0x03, 0x04, 0x00, 0x00, 0x00, 0x02]);
var IDE_CD_Morphing = String.fromCharCode(0x00, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00); var IDE_CD_Morphing = Buffer.from([0x00, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00]);
var IDE_CD_ConfigArrayRemovable = String.fromCharCode(0x00, 0x03, 0x03, 0x04, 0x29, 0x00, 0x00, 0x02); var IDE_CD_ConfigArrayRemovable = Buffer.from([0x00, 0x03, 0x03, 0x04, 0x29, 0x00, 0x00, 0x02]);
var IDE_CD_ConfigArrayRandom = String.fromCharCode(0x00, 0x10, 0x01, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00); var IDE_CD_ConfigArrayRandom = Buffer.from([0x00, 0x10, 0x01, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00]);
var IDE_CD_Read = String.fromCharCode(0x00, 0x1E, 0x03, 0x00); var IDE_CD_Read = Buffer.from([0x00, 0x1E, 0x03, 0x00]);
var IDE_CD_PowerManagement = String.fromCharCode(0x01, 0x00, 0x03, 0x00); var IDE_CD_PowerManagement = Buffer.from([0x01, 0x00, 0x03, 0x00]);
var IDE_CD_Timeout = String.fromCharCode(0x01, 0x05, 0x03, 0x00); var IDE_CD_Timeout = Buffer.from([0x01, 0x05, 0x03, 0x00]);
// 0x01 constant data // 0x01 constant data
var IDE_ModeSence_FloppyError_Recovery_Array = String.fromCharCode(0x00, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00); var IDE_ModeSence_FloppyError_Recovery_Array = Buffer.from([0x00, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00]);
var IDE_ModeSence_Ls120Error_Recovery_Array = String.fromCharCode(0x00, 0x12, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00); var IDE_ModeSence_Ls120Error_Recovery_Array = Buffer.from([0x00, 0x12, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00]);
var IDE_ModeSence_CDError_Recovery_Array = String.fromCharCode(0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00); var IDE_ModeSence_CDError_Recovery_Array = Buffer.from([0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00]);
// CD info and performance
var RD_CD_DiskInfo = Buffer.from([0x00, 0x20, 0x0e, 0x01, 0x01, 0x01, 0x01, 0x20, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
var RD_CD_Performance = Buffer.from([0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00]);
// Private method, called by parent when it change state // Private method, called by parent when it change state
obj.xxStateChange = function (newstate) { obj.xxStateChange = function (newstate) {
debug("IDER-StateChange", newstate); if (obj.debug) console.log("IDER-StateChange", newstate);
if (newstate == 0) { obj.Stop(); } if (newstate == 0) { obj.Stop(); }
if (newstate == 3) { obj.Start(); } if (newstate == 3) { obj.Start(); }
} }
@ -100,8 +102,7 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
if (fs.existsSync(floppyPath) == false) { return 1; } // Floppy disk image does not exist if (fs.existsSync(floppyPath) == false) { return 1; } // Floppy disk image does not exist
var stats = fs.statSync(floppyPath); var stats = fs.statSync(floppyPath);
if ((stats.size % 512) != 0) { return 2; } // Invalid floppy disk image if ((stats.size % 512) != 0) { return 2; } // Invalid floppy disk image
obj.floppySize = stats.size; obj.floppy = { size: stats.size, ptr: fs.openSync(floppyPath, 'r') };
obj.floppy = fs.openSync(floppyPath, 'r');
} catch (ex) { return 3; } // Unable to open floppy disk image } catch (ex) { return 3; } // Unable to open floppy disk image
} }
@ -111,8 +112,7 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
if (fs.existsSync(cdromPath) == false) { return 4; } // CDROM disk image does not exist if (fs.existsSync(cdromPath) == false) { return 4; } // CDROM disk image does not exist
var stats = fs.statSync(cdromPath); var stats = fs.statSync(cdromPath);
if ((stats.size % 512) != 0) { return 5; } // Invalid CDROM disk image if ((stats.size % 512) != 0) { return 5; } // Invalid CDROM disk image
obj.cdromSize = stats.size; obj.cdrom = { size: stats.size, ptr: fs.openSync(cdromPath, 'r') };
obj.cdrom = fs.openSync(cdromPath, 'r');
} catch (ex) { return 6; } // Unable to open CDROM disk image } catch (ex) { return 6; } // Unable to open CDROM disk image
} }
@ -122,9 +122,7 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
} }
obj.Start = function () { obj.Start = function () {
debug("IDER-Start"); if (obj.debug) { console.log('IDER-Start'); console.log(obj.floppy, obj.cdrom); }
// Get ready
obj.bytesToAmt = 0; obj.bytesToAmt = 0;
obj.bytesFromAmt = 0; obj.bytesFromAmt = 0;
obj.inSequence = 0; obj.inSequence = 0;
@ -132,87 +130,80 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
g_readQueue = []; g_readQueue = [];
// Send first command, OPEN_SESSION // Send first command, OPEN_SESSION
obj.SendCommand(0x40, webserver.common.ShortToStrX(obj.rx_timeout) + webserver.common.ShortToStrX(obj.tx_timeout) + webserver.common.ShortToStrX(obj.heartbeat) + webserver.common.IntToStrX(obj.version)); obj.SendCommand(0x40, Buffer.concat([ShortToStrX(obj.rx_timeout), ShortToStrX(obj.tx_timeout), ShortToStrX(obj.heartbeat), IntToStrX(obj.version)]));
// Send sector stats // Send sector stats
if (obj.sectorStats) { if (obj.sectorStats) {
obj.sectorStats(0, 0, obj.floppy ? (obj.floppySize >> 9) : 0); obj.sectorStats(0, 0, obj.floppy ? (obj.floppy.size >> 9) : 0);
obj.sectorStats(0, 1, obj.cdrom ? (obj.cdromSize >> 11) : 0); obj.sectorStats(0, 1, obj.cdrom ? (obj.cdrom.size >> 11) : 0);
} }
// Setup the ping timer
//obj.pingTimer = setInterval(function () { obj.SendCommand(0x44); }, 5000);
} }
obj.Stop = function () { obj.Stop = function () {
debug("IDER-Stop"); if (obj.debug) console.log('IDER-Stop');
//if (obj.pingTimer) { clearInterval(obj.pingTimer); obj.pingTimer = null; }
// Close the files
if (obj.floppy) { fs.close(obj.floppy); delete obj.floppy; }
if (obj.cdrom) { fs.close(obj.cdrom); delete obj.cdrom; }
// Clean up
obj.floppySize = 0;
obj.cdromSize = 0;
obj.floppyReady = false;
obj.cdromReady = false;
// Stop the redirection connection
obj.parent.Stop(); obj.parent.Stop();
} }
// Private method // Private method
obj.ProcessData = function (data) { obj.ProcessData = function (data) {
data = Buffer.from(data, 'binary');
obj.bytesFromAmt += data.length; obj.bytesFromAmt += data.length;
obj.acc += data; if (obj.acc == null) { obj.acc = data; } else { obj.acc = Buffer.concat(obj.acc, data); }
debug('IDER-ProcessData', obj.acc.length, webserver.common.rstr2hex(obj.acc)); if (obj.debug) console.log('IDER-ProcessData', obj.acc.length, obj.acc.toString('hex'));
// Process as many commands as possible // Process as many commands as possible
while (true) { while (obj.acc != null) {
var len = obj.ProcessDataEx(); var len = obj.ProcessDataEx();
if (len == 0) return; if (len == 0) return;
if (obj.inSequence != webserver.common.ReadIntX(obj.acc, 4)) { if (obj.inSequence != ReadIntX(obj.acc, 4)) {
debug('ERROR: Out of sequence', obj.inSequence, webserver.common.ReadIntX(obj.acc, 4)); if (obj.debug) console.log('ERROR: Out of sequence', obj.inSequence, ReadIntX(obj.acc, 4));
obj.Stop(); obj.Stop();
return; return;
} }
obj.inSequence++; obj.inSequence++;
obj.acc = obj.acc.substring(len); if (len == obj.acc.length) { obj.acc = null; } else { obj.acc = obj.acc.slice(len); }
} }
} }
// Private method // Private method
obj.SendCommand = function (cmdid, data, completed, dma) { obj.SendCommand = function (cmdid, data, completed, dma) {
if (data == null) { data = ''; } if (data == null) { data = Buffer.alloc(0); }
var attributes = ((cmdid > 50) && (completed == true)) ? 2 : 0; var attributes = ((cmdid > 50) && (completed == true)) ? 2 : 0;
if (dma) { attributes += 1; } if (dma) { attributes += 1; }
var x = String.fromCharCode(cmdid, 0, 0, attributes) + webserver.common.IntToStrX(obj.outSequence++) + data; var x = Buffer.concat([Buffer.from([cmdid, 0, 0, attributes]), IntToStrX(obj.outSequence++), data]);
obj.parent.xxSend(x); obj.parent.xxSend(x);
obj.bytesToAmt += x.length; obj.bytesToAmt += x.length;
if (cmdid != 0x4B) { debug('IDER-SendData', x.length, webserver.common.rstr2hex(x)); } //if (cmdid != 0x4B) { console.log('IDER-SendData', x.length, x.toString('hex')); }
} }
// CommandEndResponse (SCSI_SENSE) // CommandEndResponse (SCSI_SENSE)
obj.SendCommandEndResponse = function (error, sense, device, asc, asq) { obj.SendCommandEndResponse = function (error, sense, device, asc, asq) {
if (error) { obj.SendCommand(0x51, String.fromCharCode(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc5, 0, 3, 0, 0, 0, device, 0x50, 0, 0, 0), true); } if (error) { obj.SendCommand(0x51, Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc5, 0, 3, 0, 0, 0, device, 0x50, 0, 0, 0]), true); }
else { obj.SendCommand(0x51, String.fromCharCode(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x87, (sense << 4), 3, 0, 0, 0, device, 0x51, sense, asc, asq), true); } else { obj.SendCommand(0x51, Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x87, (sense << 4), 3, 0, 0, 0, device, 0x51, sense, asc, asq]), true); }
} }
// DataToHost (SCSI_READ) // DataToHost (SCSI_READ)
obj.SendDataToHost = function (device, completed, data, dma) { obj.SendDataToHost = function (device, completed, data, dma) {
var dmalen = (dma) ? 0 : data.length; var dmalen = (dma) ? 0 : data.length;
if (completed == true) { if (completed == true) {
obj.SendCommand(0x54, String.fromCharCode(0, (data.length & 0xff), (data.length >> 8), 0, dma ? 0xb4 : 0xb5, 0, 2, 0, (dmalen & 0xff), (dmalen >> 8), device, 0x58, 0x85, 0, 3, 0, 0, 0, device, 0x50, 0, 0, 0, 0, 0, 0) + data, completed, dma); obj.SendCommand(0x54, Buffer.concat([Buffer.from([0, (data.length & 0xff), (data.length >> 8), 0, dma ? 0xb4 : 0xb5, 0, 2, 0, (dmalen & 0xff), (dmalen >> 8), device, 0x58, 0x85, 0, 3, 0, 0, 0, device, 0x50, 0, 0, 0, 0, 0, 0]), data]), completed, dma);
} else { } else {
obj.SendCommand(0x54, String.fromCharCode(0, (data.length & 0xff), (data.length >> 8), 0, dma ? 0xb4 : 0xb5, 0, 2, 0, (dmalen & 0xff), (dmalen >> 8), device, 0x58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + data, completed, dma); obj.SendCommand(0x54, Buffer.concat([Buffer.from([0, (data.length & 0xff), (data.length >> 8), 0, dma ? 0xb4 : 0xb5, 0, 2, 0, (dmalen & 0xff), (dmalen >> 8), device, 0x58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), data]), completed, dma);
} }
} }
// GetDataFromHost (SCSI_CHUNK) // GetDataFromHost (SCSI_CHUNK)
obj.SendGetDataFromHost = function (device, chunksize) { obj.SendGetDataFromHost = function (device, chunksize) {
obj.SendCommand(0x52, String.fromCharCode(0, (chunksize & 0xff), (chunksize >> 8), 0, 0xb5, 0, 0, 0, (chunksize & 0xff), (chunksize >> 8), device, 0x58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), false); obj.SendCommand(0x52, Buffer.from([0, (chunksize & 0xff), (chunksize >> 8), 0, 0xb5, 0, 0, 0, (chunksize & 0xff), (chunksize >> 8), device, 0x58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), false);
} }
// DisableEnableFeatures (STATUS_DATA) // DisableEnableFeatures (STATUS_DATA)
// If type is REGS_TOGGLE (3), 4 bytes of data must be provided. // If type is REGS_TOGGLE (3), 4 bytes of data must be provided.
obj.SendDisableEnableFeatures = function (type, data) { if (data == null) { data = ''; } obj.SendCommand(0x48, String.fromCharCode(type) + data); } obj.SendDisableEnableFeatures = function (type, data) { if (data == null) { data = ''; } obj.SendCommand(0x48, Buffer.concat([Buffer.from([type]), data])); }
// Private method // Private method
obj.ProcessDataEx = function () { obj.ProcessDataEx = function () {
@ -220,130 +211,128 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
// First 8 bytes are the header // First 8 bytes are the header
// CommandID + 0x000000 + Sequence Number // CommandID + 0x000000 + Sequence Number
//console.log('ProcessDataEx', obj.acc[0], obj.acc);
switch(obj.acc.charCodeAt(0)) { switch (obj.acc[0]) {
case 0x41: // OPEN_SESSION case 0x41: // OPEN_SESSION
if (obj.acc.length < 30) return 0; if (obj.acc.length < 30) return 0;
var len = obj.acc.charCodeAt(29); var len = obj.acc[29];
if (obj.acc.length < (30 + len)) return 0; if (obj.acc.length < (30 + len)) return 0;
obj.iderinfo = {}; obj.iderinfo = {};
obj.iderinfo.major = obj.acc.charCodeAt(8); obj.iderinfo.major = obj.acc[8];
obj.iderinfo.minor = obj.acc.charCodeAt(9); obj.iderinfo.minor = obj.acc[9];
obj.iderinfo.fwmajor = obj.acc.charCodeAt(10); obj.iderinfo.fwmajor = obj.acc[10];
obj.iderinfo.fwminor = obj.acc.charCodeAt(11); obj.iderinfo.fwminor = obj.acc[11];
obj.iderinfo.readbfr = webserver.common.ReadShortX(obj.acc, 16); obj.iderinfo.readbfr = ReadShortX(obj.acc, 16);
obj.iderinfo.writebfr = webserver.common.ReadShortX(obj.acc, 18); obj.iderinfo.writebfr = ReadShortX(obj.acc, 18);
obj.iderinfo.proto = obj.acc.charCodeAt(21); obj.iderinfo.proto = obj.acc[21];
obj.iderinfo.iana = webserver.common.ReadIntX(obj.acc, 25); obj.iderinfo.iana = ReadIntX(obj.acc, 25);
debug(obj.iderinfo); if (obj.debug) console.log(obj.iderinfo);
if (obj.iderinfo.proto != 0) { if (obj.iderinfo.proto != 0) {
debug("Unknown proto", obj.iderinfo.proto); if (obj.debug) console.log("Unknown proto", obj.iderinfo.proto);
obj.Stop(); obj.Stop();
} }
if (obj.iderinfo.readbfr > 8192) { if (obj.iderinfo.readbfr > 8192) {
debug("Illegal read buffer size", obj.iderinfo.readbfr); if (obj.debug) console.log("Illegal read buffer size", obj.iderinfo.readbfr);
obj.Stop(); obj.Stop();
} }
if (obj.iderinfo.writebfr > 8192) { if (obj.iderinfo.writebfr > 8192) {
debug("Illegal write buffer size", obj.iderinfo.writebfr); if (obj.debug) console.log("Illegal write buffer size", obj.iderinfo.writebfr);
obj.Stop(); obj.Stop();
} }
if (obj.iderStart == 0) { obj.SendDisableEnableFeatures(3, webserver.common.IntToStrX(0x01 + 0x08)); } // OnReboot if (obj.iderStart == 0) { obj.SendDisableEnableFeatures(3, IntToStrX(0x01 + 0x08)); } // OnReboot
else if (obj.iderStart == 1) { obj.SendDisableEnableFeatures(3, webserver.common.IntToStrX(0x01 + 0x10)); } // Graceful else if (obj.iderStart == 1) { obj.SendDisableEnableFeatures(3, IntToStrX(0x01 + 0x10)); } // Graceful
else if (obj.iderStart == 2) { obj.SendDisableEnableFeatures(3, webserver.common.IntToStrX(0x01 + 0x18)); } // Now else if (obj.iderStart == 2) { obj.SendDisableEnableFeatures(3, IntToStrX(0x01 + 0x18)); } // Now
//obj.SendDisableEnableFeatures(1); // GetSupportedFeatures //obj.SendDisableEnableFeatures(1); // GetSupportedFeatures
return 30 + len; return 30 + len;
case 0x43: // CLOSE case 0x43: // CLOSE
debug('CLOSE'); if (obj.debug) console.log('CLOSE');
obj.Stop(); obj.Stop();
return 8; return 8;
case 0x44: // KEEPALIVEPING case 0x44: // KEEPALIVEPING
obj.SendCommand(0x45); // Send PONG back obj.SendCommand(0x45); // Send PONG back
return 8; return 8;
case 0x45: // KEEPALIVEPONG case 0x45: // KEEPALIVEPONG
debug('PONG'); if (obj.debug) console.log('PONG');
return 8; return 8;
case 0x46: // RESETOCCURED case 0x46: // RESETOCCURED
if (obj.acc.length < 9) return 0; if (obj.acc.length < 9) return 0;
var resetMask = obj.acc.charCodeAt(8); var resetMask = obj.acc[8];
if (g_media === null) { if (g_media === null) {
// No operations are pending // No operations are pending
obj.SendCommand(0x47); // Send ResetOccuredResponse obj.SendCommand(0x47); // Send ResetOccuredResponse
debug('RESETOCCURED1', resetMask); if (obj.debug) console.log('RESETOCCURED1', resetMask);
} else { } else {
// Operations are being done, sent the reset once completed. // Operations are being done, sent the reset once completed.
g_reset = true; g_reset = true;
debug('RESETOCCURED2', resetMask); if (obj.debug) console.log('RESETOCCURED2', resetMask);
} }
return 9; return 9;
case 0x49: // STATUS_DATA - DisableEnableFeaturesReply case 0x49: // STATUS_DATA - DisableEnableFeaturesReply
if (obj.acc.length < 13) return 0; if (obj.acc.length < 13) return 0;
var type = obj.acc.charCodeAt(8); var type = obj.acc[8];
var value = webserver.common.ReadIntX(obj.acc, 9); var value = ReadIntX(obj.acc, 9);
debug('STATUS_DATA', type, value); if (obj.debug) console.log('STATUS_DATA', type, value);
switch (type) switch (type) {
{
case 1: // REGS_AVAIL case 1: // REGS_AVAIL
if (value & 1) { if (value & 1) {
if (obj.iderStart == 0) { obj.SendDisableEnableFeatures(3, webserver.common.IntToStrX(0x01 + 0x08)); } // OnReboot if (obj.iderStart == 0) { obj.SendDisableEnableFeatures(3, IntToStrX(0x01 + 0x08)); } // OnReboot
else if (obj.iderStart == 1) { obj.SendDisableEnableFeatures(3, webserver.common.IntToStrX(0x01 + 0x10)); } // Graceful else if (obj.iderStart == 1) { obj.SendDisableEnableFeatures(3, IntToStrX(0x01 + 0x10)); } // Graceful
else if (obj.iderStart == 2) { obj.SendDisableEnableFeatures(3, webserver.common.IntToStrX(0x01 + 0x18)); } // Now else if (obj.iderStart == 2) { obj.SendDisableEnableFeatures(3, IntToStrX(0x01 + 0x18)); } // Now
} }
break; break;
case 2: // REGS_STATUS case 2: // REGS_STATUS
obj.enabled = (value & 2) ? true : false; obj.enabled = (value & 2) ? true : false;
debug("IDER Status: " + obj.enabled); if (obj.debug) console.log("IDER Status: " + obj.enabled);
break; break;
case 3: // REGS_TOGGLE case 3: // REGS_TOGGLE
if (value != 1) { if (value != 1) {
debug("Register toggle failure"); if (obj.debug) console.log("Register toggle failure");
} //else { obj.SendDisableEnableFeatures(2); } } //else { obj.SendDisableEnableFeatures(2); }
break; break;
} }
return 13; return 13;
case 0x4A: // ERROR OCCURED case 0x4A: // ERROR OCCURED
if (obj.acc.length < 11) return 0; if (obj.acc.length < 11) return 0;
debug('IDER: ABORT', obj.acc.charCodeAt(8)); if (obj.debug) console.log('IDER: ABORT', obj.acc[8]);
//obj.Stop(); //obj.Stop();
return 11; return 11;
case 0x4B: // HEARTBEAT case 0x4B: // HEARTBEAT
//debug('HEARTBEAT'); //console.log('HEARTBEAT');
return 8; return 8;
case 0x50: // COMMAND WRITTEN case 0x50: // COMMAND WRITTEN
if (obj.acc.length < 28) return 0; if (obj.acc.length < 28) return 0;
var device = (obj.acc.charCodeAt(14) & 0x10) ? 0xB0 : 0xA0; var device = (obj.acc[14] & 0x10) ? 0xB0 : 0xA0;
var deviceFlags = obj.acc.charCodeAt(14); var deviceFlags = obj.acc[14];
var cdb = obj.acc.substring(16, 28); var cdb = obj.acc.slice(16, 28);
var featureRegister = obj.acc.charCodeAt(9); var featureRegister = obj.acc[9];
debug('SCSI_CMD', device, webserver.common.rstr2hex(cdb), featureRegister, deviceFlags); if (obj.debug) console.log('SCSI_CMD', device, cdb.toString('hex'), featureRegister, deviceFlags);
handleSCSI(device, cdb, featureRegister, deviceFlags); handleSCSI(device, cdb, featureRegister, deviceFlags);
return 28; return 28;
case 0x53: // DATA FROM HOST case 0x53: // DATA FROM HOST
if (obj.acc.length < 14) return 0; if (obj.acc.length < 14) return 0;
var len = webserver.common.ReadShortX(obj.acc, 9); var len = ReadShortX(obj.acc, 9);
if (obj.acc.length < (14 + len)) return 0; if (obj.acc.length < (14 + len)) return 0;
debug('SCSI_WRITE, len = ' + (14 + len)); if (obj.debug) console.log('SCSI_WRITE, len = ' + (14 + len));
obj.SendCommand(0x51, String.fromCharCode(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x70, 0x03, 0x00, 0x00, 0x00, 0xa0, 0x51, 0x07, 0x27, 0x00), true); obj.SendCommand(0x51, Buffer.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x70, 0x03, 0x00, 0x00, 0x00, 0xa0, 0x51, 0x07, 0x27, 0x00]), true);
return 14 + len; return 14 + len;
default: default:
debug('Unknown IDER command', obj.acc[0]); if (obj.debug) console.log('Unknown IDER command', obj.acc[0]);
obj.Stop(); obj.Stop();
break; break;
} }
return 0; return 0;
} }
function handleSCSI(dev, cdb, featureRegister, deviceFlags) function handleSCSI(dev, cdb, featureRegister, deviceFlags) {
{
var lba; var lba;
var len; var len;
switch(cdb.charCodeAt(0)) switch (cdb[0]) {
{
case 0x00: // TEST_UNIT_READY: case 0x00: // TEST_UNIT_READY:
debug("SCSI: TEST_UNIT_READY", dev); if (obj.debug) console.log("SCSI: TEST_UNIT_READY", dev);
switch (dev) { switch (dev) {
case 0xA0: // DEV_FLOPPY case 0xA0: // DEV_FLOPPY
if (obj.floppy == null) { obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); return -1; } if (obj.floppy == null) { obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); return -1; }
@ -354,34 +343,34 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
if (obj.cdromReady == false) { obj.cdromReady = true; obj.SendCommandEndResponse(1, 0x06, dev, 0x28, 0x00); return -1; } // Switch to ready if (obj.cdromReady == false) { obj.cdromReady = true; obj.SendCommandEndResponse(1, 0x06, dev, 0x28, 0x00); return -1; } // Switch to ready
break; break;
default: default:
debug("SCSI Internal error 3", dev); if (obj.debug) console.log("SCSI Internal error 3", dev);
return -1; return -1;
} }
obj.SendCommandEndResponse(1, 0x00, dev, 0x00, 0x00); // Indicate ready obj.SendCommandEndResponse(1, 0x00, dev, 0x00, 0x00); // Indicate ready
break; break;
case 0x08: // READ_6 case 0x08: // READ_6
lba = ((cdb.charCodeAt(1) & 0x1f) << 16) + (cdb.charCodeAt(2) << 8) + cdb.charCodeAt(3); lba = ((cdb[1] & 0x1f) << 16) + (cdb[2] << 8) + cdb[3];
len = cdb.charCodeAt(4); len = cdb[4];
if (len == 0) { len = 256; } if (len == 0) { len = 256; }
debug("SCSI: READ_6", dev, lba, len); if (obj.debug) console.log("SCSI: READ_6", dev, lba, len);
sendDiskData(dev, lba, len, featureRegister); sendDiskData(dev, lba, len, featureRegister);
break; break;
case 0x0a: // WRITE_6 case 0x0a: // WRITE_6
lba = ((cdb.charCodeAt(1) & 0x1f) << 16) + (cdb.charCodeAt(2) << 8) + cdb.charCodeAt(3); lba = ((cdb[1] & 0x1f) << 16) + (cdb[2] << 8) + cdb[3];
len = cdb.charCodeAt(4); len = cdb[4];
if (len == 0) { len = 256; } if (len == 0) { len = 256; }
debug("SCSI: WRITE_6", dev, lba, len); if (obj.debug) console.log("SCSI: WRITE_6", dev, lba, len);
obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); // Write is not supported, remote no medium. obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); // Write is not supported, remote no medium.
return -1; return -1;
/* /*
case 0x15: // MODE_SELECT_6: case 0x15: // MODE_SELECT_6:
debug("SCSI ERROR: MODE_SELECT_6", dev); console.log("SCSI ERROR: MODE_SELECT_6", dev);
obj.SendCommandEndResponse(1, 0x05, dev, 0x20, 0x00); obj.SendCommandEndResponse(1, 0x05, dev, 0x20, 0x00);
return -1; return -1;
*/ */
case 0x1a: // MODE_SENSE_6 case 0x1a: // MODE_SENSE_6
debug("SCSI: MODE_SENSE_6", dev); if (obj.debug) console.log("SCSI: MODE_SENSE_6", dev);
if ((cdb.charCodeAt(2) == 0x3f) && (cdb.charCodeAt(3) == 0x00)) { if ((cdb[2] == 0x3f) && (cdb[3] == 0x00)) {
var a = 0, b = 0; var a = 0, b = 0;
switch (dev) { switch (dev) {
case 0xA0: // DEV_FLOPPY case 0xA0: // DEV_FLOPPY
@ -395,90 +384,89 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
b = 0x80; b = 0x80;
break; break;
default: default:
debug("SCSI Internal error 6", dev); if (obj.debug) console.log("SCSI Internal error 6", dev);
return -1; return -1;
} }
obj.SendDataToHost(dev, true, String.fromCharCode(0, a, b, 0), featureRegister & 1); obj.SendDataToHost(dev, true, Buffer.from([0, a, b, 0]), featureRegister & 1);
return; return;
} }
obj.SendCommandEndResponse(1, 0x05, dev, 0x24, 0x00); obj.SendCommandEndResponse(1, 0x05, dev, 0x24, 0x00);
break; break;
case 0x1b: // START_STOP (Called when you eject the CDROM) case 0x1b: // START_STOP (Called when you eject the CDROM)
//var immediate = cdb.charCodeAt(1) & 0x01; //var immediate = cdb[1] & 0x01;
//var loej = cdb.charCodeAt(4) & 0x02; //var loej = cdb[4] & 0x02;
//var start = cdb.charCodeAt(4) & 0x01; //var start = cdb[4] & 0x01;
obj.SendCommandEndResponse(1, 0, dev); obj.SendCommandEndResponse(1, 0, dev);
break; break;
case 0x1e: // LOCK_UNLOCK - ALLOW_MEDIUM_REMOVAL case 0x1e: // LOCK_UNLOCK - ALLOW_MEDIUM_REMOVAL
debug("SCSI: ALLOW_MEDIUM_REMOVAL", dev); if (obj.debug) console.log("SCSI: ALLOW_MEDIUM_REMOVAL", dev);
if ((dev == 0xA0) && (obj.floppy == null)) { obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); return -1; } if ((dev == 0xA0) && (obj.floppy == null)) { obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); return -1; }
if ((dev == 0xB0) && (obj.cdrom == null)) { obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); return -1; } if ((dev == 0xB0) && (obj.cdrom == null)) { obj.SendCommandEndResponse(1, 0x02, dev, 0x3a, 0x00); return -1; }
obj.SendCommandEndResponse(1, 0x00, dev, 0x00, 0x00); obj.SendCommandEndResponse(1, 0x00, dev, 0x00, 0x00);
break; break;
case 0x23: // READ_FORMAT_CAPACITIES (Floppy only) case 0x23: // READ_FORMAT_CAPACITIES (Floppy only)
debug("SCSI: READ_FORMAT_CAPACITIES", dev); if (obj.debug) console.log("SCSI: READ_FORMAT_CAPACITIES", dev);
var buflen = webserver.common.ReadShort(cdb, 7); var buflen = ReadShort(cdb, 7);
var mediaStatus = 0, sectors; var mediaStatus = 0, sectors;
var mcSize = buflen / 8; // Capacity descriptor size is 8 var mcSize = buflen / 8; // Capacity descriptor size is 8
switch (dev) { switch (dev) {
case 0xA0: // DEV_FLOPPY case 0xA0: // DEV_FLOPPY
if ((obj.floppy == null) || (obj.floppySize == 0)) { obj.SendCommandEndResponse(0, 0x05, dev, 0x24, 0x00); return -1; } if ((obj.floppy == null) || (obj.floppy.size == 0)) { obj.SendCommandEndResponse(0, 0x05, dev, 0x24, 0x00); return -1; }
sectors = (obj.floppySize >> 9) - 1; sectors = (obj.floppy.size >> 9) - 1;
break; break;
case 0xB0: // DEV_CDDVD case 0xB0: // DEV_CDDVD
if ((obj.cdrom == null) || (obj.cdromSize == 0)) { obj.SendCommandEndResponse(0, 0x05, dev, 0x24, 0x00); return -1; } if ((obj.cdrom == null) || (obj.cdrom.size == 0)) { obj.SendCommandEndResponse(0, 0x05, dev, 0x24, 0x00); return -1; }
sectors = (obj.cdromSize >> 11) - 1; // Number 2048 byte blocks sectors = (obj.cdrom.size >> 11) - 1; // Number 2048 byte blocks
break; break;
default: default:
debug("SCSI Internal error 4", dev); if (obj.debug) console.log("SCSI Internal error 4", dev);
return -1; return -1;
} }
obj.SendDataToHost(dev, true, webserver.common.IntToStr(8) + String.fromCharCode(0x00, 0x00, 0x0b, 0x40, 0x02, 0x00, 0x02, 0x00), featureRegister & 1); obj.SendDataToHost(dev, true, Buffer.concat([IntToStr(8), Buffer.from([0x00, 0x00, 0x0b, 0x40, 0x02, 0x00, 0x02, 0x00])]), featureRegister & 1);
break; break;
case 0x25: // READ_CAPACITY case 0x25: // READ_CAPACITY
debug("SCSI: READ_CAPACITY", dev); if (obj.debug) console.log("SCSI: READ_CAPACITY", dev);
var len = 0; var len = 0;
switch(dev) switch (dev) {
{
case 0xA0: // DEV_FLOPPY case 0xA0: // DEV_FLOPPY
if ((obj.floppy == null) || (obj.floppySize == 0)) { obj.SendCommandEndResponse(0, 0x02, dev, 0x3a, 0x00); return -1; } if ((obj.floppy == null) || (obj.floppy.size == 0)) { obj.SendCommandEndResponse(0, 0x02, dev, 0x3a, 0x00); return -1; }
if (obj.floppy != null) { len = (obj.floppySize >> 9) - 1; } if (obj.floppy != null) { len = (obj.floppy.size >> 9) - 1; }
debug('DEV_FLOPPY', len); // Number 512 byte blocks if (obj.debug) console.log('DEV_FLOPPY', len); // Number 512 byte blocks
break; break;
case 0xB0: // DEV_CDDVD case 0xB0: // DEV_CDDVD
if ((obj.floppy == null) || (obj.floppySize == 0)) { obj.SendCommandEndResponse(0, 0x02, dev, 0x3a, 0x00); return -1; } if ((obj.cdrom == null) || (obj.cdrom.size == 0)) { obj.SendCommandEndResponse(0, 0x02, dev, 0x3a, 0x00); return -1; }
if (obj.cdrom != null) { len = (obj.cdromSize >> 11) - 1; } // Number 2048 byte blocks if (obj.cdrom != null) { len = (obj.cdrom.size >> 11) - 1; } // Number 2048 byte blocks
debug('DEV_CDDVD', len); if (obj.debug) console.log('DEV_CDDVD', len);
break; break;
default: default:
debug("SCSI Internal error 4", dev); if (obj.debug) console.log("SCSI Internal error 4", dev);
return -1; return -1;
} }
//if (dev == 0xA0) { dev = 0x00; } else { dev = 0x10; } // Weird but seems to work. //if (dev == 0xA0) { dev = 0x00; } else { dev = 0x10; } // Weird but seems to work.
debug("SCSI: READ_CAPACITY2", dev, deviceFlags); if (obj.debug) console.log("SCSI: READ_CAPACITY2", dev, deviceFlags);
obj.SendDataToHost(deviceFlags, true, webserver.common.IntToStr(len) + String.fromCharCode(0, 0, ((dev == 0xB0) ? 0x08 : 0x02), 0), featureRegister & 1); obj.SendDataToHost(deviceFlags, true, Buffer.concat([IntToStr(len), Buffer.from([0, 0, ((dev == 0xB0) ? 0x08 : 0x02), 0])]), featureRegister & 1);
break; break;
case 0x28: // READ_10 case 0x28: // READ_10
lba = webserver.common.ReadInt(cdb, 2); lba = ReadInt(cdb, 2);
len = webserver.common.ReadShort(cdb, 7); len = ReadShort(cdb, 7);
debug("SCSI: READ_10", dev, lba, len); if (obj.debug) console.log("SCSI: READ_10", dev, lba, len);
sendDiskData(dev, lba, len, featureRegister); sendDiskData(dev, lba, len, featureRegister);
break; break;
case 0x2a: // WRITE_10 (Floppy only) case 0x2a: // WRITE_10 (Floppy only)
case 0x2e: // WRITE_AND_VERIFY (Floppy only) case 0x2e: // WRITE_AND_VERIFY (Floppy only)
lba = webserver.common.ReadInt(cdb, 2); lba = ReadInt(cdb, 2);
len = webserver.common.ReadShort(cdb, 7); len = ReadShort(cdb, 7);
debug("SCSI: WRITE_10", dev, lba, len); if (obj.debug) console.log("SCSI: WRITE_10", dev, lba, len);
obj.SendGetDataFromHost(dev, 512 * len); // Floppy writes only, accept sectors of 512 bytes obj.SendGetDataFromHost(dev, 512 * len); // Floppy writes only, accept sectors of 512 bytes
break; break;
case 0x43: // READ_TOC (CD Audio only) case 0x43: // READ_TOC (CD Audio only)
var buflen = webserver.common.ReadShort(cdb, 7); var buflen = ReadShort(cdb, 7);
var msf = cdb.charCodeAt(1) & 0x02; var msf = cdb[1] & 0x02;
var format = cdb.charCodeAt(2) & 0x07; var format = cdb[2] & 0x07;
if (format == 0) { format = cdb.charCodeAt(9) >> 6; } if (format == 0) { format = cdb[9] >> 6; }
debug("SCSI: READ_TOC, dev=" + dev + ", buflen=" + buflen + ", msf=" + msf + ", format=" + format); if (obj.debug) console.log("SCSI: READ_TOC, dev=" + dev + ", buflen=" + buflen + ", msf=" + msf + ", format=" + format);
switch (dev) { switch (dev) {
case 0xA0: // DEV_FLOPPY case 0xA0: // DEV_FLOPPY
@ -488,96 +476,100 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
// NOP // NOP
break; break;
default: default:
debug("SCSI Internal error 9", dev); if (obj.debug) console.log("SCSI Internal error 9", dev);
return -1; return -1;
} }
if (format == 1) { obj.SendDataToHost(dev, true, String.fromCharCode(0x00, 0x0a, 0x01, 0x01, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00), featureRegister & 1); } if (format == 1) { obj.SendDataToHost(dev, true, Buffer.from([0x00, 0x0a, 0x01, 0x01, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00]), featureRegister & 1); }
else if (format == 0) { else if (format == 0) {
if (msf) { if (msf) {
obj.SendDataToHost(dev, true, String.fromCharCode(0x00, 0x12, 0x01, 0x01, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x34, 0x13), featureRegister & 1); obj.SendDataToHost(dev, true, Buffer.from([0x00, 0x12, 0x01, 0x01, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x34, 0x13]), featureRegister & 1);
} else { } else {
obj.SendDataToHost(dev, true, String.fromCharCode(0x00, 0x12, 0x01, 0x01, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00), featureRegister & 1); obj.SendDataToHost(dev, true, Buffer.from([0x00, 0x12, 0x01, 0x01, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00]), featureRegister & 1);
} }
} }
break; break;
case 0x46: // GET_CONFIGURATION case 0x46: // GET_CONFIGURATION
var sendall = (cdb.charCodeAt(1) != 2); var sendall = (cdb[1] != 2);
var firstcode = webserver.common.ReadShort(cdb, 2); var firstcode = ReadShort(cdb, 2);
var buflen = webserver.common.ReadShort(cdb, 7); var buflen = ReadShort(cdb, 7);
debug("SCSI: GET_CONFIGURATION", dev, sendall, firstcode, buflen); if (obj.debug) console.log("SCSI: GET_CONFIGURATION", dev, sendall, firstcode, buflen);
if (buflen == 0) { obj.SendDataToHost(dev, true, Buffer.concat([IntToStr(0x003c), IntToStr(0x0008)]), featureRegister & 1); return -1; } // TODO: Fixed this return, it's not correct.
if (buflen == 0) { obj.SendDataToHost(dev, true, webserver.common.IntToStr(0x003c) + webserver.common.IntToStr(0x0008), featureRegister & 1); return -1; } // TODO: Fixed this return, it's not correct.
// Set the header // Set the header
var r = webserver.common.IntToStr(0x0008); var r = null;
// Add the data // Add the data
if (firstcode == 0) { r += IDE_CD_ConfigArrayProfileList; } if (firstcode == 0) { r = IDE_CD_ConfigArrayProfileList; }
if ((firstcode == 0x1) || (sendall && (firstcode < 0x1))) { r += IDE_CD_ConfigArrayCore; } if ((firstcode == 0x1) || (sendall && (firstcode < 0x1))) { r = IDE_CD_ConfigArrayCore; }
if ((firstcode == 0x2) || (sendall && (firstcode < 0x2))) { r += IDE_CD_Morphing; } if ((firstcode == 0x2) || (sendall && (firstcode < 0x2))) { r = IDE_CD_Morphing; }
if ((firstcode == 0x3) || (sendall && (firstcode < 0x3))) { r += IDE_CD_ConfigArrayRemovable; } if ((firstcode == 0x3) || (sendall && (firstcode < 0x3))) { r = IDE_CD_ConfigArrayRemovable; }
if ((firstcode == 0x10) || (sendall && (firstcode < 0x10))) { r += IDE_CD_ConfigArrayRandom; } if ((firstcode == 0x10) || (sendall && (firstcode < 0x10))) { r = IDE_CD_ConfigArrayRandom; }
if ((firstcode == 0x1E) || (sendall && (firstcode < 0x1E))) { r += IDE_CD_Read; } if ((firstcode == 0x1E) || (sendall && (firstcode < 0x1E))) { r = IDE_CD_Read; }
if ((firstcode == 0x100) || (sendall && (firstcode < 0x100))) { r += IDE_CD_PowerManagement; } if ((firstcode == 0x100) || (sendall && (firstcode < 0x100))) { r = IDE_CD_PowerManagement; }
if ((firstcode == 0x105) || (sendall && (firstcode < 0x105))) { r += IDE_CD_Timeout; } if ((firstcode == 0x105) || (sendall && (firstcode < 0x105))) { r = IDE_CD_Timeout; }
// Set the length if (r == null) {
r = webserver.common.IntToStr(r.length) + r; //console.log('NOT RIGHT', sendall, firstcode, cdb[2], cdb[3]);
//process.exit(0);
r = Buffer.concat([IntToStr(0x0008), IntToStr(4)]);
} else {
r = Buffer.concat([IntToStr(0x0008), IntToStr(r.length + 4), r]);
}
// Cut the length to buflen if needed // Cut the length to buflen if needed
if (r.length > buflen) { r = r.substring(0, buflen); } if (r.length > buflen) { r = r.slice(0, buflen); }
obj.SendDataToHost(dev, true, r, featureRegister & 1); obj.SendDataToHost(dev, true, r, featureRegister & 1);
return -1; return -1;
case 0x4a: // GET_EV_STATUS - GET_EVENT_STATUS_NOTIFICATION case 0x4a: // GET_EV_STATUS - GET_EVENT_STATUS_NOTIFICATION
//var buflen = (cdb.charCodeAt(7) << 8) + cdb.charCodeAt(8); //var buflen = (cdb[7] << 8) + cdb[8];
//if (buflen == 0) { obj.SendDataToHost(dev, true, webserver.common.IntToStr(0x003c) + webserver.common.IntToStr(0x0008), featureRegister & 1); return -1; } // TODO: Fixed this return, it's not correct. //if (buflen == 0) { obj.SendDataToHost(dev, true, Buffer.concat([IntToStr(0x003c), IntToStr(0x0008)]), featureRegister & 1); return -1; } // TODO: Fixed this return, it's not correct.
debug("SCSI: GET_EVENT_STATUS_NOTIFICATION", dev, cdb.charCodeAt(1), cdb.charCodeAt(4), cdb.charCodeAt(9)); if (obj.debug) console.log("SCSI: GET_EVENT_STATUS_NOTIFICATION", dev, cdb[1], cdb[4], cdb[9]);
if ((cdb.charCodeAt(1) != 0x01) && (cdb.charCodeAt(4) != 0x10)) { if ((cdb[1] != 0x01) && (cdb[4] != 0x10)) {
debug('SCSI ERROR'); if (obj.debug) console.log('SCSI ERROR');
obj.SendCommandEndResponse(1, 0x05, dev, 0x26, 0x01); obj.SendCommandEndResponse(1, 0x05, dev, 0x26, 0x01);
break; break;
} }
var present = 0x00; var present = 0x00;
if ((dev == 0xA0) && (obj.floppy != null)) { present = 0x02; } if ((dev == 0xA0) && (obj.floppy != null)) { present = 0x02; }
else if ((dev == 0xB0) && (obj.cdrom != null)) { present = 0x02; } else if ((dev == 0xB0) && (obj.cdrom != null)) { present = 0x02; }
obj.SendDataToHost(dev, true, String.fromCharCode(0x00, present, 0x80, 0x00), featureRegister & 1); // This is the original version, 4 bytes long obj.SendDataToHost(dev, true, Buffer.from([0x00, present, 0x80, 0x00]), featureRegister & 1); // This is the original version, 4 bytes long
break; break;
case 0x4c: case 0x4c:
obj.SendCommand(0x51, webserver.common.IntToStrX(0) + webserver.common.IntToStrX(0) + webserver.common.IntToStrX(0) + String.fromCharCode(0x87, 0x50, 0x03, 0x00, 0x00, 0x00, 0xb0, 0x51, 0x05, 0x20, 0x00), true); obj.SendCommand(0x51, Buffer.concat([IntToStrX(0), IntToStrX(0), IntToStrX(0), Buffer.from([0x87, 0x50, 0x03, 0x00, 0x00, 0x00, 0xb0, 0x51, 0x05, 0x20, 0x00])]), true);
break; break;
case 0x51: // READ_DISC_INFO case 0x51: // READ_DISC_INFO
debug("SCSI READ_DISC_INFO", dev); if (obj.debug) console.log("SCSI READ_DISC_INFO", dev);
obj.SendCommandEndResponse(0, 0x05, dev, 0x20, 0x00); // Correct obj.SendCommandEndResponse(0, 0x05, dev, 0x20, 0x00); // Correct
return -1; return -1;
case 0x55: // MODE_SELECT_10: case 0x55: // MODE_SELECT_10:
debug("SCSI ERROR: MODE_SELECT_10", dev); if (obj.debug) console.log("SCSI ERROR: MODE_SELECT_10", dev);
obj.SendCommandEndResponse(1, 0x05, dev, 0x20, 0x00); obj.SendCommandEndResponse(1, 0x05, dev, 0x20, 0x00);
return -1; return -1;
case 0x5a: // MODE_SENSE_10 case 0x5a: // MODE_SENSE_10
debug("SCSI: MODE_SENSE_10", dev, cdb.charCodeAt(2) & 0x3f); if (obj.debug) console.log("SCSI: MODE_SENSE_10", dev, cdb[2] & 0x3f);
var buflen = webserver.common.ReadShort(cdb, 7); var buflen = ReadShort(cdb, 7);
//var pc = cdb.charCodeAt(2) & 0xc0; //var pc = cdb[2] & 0xc0;
var r = null; var r = null;
if (buflen == 0) { obj.SendDataToHost(dev, true, webserver.common.IntToStr(0x003c) + webserver.common.IntToStr(0x0008), featureRegister & 1); return -1; } // TODO: Fixed this return, it's not correct. if (buflen == 0) { obj.SendDataToHost(dev, true, Buffer.concat([IntToStr(0x003c), IntToStr(0x0008)]), featureRegister & 1); return -1; } // TODO: Fixed this return, it's not correct.
// 1.44 mb floppy or LS120 (sectorCount == 0x3c300) // 1.44 mb floppy or LS120 (sectorCount == 0x3c300)
var sectorCount = 0; var sectorCount = 0;
if (dev == 0xA0) { if (dev == 0xA0) {
if (obj.floppy != null) { sectorCount = (obj.floppySize >> 9); } if (obj.floppy != null) { sectorCount = (obj.floppy.size >> 9); }
} else { } else {
if (obj.cdrom != null) { sectorCount = (obj.cdromSize >> 11); } if (obj.cdrom != null) { sectorCount = (obj.cdrom.size >> 11); }
} }
switch (cdb.charCodeAt(2) & 0x3f) { switch (cdb[2] & 0x3f) {
case 0x01: if (dev == 0xA0) { r = (sectorCount <= 0xb40)?IDE_ModeSence_FloppyError_Recovery_Array:IDE_ModeSence_Ls120Error_Recovery_Array; } else { r = IDE_ModeSence_CDError_Recovery_Array; } break; case 0x01: if (dev == 0xA0) { r = (sectorCount <= 0xb40) ? IDE_ModeSence_FloppyError_Recovery_Array : IDE_ModeSence_Ls120Error_Recovery_Array; } else { r = IDE_ModeSence_CDError_Recovery_Array; } break;
case 0x05: if (dev == 0xA0) { r = (sectorCount <= 0xb40)?IDE_ModeSence_FloppyDisk_Page_Array:IDE_ModeSence_LS120Disk_Page_Array; } break; case 0x05: if (dev == 0xA0) { r = (sectorCount <= 0xb40) ? IDE_ModeSence_FloppyDisk_Page_Array : IDE_ModeSence_LS120Disk_Page_Array; } break;
case 0x3f: if (dev == 0xA0) { r = (sectorCount <= 0xb40)?IDE_ModeSence_3F_Floppy_Array:IDE_ModeSence_3F_LS120_Array; } else { r = IDE_ModeSence_3F_CD_Array; } break; case 0x3f: if (dev == 0xA0) { r = (sectorCount <= 0xb40) ? IDE_ModeSence_3F_Floppy_Array : IDE_ModeSence_3F_LS120_Array; } else { r = IDE_ModeSence_3F_CD_Array; } break;
case 0x1A: if (dev == 0xB0) { r = IDE_ModeSence_CD_1A_Array; } break; case 0x1A: if (dev == 0xB0) { r = IDE_ModeSence_CD_1A_Array; } break;
case 0x1D: if (dev == 0xB0) { r = IDE_ModeSence_CD_1D_Array; } break; case 0x1D: if (dev == 0xB0) { r = IDE_ModeSence_CD_1D_Array; } break;
case 0x2A: if (dev == 0xB0) { r = IDE_ModeSence_CD_2A_Array; } break; case 0x2A: if (dev == 0xB0) { r = IDE_ModeSence_CD_2A_Array; } break;
} }
@ -589,8 +581,14 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
obj.SendDataToHost(dev, true, r, featureRegister & 1); obj.SendDataToHost(dev, true, r, featureRegister & 1);
} }
break; break;
case 0x51: // READ_DISK_INFORMATION
obj.SendDataToHost(dev, true, RD_CD_DiskInfo, featureRegister & 1);
break;
case 0xAC: // GET_PERFORMANCE
obj.SendDataToHost(dev, true, RD_CD_Performance, featureRegister & 1);
break;
default: // UNKNOWN COMMAND default: // UNKNOWN COMMAND
debug("IDER: Unknown SCSI command", cdb.charCodeAt(0)); if (obj.debug) console.log("IDER: Unknown SCSI command", cdb[0]);
obj.SendCommandEndResponse(0, 0x05, dev, 0x20, 0x00); obj.SendCommandEndResponse(0, 0x05, dev, 0x20, 0x00);
return -1; return -1;
} }
@ -600,8 +598,8 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
function sendDiskData(dev, lba, len, featureRegister) { function sendDiskData(dev, lba, len, featureRegister) {
var media = null; var media = null;
var mediaBlocks = 0; var mediaBlocks = 0;
if (dev == 0xA0) { media = obj.floppy; if (obj.floppy != null) { mediaBlocks = (obj.floppySize >> 9); } } if (dev == 0xA0) { media = obj.floppy; if (obj.floppy != null) { mediaBlocks = (obj.floppy.size >> 9); } }
if (dev == 0xB0) { media = obj.cdrom; if (obj.cdrom != null) { mediaBlocks = (obj.cdromSize >> 11); } } if (dev == 0xB0) { media = obj.cdrom; if (obj.cdrom != null) { mediaBlocks = (obj.cdrom.size >> 11); } }
if ((len < 0) || (lba + len > mediaBlocks)) { obj.SendCommandEndResponse(1, 0x05, dev, 0x21, 0x00); return 0; } if ((len < 0) || (lba + len > mediaBlocks)) { obj.SendCommandEndResponse(1, 0x05, dev, 0x21, 0x00); return 0; }
if (len == 0) { obj.SendCommandEndResponse(1, 0x00, dev, 0x00, 0x00); return 0; } if (len == 0) { obj.SendCommandEndResponse(1, 0x00, dev, 0x00, 0x00); return 0; }
if (media != null) { if (media != null) {
@ -628,9 +626,10 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
if (g_len > obj.iderinfo.readbfr) { len = obj.iderinfo.readbfr; } if (g_len > obj.iderinfo.readbfr) { len = obj.iderinfo.readbfr; }
g_len -= len; g_len -= len;
g_lba += len; g_lba += len;
var buffer = Buffer.alloc(len); var buffer = Buffer.alloc(len);
fs.read(g_media, buffer, 0, len, lba, function (error, bytesRead, buffer) { fs.read(g_media.ptr, buffer, 0, len, lba, function (error, bytesRead, buffer) {
obj.SendDataToHost(g_dev, (g_len == 0), buffer.toString('binary'), featureRegister & 1); obj.SendDataToHost(g_dev, (g_len == 0), buffer, featureRegister & 1);
if ((g_len > 0) && (g_reset == false)) { if ((g_len > 0) && (g_reset == false)) {
sendDiskDataEx(featureRegister); sendDiskDataEx(featureRegister);
} else { } else {
@ -643,3 +642,13 @@ module.exports.CreateAmtRemoteIder = function (webserver, meshcentral) {
return obj; return obj;
} }
function ShortToStr(v) { return Buffer.from([(v >> 8) & 0xFF, v & 0xFF]); }
function ShortToStrX(v) { return Buffer.from([v & 0xFF, (v >> 8) & 0xFF]); }
function IntToStr(v) { return Buffer.from([(v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF]); }
function IntToStrX(v) { return Buffer.from([v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF, (v >> 24) & 0xFF]); }
function ReadShort(v, p) { return (v[p] << 8) + v[p + 1]; }
function ReadShortX(v, p) { return (v[p + 1] << 8) + v[p]; }
function ReadInt(v, p) { return (v[p] * 0x1000000) + (v[p + 1] << 16) + (v[p + 2] << 8) + v[p + 3]; } // We use "*0x1000000" instead of "<<24" because the shift converts the number to signed int32.
function ReadSInt(v, p) { return (v[p] << 24) + (v[p + 1] << 16) + (v[p + 2] << 8) + v[p + 3]; }
function ReadIntX(v, p) { return (v[p + 3] * 0x1000000) + (v[p + 2] << 16) + (v[p + 1] << 8) + v[p]; }

View File

@ -127,8 +127,8 @@ module.exports.CreateAmtIderSession = function (parent, db, ws, req, args, domai
if ((command.args.floppyPath != null) && (typeof command.args.floppyPath != 'string')) { command.args.floppyPath = null; } else { command.args.floppyPath = decodeURIComponent(command.args.floppyPath); } if ((command.args.floppyPath != null) && (typeof command.args.floppyPath != 'string')) { command.args.floppyPath = null; } else { command.args.floppyPath = decodeURIComponent(command.args.floppyPath); }
if ((command.args.cdromPath != null) && (typeof command.args.cdromPath != 'string')) { command.args.cdromPath = null; } else { command.args.cdromPath = decodeURIComponent(command.args.cdromPath); } if ((command.args.cdromPath != null) && (typeof command.args.cdromPath != 'string')) { command.args.cdromPath = null; } else { command.args.cdromPath = decodeURIComponent(command.args.cdromPath); }
// TODO: Double check that "." or ".." are not used. // TODO: Double check that "." or ".." are not used.
if ((command.args.floppyPath != null) && (command.args.floppyPath.indexOf("..") >= 0)) { delete command.args.floppyPath; } if ((command.args.floppyPath != null) && (command.args.floppyPath.indexOf('..') >= 0)) { delete command.args.floppyPath; }
if ((command.args.cdromPath != null) && (command.args.cdromPath.indexOf("..") >= 0)) { delete command.args.cdromPath; } if ((command.args.cdromPath != null) && (command.args.cdromPath.indexOf('..') >= 0)) { delete command.args.cdromPath; }
// Get the disk image paths // Get the disk image paths
var domainx = 'domain' + ((domain.id == '') ? '' : ('-' + domain.id)); var domainx = 'domain' + ((domain.id == '') ? '' : ('-' + domain.id));
@ -148,7 +148,7 @@ module.exports.CreateAmtIderSession = function (parent, db, ws, req, args, domai
var iderError = obj.ider.m.diskSetup(floppyPath, cdromPath); var iderError = obj.ider.m.diskSetup(floppyPath, cdromPath);
// Error with the disk images, unable to start IDER // Error with the disk images, unable to start IDER
if (iderError != 0) { try { ws.send(JSON.stringify({ action: "error", code: iderError })); } catch (ex) { } break; } if (iderError != 0) { try { ws.send(JSON.stringify({ action: 'error', code: iderError })); } catch (ex) { } break; }
// Start the IDER session // Start the IDER session
obj.ider.Start(req.query.host, req.query.port, req.query.tls); obj.ider.Start(req.query.host, req.query.port, req.query.tls);

View File

@ -44,10 +44,10 @@ module.exports.CreateAmtRedirect = function (module, domain, user, webserver, me
obj.redirTrace = false; obj.redirTrace = false;
obj.tls1only = 0; // TODO obj.tls1only = 0; // TODO
obj.amtaccumulator = ""; obj.amtaccumulator = '';
obj.amtsequence = 1; obj.amtsequence = 1;
obj.amtkeepalivetimer = null; obj.amtkeepalivetimer = null;
obj.authuri = "/RedirectionService"; obj.authuri = '/RedirectionService';
obj.onStateChanged = null; obj.onStateChanged = null;
obj.forwardclient = null; obj.forwardclient = null;
@ -71,7 +71,7 @@ module.exports.CreateAmtRedirect = function (module, domain, user, webserver, me
const SITERIGHT_LOCKED = 32; const SITERIGHT_LOCKED = 32;
function Debug(lvl) { function Debug(lvl) {
if ((arguments.length < 2) || (lvl > meshcentral.debugLevel)) return; if ((arguments.length < 2) || (meshcentral.debugLevel == null) || (lvl > meshcentral.debugLevel)) return;
var a = []; for (var i = 1; i < arguments.length; i++) { a.push(arguments[i]); } console.log(...a); var a = []; for (var i = 1; i < arguments.length; i++) { a.push(arguments[i]); } console.log(...a);
} }
@ -81,7 +81,7 @@ module.exports.CreateAmtRedirect = function (module, domain, user, webserver, me
var obj = new require('stream').Duplex(options); var obj = new require('stream').Duplex(options);
obj.forwardwrite = null; obj.forwardwrite = null;
obj.updateBuffer = function (chunk) { this.push(chunk); }; obj.updateBuffer = function (chunk) { this.push(chunk); };
obj._write = function (chunk, encoding, callback) { if (obj.forwardwrite != null) { obj.forwardwrite(chunk); } else { console.err("Failed to fwd _write."); } if (callback) callback(); }; // Pass data written to forward obj._write = function (chunk, encoding, callback) { if (obj.forwardwrite != null) { obj.forwardwrite(chunk); } else { console.err('Failed to fwd _write.'); } if (callback) callback(); }; // Pass data written to forward
obj._read = function (size) { }; // Push nothing, anything to read should be pushed from updateBuffer() obj._read = function (size) { }; // Push nothing, anything to read should be pushed from updateBuffer()
return obj; return obj;
} }
@ -478,10 +478,17 @@ module.exports.CreateAmtRedirect = function (module, domain, user, webserver, me
} }
obj.xxSend = function (x) { obj.xxSend = function (x) {
if (obj.redirTrace) { console.log("REDIR-SEND(" + x.length + "): " + Buffer.from(x, "binary").toString('hex'), typeof x); } if (typeof x == 'string') {
//obj.Debug("Send(" + x.length + "): " + webserver.common.rstr2hex(x)); if (obj.redirTrace) { console.log("REDIR-SEND(" + x.length + "): " + Buffer.from(x, 'binary').toString('hex'), typeof x); }
//obj.forwardclient.write(x); // FIXES CIRA //obj.Debug("Send(" + x.length + "): " + webserver.common.rstr2hex(x));
obj.forwardclient.write(Buffer.from(x, "binary")); //obj.forwardclient.write(x); // FIXES CIRA
obj.forwardclient.write(Buffer.from(x, 'binary'));
} else {
if (obj.redirTrace) { console.log("REDIR-SEND(" + x.length + "): " + x.toString('hex'), typeof x); }
//obj.Debug("Send(" + x.length + "): " + webserver.common.rstr2hex(x));
//obj.forwardclient.write(x); // FIXES CIRA
obj.forwardclient.write(x);
}
} }
obj.Send = function (x) { obj.Send = function (x) {
@ -497,7 +504,7 @@ module.exports.CreateAmtRedirect = function (module, domain, user, webserver, me
obj.xxRandomValueHex = function(len) { return obj.crypto.randomBytes(Math.ceil(len / 2)).toString('hex').slice(0, len); } obj.xxRandomValueHex = function(len) { return obj.crypto.randomBytes(Math.ceil(len / 2)).toString('hex').slice(0, len); }
obj.xxOnSocketClosed = function () { obj.xxOnSocketClosed = function () {
if (obj.redirTrace) { console.log("REDIR-CLOSED"); } if (obj.redirTrace) { console.log('REDIR-CLOSED'); }
//obj.Debug("Socket Closed"); //obj.Debug("Socket Closed");
obj.Stop(); obj.Stop();
} }
@ -510,12 +517,12 @@ module.exports.CreateAmtRedirect = function (module, domain, user, webserver, me
} }
obj.Stop = function () { obj.Stop = function () {
if (obj.redirTrace) { console.log("REDIR-CLOSED"); } if (obj.redirTrace) { console.log('REDIR-CLOSED'); }
//obj.Debug("Socket Stopped"); //obj.Debug("Socket Stopped");
obj.xxStateChange(0); obj.xxStateChange(0);
obj.connectstate = -1; obj.connectstate = -1;
obj.amtaccumulator = ""; obj.amtaccumulator = '';
if (obj.forwardclient != null) { try { obj.forwardclient.close(); } catch (ex) { } delete obj.forwardclient; } if (obj.forwardclient != null) { try { obj.forwardclient.destroy(); } catch (ex) { } delete obj.forwardclient; }
if (obj.amtkeepalivetimer != null) { clearInterval(obj.amtkeepalivetimer); delete obj.amtkeepalivetimer; } if (obj.amtkeepalivetimer != null) { clearInterval(obj.amtkeepalivetimer); delete obj.amtkeepalivetimer; }
} }

View File

@ -223,8 +223,7 @@ module.exports.CreateWebRelay = function (parent, db, args, domain) {
// Construct the HTTP request // Construct the HTTP request
var request = req.method + ' ' + req.url + ' HTTP/' + req.httpVersion + '\r\n'; var request = req.method + ' ' + req.url + ' HTTP/' + req.httpVersion + '\r\n';
const blockedHeaders = ['host', 'origin', 'cookie', 'upgrade-insecure-requests', 'sec-ch-ua', 'sec-ch-ua-mobile', 'dnt', 'sec-fetch-user', 'sec-ch-ua-platform', 'sec-fetch-site', 'sec-fetch-mode', 'sec-fetch-dest']; // These are headers we do not forward const blockedHeaders = ['origin', 'cookie', 'upgrade-insecure-requests', 'sec-ch-ua', 'sec-ch-ua-mobile', 'dnt', 'sec-fetch-user', 'sec-ch-ua-platform', 'sec-fetch-site', 'sec-fetch-mode', 'sec-fetch-dest']; // These are headers we do not forward
request += 'host: central.mesh.meshcentral.com\r\n';
for (var i in req.headers) { if (blockedHeaders.indexOf(i) == -1) { request += i + ': ' + req.headers[i] + '\r\n'; } } for (var i in req.headers) { if (blockedHeaders.indexOf(i) == -1) { request += i + ': ' + req.headers[i] + '\r\n'; } }
var cookieStr = ''; var cookieStr = '';
for (var i in parent.webCookies) { if (cookieStr != '') { cookieStr += '; ' } cookieStr += (i + '=' + parent.webCookies[i].value); } for (var i in parent.webCookies) { if (cookieStr != '') { cookieStr += '; ' } cookieStr += (i + '=' + parent.webCookies[i].value); }

View File

@ -1006,7 +1006,13 @@ module.exports.CertificateOperations = function (parent) {
if (r.root == null) { if (r.root == null) {
// If the root certificate does not exist, create one // If the root certificate does not exist, create one
console.log("Generating root certificate..."); console.log("Generating root certificate...");
rootCertAndKey = obj.GenerateRootCertificate(true, 'MeshCentralRoot', null, null, strongCertificate); if (typeof args.rootcertcommonname == 'string') {
// If a root certificate common name is specified, use it.
rootCertAndKey = obj.GenerateRootCertificate(false, args.rootcertcommonname, null, null, strongCertificate);
} else {
// A root certificate common name is not specified, use the default one.
rootCertAndKey = obj.GenerateRootCertificate(true, 'MeshCentralRoot', null, null, strongCertificate);
}
rootCertificate = obj.pki.certificateToPem(rootCertAndKey.cert); rootCertificate = obj.pki.certificateToPem(rootCertAndKey.cert);
rootPrivateKey = obj.pki.privateKeyToPem(rootCertAndKey.key); rootPrivateKey = obj.pki.privateKeyToPem(rootCertAndKey.key);
obj.fs.writeFileSync(parent.getConfigFilePath('root-cert-public.crt'), rootCertificate); obj.fs.writeFileSync(parent.getConfigFilePath('root-cert-public.crt'), rootCertificate);

View File

@ -7,6 +7,6 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Ihr Login-Token lautet: [[[TOKEN]]]</p> <p>Ihr Anmelde-Token lautet: [[[TOKEN]]]</p>
<p>Dieser Token kann nur einmal verwendet werden und ist 5 Minuten gültig.</p> <p>Dieser Token kann nur einmal verwendet werden und ist 5 Minuten gültig.</p>
</div></body></html> </div></body></html>

View File

@ -1,4 +1,4 @@
[[[SERVERNAME]]] - Konto-Login [[[SERVERNAME]]] - Konto-Login
Ihr Login-Token lautet: [[[TOKEN]]] Ihr Anmelde-Token lautet: [[[TOKEN]]]
~ ~
Dieser Token kann nur einmal verwendet werden und ist 5 Minuten gültig. Dieser Token kann nur einmal verwendet werden und ist 5 Minuten gültig.

View File

@ -3,7 +3,7 @@
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agenteninstallation</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agent-Installation</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
@ -15,7 +15,7 @@
<p>Benutzer [[[USERNAME]]] auf dem Server <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> fordert Sie auf, Software zu installieren, um eine Fernsteuerungssitzung zu starten.</p> <p>Benutzer [[[USERNAME]]] auf dem Server <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> fordert Sie auf, Software zu installieren, um eine Fernsteuerungssitzung zu starten.</p>
<area-msg> <area-msg>
<p> <p>
Botschaft: <b notrans="1">[[[MSG]]]</b> Nachricht: <b notrans="1">[[[MSG]]]</b>
</p> </p>
</area-msg> </area-msg>
<area-windows> <area-windows>
@ -28,7 +28,7 @@
</area-osx> </area-osx>
<area-linux> <area-linux>
<p> <p>
Schneiden Sie unter Linux Folgendes aus und fügen Sie es in ein Terminal ein, um den Agenten zu installieren:<br> Schneiden Sie unter Linux Folgendes aus und fügen Sie es in ein Terminal ein, um den Agent zu installieren:<br>
</p><pre style="margin-left:30px" notrans="1">wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh &amp;&amp; chmod 755 ./meshinstall.sh &amp;&amp; sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'</pre> </p><pre style="margin-left:30px" notrans="1">wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh &amp;&amp; chmod 755 ./meshinstall.sh &amp;&amp; sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'</pre>
<p></p> <p></p>
</area-linux> </area-linux>

View File

@ -21,7 +21,7 @@ Nagivieren Sie unter Apple OSX den folgenden Link, um den Vorgang abzuschließen
~ ~
~</area-osx> ~</area-osx>
~<area-linux> ~<area-linux>
Schneiden Sie unter Linux Folgendes aus und fügen Sie es in ein Terminal ein, um den Agenten zu installieren: Schneiden Sie unter Linux Folgendes aus und fügen Sie es in ein Terminal ein, um den Agent zu installieren:
~ ~
~wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] '[[[MESHIDHEX]]]' ~wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] '[[[MESHIDHEX]]]'
~ ~

View File

@ -199,7 +199,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"mongoDumpPath": { "type": "string" }, "mongoDumpPath": { "type": "string" },
"mysqlDumpPath": { "type": "string"}, "mysqlDumpPath": { "type": "string" },
"backupIntervalHours": { "type": "integer" }, "backupIntervalHours": { "type": "integer" },
"keepLastDaysBackup": { "type": "integer" }, "keepLastDaysBackup": { "type": "integer" },
"zipPassword": { "type": "string" }, "zipPassword": { "type": "string" },
@ -250,6 +250,7 @@
} }
} }
}, },
"rootCertCommonName" : { "type": "string", "default": "MeshCentralRoot-XXXXXX", "description": "The common name of the MeshCentral server root certificate. By default it's 'MeshCentralRoot-' followed by the first 6 HEX digits of the public key fingerprint. For this setting to take effect, all generated certificates need to be deleted and reset. Existing agents will not be able to connect anymore." },
"redirects": { "type": "object" }, "redirects": { "type": "object" },
"maxInvalidLogin": { "maxInvalidLogin": {
"type": "object", "type": "object",
@ -615,10 +616,18 @@
"MaxSingleUserSessions": { "type": "integer", "default": null, "description": "Maximum number of sessions a single user can have. Each time a user opens a new browser tab or opens a new browser on a different computer, a new user session is created." } "MaxSingleUserSessions": { "type": "integer", "default": null, "description": "Maximum number of sessions a single user can have. Each time a user opens a new browser tab or opens a new browser on a different computer, a new user session is created." }
} }
}, },
"files": {
"type": "object",
"description": "Values that affect the files feature",
"properties": {
"sftpConnect" : { "type": "boolean", "default": true, "description": "When false, removes the 'SFTP Connect' button from the files tab unless this is the only possible option." }
}
},
"terminal": { "terminal": {
"type": "object", "type": "object",
"description": "Values that affect the terminal feature", "description": "Values that affect the terminal feature",
"properties": { "properties": {
"sshConnect" : { "type": "boolean", "default": true, "description": "When false, removes the 'SSH Connect' button from the terminal tab unless this is the only possible option." },
"linuxShell": { "linuxShell": {
"type": "string", "type": "string",
"enum": [ "any", "root", "user", "login" ], "enum": [ "any", "root", "user", "login" ],
@ -636,7 +645,7 @@
}, },
"desktop": { "desktop": {
"type": "object", "type": "object",
"description": "Values that affect the remote desktop feature", "description": "Values that affect the desktop feature",
"properties": { "properties": {
"viewonly": { "viewonly": {
"type": "boolean", "type": "boolean",

View File

@ -1,6 +1,6 @@
{ {
"name": "meshcentral", "name": "meshcentral",
"version": "1.0.45", "version": "1.0.46",
"keywords": [ "keywords": [
"Remote Device Management", "Remote Device Management",
"Remote Device Monitoring", "Remote Device Monitoring",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -961,6 +961,13 @@
}, },
{ {
"en": ", 16 grays", "en": ", 16 grays",
"cs": ", 16 šedá",
"da": ", 16 grå",
"de": ", 16 Grautöne",
"fi": ", 16 harmaata",
"pt": ", 16 cinza",
"pt-br": ", 16 cinza",
"it": ", 16 grigi",
"fr": ", 16 gris", "fr": ", 16 gris",
"nl": ", 16 grijstinten", "nl": ", 16 grijstinten",
"pl": ", 16 odcieni szarości", "pl": ", 16 odcieni szarości",
@ -971,6 +978,13 @@
}, },
{ {
"en": ", 256 grays", "en": ", 256 grays",
"cs": ", 256 šedá",
"da": ", 256 grå",
"de": ", 256 Grautöne",
"fi": ", 256 harmaata",
"pt": ", 256 cinza",
"pt-br": ", 256 cinza",
"it": ", 256 grigi",
"fr": ", 256 gris", "fr": ", 256 gris",
"nl": ", 256 grijstinten", "nl": ", 256 grijstinten",
"pl": ", 256 odcieni szarości", "pl": ", 256 odcieni szarości",
@ -1112,6 +1126,15 @@
"pl": ", RDP", "pl": ", RDP",
"ru": ", RDP", "ru": ", RDP",
"fr": ", RDP", "fr": ", RDP",
"de": ", RDP",
"de": ", RDP",
"da": ", RDP",
"cs": ", RDP",
"es": ", RDP",
"fi": ", RDP",
"it": ", RDP",
"pt": ", RDP",
"pt-br": ", RDP",
"xloc": [ "xloc": [
"default.handlebars->45->1244" "default.handlebars->45->1244"
] ]
@ -1191,10 +1214,18 @@
}, },
{ {
"en": ", SFTP", "en": ", SFTP",
"cs": ", SFTP",
"es": ", SFTP",
"da": ", SFTP",
"de": ", SFTP",
"fr": ", SFTP",
"fi": ", SFTP",
"it": ", SFTP",
"nl": ", SFTP", "nl": ", SFTP",
"pl": ", SFTP", "pl": ", SFTP",
"pt": ", SFTP",
"pt-br": ", SFTP",
"ru": ", SFTP", "ru": ", SFTP",
"fr": ", SFTP",
"xloc": [ "xloc": [
"default-mobile.handlebars->11->468", "default-mobile.handlebars->11->468",
"default.handlebars->45->1352" "default.handlebars->45->1352"
@ -1206,6 +1237,14 @@
"pl": ", SSH", "pl": ", SSH",
"ru": ", SSH", "ru": ", SSH",
"fr": ", SSH", "fr": ", SSH",
"de": ", SSH",
"da": ", SSH",
"cs": ", SSH",
"es": ", SSH",
"fi": ", SSH",
"it": ", SSH",
"pt": ", SSH",
"pt-br": ", SSH",
"xloc": [ "xloc": [
"default.handlebars->45->1320" "default.handlebars->45->1320"
] ]
@ -2540,6 +2579,7 @@
{ {
"cs": "1024×768", "cs": "1024×768",
"da": "1024×768", "da": "1024×768",
"de": "1024×768",
"en": "1024x768", "en": "1024x768",
"es": "1024×768", "es": "1024×768",
"fi": "1024×768", "fi": "1024×768",
@ -2560,6 +2600,7 @@
{ {
"cs": "1024×768", "cs": "1024×768",
"da": "1024×768", "da": "1024×768",
"de": "1024×768",
"en": "1024×768", "en": "1024×768",
"es": "1024×768", "es": "1024×768",
"fi": "1024×768", "fi": "1024×768",
@ -2699,6 +2740,7 @@
{ {
"cs": "1280x800", "cs": "1280x800",
"da": "1280x800", "da": "1280x800",
"de": "1280×800",
"en": "1280×800", "en": "1280×800",
"es": "1280x800", "es": "1280x800",
"fi": "1280x800", "fi": "1280x800",
@ -2719,6 +2761,7 @@
{ {
"cs": "1440x900", "cs": "1440x900",
"da": "1440x900", "da": "1440x900",
"de": "1440x900",
"en": "1440x900", "en": "1440x900",
"es": "1440x900", "es": "1440x900",
"fi": "1440x900", "fi": "1440x900",
@ -2739,6 +2782,7 @@
{ {
"cs": "1440x900", "cs": "1440x900",
"da": "1440x900", "da": "1440x900",
"de": "1440x900",
"en": "1440×900", "en": "1440×900",
"es": "1440x900", "es": "1440x900",
"fi": "1440x900", "fi": "1440x900",
@ -2811,6 +2855,7 @@
{ {
"cs": "1600x900", "cs": "1600x900",
"da": "1600x900", "da": "1600x900",
"de": "1600x900",
"en": "1600x900", "en": "1600x900",
"es": "1600x900", "es": "1600x900",
"fi": "1600x900", "fi": "1600x900",
@ -2831,6 +2876,7 @@
{ {
"cs": "1600x900", "cs": "1600x900",
"da": "1600x900", "da": "1600x900",
"de": "1600x900",
"en": "1600×900", "en": "1600×900",
"es": "1600x900", "es": "1600x900",
"fi": "1600x900", "fi": "1600x900",
@ -2851,6 +2897,7 @@
{ {
"cs": "1680x1050", "cs": "1680x1050",
"da": "1680x1050", "da": "1680x1050",
"de": "1600x1050",
"en": "1680x1050", "en": "1680x1050",
"es": "1680x1050", "es": "1680x1050",
"fi": "1680x1050", "fi": "1680x1050",
@ -2871,6 +2918,7 @@
{ {
"cs": "1680x1050", "cs": "1680x1050",
"da": "1680x1050", "da": "1680x1050",
"de": "1600x1050",
"en": "1680×1050", "en": "1680×1050",
"es": "1680x1050", "es": "1680x1050",
"fi": "1680x1050", "fi": "1680x1050",
@ -2891,6 +2939,7 @@
{ {
"cs": "1920x1080", "cs": "1920x1080",
"da": "1920x1080", "da": "1920x1080",
"de": "1920x1080",
"en": "1920x1080", "en": "1920x1080",
"es": "1920x1080", "es": "1920x1080",
"fi": "1920x1080", "fi": "1920x1080",
@ -2911,6 +2960,7 @@
{ {
"cs": "1920x1080", "cs": "1920x1080",
"da": "1920x1080", "da": "1920x1080",
"de": "1920x1080",
"en": "1920×1080", "en": "1920×1080",
"es": "1920x1080", "es": "1920x1080",
"fi": "1920x1080", "fi": "1920x1080",
@ -4015,6 +4065,7 @@
{ {
"cs": "640x480", "cs": "640x480",
"da": "640x480", "da": "640x480",
"de": "640x480",
"en": "640x480", "en": "640x480",
"es": "640x480", "es": "640x480",
"fi": "640x480", "fi": "640x480",
@ -4035,6 +4086,7 @@
{ {
"cs": "640x480", "cs": "640x480",
"da": "640x480", "da": "640x480",
"de": "640x480",
"en": "640×480", "en": "640×480",
"es": "640x480", "es": "640x480",
"fi": "640x480", "fi": "640x480",
@ -4174,7 +4226,13 @@
}, },
{ {
"en": "7 days", "en": "7 days",
"da": "7 Dages",
"de": "7 Tage",
"cs": "7 dní",
"es": "7 días",
"nl": "7 dagen", "nl": "7 dagen",
"fi": "7 päivääs",
"it": "7 giorni",
"pl": "7 dni", "pl": "7 dni",
"pt-br": "7 dias", "pt-br": "7 dias",
"ru": "7 дней", "ru": "7 дней",
@ -28180,6 +28238,7 @@
{ {
"en": "Gateway: {0}", "en": "Gateway: {0}",
"nl": "Gateway: {0}", "nl": "Gateway: {0}",
"pl": "Brama: {0}",
"xloc": [ "xloc": [
"default-mobile.handlebars->11->556", "default-mobile.handlebars->11->556",
"default.handlebars->45->1453" "default.handlebars->45->1453"
@ -29326,6 +29385,7 @@
"de": "HTTP Verbindung", "de": "HTTP Verbindung",
"en": "HTTP Connection", "en": "HTTP Connection",
"nl": "HTTP verbinding", "nl": "HTTP verbinding",
"pl": "Połączenie HTTP",
"xloc": [ "xloc": [
"default.handlebars->45->750" "default.handlebars->45->750"
] ]
@ -29333,6 +29393,7 @@
{ {
"en": "HTTP remote connection port:", "en": "HTTP remote connection port:",
"nl": "HTTP poort voor externe verbinding:", "nl": "HTTP poort voor externe verbinding:",
"pl": "HTTP zdalny port połączenia:",
"xloc": [ "xloc": [
"default.handlebars->45->749" "default.handlebars->45->749"
] ]
@ -29366,6 +29427,7 @@
"de": "HTTPS Verbindung", "de": "HTTPS Verbindung",
"en": "HTTPS Connection", "en": "HTTPS Connection",
"nl": "HTTPS verbinding", "nl": "HTTPS verbinding",
"pl": "Połączenie HTTPS",
"xloc": [ "xloc": [
"default.handlebars->45->752" "default.handlebars->45->752"
] ]
@ -29373,6 +29435,7 @@
{ {
"en": "HTTPS remote connection port:", "en": "HTTPS remote connection port:",
"nl": "HTTPS poort voor externe verbinding:", "nl": "HTTPS poort voor externe verbinding:",
"pl": "HTTPS zdalny port połączenia:",
"xloc": [ "xloc": [
"default.handlebars->45->751" "default.handlebars->45->751"
] ]
@ -32751,16 +32814,36 @@
}, },
{ {
"en": "Intel&reg;AMT", "en": "Intel&reg;AMT",
"cs": "Intel&reg;AMT",
"da": "Intel&reg;AMT",
"de": "Intel&reg;AMT",
"nl": "Intel&reg;AMT", "nl": "Intel&reg;AMT",
"pl": "Intel&reg;AMT", "pl": "Intel&reg;AMT",
"es": "Intel&reg;AMT",
"fi": "Intel&reg;AMT",
"fr": "Intel&reg;AMT",
"it": "Intel&reg;AMT",
"pt-br": "Intel&reg;AMT",
"ru": "Intel&reg;AMT",
"tr": "Intel&reg;AMT",
"xloc": [ "xloc": [
"default.handlebars->45->965" "default.handlebars->45->965"
] ]
}, },
{ {
"en": "Intel&reg;SM", "en": "Intel&reg;SM",
"cs": "Intel&reg;SM",
"da": "Intel&reg;SM",
"de": "Intel&reg;SM",
"nl": "Intel&reg;SM", "nl": "Intel&reg;SM",
"pl": "Intel&reg;SM", "pl": "Intel&reg;SM",
"es": "Intel&reg;SM",
"fi": "Intel&reg;SM",
"fr": "Intel&reg;SM",
"it": "Intel&reg;SM",
"pt-br": "Intel&reg;SM",
"ru": "Intel&reg;SM",
"tr": "Intel&reg;SM",
"xloc": [ "xloc": [
"default.handlebars->45->963" "default.handlebars->45->963"
] ]
@ -39186,6 +39269,7 @@
{ {
"en": "Mask: {0}", "en": "Mask: {0}",
"nl": "Mask: {0}", "nl": "Mask: {0}",
"pl": "Maska: {0}",
"xloc": [ "xloc": [
"default-mobile.handlebars->11->555", "default-mobile.handlebars->11->555",
"default.handlebars->45->1452" "default.handlebars->45->1452"
@ -45629,11 +45713,16 @@
}, },
{ {
"de": "Optionen", "de": "Optionen",
"da": "Muligheder",
"en": "Options", "en": "Options",
"es": "Opciones",
"cs": "Možnosti",
"it": "Opzioni",
"nl": "Opties", "nl": "Opties",
"pl": "Opcje", "pl": "Opcje",
"ru": "Опции", "ru": "Опции",
"fr": "Options", "fr": "Options",
"fi": "Vaihtoehdot",
"xloc": [ "xloc": [
"default.handlebars->container->dialog->dialogBody->dialog7->d7rdpkvm->5->1" "default.handlebars->container->dialog->dialogBody->dialog7->d7rdpkvm->5->1"
] ]
@ -70839,6 +70928,7 @@
"de": "X", "de": "X",
"en": "X", "en": "X",
"es": "X", "es": "X",
"fi": "X",
"fr": "X", "fr": "X",
"it": "X", "it": "X",
"ja": "バツ", "ja": "バツ",
@ -74690,6 +74780,7 @@
"ja": "{0}分", "ja": "{0}分",
"nl": "{0} minuut", "nl": "{0} minuut",
"pl": "{0} minuta", "pl": "{0} minuta",
"pt": "{0} minuto",
"pt-br": "{0} minuto", "pt-br": "{0} minuto",
"ru": "{0} минута", "ru": "{0} минута",
"tr": "{0} dakika", "tr": "{0} dakika",
@ -74710,6 +74801,7 @@
"ja": "{0}分", "ja": "{0}分",
"nl": "{0} minuten", "nl": "{0} minuten",
"pl": "{0} minut", "pl": "{0} minut",
"pt": "{0} minutos",
"pt-br": "{0} minutos", "pt-br": "{0} minutos",
"ru": "{0} минут", "ru": "{0} минут",
"tr": "{0} dakika", "tr": "{0} dakika",

View File

@ -9726,7 +9726,7 @@
// Show the right buttons // Show the right buttons
QV('disconnectbutton2span', (termState == true)); QV('disconnectbutton2span', (termState == true));
QV('connectbutton2span', (termState == false) && (terminalNode.agent != null) && (terminalNode.agent.caps & 2) && (terminalNode.mtype != 3)); QV('connectbutton2span', (termState == false) && (terminalNode.agent != null) && (terminalNode.agent.caps & 2) && (terminalNode.mtype != 3));
QV('connectbutton2sspan', (features2 & 0x00000200) && (termState == false) && (terminalNode.agent != null) && (terminalNode.agent.caps & 2) && (terminalNode.agent.id != 3) && (terminalNode.agent.id != 4)); QV('connectbutton2sspan', (features2 & 0x00000200) && (termState == false) && (terminalNode.agent != null) && (terminalNode.agent.caps & 2) && (terminalNode.agent.id != 3) && (terminalNode.agent.id != 4) && ((features2 & 0x1000000) == 0));
if (terminalNode.mtype == 1) { if (terminalNode.mtype == 1) {
QV('connectbutton2hspan', (termState == false) && (terminalNode.intelamt != null) && (terminalNode.intelamt.state == 2)); QV('connectbutton2hspan', (termState == false) && (terminalNode.intelamt != null) && (terminalNode.intelamt.state == 2));
QV('terminalSizeDropDown', (termState == false) && (terminalNode.intelamt != null) && (terminalNode.intelamt.state == 2)); QV('terminalSizeDropDown', (termState == false) && (terminalNode.intelamt != null) && (terminalNode.intelamt.state == 2));
@ -10160,7 +10160,7 @@
QE('p13Connect', online); QE('p13Connect', online);
QE('p13Connects', online); QE('p13Connects', online);
QV('p13Connect', (files == null) && (filesNode.mtype == 2)); QV('p13Connect', (files == null) && (filesNode.mtype == 2));
QV('p13Connects', (files == null) && (filesNode.agent != null) && (filesNode.agent.id != 3) && (filesNode.agent.id != 4)); QV('p13Connects', (features2 & 0x200) && (files == null) && (filesNode.agent != null) && (filesNode.agent.id != 3) && (filesNode.agent.id != 4) && ((features2 & 0x800000) == 0));
QV('p13Disconnect', files != null); QV('p13Disconnect', files != null);
if (((samenode == false) || (online == false)) && files) { files.Stop(); files = null; } if (((samenode == false) || (online == false)) && files) { files.Stop(); files = null; }
p13setActions(); p13setActions();

View File

@ -2864,7 +2864,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
webstate: encodeURIComponent(webstate).replace(/'/g, '%27'), webstate: encodeURIComponent(webstate).replace(/'/g, '%27'),
amtscanoptions: amtscanoptions, amtscanoptions: amtscanoptions,
pluginHandler: (parent.pluginHandler == null) ? 'null' : parent.pluginHandler.prepExports(), pluginHandler: (parent.pluginHandler == null) ? 'null' : parent.pluginHandler.prepExports(),
webRelayPort: ((typeof args.relaydns == 'string') ? args.port : ((parent.webrelayserver != null) ? ((typeof args.relayaliasport == 'number') ? args.relayaliasport : parent.webrelayserver.port) : 0)), webRelayPort: ((typeof args.relaydns == 'string') ? ((typeof args.aliasport == 'number') ? args.aliasport : args.port) : ((parent.webrelayserver != null) ? ((typeof args.relayaliasport == 'number') ? args.relayaliasport : parent.webrelayserver.port) : 0)),
webRelayDns: ((typeof args.relaydns == 'string') ? args.relaydns : '') webRelayDns: ((typeof args.relaydns == 'string') ? args.relaydns : '')
}, dbGetFunc.req, domain), user); }, dbGetFunc.req, domain), user);
} }
@ -2972,11 +2972,13 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
if (domain.devicesearchbarserverandclientname) { features2 += 0x00008000; } // Search bar will find both server name and client name if (domain.devicesearchbarserverandclientname) { features2 += 0x00008000; } // Search bar will find both server name and client name
if (domain.ipkvm) { features2 += 0x00010000; } // Indicates support for IP KVM device groups if (domain.ipkvm) { features2 += 0x00010000; } // Indicates support for IP KVM device groups
if ((domain.passwordrequirements) && (domain.passwordrequirements.otp2factor == false)) { features2 += 0x00020000; } // Indicates support for OTP 2FA is disabled if ((domain.passwordrequirements) && (domain.passwordrequirements.otp2factor == false)) { features2 += 0x00020000; } // Indicates support for OTP 2FA is disabled
if ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.backupcode2factor === false)) { features2 += 0x00040000; } // Indicates 2FA backup codes are disabled if ((typeof domain.passwordrequirements == 'object') && (domain.passwordrequirements.backupcode2factor === false)) { features2 += 0x00040000; } // Indicates 2FA backup codes are disabled
if ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.single2factorwarning === false)) { features2 += 0x00080000; } // Indicates no warning if a single 2FA is in use if ((typeof domain.passwordrequirements == 'object') && (domain.passwordrequirements.single2factorwarning === false)) { features2 += 0x00080000; } // Indicates no warning if a single 2FA is in use
if (domain.nightmode === 1) { features2 += 0x00100000; } // Always night mode if (domain.nightmode === 1) { features2 += 0x00100000; } // Always night mode
if (domain.nightmode === 2) { features2 += 0x00200000; } // Always day mode if (domain.nightmode === 2) { features2 += 0x00200000; } // Always day mode
if (domain.allowsavingdevicecredentials == false) { features2 += 0x00400000; } // Do not allow device credentials to be saved on the server if (domain.allowsavingdevicecredentials == false) { features2 += 0x00400000; } // Do not allow device credentials to be saved on the server
if ((typeof domain.files == 'object') && (domain.files.sftpconnect === false)) { features2 += 0x00800000; } // Remove the "SFTP Connect" button in the "Files" tab when the device is agent managed
if ((typeof domain.terminal == 'object') && (domain.terminal.sshconnect === false)) { features2 += 0x01000000; } // Remove the "SSH Connect" button in the "Terminal" tab when the device is agent managed
return { features: features, features2: features2 }; return { features: features, features2: features2 };
} }