dsch-electron-edge-js
Version:
Edge.js: run .NET and Node.js in-process on Electron
77 lines (67 loc) • 2.74 kB
JavaScript
// Overview of edge.js: http://tjanczuk.github.com/edge
var edge = require('../lib/edge')
, http = require('http');
var authenticate = edge.func(function() {/*
using System;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Security.Principal;
class Startup
{
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword,
int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
public async Task<object> Invoke(dynamic input)
{
return await Task<object>.Run(() => {
IntPtr token;
if (!Startup.LogonUser(input.user, null, input.password, 3, 0, out token))
{
throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}
try {
using (WindowsIdentity id = new WindowsIdentity(token))
{
return new {
name = id.Name,
sid = id.User.ToString()
};
}
}
finally {
Startup.CloseHandle(token);
}
});
}
}
*/});
http.createServer(function (req, res) {
function challange() {
res.writeHead(401, { 'WWW-Authenticate': 'Basic realm=""' });
res.end();
}
if (req.headers.authorization && req.headers.authorization.indexOf('Basic ') === 0) {
var tokens = new Buffer(req.headers.authorization.substring(6), 'base64').toString('utf8').split(':');
if (!tokens || tokens.length !== 2 || tokens[0] === 'noone' && tokens[1] === 'noone') {
challange();
}
else {
authenticate({ user: tokens[0], password: tokens[1] }, function (error, result) {
if (error) {
console.log(error);
challange();
}
else {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('<p>Welcome ' + result.name + ' (' + result.sid + ')');
res.end('<p><a href="http://noone:noone@' + req.headers.host + '/">Logout</a>');
}
})
}
}
else {
challange();
}
}).listen(process.env.PORT || 8080);