mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-17 16:53:13 +00:00
Updated user-sessions on MacOS to support getHomeFolder and getUsername
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -224,7 +224,7 @@ if (process.platform == 'darwin')
|
|||||||
function macos_messageBox()
|
function macos_messageBox()
|
||||||
{
|
{
|
||||||
this._ObjectID = 'message-box';
|
this._ObjectID = 'message-box';
|
||||||
this._initMessageServer = function _initMessageServer()
|
this._initIPCBase = function _initIPCBase()
|
||||||
{
|
{
|
||||||
var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; });
|
var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; });
|
||||||
|
|
||||||
@@ -232,73 +232,49 @@ function macos_messageBox()
|
|||||||
{
|
{
|
||||||
ret.uid = require('user-sessions').consoleUid();
|
ret.uid = require('user-sessions').consoleUid();
|
||||||
}
|
}
|
||||||
catch(e)
|
catch (e)
|
||||||
{
|
{
|
||||||
ret._rej(e);
|
ret._rej(e);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.ipcpath = '/var/tmp/' + process.execPath.split('/').pop() + '_ev';
|
ret.path = '/var/tmp/' + process.execPath.split('/').pop() + '_ev';
|
||||||
var n;
|
var n;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
n = require('tls').generateRandomInteger('1', '99999');
|
n = require('tls').generateRandomInteger('1', '99999');
|
||||||
}
|
}
|
||||||
catch(e)
|
catch (e)
|
||||||
{
|
{
|
||||||
n = 0;
|
n = 0;
|
||||||
}
|
}
|
||||||
while (require('fs').existsSync(ret.ipcpath + n))
|
while (require('fs').existsSync(ret.path + n))
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
n = require('tls').generateRandomInteger('1', '99999');
|
n = require('tls').generateRandomInteger('1', '99999');
|
||||||
}
|
}
|
||||||
catch (e)
|
catch (e) {
|
||||||
{
|
|
||||||
++n;
|
++n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret.ipcpath = ret.ipcpath + n;
|
ret.path = ret.path + n;
|
||||||
ret.tmpServiceName = 'meshNotificationServer' + n;
|
ret.tmpServiceName = 'meshNotificationServer' + n;
|
||||||
require('service-manager').manager.installLaunchAgent(
|
|
||||||
{
|
|
||||||
name: tmpServiceName, servicePath: process.execPath, startType: 'AUTO_START',
|
|
||||||
sessionTypes: ['Aqua'], parameters: ['-exec', "require('message-box').startServer({path: '" + ret.ipcpath + ", service: '" + ret.tmpServiceName + "'}).on('close', function(){process.exit();});"]
|
|
||||||
});
|
|
||||||
require('service-manager').getLaunchAgent(ret.tmpServiceName).load(ret.uid);
|
|
||||||
|
|
||||||
return (ret);
|
return (ret);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.create = function create(title, caption, timeout)
|
this.create = function create(title, caption, timeout)
|
||||||
{
|
{
|
||||||
var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; });
|
// Start Local Server
|
||||||
ret.ipcpath = '/var/tmp/' + process.execPath.split('/').pop() + '_ev';
|
var ret = this._initIPCBase();
|
||||||
|
ret.title = title; ret.caption = caption; ret.timeout = timeout;
|
||||||
var n = 0;
|
ret.server = this.startMessageServer(ret);
|
||||||
while (require('fs').existsSync(ret.ipcpath + n)) { ++n; }
|
ret.server.ret = ret;
|
||||||
ret.ipcpath += n;
|
ret.server.on('connection', function (c)
|
||||||
|
|
||||||
ret.title = title;
|
|
||||||
ret.caption = caption;
|
|
||||||
|
|
||||||
//ToDo: Install the message server
|
|
||||||
|
|
||||||
this.startServer({ path: ret.ipcpath });
|
|
||||||
|
|
||||||
// Create the Client
|
|
||||||
ret.client = require('net').createConnection({ path: ret.ipcpath }, function ()
|
|
||||||
{
|
{
|
||||||
var b = translateObject({ command: 'DIALOG', title: ret.title, caption: ret.caption, icon: 'caution', buttons: ['"Yes"', '"No"'], buttonDefault: 2, timeout: timeout });
|
this._connection = c;
|
||||||
this.write(b);
|
c.promise = this.ret;
|
||||||
});
|
c.on('data', function (buffer)
|
||||||
ret.client.promise = ret;
|
|
||||||
ret.client.on('data', function (buffer)
|
|
||||||
{
|
{
|
||||||
if (buffer.len < 4 || buffer.readUInt32LE(0) > buffer.len) { this.unshift(buffer); }
|
if (buffer.len < 4 || buffer.readUInt32LE(0) > buffer.len) { this.unshift(buffer); }
|
||||||
var p = JSON.parse(buffer.slice(4, buffer.readUInt32LE(0)).toString());
|
var p = JSON.parse(buffer.slice(4, buffer.readUInt32LE(0)).toString());
|
||||||
@@ -319,80 +295,55 @@ function macos_messageBox()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ret.client.on('end', function ()
|
c.write(translateObject({ command: 'DIALOG', title: this.ret.title, caption: this.ret.caption, icon: 'caution', buttons: ['"Yes"', '"No"'], buttonDefault: 2, timeout: this.ret.timeout }));
|
||||||
{
|
|
||||||
this.promise._rej('Message Server abruptly disconnected');
|
|
||||||
});
|
});
|
||||||
ret.finally(function () { console.log('finally'); });
|
|
||||||
return (ret);
|
return (ret);
|
||||||
};
|
};
|
||||||
this.notify = function notify(title, caption)
|
this.notify = function notify(title, caption)
|
||||||
{
|
{
|
||||||
var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; });
|
// Start Local Server
|
||||||
ret.ipcpath = '/var/tmp/' + process.execPath.split('/').pop() + '_ev';
|
var ret = this._initIPCBase();
|
||||||
|
ret.title = title; ret.caption = caption;
|
||||||
var n = 0;
|
ret.server = this.startMessageServer(ret);
|
||||||
while (require('fs').existsSync(ret.ipcPath + n)) { ++n; }
|
ret.server.ret = ret;
|
||||||
ret.ipcpath += n;
|
ret.server.on('connection', function (c)
|
||||||
|
|
||||||
ret.title = title;
|
|
||||||
ret.caption = caption;
|
|
||||||
|
|
||||||
//ToDo: Install the message server
|
|
||||||
|
|
||||||
this.startServer({ path: ret.ipcpath });
|
|
||||||
|
|
||||||
// Create the Client
|
|
||||||
ret.client = require('net').createConnection({ path: ret.ipcpath }, function ()
|
|
||||||
{
|
{
|
||||||
var b = translateObject({ command: 'NOTIFY', title: ret.title, caption: ret.caption });
|
this._connection = c;
|
||||||
this.write(b);
|
c.promise = this.ret;
|
||||||
});
|
c.on('data', function (buffer)
|
||||||
ret.client.promise = ret;
|
|
||||||
ret.client.on('data', function (buffer)
|
|
||||||
{
|
{
|
||||||
if (buffer.len < 4 || buffer.readUInt32LE(0) > buffer.len) { this.unshift(buffer); }
|
if (buffer.len < 4 || buffer.readUInt32LE(0) > buffer.len) { this.unshift(buffer); }
|
||||||
var p = JSON.parse(buffer.slice(4, buffer.readUInt32LE(0)).toString());
|
var p = JSON.parse(buffer.slice(4, buffer.readUInt32LE(0)).toString());
|
||||||
switch(p.command)
|
switch (p.command)
|
||||||
{
|
{
|
||||||
case 'ERROR':
|
case 'ERROR':
|
||||||
this.promise._rej(p.reason);
|
this.promise._rej(p.reason);
|
||||||
break;
|
break;
|
||||||
case 'NOTIFY':
|
case 'NOTIFY':
|
||||||
|
|
||||||
this.promise._res();
|
this.promise._res();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ret.client.on('end', function ()
|
c.write(translateObject({ command: 'NOTIFY', title: this.ret.title, caption: this.ret.caption }));
|
||||||
{
|
|
||||||
this.promise._rej('Message Server abruptly disconnected');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return (ret);
|
return (ret);
|
||||||
};
|
};
|
||||||
this.startServer = function startServer(options)
|
this.startClient = function startClient(options)
|
||||||
{
|
{
|
||||||
if (require('fs').existsSync(options.path)) { require('fs').unlinkSync(options.path); }
|
// Create the Client
|
||||||
|
console.log('Starting Client...');
|
||||||
|
|
||||||
this._messageServer = require('net').createServer();
|
options.osversion = require('service-manager').getOSVersion();
|
||||||
this._messageServer.uid = require('user-sessions').consoleUid();
|
options.uid = require('user-sessions').consoleUid();
|
||||||
this._messageServer.osversion = require('service-manager').getOSVersion();
|
this.client = require('net').createConnection(options);
|
||||||
this._messageServer._options = options;
|
this.client._options = options;
|
||||||
this._messageServer.timer = setTimeout(function (obj)
|
this.client.on('data', function (buffer)
|
||||||
{
|
{
|
||||||
obj.close();
|
if (buffer.len < 4 || buffer.readUInt32LE(0) > buffer.len) { this.unshift(buffer); }
|
||||||
}, 5000, this._messageServer);
|
var p = JSON.parse(buffer.slice(4, buffer.readUInt32LE(0)).toString());
|
||||||
this._messageServer.listen(options);
|
|
||||||
this._messageServer.on('connection', function (c)
|
|
||||||
{
|
|
||||||
this._client = c;
|
|
||||||
this._client.timer = this.timer;
|
|
||||||
this._client.on('data', function (buffer)
|
|
||||||
{
|
|
||||||
if (buffer.length < 4) { this.unshift(buffer); }
|
|
||||||
if (buffer.length < buffer.readUInt32LE(0)) { this.unshift(buffer); }
|
|
||||||
var p = JSON.parse(buffer.slice(4, buffer.readUInt32LE(0)).toString().trim());
|
|
||||||
clearTimeout(this.timer);
|
|
||||||
switch (p.command)
|
switch (p.command)
|
||||||
{
|
{
|
||||||
case 'NOTIFY':
|
case 'NOTIFY':
|
||||||
@@ -443,52 +394,78 @@ function macos_messageBox()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
this.client.on('error', function () { this.uninstall(); }).on('end', function () { this.uninstall(); });
|
||||||
|
this.client.uninstall = function ()
|
||||||
this._messageServer.on('~', function ()
|
|
||||||
{
|
{
|
||||||
//attachDebugger({ webport: 9998, wait: 1 }).then(console.log);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
require('fs').unlinkSync(this._options.path);
|
|
||||||
}
|
|
||||||
catch (e)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Need to uninstall ourselves
|
// Need to uninstall ourselves
|
||||||
|
console.log('uninstall');
|
||||||
var s;
|
var s;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
s = require('service-manager').manager.getLaunchAgent(this._options.service);
|
s = require('service-manager').manager.getLaunchAgent(this._options.service);
|
||||||
}
|
}
|
||||||
catch(ee)
|
catch (ee)
|
||||||
{
|
{
|
||||||
|
console.log('LaunchAgent not found');
|
||||||
return; // Nothing to do if the service doesn't exist
|
return; // Nothing to do if the service doesn't exist
|
||||||
}
|
}
|
||||||
|
|
||||||
var child = require('child_process').execFile('/bin/sh', ['sh'], { detached: true });
|
var child = require('child_process').execFile('/bin/sh', ['sh'], { detached: true });
|
||||||
if (this.osversion.compareTo('10.10') < 0)
|
if (this._options.osversion.compareTo('10.10') < 0)
|
||||||
{
|
{
|
||||||
// Just unload
|
// Just unload
|
||||||
|
console.log('launchctl unload ' + s.plist + '\nrm ' + s.plist + '\nexit\n');
|
||||||
child.stdin.write('launchctl unload ' + s.plist + '\nrm ' + s.plist + '\nexit\n');
|
child.stdin.write('launchctl unload ' + s.plist + '\nrm ' + s.plist + '\nexit\n');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Use bootout
|
// Use bootout
|
||||||
child.stdin.write('launchctl bootout gui/' + this.uid + ' ' + s.plist + '\nrm ' + s.plist + '\nexit\n');
|
console.log('launchctl bootout gui/' + this._options.uid + ' ' + s.plist + '\nrm ' + s.plist + '\nexit\n');
|
||||||
|
child.stdin.write('launchctl bootout gui/' + this._options.uid + ' ' + s.plist + '\nrm ' + s.plist + '\nexit\n');
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
child.waitExit();
|
child.waitExit();
|
||||||
}
|
}
|
||||||
catch(e)
|
catch (e)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
return (this.client);
|
||||||
|
};
|
||||||
|
this.startMessageServer = function startMessageServer(options)
|
||||||
|
{
|
||||||
|
if (require('fs').existsSync(options.path)) { require('fs').unlinkSync(options.path); }
|
||||||
|
options.writableAll = true;
|
||||||
|
|
||||||
|
var ret = require('net').createServer();
|
||||||
|
ret.uid = require('user-sessions').consoleUid();
|
||||||
|
ret.osversion = require('service-manager').getOSVersion();
|
||||||
|
ret._options = options;
|
||||||
|
ret.timer = setTimeout(function (obj)
|
||||||
|
{
|
||||||
|
obj.close();
|
||||||
|
obj._options._rej('Connection timeout');
|
||||||
|
}, 5000, ret);
|
||||||
|
ret.listen(options);
|
||||||
|
ret.on('connection', function (c)
|
||||||
|
{
|
||||||
|
clearTimeout(this.timer);
|
||||||
|
});
|
||||||
|
ret.on('~', function ()
|
||||||
|
{
|
||||||
|
require('fs').unlinkSync(this._options.path);
|
||||||
});
|
});
|
||||||
|
|
||||||
return (this._messageServer);
|
require('service-manager').manager.installLaunchAgent(
|
||||||
|
{
|
||||||
|
name: options.tmpServiceName, servicePath: process.execPath, startType: 'AUTO_START',
|
||||||
|
sessionTypes: ['Aqua'], parameters: ['-exec', "require('message-box').startClient({ path: '" + options.path + "', service: '" + options.tmpServiceName + "' }).on('end', function () { process.exit(); }).on('error', function () { process.exit(); });"]
|
||||||
|
});
|
||||||
|
require('service-manager').manager.getLaunchAgent(options.tmpServiceName).load(options.uid);
|
||||||
|
|
||||||
|
return (ret);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -652,6 +652,38 @@ function UserSessions()
|
|||||||
}
|
}
|
||||||
else if(process.platform == 'darwin')
|
else if(process.platform == 'darwin')
|
||||||
{
|
{
|
||||||
|
this.getUsername = function getUsername(uid)
|
||||||
|
{
|
||||||
|
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||||
|
child.stdout.str = '';
|
||||||
|
child.stdout.on('data', function (chunk) { this.str += chunk.toString(); });
|
||||||
|
child.stdin.write("dscl . list /Users UniqueID | grep " + uid + " | awk '{ if($2==" + uid + "){ print $1 }}'\nexit\n");
|
||||||
|
child.waitExit();
|
||||||
|
if(child.stdout.str.trim() != '')
|
||||||
|
{
|
||||||
|
return (child.stdout.str.trim());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw ('uid: ' + uid + ' not found');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.getHomeFolder = function getHomeFolder(user)
|
||||||
|
{
|
||||||
|
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||||
|
child.stdout.str = '';
|
||||||
|
child.stdout.on('data', function (chunk) { this.str += chunk.toString(); });
|
||||||
|
child.stdin.write("dscl . -read /Users/" + user + " | grep NFSHomeDirectory | awk -F: '{ print $2 }'\nexit\n");
|
||||||
|
child.waitExit();
|
||||||
|
if (child.stdout.str.trim() != '')
|
||||||
|
{
|
||||||
|
return (child.stdout.str.trim());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw ('user: ' + user + ' not found');
|
||||||
|
}
|
||||||
|
};
|
||||||
this._users = function ()
|
this._users = function ()
|
||||||
{
|
{
|
||||||
var child = require('child_process').execFile('/usr/bin/dscl', ['dscl', '.', 'list', '/Users', 'UniqueID']);
|
var child = require('child_process').execFile('/usr/bin/dscl', ['dscl', '.', 'list', '/Users', 'UniqueID']);
|
||||||
|
|||||||
Reference in New Issue
Block a user