|
|
|
@ -1,7 +1,7 @@ |
|
|
|
|
/* globals RoutePolicy, logger */ |
|
|
|
|
/* jshint newcap: false */ |
|
|
|
|
|
|
|
|
|
var Fiber = Npm.require('fibers'); |
|
|
|
|
var fiber = Npm.require('fibers'); |
|
|
|
|
var url = Npm.require('url'); |
|
|
|
|
var CAS = Npm.require('cas'); |
|
|
|
|
|
|
|
|
@ -9,45 +9,10 @@ var _casCredentialTokens = {}; |
|
|
|
|
|
|
|
|
|
RoutePolicy.declare('/_cas/', 'network'); |
|
|
|
|
|
|
|
|
|
// Listen to incoming OAuth http requests
|
|
|
|
|
WebApp.connectHandlers.use(function(req, res, next) { |
|
|
|
|
// Need to create a Fiber since we're using synchronous http calls and nothing
|
|
|
|
|
// else is wrapping this in a fiber automatically
|
|
|
|
|
Fiber(function () { |
|
|
|
|
middleware(req, res, next); |
|
|
|
|
}).run(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
var middleware = function (req, res, next) { |
|
|
|
|
// Make sure to catch any exceptions because otherwise we'd crash
|
|
|
|
|
// the runner
|
|
|
|
|
try { |
|
|
|
|
var barePath = req.url.substring(0, req.url.indexOf('?')); |
|
|
|
|
var splitPath = barePath.split('/'); |
|
|
|
|
|
|
|
|
|
// Any non-cas request will continue down the default
|
|
|
|
|
// middlewares.
|
|
|
|
|
if (splitPath[1] !== '_cas') { |
|
|
|
|
next(); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// get auth token
|
|
|
|
|
var credentialToken = splitPath[2]; |
|
|
|
|
if (!credentialToken) { |
|
|
|
|
closePopup(res); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// validate ticket
|
|
|
|
|
casTicket(req, credentialToken, function() { |
|
|
|
|
closePopup(res); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
} catch (err) { |
|
|
|
|
logger.error('Unexpected error : ' + err.message); |
|
|
|
|
closePopup(res); |
|
|
|
|
} |
|
|
|
|
var closePopup = function(res) { |
|
|
|
|
res.writeHead(200, {'Content-Type': 'text/html'}); |
|
|
|
|
var content = '<html><head><script>window.close()</script></head></html>'; |
|
|
|
|
res.end(content, 'utf-8'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var casTicket = function (req, token, callback) { |
|
|
|
@ -87,6 +52,60 @@ var casTicket = function (req, token, callback) { |
|
|
|
|
return; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var middleware = function (req, res, next) { |
|
|
|
|
// Make sure to catch any exceptions because otherwise we'd crash
|
|
|
|
|
// the runner
|
|
|
|
|
try { |
|
|
|
|
var barePath = req.url.substring(0, req.url.indexOf('?')); |
|
|
|
|
var splitPath = barePath.split('/'); |
|
|
|
|
|
|
|
|
|
// Any non-cas request will continue down the default
|
|
|
|
|
// middlewares.
|
|
|
|
|
if (splitPath[1] !== '_cas') { |
|
|
|
|
next(); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// get auth token
|
|
|
|
|
var credentialToken = splitPath[2]; |
|
|
|
|
if (!credentialToken) { |
|
|
|
|
closePopup(res); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// validate ticket
|
|
|
|
|
casTicket(req, credentialToken, function() { |
|
|
|
|
closePopup(res); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
} catch (err) { |
|
|
|
|
logger.error('Unexpected error : ' + err.message); |
|
|
|
|
closePopup(res); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Listen to incoming OAuth http requests
|
|
|
|
|
WebApp.connectHandlers.use(function(req, res, next) { |
|
|
|
|
// Need to create a fiber since we're using synchronous http calls and nothing
|
|
|
|
|
// else is wrapping this in a fiber automatically
|
|
|
|
|
fiber(function () { |
|
|
|
|
middleware(req, res, next); |
|
|
|
|
}).run(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
var _hasCredential = function(credentialToken) { |
|
|
|
|
return _.has(_casCredentialTokens, credentialToken); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* Retrieve token and delete it to avoid replaying it. |
|
|
|
|
*/ |
|
|
|
|
var _retrieveCredential = function(credentialToken) { |
|
|
|
|
var result = _casCredentialTokens[credentialToken]; |
|
|
|
|
delete _casCredentialTokens[credentialToken]; |
|
|
|
|
return result; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* Register a server-side login handle. |
|
|
|
|
* It is call after Accounts.callLoginMethod() is call from client. |
|
|
|
@ -143,22 +162,3 @@ Accounts.registerLoginHandler(function (options) { |
|
|
|
|
|
|
|
|
|
return { userId: user._id }; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
var _hasCredential = function(credentialToken) { |
|
|
|
|
return _.has(_casCredentialTokens, credentialToken); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* Retrieve token and delete it to avoid replaying it. |
|
|
|
|
*/ |
|
|
|
|
var _retrieveCredential = function(credentialToken) { |
|
|
|
|
var result = _casCredentialTokens[credentialToken]; |
|
|
|
|
delete _casCredentialTokens[credentialToken]; |
|
|
|
|
return result; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var closePopup = function(res) { |
|
|
|
|
res.writeHead(200, {'Content-Type': 'text/html'}); |
|
|
|
|
var content = '<html><head><script>window.close()</script></head></html>'; |
|
|
|
|
res.end(content, 'utf-8'); |
|
|
|
|
}; |
|
|
|
|