mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	1. Updated merge with previous commit
2. Fixed bug in getCommand()
This commit is contained in:
		
							parent
							
								
									521603053b
								
							
						
					
					
						commit
						4858740894
					
				
					 1 changed files with 89 additions and 43 deletions
				
			
		| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2018-2020 Intel Corporation
 | 
			
		||||
Copyright 2018-2021 Intel Corporation
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +108,7 @@ function amt_heci()
 | 
			
		|||
    
 | 
			
		||||
    function trim(x) { var y = x.indexOf('\0'); if (y >= 0) { return x.substring(0, y); } else { return x; } }
 | 
			
		||||
    this.getCommand = function getCommand(chunk) {
 | 
			
		||||
        var command = chunk.length == 0 ? (this._rq.peekQueue().cmd | 0x800000) : chunk.readUInt32LE(4);
 | 
			
		||||
        var command = chunk.length == 0 ? (g_internal._rq.peekQueue().cmd | 0x800000) : chunk.readUInt32LE(4);
 | 
			
		||||
        var ret = { IsResponse: (command & 0x800000) == 0x800000 ? true : false, Command: (command & 0x7FFFFF), Status: chunk.length != 0 ? chunk.readUInt32LE(12) : -1, Data: chunk.length != 0 ? chunk.slice(16) : null };
 | 
			
		||||
        return (ret);
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -332,34 +332,27 @@ function amt_heci()
 | 
			
		|||
    this.getLocalSystemAccount = function getLocalSystemAccount(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(103, Buffer.alloc(40), function (header, fn, opt)
 | 
			
		||||
        {
 | 
			
		||||
            if (header.Status == 0 && header.Data.length == 68)
 | 
			
		||||
            {
 | 
			
		||||
        this.sendCommand(103, Buffer.alloc(40), function (header, fn, opt) {
 | 
			
		||||
            if (header.Status == 0 && header.Data.length == 68) {
 | 
			
		||||
                opt.unshift({ user: trim(header.Data.slice(0, 33).toString()), pass: trim(header.Data.slice(33, 67).toString()), raw: header.Data });
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
            else {
 | 
			
		||||
                opt.unshift(null);
 | 
			
		||||
            }
 | 
			
		||||
            fn.apply(this, opt);
 | 
			
		||||
        }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.getLanInterfaceSettings = function getLanInterfaceSettings(index, callback)
 | 
			
		||||
    {
 | 
			
		||||
    this.getLanInterfaceSettings = function getLanInterfaceSettings(index, callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        var ifx = Buffer.alloc(4);
 | 
			
		||||
        ifx.writeUInt32LE(index);
 | 
			
		||||
        this.sendCommand(0x48, ifx, function onGetLanInterfaceSettings(header, fn, opt)
 | 
			
		||||
        {
 | 
			
		||||
            if(header.Status == 0)
 | 
			
		||||
            {
 | 
			
		||||
        this.sendCommand(0x48, ifx, function onGetLanInterfaceSettings(header, fn, opt) {
 | 
			
		||||
            if (header.Status == 0) {
 | 
			
		||||
                var info = {};
 | 
			
		||||
                info.enabled = header.Data.readUInt32LE(0);
 | 
			
		||||
                info.dhcpEnabled = header.Data.readUInt32LE(8);
 | 
			
		||||
                switch(header.Data[12])
 | 
			
		||||
                {
 | 
			
		||||
                switch (header.Data[12]) {
 | 
			
		||||
                    case 1:
 | 
			
		||||
                        info.dhcpMode = 'ACTIVE'
 | 
			
		||||
                        break;
 | 
			
		||||
| 
						 | 
				
			
			@ -371,14 +364,13 @@ function amt_heci()
 | 
			
		|||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                info.mac = header.Data.slice(14).toString('hex:');
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                var addr = header.Data.readUInt32LE(4);
 | 
			
		||||
                info.address = ((addr >> 24) & 255) + '.' + ((addr >> 16) & 255) + '.' + ((addr >> 8) & 255) + '.' + (addr & 255);
 | 
			
		||||
                opt.unshift(info);
 | 
			
		||||
                fn.apply(this, opt);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
            else {
 | 
			
		||||
                opt.unshift(null);
 | 
			
		||||
                fn.apply(this, opt);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -395,32 +387,32 @@ function amt_heci()
 | 
			
		|||
            fn.apply(this, opt);
 | 
			
		||||
        }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.startConfiguration = function startConfiguration() {
 | 
			
		||||
    this.startConfiguration = function startConfiguration(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x29, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x29, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.stopConfiguration = function stopConfiguration() {
 | 
			
		||||
    this.stopConfiguration = function stopConfiguration(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x5E, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x5E, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.openUserInitiatedConnection = function openUserInitiatedConnection() {
 | 
			
		||||
    this.openUserInitiatedConnection = function openUserInitiatedConnection(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x44, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x44, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.closeUserInitiatedConnection = function closeUnserInitiatedConnected() {
 | 
			
		||||
    this.closeUserInitiatedConnection = function closeUnserInitiatedConnected(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x45, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x45, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.getRemoteAccessConnectionStatus = function getRemoteAccessConnectionStatus() {
 | 
			
		||||
    this.getRemoteAccessConnectionStatus = function getRemoteAccessConnectionStatus(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x46, data, function (header, fn, opt) {
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
        this.sendCommand(0x46, null, function (header, fn, opt) {
 | 
			
		||||
            if (header.Status == 0) {
 | 
			
		||||
                var hostname = v.slice(14, header.Data.readUInt16LE(12) + 14).toString()
 | 
			
		||||
                var hostname = header.Data.slice(14, header.Data.readUInt16LE(12) + 14).toString()
 | 
			
		||||
                opt.unshift({ status: header.Status, networkStatus: header.Data.readUInt32LE(0), remoteAccessStatus: header.Data.readUInt32LE(4), remoteAccessTrigger: header.Data.readUInt32LE(8), mpsHostname: hostname, raw: header.Data });
 | 
			
		||||
            } else {
 | 
			
		||||
                opt.unshift({ status: header.Status });
 | 
			
		||||
| 
						 | 
				
			
			@ -428,27 +420,81 @@ function amt_heci()
 | 
			
		|||
            fn.apply(this, opt);
 | 
			
		||||
        }, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.getProtocolVersion = function getProtocolVersion(callback)
 | 
			
		||||
    {
 | 
			
		||||
    this.getProtocolVersion = function getProtocolVersion(callback) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 1; i < arguments.length; ++i) { opt.push(arguments[i]); }
 | 
			
		||||
 | 
			
		||||
        if (!this._tmpSession) { this._tmpSession = heci.create(); this._tmpSession.parent = this;}
 | 
			
		||||
        this._tmpSession.doIoctl(heci.IOCTL.HECI_VERSION, Buffer.alloc(5), Buffer.alloc(5), function (status, buffer, self, fn, opt)
 | 
			
		||||
        {
 | 
			
		||||
        if (!this._tmpSession) { this._tmpSession = heci.create(); this._tmpSession.parent = this; }
 | 
			
		||||
        this._tmpSession.doIoctl(heci.IOCTL.HECI_VERSION, Buffer.alloc(5), Buffer.alloc(5), function (status, buffer, self, fn, opt) {
 | 
			
		||||
            if (status == 0) {
 | 
			
		||||
                var result = buffer.readUInt8(0).toString() + '.' + buffer.readUInt8(1).toString() + '.' + buffer.readUInt8(2).toString() + '.' + buffer.readUInt16BE(3).toString();
 | 
			
		||||
                opt.unshift(result);
 | 
			
		||||
                fn.apply(self, opt);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
            else {
 | 
			
		||||
                opt.unshift(null);
 | 
			
		||||
                fn.apply(self, opt);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }, this, callback, optional);
 | 
			
		||||
    }
 | 
			
		||||
    this.startConfigurationHBased = function startConfigurationHBased(certHash, hostVpn, dnsSuffixList, func) {
 | 
			
		||||
        if ((certHash == null) || ((certHash.length != 32) && (certHash.length != 48))) { func({ status: -101 }); }
 | 
			
		||||
        this.stopConfiguration(function (status) {
 | 
			
		||||
            if (status == 0) {
 | 
			
		||||
                // We stopped the configuration, wait 20 seconds before starting up again.
 | 
			
		||||
                var f = function tf() { delete tf.parent.xtimeout; tf.parent.startConfigurationHBasedEx(certHash, hostVpn, dnsSuffixList, func); }
 | 
			
		||||
                f.parent = this;
 | 
			
		||||
                this.xtimeout = setTimeout(f, 20000);
 | 
			
		||||
            } else {
 | 
			
		||||
                // We are not in the connect mode, this is good, start configuration right away.
 | 
			
		||||
                this.startConfigurationHBasedEx(certHash, hostVpn, dnsSuffixList, func);
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
    this.startConfigurationHBasedEx = function startConfigurationHBased(certHash, hostVpn, dnsSuffixList, func) {
 | 
			
		||||
        var optional = [];
 | 
			
		||||
        for (var i = 4; i < arguments.length; ++i) { optional.push(arguments[i]); }
 | 
			
		||||
 | 
			
		||||
        // Format the command
 | 
			
		||||
        var data = Buffer.alloc(4 + 64 + 4 + 4 + 320);
 | 
			
		||||
        data.writeUInt32LE((certHash.length == 48) ? 3 : 2, 0); // Write certificate hash type: SHA256 = 2, SHA384 = 3
 | 
			
		||||
        certHash.copy(data, 4); // Write the hash
 | 
			
		||||
        data.writeUInt32LE(hostVpn ? 1 : 0, 68); // Write is HostVPN is enabled
 | 
			
		||||
        if (dnsSuffixList != null) {
 | 
			
		||||
            data.writeUInt32LE(dnsSuffixList.length, 72); // Write the number of DNS Suffix, from 0 to 4
 | 
			
		||||
            var ptr = 76;
 | 
			
		||||
            for (var i = 0; i < dnsSuffixList.length; i++) { ptr += data.write(dnsSuffixList[i], ptr) + 1; } // Write up to 4 DNS Suffix with null seperation.
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Send the command
 | 
			
		||||
        this.sendCommand(139, data, function (header, fn, opt) {
 | 
			
		||||
            if (header.Status == 0) {
 | 
			
		||||
                var amtHash = null;
 | 
			
		||||
                if (header.Data[0] == 2) { amtHash = header.Data.slice(1, 33); } // SHA256
 | 
			
		||||
                if (header.Data[0] == 3) { amtHash = header.Data.slice(1, 49); } // SHA384
 | 
			
		||||
                opt.unshift({ status: header.Status, hash: amtHash.toString('hex') });
 | 
			
		||||
            } else {
 | 
			
		||||
                opt.unshift({ status: header.Status });
 | 
			
		||||
            }
 | 
			
		||||
            fn.apply(this, opt);
 | 
			
		||||
        }, func, optional);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = amt_heci;
 | 
			
		||||
module.exports = amt_heci;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
AMT_STATUS_SUCCESS = 0,
 | 
			
		||||
AMT_STATUS_INTERNAL_ERROR = 1,
 | 
			
		||||
AMT_STATUS_INVALID_AMT_MODE = 3,
 | 
			
		||||
AMT_STATUS_INVALID_MESSAGE_LENGTH = 4,
 | 
			
		||||
AMT_STATUS_MAX_LIMIT_REACHED = 23,
 | 
			
		||||
AMT_STATUS_INVALID_PARAMETER = 36,
 | 
			
		||||
AMT_STATUS_RNG_GENERATION_IN_PROGRESS = 47,
 | 
			
		||||
AMT_STATUS_RNG_NOT_READY = 48,
 | 
			
		||||
AMT_STATUS_CERTIFICATE_NOT_READY = 49,
 | 
			
		||||
AMT_STATUS_INVALID_HANDLE = 2053
 | 
			
		||||
AMT_STATUS_NOT_FOUND = 2068,
 | 
			
		||||
*/
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue