node-x11/lib/auth.js
2015-03-16 13:43:42 +11:00

83 lines
2.3 KiB
JavaScript

// TODO: http://en.wikipedia.org/wiki/X_Window_authorization
var fs = require('fs');
var Buffer = require('buffer').Buffer;
// add 'unpack' method for buffer
require('./unpackbuffer').addUnpack(Buffer);
function parseXauth(buf) {
var offset = 0;
var auth = [];
var cookieProperties = ['address', 'display', 'authName', 'authData'];
function handleCookieProperty(property) {
var length = buf.unpack('n', offset)[0];
offset += 2;
cookie[property] = buf.unpackString(length, offset);
offset += length;
}
while (offset < buf.length) {
var cookie = {};
var typeToName = {
256 : 'Local',
65535: 'Wild',
254 : 'Netname',
253 : 'Krb5Principal',
252 : 'LocalHost',
0 : 'Internet',
1 : 'DECnet',
2 : 'Chaos',
5 : 'ServerInterpreted',
6 : 'InternetV6'
};
cookie.type = buf.unpack('n')[0];
if (!typeToName[cookie.type]) {
console.warn('Unknown address type');
}
offset += 2;
//JSHint becomes angry when handleCookieProperty is declared inside loop
cookieProperties.forEach(handleCookieProperty);
auth.push(cookie);
}
return auth;
}
module.exports = function(display, host, cb) {
var XAuthorityFile = process.env.XAUTHORITY;
if (!XAuthorityFile) {
if (process.platform.match(/^win/)) {
// http://www.straightrunning.com/XmingNotes/trouble.php
//
// The Xming magic cookie program, xauth (user-based), uses an
// Xauthority file (not the traditional .Xauthority file) in
// the %HOME% directory. To use xauth from Command Processor
// e.g. on Windows machine 192.168.0.2 with user colin...
XAuthorityFile = process.env.USERPROFILE + '\\Xauthority';
} else {
XAuthorityFile = process.env.HOME + '/.Xauthority';
}
}
fs.readFile(XAuthorityFile, function(err, data) {
if (err) {
if (err.code == 'ENOENT') {
cb('', '');
return;
}
throw err;
}
var auth = parseXauth(data);
for (var cookieNum in auth) {
var cookie = auth[cookieNum];
if (cookie.display == display && cookie.address == host) {
cb(cookie.authName, cookie.authData);
return;
}
}
// throw 'No auth cookie matching display=' + display + ' and host=' + host;
cb('', '');
});
};