mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2025-03-09 15:40:18 +00:00
Completed SSH file transfer.
This commit is contained in:
parent
ded4d61f85
commit
6f67c94d01
3 changed files with 85 additions and 8 deletions
76
apprelays.js
76
apprelays.js
|
@ -823,7 +823,6 @@ module.exports.CreateSshFilesRelay = function (parent, db, ws, req, domain, user
|
|||
obj.uploadHandle = handle;
|
||||
try { obj.ws.send(Buffer.from(JSON.stringify({ action: 'uploadstart', reqid: obj.uploadReqid }))) } catch (ex) { }
|
||||
}
|
||||
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
@ -854,6 +853,52 @@ module.exports.CreateSshFilesRelay = function (parent, db, ws, req, domain, user
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 'download': {
|
||||
if (obj.sftp == null) return;
|
||||
switch (msg.sub) {
|
||||
case 'start': {
|
||||
var requestedPath = msg.path;
|
||||
if (requestedPath.startsWith('/') == false) { requestedPath = '/' + requestedPath; }
|
||||
obj.downloadFullpath = requestedPath;
|
||||
obj.downloadId = msg.id;
|
||||
obj.downloadPosition = 0;
|
||||
obj.downloadBuffer = Buffer.alloc(16384);
|
||||
obj.sftp.open(obj.downloadFullpath, 'r', function (err, handle) {
|
||||
if (err != null) {
|
||||
try { obj.ws.send(Buffer.from(JSON.stringify({ action: 'download', sub: 'cancel', id: obj.downloadId }))) } catch (ex) { }
|
||||
} else {
|
||||
obj.downloadHandle = handle;
|
||||
// MeshServerLogEx((cmd.ask == 'coredump') ? 104 : 49, [cmd.path], 'Download: \"' + cmd.path + '\"', this.httprequest);
|
||||
try { obj.ws.send(JSON.stringify({ action: 'download', sub: 'start', id: obj.downloadId })) } catch (ex) { }
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'startack': {
|
||||
if ((obj.downloadHandle == null) || (obj.downloadId != msg.id)) break;
|
||||
obj.downloadPendingBlockCount = (typeof msg.ack == 'number') ? msg.ack : 8;
|
||||
uploadNextBlock();
|
||||
break;
|
||||
}
|
||||
case 'ack': {
|
||||
if ((obj.downloadHandle == null) || (obj.downloadId != msg.id)) break;
|
||||
if (obj.downloadPendingBlockCount == 0) { obj.downloadPendingBlockCount = 1; uploadNextBlock(); }
|
||||
break;
|
||||
}
|
||||
case 'stop': {
|
||||
if ((obj.downloadHandle == null) || (obj.downloadId != msg.id)) break;
|
||||
if (obj.downloadHandle != null) { obj.sftp.close(obj.downloadHandle, function () { }); }
|
||||
delete obj.downloadId;
|
||||
delete obj.downloadBuffer;
|
||||
delete obj.downloadHandle;
|
||||
delete obj.downloadFullpath;
|
||||
delete obj.downloadPosition;
|
||||
delete obj.downloadPendingBlockCount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'sshauth': {
|
||||
if (obj.sshClient != null) return;
|
||||
|
||||
|
@ -876,6 +921,35 @@ module.exports.CreateSshFilesRelay = function (parent, db, ws, req, domain, user
|
|||
} catch (ex) { console.log(ex); obj.close(); }
|
||||
});
|
||||
|
||||
function uploadNextBlock() {
|
||||
if (obj.downloadBuffer == null) return;
|
||||
obj.sftp.read(obj.downloadHandle, obj.downloadBuffer, 4, obj.downloadBuffer.length - 4, obj.downloadPosition, function (err, len, buf) {
|
||||
obj.downloadPendingBlockCount--;
|
||||
if (obj.downloadBuffer == null) return;
|
||||
if (err != null) {
|
||||
try { obj.ws.send(Buffer.from(JSON.stringify({ action: 'download', sub: 'cancel', id: obj.downloadId }))) } catch (ex) { }
|
||||
} else {
|
||||
obj.downloadPosition += len;
|
||||
if (len < (obj.downloadBuffer.length - 4)) {
|
||||
obj.downloadBuffer.writeInt32BE(0x01000001, 0)
|
||||
if (len > 0) { try { obj.ws.send(obj.downloadBuffer.slice(0, len + 4)); } catch (ex) { console.log(ex); } }
|
||||
} else {
|
||||
obj.downloadBuffer.writeInt32BE(0x01000000, 0);
|
||||
try { obj.ws.send(obj.downloadBuffer.slice(0, len + 4)); } catch (ex) { console.log(ex); }
|
||||
if (obj.downloadPendingBlockCount > 0) { uploadNextBlock(); }
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (obj.downloadHandle != null) { obj.sftp.close(obj.downloadHandle, function () { }); }
|
||||
delete obj.downloadId;
|
||||
delete obj.downloadBuffer;
|
||||
delete obj.downloadHandle;
|
||||
delete obj.downloadFullpath;
|
||||
delete obj.downloadPosition;
|
||||
delete obj.downloadPendingBlockCount;
|
||||
});
|
||||
}
|
||||
|
||||
// If error, do nothing
|
||||
ws.on('error', function (err) { parent.parent.debug('relay', 'SSH: Browser websocket error: ' + err); obj.close(); });
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue