Fix Prettier (#7066)
This commit is contained in:
@@ -2,12 +2,9 @@ var https = require('https'),
|
||||
crypto = require('crypto');
|
||||
var Parse = require('parse/node').Parse;
|
||||
|
||||
var OAuth = function(options) {
|
||||
var OAuth = function (options) {
|
||||
if (!options) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.INTERNAL_SERVER_ERROR,
|
||||
'No options passed to OAuth'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'No options passed to OAuth');
|
||||
}
|
||||
this.consumer_key = options.consumer_key;
|
||||
this.consumer_secret = options.consumer_secret;
|
||||
@@ -17,22 +14,22 @@ var OAuth = function(options) {
|
||||
this.oauth_params = options.oauth_params || {};
|
||||
};
|
||||
|
||||
OAuth.prototype.send = function(method, path, params, body) {
|
||||
OAuth.prototype.send = function (method, path, params, body) {
|
||||
var request = this.buildRequest(method, path, params, body);
|
||||
// Encode the body properly, the current Parse Implementation don't do it properly
|
||||
return new Promise(function(resolve, reject) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var httpRequest = https
|
||||
.request(request, function(res) {
|
||||
.request(request, function (res) {
|
||||
var data = '';
|
||||
res.on('data', function(chunk) {
|
||||
res.on('data', function (chunk) {
|
||||
data += chunk;
|
||||
});
|
||||
res.on('end', function() {
|
||||
res.on('end', function () {
|
||||
data = JSON.parse(data);
|
||||
resolve(data);
|
||||
});
|
||||
})
|
||||
.on('error', function() {
|
||||
.on('error', function () {
|
||||
reject('Failed to make an OAuth request');
|
||||
});
|
||||
if (request.body) {
|
||||
@@ -42,7 +39,7 @@ OAuth.prototype.send = function(method, path, params, body) {
|
||||
});
|
||||
};
|
||||
|
||||
OAuth.prototype.buildRequest = function(method, path, params, body) {
|
||||
OAuth.prototype.buildRequest = function (method, path, params, body) {
|
||||
if (path.indexOf('/') != 0) {
|
||||
path = '/' + path;
|
||||
}
|
||||
@@ -62,12 +59,7 @@ OAuth.prototype.buildRequest = function(method, path, params, body) {
|
||||
oauth_params['oauth_token'] = this.auth_token;
|
||||
}
|
||||
|
||||
request = OAuth.signRequest(
|
||||
request,
|
||||
oauth_params,
|
||||
this.consumer_secret,
|
||||
this.auth_token_secret
|
||||
);
|
||||
request = OAuth.signRequest(request, oauth_params, this.consumer_secret, this.auth_token_secret);
|
||||
|
||||
if (body && Object.keys(body).length > 0) {
|
||||
request.body = OAuth.buildParameterString(body);
|
||||
@@ -75,18 +67,18 @@ OAuth.prototype.buildRequest = function(method, path, params, body) {
|
||||
return request;
|
||||
};
|
||||
|
||||
OAuth.prototype.get = function(path, params) {
|
||||
OAuth.prototype.get = function (path, params) {
|
||||
return this.send('GET', path, params);
|
||||
};
|
||||
|
||||
OAuth.prototype.post = function(path, params, body) {
|
||||
OAuth.prototype.post = function (path, params, body) {
|
||||
return this.send('POST', path, params, body);
|
||||
};
|
||||
|
||||
/*
|
||||
Proper string %escape encoding
|
||||
*/
|
||||
OAuth.encode = function(str) {
|
||||
OAuth.encode = function (str) {
|
||||
// discuss at: http://phpjs.org/functions/rawurlencode/
|
||||
// original by: Brett Zamir (http://brett-zamir.me)
|
||||
// input by: travc
|
||||
@@ -126,25 +118,23 @@ OAuth.version = '1.0';
|
||||
/*
|
||||
Generate a nonce
|
||||
*/
|
||||
OAuth.nonce = function() {
|
||||
OAuth.nonce = function () {
|
||||
var text = '';
|
||||
var possible =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
|
||||
for (var i = 0; i < 30; i++)
|
||||
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
||||
for (var i = 0; i < 30; i++) text += possible.charAt(Math.floor(Math.random() * possible.length));
|
||||
|
||||
return text;
|
||||
};
|
||||
|
||||
OAuth.buildParameterString = function(obj) {
|
||||
OAuth.buildParameterString = function (obj) {
|
||||
// Sort keys and encode values
|
||||
if (obj) {
|
||||
var keys = Object.keys(obj).sort();
|
||||
|
||||
// Map key=value, join them by &
|
||||
return keys
|
||||
.map(function(key) {
|
||||
.map(function (key) {
|
||||
return key + '=' + OAuth.encode(obj[key]);
|
||||
})
|
||||
.join('&');
|
||||
@@ -157,33 +147,19 @@ OAuth.buildParameterString = function(obj) {
|
||||
Build the signature string from the object
|
||||
*/
|
||||
|
||||
OAuth.buildSignatureString = function(method, url, parameters) {
|
||||
return [
|
||||
method.toUpperCase(),
|
||||
OAuth.encode(url),
|
||||
OAuth.encode(parameters),
|
||||
].join('&');
|
||||
OAuth.buildSignatureString = function (method, url, parameters) {
|
||||
return [method.toUpperCase(), OAuth.encode(url), OAuth.encode(parameters)].join('&');
|
||||
};
|
||||
|
||||
/*
|
||||
Retuns encoded HMAC-SHA1 from key and text
|
||||
*/
|
||||
OAuth.signature = function(text, key) {
|
||||
OAuth.signature = function (text, key) {
|
||||
crypto = require('crypto');
|
||||
return OAuth.encode(
|
||||
crypto
|
||||
.createHmac('sha1', key)
|
||||
.update(text)
|
||||
.digest('base64')
|
||||
);
|
||||
return OAuth.encode(crypto.createHmac('sha1', key).update(text).digest('base64'));
|
||||
};
|
||||
|
||||
OAuth.signRequest = function(
|
||||
request,
|
||||
oauth_parameters,
|
||||
consumer_secret,
|
||||
auth_token_secret
|
||||
) {
|
||||
OAuth.signRequest = function (request, oauth_parameters, consumer_secret, auth_token_secret) {
|
||||
oauth_parameters = oauth_parameters || {};
|
||||
|
||||
// Set default values
|
||||
@@ -224,16 +200,9 @@ OAuth.signRequest = function(
|
||||
// Build the signature string
|
||||
var url = 'https://' + request.host + '' + request.path;
|
||||
|
||||
var signatureString = OAuth.buildSignatureString(
|
||||
request.method,
|
||||
url,
|
||||
parameterString
|
||||
);
|
||||
var signatureString = OAuth.buildSignatureString(request.method, url, parameterString);
|
||||
// Hash the signature string
|
||||
var signatureKey = [
|
||||
OAuth.encode(consumer_secret),
|
||||
OAuth.encode(auth_token_secret),
|
||||
].join('&');
|
||||
var signatureKey = [OAuth.encode(consumer_secret), OAuth.encode(auth_token_secret)].join('&');
|
||||
|
||||
var signature = OAuth.signature(signatureString, signatureKey);
|
||||
|
||||
@@ -246,7 +215,7 @@ OAuth.signRequest = function(
|
||||
// Set the authorization header
|
||||
var authHeader = Object.keys(oauth_parameters)
|
||||
.sort()
|
||||
.map(function(key) {
|
||||
.map(function (key) {
|
||||
var value = oauth_parameters[key];
|
||||
return key + '="' + value + '"';
|
||||
})
|
||||
|
||||
@@ -33,24 +33,15 @@ const getAppleKeyByKeyId = async (keyId, cacheMaxEntries, cacheMaxAge) => {
|
||||
const getHeaderFromToken = token => {
|
||||
const decodedToken = jwt.decode(token, { complete: true });
|
||||
if (!decodedToken) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
`provided token does not decode as JWT`
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
|
||||
}
|
||||
|
||||
return decodedToken.header;
|
||||
};
|
||||
|
||||
const verifyIdToken = async (
|
||||
{ token, id },
|
||||
{ clientId, cacheMaxEntries, cacheMaxAge }
|
||||
) => {
|
||||
const verifyIdToken = async ({ token, id }, { clientId, cacheMaxEntries, cacheMaxAge }) => {
|
||||
if (!token) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
`id token is invalid for this user.`
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
|
||||
}
|
||||
|
||||
const { kid: keyId, alg: algorithm } = getHeaderFromToken(token);
|
||||
@@ -60,11 +51,7 @@ const verifyIdToken = async (
|
||||
cacheMaxAge = cacheMaxAge || ONE_HOUR_IN_MS;
|
||||
cacheMaxEntries = cacheMaxEntries || 5;
|
||||
|
||||
const appleKey = await getAppleKeyByKeyId(
|
||||
keyId,
|
||||
cacheMaxEntries,
|
||||
cacheMaxAge
|
||||
);
|
||||
const appleKey = await getAppleKeyByKeyId(keyId, cacheMaxEntries, cacheMaxAge);
|
||||
const signingKey = appleKey.publicKey || appleKey.rsaPublicKey;
|
||||
|
||||
try {
|
||||
@@ -87,10 +74,7 @@ const verifyIdToken = async (
|
||||
}
|
||||
|
||||
if (jwtClaims.sub !== id) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
`auth data is invalid for this user.`
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `auth data is invalid for this user.`);
|
||||
}
|
||||
return jwtClaims;
|
||||
};
|
||||
|
||||
@@ -19,20 +19,12 @@ function getAppSecretPath(authData, options = {}) {
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData, options) {
|
||||
return graphRequest(
|
||||
'me?fields=id&access_token=' +
|
||||
authData.access_token +
|
||||
getAppSecretPath(authData, options)
|
||||
'me?fields=id&access_token=' + authData.access_token + getAppSecretPath(authData, options)
|
||||
).then(data => {
|
||||
if (
|
||||
(data && data.id == authData.id) ||
|
||||
(process.env.TESTING && authData.id === 'test')
|
||||
) {
|
||||
if ((data && data.id == authData.id) || (process.env.TESTING && authData.id === 'test')) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Facebook auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Facebook auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -43,10 +35,7 @@ function validateAppId(appIds, authData, options) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
if (!appIds.length) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Facebook auth is not configured.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Facebook auth is not configured.');
|
||||
}
|
||||
return graphRequest(
|
||||
'app?access_token=' + access_token + getAppSecretPath(authData, options)
|
||||
@@ -54,10 +43,7 @@ function validateAppId(appIds, authData, options) {
|
||||
if (data && appIds.indexOf(data.id) != -1) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Facebook auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Facebook auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -96,20 +96,14 @@ function verifySignature(publicKey, authData) {
|
||||
verifier.update(authData.salt, 'base64');
|
||||
|
||||
if (!verifier.verify(publicKey, authData.signature, 'base64')) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Apple Game Center - invalid signature'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - invalid signature');
|
||||
}
|
||||
}
|
||||
|
||||
// Returns a promise that fulfills if this user id is valid.
|
||||
async function validateAuthData(authData) {
|
||||
if (!authData.id) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Apple Game Center - authData id missing'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - authData id missing');
|
||||
}
|
||||
authData.playerId = authData.id;
|
||||
const publicKey = await getAppleCertificate(authData.publicKeyUrl);
|
||||
|
||||
@@ -8,10 +8,7 @@ function validateAuthData(authData) {
|
||||
if (data && data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Github auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Github auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -39,9 +39,7 @@ function getGoogleKeyByKeyId(keyId) {
|
||||
|
||||
if (expire) {
|
||||
cache = Object.assign({}, pems, {
|
||||
expiresAt: new Date(
|
||||
new Date().getTime() + Number(expire[1]) * 1000
|
||||
),
|
||||
expiresAt: new Date(new Date().getTime() + Number(expire[1]) * 1000),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -57,10 +55,7 @@ function getHeaderFromToken(token) {
|
||||
const decodedToken = jwt.decode(token, { complete: true });
|
||||
|
||||
if (!decodedToken) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
`provided token does not decode as JWT`
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
|
||||
}
|
||||
|
||||
return decodedToken.header;
|
||||
@@ -68,10 +63,7 @@ function getHeaderFromToken(token) {
|
||||
|
||||
async function verifyIdToken({ id_token: token, id }, { clientId }) {
|
||||
if (!token) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
`id token is invalid for this user.`
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
|
||||
}
|
||||
|
||||
const { kid: keyId, alg: algorithm } = getHeaderFromToken(token);
|
||||
@@ -96,10 +88,7 @@ async function verifyIdToken({ id_token: token, id }, { clientId }) {
|
||||
}
|
||||
|
||||
if (jwtClaims.sub !== id) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
`auth data is invalid for this user.`
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `auth data is invalid for this user.`);
|
||||
}
|
||||
|
||||
if (clientId && jwtClaims.aud !== clientId) {
|
||||
@@ -140,9 +129,7 @@ function rsaPublicKeyToPEM(modulusB64, exponentB64) {
|
||||
const encodedExplen = encodeLengthHex(explen);
|
||||
const encodedPubkey =
|
||||
'30' +
|
||||
encodeLengthHex(
|
||||
modlen + explen + encodedModlen.length / 2 + encodedExplen.length / 2 + 2
|
||||
) +
|
||||
encodeLengthHex(modlen + explen + encodedModlen.length / 2 + encodedExplen.length / 2 + 2) +
|
||||
'02' +
|
||||
encodedModlen +
|
||||
modulusHex +
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const https = require('https');
|
||||
|
||||
function makeCallback(resolve, reject, noJSON) {
|
||||
return function(res) {
|
||||
return function (res) {
|
||||
let data = '';
|
||||
res.on('data', chunk => {
|
||||
data += chunk;
|
||||
@@ -23,9 +23,7 @@ function makeCallback(resolve, reject, noJSON) {
|
||||
|
||||
function get(options, noJSON = false) {
|
||||
return new Promise((resolve, reject) => {
|
||||
https
|
||||
.get(options, makeCallback(resolve, reject, noJSON))
|
||||
.on('error', reject);
|
||||
https.get(options, makeCallback(resolve, reject, noJSON)).on('error', reject);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -92,11 +92,7 @@ function loadAuthAdapter(provider, authOptions) {
|
||||
|
||||
// Try the configuration methods
|
||||
if (providerOptions) {
|
||||
const optionalAdapter = loadAdapter(
|
||||
providerOptions,
|
||||
undefined,
|
||||
providerOptions
|
||||
);
|
||||
const optionalAdapter = loadAdapter(providerOptions, undefined, providerOptions);
|
||||
if (optionalAdapter) {
|
||||
['validateAuthData', 'validateAppId'].forEach(key => {
|
||||
if (optionalAdapter[key]) {
|
||||
@@ -128,10 +124,7 @@ module.exports = function (authOptions = {}, enableAnonymousUsers = true) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { adapter, appIds, providerOptions } = loadAuthAdapter(
|
||||
provider,
|
||||
authOptions
|
||||
);
|
||||
const { adapter, appIds, providerOptions } = loadAuthAdapter(provider, authOptions);
|
||||
|
||||
return authDataValidator(adapter, appIds, providerOptions);
|
||||
};
|
||||
|
||||
@@ -11,10 +11,7 @@ function validateAuthData(authData) {
|
||||
if (response && response.data && response.data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Instagram auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Instagram auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -5,19 +5,17 @@ const httpsRequest = require('./httpsRequest');
|
||||
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData, options) {
|
||||
return request(options.janrain_capture_host, authData.access_token).then(
|
||||
data => {
|
||||
//successful response will have a "stat" (status) of 'ok' and a result node that stores the uuid, because that's all we asked for
|
||||
//see: https://docs.janrain.com/api/registration/entity/#entity
|
||||
if (data && data.stat == 'ok' && data.result == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Janrain capture auth is invalid for this user.'
|
||||
);
|
||||
return request(options.janrain_capture_host, authData.access_token).then(data => {
|
||||
//successful response will have a "stat" (status) of 'ok' and a result node that stores the uuid, because that's all we asked for
|
||||
//see: https://docs.janrain.com/api/registration/entity/#entity
|
||||
if (data && data.stat == 'ok' && data.result == authData.id) {
|
||||
return;
|
||||
}
|
||||
);
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Janrain capture auth is invalid for this user.'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Returns a promise that fulfills iff this app id is valid.
|
||||
|
||||
@@ -37,12 +37,7 @@ const { Parse } = require('parse/node');
|
||||
const httpsRequest = require('./httpsRequest');
|
||||
|
||||
const arraysEqual = (_arr1, _arr2) => {
|
||||
if (
|
||||
!Array.isArray(_arr1) ||
|
||||
!Array.isArray(_arr2) ||
|
||||
_arr1.length !== _arr2.length
|
||||
)
|
||||
return false;
|
||||
if (!Array.isArray(_arr1) || !Array.isArray(_arr2) || _arr1.length !== _arr2.length) return false;
|
||||
|
||||
var arr1 = _arr1.concat().sort();
|
||||
var arr2 = _arr2.concat().sort();
|
||||
@@ -54,21 +49,12 @@ const arraysEqual = (_arr1, _arr2) => {
|
||||
return true;
|
||||
};
|
||||
|
||||
const handleAuth = async (
|
||||
{ access_token, id, roles, groups } = {},
|
||||
{ config } = {}
|
||||
) => {
|
||||
const handleAuth = async ({ access_token, id, roles, groups } = {}, { config } = {}) => {
|
||||
if (!(access_token && id)) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Missing access token and/or User id'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Missing access token and/or User id');
|
||||
}
|
||||
if (!config || !(config['auth-server-url'] && config['realm'])) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Missing keycloak configuration'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Missing keycloak configuration');
|
||||
}
|
||||
try {
|
||||
const response = await httpsRequest.get({
|
||||
@@ -87,10 +73,7 @@ const handleAuth = async (
|
||||
) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Invalid authentication'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Invalid authentication');
|
||||
} catch (e) {
|
||||
if (e instanceof Parse.Error) {
|
||||
throw e;
|
||||
|
||||
@@ -4,16 +4,12 @@ const Parse = require('parse/node').Parse;
|
||||
function validateAuthData(authData, options) {
|
||||
if (!optionsAreValid(options)) {
|
||||
return new Promise((_, reject) => {
|
||||
reject(
|
||||
new Parse.Error(
|
||||
Parse.Error.INTERNAL_SERVER_ERROR,
|
||||
'LDAP auth configuration missing'
|
||||
)
|
||||
);
|
||||
reject(new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'LDAP auth configuration missing'));
|
||||
});
|
||||
}
|
||||
const clientOptions = (options.url.startsWith("ldaps://")) ?
|
||||
{ url: options.url, tlsOptions: options.tlsOptions } : { url: options.url };
|
||||
const clientOptions = options.url.startsWith('ldaps://')
|
||||
? { url: options.url, tlsOptions: options.tlsOptions }
|
||||
: { url: options.url };
|
||||
|
||||
const client = ldapjs.createClient(clientOptions);
|
||||
const userCn =
|
||||
@@ -23,28 +19,31 @@ function validateAuthData(authData, options) {
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
client.bind(userCn, authData.password, ldapError => {
|
||||
delete(authData.password);
|
||||
delete authData.password;
|
||||
if (ldapError) {
|
||||
let error;
|
||||
switch (ldapError.code) {
|
||||
case 49:
|
||||
error = new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'LDAP: Wrong username or password');
|
||||
error = new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'LDAP: Wrong username or password'
|
||||
);
|
||||
break;
|
||||
case "DEPTH_ZERO_SELF_SIGNED_CERT":
|
||||
case 'DEPTH_ZERO_SELF_SIGNED_CERT':
|
||||
error = new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'LDAPS: Certificate mismatch');
|
||||
break;
|
||||
default:
|
||||
error = new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'LDAP: Somthing went wrong (' + ldapError.code + ')');
|
||||
error = new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'LDAP: Somthing went wrong (' + ldapError.code + ')'
|
||||
);
|
||||
}
|
||||
reject(error);
|
||||
client.destroy(ldapError);
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
typeof options.groupCn === 'string' &&
|
||||
typeof options.groupFilter === 'string'
|
||||
) {
|
||||
if (typeof options.groupCn === 'string' && typeof options.groupFilter === 'string') {
|
||||
searchForGroup(client, options, authData.id, resolve, reject);
|
||||
} else {
|
||||
client.unbind();
|
||||
@@ -61,7 +60,7 @@ function optionsAreValid(options) {
|
||||
typeof options.suffix === 'string' &&
|
||||
typeof options.url === 'string' &&
|
||||
(options.url.startsWith('ldap://') ||
|
||||
options.url.startsWith('ldaps://') && typeof options.tlsOptions === 'object')
|
||||
(options.url.startsWith('ldaps://') && typeof options.tlsOptions === 'object'))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -76,12 +75,7 @@ function searchForGroup(client, options, id, resolve, reject) {
|
||||
if (searchError) {
|
||||
client.unbind();
|
||||
client.destroy();
|
||||
return reject(
|
||||
new Parse.Error(
|
||||
Parse.Error.INTERNAL_SERVER_ERROR,
|
||||
'LDAP group search failed'
|
||||
)
|
||||
);
|
||||
return reject(new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'LDAP group search failed'));
|
||||
}
|
||||
res.on('searchEntry', entry => {
|
||||
if (entry.object.cn === options.groupCn) {
|
||||
@@ -96,20 +90,12 @@ function searchForGroup(client, options, id, resolve, reject) {
|
||||
client.unbind();
|
||||
client.destroy();
|
||||
return reject(
|
||||
new Parse.Error(
|
||||
Parse.Error.INTERNAL_SERVER_ERROR,
|
||||
'LDAP: User not in group'
|
||||
)
|
||||
new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'LDAP: User not in group')
|
||||
);
|
||||
}
|
||||
});
|
||||
res.on('error', () => {
|
||||
return reject(
|
||||
new Parse.Error(
|
||||
Parse.Error.INTERNAL_SERVER_ERROR,
|
||||
'LDAP group search failed'
|
||||
)
|
||||
);
|
||||
return reject(new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'LDAP group search failed'));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,10 +8,7 @@ function validateAuthData(authData) {
|
||||
if (response && response.userId && response.userId === authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Line auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Line auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,12 @@ const httpsRequest = require('./httpsRequest');
|
||||
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData) {
|
||||
return request('me', authData.access_token, authData.is_mobile_sdk).then(
|
||||
data => {
|
||||
if (data && data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Linkedin auth is invalid for this user.'
|
||||
);
|
||||
return request('me', authData.access_token, authData.is_mobile_sdk).then(data => {
|
||||
if (data && data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Linkedin auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
// Returns a promise that fulfills iff this app id is valid.
|
||||
|
||||
@@ -8,10 +8,7 @@ function validateAuthData(authData) {
|
||||
if (data && data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Meetup auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Meetup auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,15 @@ const httpsRequest = require('./httpsRequest');
|
||||
|
||||
// Returns a promise that fulfills if this user mail is valid.
|
||||
function validateAuthData(authData) {
|
||||
return request('me', authData.access_token).then(
|
||||
response => {
|
||||
if (response && response.id && response.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Microsoft Graph auth is invalid for this user.'
|
||||
);
|
||||
return request('me', authData.access_token).then(response => {
|
||||
if (response && response.id && response.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
);
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Microsoft Graph auth is invalid for this user.'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Returns a promise that fulfills if this app id is valid.
|
||||
|
||||
@@ -63,8 +63,7 @@ const INVALID_ACCESS_APPID =
|
||||
"OAuth2: the access_token's appID is empty or is not in the list of permitted appIDs in the auth configuration.";
|
||||
const MISSING_APPIDS =
|
||||
'OAuth2 configuration is missing the client app IDs ("appIds" config parameter).';
|
||||
const MISSING_URL =
|
||||
'OAuth2 token introspection endpoint URL is missing from configuration!';
|
||||
const MISSING_URL = 'OAuth2 token introspection endpoint URL is missing from configuration!';
|
||||
|
||||
// Returns a promise that fulfills if this user id is valid.
|
||||
function validateAuthData(authData, options) {
|
||||
|
||||
@@ -14,10 +14,7 @@ function validateAuthData(authData) {
|
||||
if (data && data.sub == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'PhantAuth auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'PhantAuth auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,16 +4,11 @@ var Parse = require('parse/node').Parse;
|
||||
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData) {
|
||||
return graphRequest('me?access_token=' + authData.access_token).then(function(
|
||||
data
|
||||
) {
|
||||
return graphRequest('me?access_token=' + authData.access_token).then(function (data) {
|
||||
if (data && data.openid == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'qq auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -24,21 +19,16 @@ function validateAppId() {
|
||||
|
||||
// A promisey wrapper for qq graph requests.
|
||||
function graphRequest(path) {
|
||||
return httpsRequest
|
||||
.get('https://graph.qq.com/oauth2.0/' + path, true)
|
||||
.then(data => {
|
||||
return parseResponseData(data);
|
||||
});
|
||||
return httpsRequest.get('https://graph.qq.com/oauth2.0/' + path, true).then(data => {
|
||||
return parseResponseData(data);
|
||||
});
|
||||
}
|
||||
|
||||
function parseResponseData(data) {
|
||||
const starPos = data.indexOf('(');
|
||||
const endPos = data.indexOf(')');
|
||||
if (starPos == -1 || endPos == -1) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'qq auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
|
||||
}
|
||||
data = data.substring(starPos + 1, endPos - 1);
|
||||
return JSON.parse(data);
|
||||
|
||||
@@ -8,10 +8,7 @@ function validateAuthData(authData) {
|
||||
if (data && data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Spotify auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -19,19 +16,13 @@ function validateAuthData(authData) {
|
||||
function validateAppId(appIds, authData) {
|
||||
var access_token = authData.access_token;
|
||||
if (!appIds.length) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Spotify auth is not configured.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth is not configured.');
|
||||
}
|
||||
return request('me', access_token).then(data => {
|
||||
if (data && appIds.indexOf(data.id) != -1) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Spotify auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -5,10 +5,7 @@ var Parse = require('parse/node').Parse;
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData, options) {
|
||||
if (!options) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.INTERNAL_SERVER_ERROR,
|
||||
'Twitter auth configuration missing'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Twitter auth configuration missing');
|
||||
}
|
||||
options = handleMultipleConfigurations(authData, options);
|
||||
var client = new OAuth(options);
|
||||
@@ -20,10 +17,7 @@ function validateAuthData(authData, options) {
|
||||
if (data && data.id_str == '' + authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Twitter auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -36,20 +30,14 @@ function handleMultipleConfigurations(authData, options) {
|
||||
if (Array.isArray(options)) {
|
||||
const consumer_key = authData.consumer_key;
|
||||
if (!consumer_key) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Twitter auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
|
||||
}
|
||||
options = options.filter(option => {
|
||||
return option.consumer_key == consumer_key;
|
||||
});
|
||||
|
||||
if (options.length == 0) {
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Twitter auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
|
||||
}
|
||||
options = options[0];
|
||||
}
|
||||
|
||||
@@ -11,10 +11,7 @@ function validateAuthData(authData, params) {
|
||||
if (response && response.access_token) {
|
||||
return request(
|
||||
'api.vk.com',
|
||||
'method/users.get?access_token=' +
|
||||
authData.access_token +
|
||||
'&v=' +
|
||||
params.apiVersion
|
||||
'method/users.get?access_token=' + authData.access_token + '&v=' + params.apiVersion
|
||||
).then(function (response) {
|
||||
if (
|
||||
response &&
|
||||
@@ -24,16 +21,10 @@ function validateAuthData(authData, params) {
|
||||
) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Vk auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'Vk appIds or appSecret is incorrect.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk appIds or appSecret is incorrect.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,14 @@ var Parse = require('parse/node').Parse;
|
||||
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData) {
|
||||
return graphRequest(
|
||||
'auth?access_token=' + authData.access_token + '&openid=' + authData.id
|
||||
).then(function(data) {
|
||||
if (data.errcode == 0) {
|
||||
return;
|
||||
return graphRequest('auth?access_token=' + authData.access_token + '&openid=' + authData.id).then(
|
||||
function (data) {
|
||||
if (data.errcode == 0) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'wechat auth is invalid for this user.');
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'wechat auth is invalid for this user.'
|
||||
);
|
||||
});
|
||||
);
|
||||
}
|
||||
|
||||
// Returns a promise that fulfills if this app id is valid.
|
||||
|
||||
@@ -5,14 +5,11 @@ var querystring = require('querystring');
|
||||
|
||||
// Returns a promise that fulfills iff this user id is valid.
|
||||
function validateAuthData(authData) {
|
||||
return graphRequest(authData.access_token).then(function(data) {
|
||||
return graphRequest(authData.access_token).then(function (data) {
|
||||
if (data && data.uid == authData.id) {
|
||||
return;
|
||||
}
|
||||
throw new Parse.Error(
|
||||
Parse.Error.OBJECT_NOT_FOUND,
|
||||
'weibo auth is invalid for this user.'
|
||||
);
|
||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'weibo auth is invalid for this user.');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user