110 lines
3.8 KiB
JavaScript
110 lines
3.8 KiB
JavaScript
/**
|
|
* Module dependencies.
|
|
*/
|
|
var utils = require('../utils')
|
|
, AuthorizationError = require('../errors/authorizationerror');
|
|
|
|
|
|
module.exports = function(server, options, immediate, complete) {
|
|
if (typeof options == 'function') {
|
|
complete = immediate;
|
|
immediate = options;
|
|
options = undefined;
|
|
}
|
|
options = options || {};
|
|
|
|
if (!server) { throw new TypeError('oauth2orize.resume middleware requires a server argument'); }
|
|
if (!immediate) { throw new TypeError('oauth2orize.resume middleware requires an immediate function'); }
|
|
|
|
var userProperty = options.userProperty || 'user';
|
|
|
|
return function resume(req, res, next) {
|
|
if (!req.oauth2) { return next(new Error('OAuth2orize requires transaction support. Did you forget oauth2orize.transactionLoader(...)?')); }
|
|
|
|
req.oauth2.user = req[userProperty];
|
|
if (res.locals) {
|
|
req.oauth2.locals = req.oauth2.locals || {};
|
|
utils.merge(req.oauth2.locals, res.locals);
|
|
}
|
|
|
|
function immediated(err, allow, info, locals) {
|
|
if (err) { return next(err); }
|
|
if (allow) {
|
|
req.oauth2.res = info || {};
|
|
req.oauth2.res.allow = true;
|
|
if (locals) {
|
|
req.oauth2.locals = req.oauth2.locals || {};
|
|
utils.merge(req.oauth2.locals, locals);
|
|
}
|
|
|
|
// proxy end() to delete the transaction
|
|
var end = res.end;
|
|
res.end = function(chunk, encoding) {
|
|
if (server._txnStore.legacy == true) {
|
|
server._txnStore.remove(options, req, req.oauth2.transactionID, function noop(){});
|
|
} else {
|
|
server._txnStore.remove(req, req.oauth2.transactionID, function noop(){});
|
|
}
|
|
|
|
res.end = end;
|
|
res.end(chunk, encoding);
|
|
};
|
|
req.oauth2._endProxied = true;
|
|
|
|
function completing(cb) {
|
|
if (!complete) { return cb(); }
|
|
complete(req, req.oauth2, cb);
|
|
}
|
|
|
|
server._respond(req.oauth2, res, completing, function(err) {
|
|
if (err) { return next(err); }
|
|
return next(new AuthorizationError('Unsupported response type: ' + req.oauth2.req.type, 'unsupported_response_type'));
|
|
});
|
|
} else {
|
|
req.oauth2.info = info;
|
|
if (locals) {
|
|
req.oauth2.locals = req.oauth2.locals || {};
|
|
utils.merge(req.oauth2.locals, locals);
|
|
}
|
|
|
|
function updated(err, tid) {
|
|
if (err) { return next(err); }
|
|
req.oauth2.transactionID = tid;
|
|
next();
|
|
}
|
|
|
|
if (server._txnStore.legacy == true) {
|
|
var txn = {};
|
|
txn.protocol = 'oauth2';
|
|
txn.client = req.oauth2.client;
|
|
txn.redirectURI = req.oauth2.redirectURI;
|
|
txn.req = req.oauth2.req;
|
|
txn.info = info;
|
|
|
|
server._txnStore.update(server, options, req, req.oauth2.transactionID, txn, updated);
|
|
} else {
|
|
server._txnStore.update(req, req.oauth2.transactionID, req.oauth2, updated);
|
|
}
|
|
}
|
|
}
|
|
|
|
try {
|
|
var arity = immediate.length;
|
|
if (arity == 7) {
|
|
immediate(req.oauth2.client, req.oauth2.user, req.oauth2.req.scope, req.oauth2.req.type, req.oauth2.req, req.oauth2.locals, immediated);
|
|
} else if (arity == 6) {
|
|
immediate(req.oauth2.client, req.oauth2.user, req.oauth2.req.scope, req.oauth2.req.type, req.oauth2.req, immediated);
|
|
} else if (arity == 5) {
|
|
immediate(req.oauth2.client, req.oauth2.user, req.oauth2.req.scope, req.oauth2.req.type, immediated);
|
|
} else if (arity == 4) {
|
|
immediate(req.oauth2.client, req.oauth2.user, req.oauth2.req.scope, immediated);
|
|
} else if (arity == 3) {
|
|
immediate(req.oauth2.client, req.oauth2.user, immediated);
|
|
} else { // arity == 2
|
|
immediate(req.oauth2, immediated);
|
|
}
|
|
} catch (ex) {
|
|
return next(ex);
|
|
}
|
|
};
|
|
};
|