UNPKG

topcoder-react-lib

Version:
117 lines (112 loc) 1.03 MB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("@topcoder-platform/tc-auth-lib"), require("babel-runtime/core-js/json/stringify"), require("babel-runtime/core-js/object/assign"), require("babel-runtime/core-js/object/keys"), require("babel-runtime/core-js/object/values"), require("babel-runtime/core-js/promise"), require("babel-runtime/core-js/set"), require("babel-runtime/core-js/set-immediate"), require("babel-runtime/helpers/asyncToGenerator"), require("babel-runtime/helpers/classCallCheck"), require("babel-runtime/helpers/createClass"), require("babel-runtime/helpers/defineProperty"), require("babel-runtime/helpers/extends"), require("babel-runtime/helpers/slicedToArray"), require("babel-runtime/helpers/toConsumableArray"), require("babel-runtime/regenerator"), require("isomorphic-fetch"), require("le_node"), require("lodash"), require("moment"), require("moment-duration-format"), require("qs"), require("redux-actions"), require("tc-core-library-js"), require("to-capital-case"), require("topcoder-react-utils")); else if(typeof define === 'function' && define.amd) define(["@topcoder-platform/tc-auth-lib", "babel-runtime/core-js/json/stringify", "babel-runtime/core-js/object/assign", "babel-runtime/core-js/object/keys", "babel-runtime/core-js/object/values", "babel-runtime/core-js/promise", "babel-runtime/core-js/set", "babel-runtime/core-js/set-immediate", "babel-runtime/helpers/asyncToGenerator", "babel-runtime/helpers/classCallCheck", "babel-runtime/helpers/createClass", "babel-runtime/helpers/defineProperty", "babel-runtime/helpers/extends", "babel-runtime/helpers/slicedToArray", "babel-runtime/helpers/toConsumableArray", "babel-runtime/regenerator", "isomorphic-fetch", "le_node", "lodash", "moment", "moment-duration-format", "qs", "redux-actions", "tc-core-library-js", "to-capital-case", "topcoder-react-utils"], factory); else if(typeof exports === 'object') exports["topcoder-react-lib"] = factory(require("@topcoder-platform/tc-auth-lib"), require("babel-runtime/core-js/json/stringify"), require("babel-runtime/core-js/object/assign"), require("babel-runtime/core-js/object/keys"), require("babel-runtime/core-js/object/values"), require("babel-runtime/core-js/promise"), require("babel-runtime/core-js/set"), require("babel-runtime/core-js/set-immediate"), require("babel-runtime/helpers/asyncToGenerator"), require("babel-runtime/helpers/classCallCheck"), require("babel-runtime/helpers/createClass"), require("babel-runtime/helpers/defineProperty"), require("babel-runtime/helpers/extends"), require("babel-runtime/helpers/slicedToArray"), require("babel-runtime/helpers/toConsumableArray"), require("babel-runtime/regenerator"), require("isomorphic-fetch"), require("le_node"), require("lodash"), require("moment"), require("moment-duration-format"), require("qs"), require("redux-actions"), require("tc-core-library-js"), require("to-capital-case"), require("topcoder-react-utils")); else root["topcoder-react-lib"] = factory(root["@topcoder-platform/tc-auth-lib"], root["babel-runtime/core-js/json/stringify"], root["babel-runtime/core-js/object/assign"], root["babel-runtime/core-js/object/keys"], root["babel-runtime/core-js/object/values"], root["babel-runtime/core-js/promise"], root["babel-runtime/core-js/set"], root["babel-runtime/core-js/set-immediate"], root["babel-runtime/helpers/asyncToGenerator"], root["babel-runtime/helpers/classCallCheck"], root["babel-runtime/helpers/createClass"], root["babel-runtime/helpers/defineProperty"], root["babel-runtime/helpers/extends"], root["babel-runtime/helpers/slicedToArray"], root["babel-runtime/helpers/toConsumableArray"], root["babel-runtime/regenerator"], root["isomorphic-fetch"], root["le_node"], root["lodash"], root["moment"], root["moment-duration-format"], root["qs"], root["redux-actions"], root["tc-core-library-js"], root["to-capital-case"], root["topcoder-react-utils"]); })(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__topcoder_platform_tc_auth_lib__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_json_stringify__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_object_assign__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_object_keys__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_object_values__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_promise__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_set__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_set_immediate__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_asyncToGenerator__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_classCallCheck__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_createClass__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_defineProperty__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_extends__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_slicedToArray__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_toConsumableArray__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_regenerator__, __WEBPACK_EXTERNAL_MODULE_isomorphic_fetch__, __WEBPACK_EXTERNAL_MODULE_le_node__, __WEBPACK_EXTERNAL_MODULE_lodash__, __WEBPACK_EXTERNAL_MODULE_moment__, __WEBPACK_EXTERNAL_MODULE_moment_duration_format__, __WEBPACK_EXTERNAL_MODULE_qs__, __WEBPACK_EXTERNAL_MODULE_redux_actions__, __WEBPACK_EXTERNAL_MODULE_tc_core_library_js__, __WEBPACK_EXTERNAL_MODULE_to_capital_case__, __WEBPACK_EXTERNAL_MODULE_topcoder_react_utils__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/Base64/base64.js": /*!***************************************!*\ !*** ./node_modules/Base64/base64.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval(";(function () {\n\n var\n object = true ? exports : undefined, // #8: web workers\n chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n INVALID_CHARACTER_ERR = (function () {\n // fabricate a suitable error object\n try { document.createElement('$'); }\n catch (error) { return error; }}());\n\n // encoder\n // [https://gist.github.com/999166] by [https://github.com/nignag]\n object.btoa || (\n object.btoa = function (input) {\n for (\n // initialize result and counter\n var block, charCode, idx = 0, map = chars, output = '';\n // if the next input index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n input.charAt(idx | 0) || (map = '=', idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = input.charCodeAt(idx += 3/4);\n if (charCode > 0xFF) throw INVALID_CHARACTER_ERR;\n block = block << 8 | charCode;\n }\n return output;\n });\n\n // decoder\n // [https://gist.github.com/1020396] by [https://github.com/atk]\n object.atob || (\n object.atob = function (input) {\n input = input.replace(/=+$/, '')\n if (input.length % 4 == 1) throw INVALID_CHARACTER_ERR;\n for (\n // initialize result and counters\n var bc = 0, bs, buffer, idx = 0, output = '';\n // get next character\n buffer = input.charAt(idx++);\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n });\n\n}());\n\n\n//# sourceURL=webpack://topcoder-react-lib/./node_modules/Base64/base64.js?"); /***/ }), /***/ "./node_modules/auth0-js/index.js": /*!****************************************!*\ !*** ./node_modules/auth0-js/index.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * Module dependencies.\n */\n\nvar Base64Url = __webpack_require__(/*! ./lib/base64_url */ \"./node_modules/auth0-js/lib/base64_url.js\");\nvar assert_required = __webpack_require__(/*! ./lib/assert_required */ \"./node_modules/auth0-js/lib/assert_required.js\");\nvar is_array = __webpack_require__(/*! ./lib/is-array */ \"./node_modules/auth0-js/lib/is-array.js\");\nvar index_of = __webpack_require__(/*! ./lib/index-of */ \"./node_modules/auth0-js/lib/index-of.js\");\n\nvar qs = __webpack_require__(/*! qs */ \"qs\");\nvar xtend = __webpack_require__(/*! xtend */ \"./node_modules/xtend/index.js\");\nvar trim = __webpack_require__(/*! trim */ \"./node_modules/trim/index.js\");\nvar reqwest = __webpack_require__(/*! reqwest */ \"./node_modules/reqwest/reqwest.js\");\nvar WinChan = __webpack_require__(/*! winchan */ \"./node_modules/winchan/winchan.js\");\n\nvar jsonp = __webpack_require__(/*! jsonp */ \"./node_modules/jsonp/index.js\");\nvar jsonpOpts = { param: 'cbx', timeout: 8000, prefix: '__auth0jp' };\n\nvar same_origin = __webpack_require__(/*! ./lib/same-origin */ \"./node_modules/auth0-js/lib/same-origin.js\");\nvar json_parse = __webpack_require__(/*! ./lib/json-parse */ \"./node_modules/auth0-js/lib/json-parse.js\");\nvar LoginError = __webpack_require__(/*! ./lib/LoginError */ \"./node_modules/auth0-js/lib/LoginError.js\");\nvar use_jsonp = __webpack_require__(/*! ./lib/use_jsonp */ \"./node_modules/auth0-js/lib/use_jsonp.js\");\n\n/**\n * Check if running in IE.\n *\n * @returns {Number} -1 if not IE, IE version otherwise.\n */\nfunction isInternetExplorer() {\n var rv = -1; // Return value assumes failure.\n var ua = navigator.userAgent;\n var re;\n if (navigator.appName === 'Microsoft Internet Explorer') {\n re = new RegExp('MSIE ([0-9]{1,}[\\.0-9]{0,})');\n if (re.exec(ua) != null) {\n rv = parseFloat(RegExp.$1);\n }\n }\n // IE > 11\n else if (ua.indexOf('Trident') > -1) {\n re = new RegExp('rv:([0-9]{2,2}[\\.0-9]{0,})');\n if (re.exec(ua) !== null) {\n rv = parseFloat(RegExp.$1);\n }\n }\n\n return rv;\n}\n\n/**\n * Stringify popup options object into\n * `window.open` string options format\n *\n * @param {Object} popupOptions\n * @private\n */\n\nfunction stringifyPopupSettings(popupOptions) {\n var settings = '';\n\n for (var key in popupOptions) {\n settings += key + '=' + popupOptions[key] + ',';\n }\n\n return settings.slice(0, -1);\n}\n\n\n/**\n * Check that a key has been set to something different than null\n * or undefined.\n *\n * @param {Object} obj\n * @param {String} key\n */\nfunction checkIfSet(obj, key) {\n /*\n * false != null -> true\n * true != null -> true\n * undefined != null -> false\n * null != null -> false\n */\n return !!(obj && obj[key] != null);\n}\n\nfunction handleRequestError(err, callback) {\n var status = err.status;\n var responseText = 'string' === typeof err.responseText ? err.responseText : err;\n\n var isAffectedIEVersion = isInternetExplorer() === 10 || isInternetExplorer() === 11;\n var zeroStatus = (!status || status === 0);\n\n var onLine = !!window.navigator.onLine;\n\n // Request failed because we are offline.\n if (zeroStatus && !onLine ) {\n status = 0;\n responseText = {\n code: 'offline'\n };\n // http://stackoverflow.com/questions/23229723/ie-10-11-cors-status-0\n // XXX IE10 when a request fails in CORS returns status code 0\n // See: http://caniuse.com/#search=navigator.onLine\n } else if (zeroStatus && isAffectedIEVersion) {\n status = 401;\n responseText = {\n code: 'invalid_user_password'\n };\n // If not IE10/11 and not offline it means that Auth0 host is unreachable:\n // Connection Timeout or Connection Refused.\n } else if (zeroStatus) {\n status = 0;\n responseText = {\n code: 'connection_refused_timeout'\n };\n }\n\n var error = new LoginError(status, responseText);\n callback(error);\n}\n\n/**\n * join url from protocol\n */\n\nfunction joinUrl(protocol, domain, endpoint) {\n return protocol + '//' + domain + endpoint;\n}\n\n/**\n * Create an `Auth0` instance with `options`\n *\n * @class Auth0\n * @constructor\n */\nfunction Auth0 (options) {\n // XXX Deprecated: We prefer new Auth0(...)\n if (!(this instanceof Auth0)) {\n return new Auth0(options);\n }\n\n assert_required(options, 'clientID');\n assert_required(options, 'domain');\n\n this._useJSONP = null != options.forceJSONP ?\n !!options.forceJSONP :\n use_jsonp() && !same_origin('https:', options.domain);\n\n this._clientID = options.clientID;\n this._callbackURL = options.callbackURL || document.location.href;\n this._shouldRedirect = !!options.callbackURL;\n this._domain = options.domain;\n this._callbackOnLocationHash = false || options.callbackOnLocationHash;\n this._cordovaSocialPlugins = {\n facebook: this._phonegapFacebookLogin\n };\n this._useCordovaSocialPlugins = false || options.useCordovaSocialPlugins;\n this._sendClientInfo = null != options.sendSDKClientInfo ? options.sendSDKClientInfo : true;\n}\n\n/**\n * Export version with `Auth0` constructor\n *\n * @property {String} version\n */\n\nAuth0.version = __webpack_require__(/*! ./version */ \"./node_modules/auth0-js/version.js\").str;\n\n/**\n * Export client info object\n *\n *\n * @property {Hash}\n */\n\nAuth0.clientInfo = { name: 'auth0.js', version: Auth0.version };\n\n\n/**\n * Wraps calls to window.open so it can be overriden in Electron.\n *\n * In Electron, window.open returns an object which provides limited control\n * over the opened window (see\n * http://electron.atom.io/docs/v0.36.0/api/window-open/).\n */\nAuth0.prototype.openWindow = function(url, name, options) {\n return window.open(url, name, stringifyPopupSettings(options));\n}\n\n/**\n * Redirect current location to `url`\n *\n * @param {String} url\n * @private\n */\n\nAuth0.prototype._redirect = function (url) {\n global.window.location = url;\n};\n\nAuth0.prototype._getCallbackOnLocationHash = function(options) {\n return (options && typeof options.callbackOnLocationHash !== 'undefined') ?\n options.callbackOnLocationHash : this._callbackOnLocationHash;\n};\n\nAuth0.prototype._getCallbackURL = function(options) {\n return (options && typeof options.callbackURL !== 'undefined') ?\n options.callbackURL : this._callbackURL;\n};\n\nAuth0.prototype._getClientInfoString = function () {\n var clientInfo = JSON.stringify(Auth0.clientInfo);\n return Base64Url.encode(clientInfo);\n};\n\nAuth0.prototype._getClientInfoHeader = function () {\n return {\n 'Auth0-Client': this._getClientInfoString()\n };\n};\n\n/**\n * Renders and submits a WSFed form\n *\n * @param {Object} options\n * @param {Function} formHtml\n * @private\n */\n\nAuth0.prototype._renderAndSubmitWSFedForm = function (options, formHtml) {\n var div = document.createElement('div');\n div.innerHTML = formHtml;\n var form = document.body.appendChild(div).children[0];\n\n if (options.popup && !this._getCallbackOnLocationHash(options)) {\n form.target = 'auth0_signup_popup';\n }\n\n form.submit();\n};\n\n/**\n * Resolve response type as `token` or `code`\n *\n * @return {Object} `scope` and `response_type` properties\n * @private\n */\n\nAuth0.prototype._getMode = function (options) {\n return {\n scope: 'openid',\n response_type: this._getCallbackOnLocationHash(options) ? 'token' : 'code'\n };\n};\n\nAuth0.prototype._configureOfflineMode = function(options) {\n if (options.scope && options.scope.indexOf('offline_access') >= 0) {\n options.device = options.device || 'Browser';\n }\n};\n\n/**\n * Get user information from API\n *\n * @param {Object} profile\n * @param {String} id_token\n * @param {Function} callback\n * @private\n */\n\nAuth0.prototype._getUserInfo = function (profile, id_token, callback) {\n\n if (!(profile && !profile.user_id)) {\n return callback(null, profile);\n }\n\n // the scope was just openid\n var _this = this;\n var protocol = 'https:';\n var domain = this._domain;\n var endpoint = '/tokeninfo';\n var url = joinUrl(protocol, domain, endpoint);\n\n var fail = function (status, description) {\n var error = new Error(status + ': ' + (description || ''));\n\n // These two properties are added for compatibility with old versions (no Error instance was returned)\n error.error = status;\n error.error_description = description;\n\n callback(error);\n };\n\n if (this._useJSONP) {\n return jsonp(url + '?' + qs.stringify({id_token: id_token}), jsonpOpts, function (err, resp) {\n if (err) {\n return fail(0, err.toString());\n }\n\n return resp.status === 200 ?\n callback(null, resp.user) :\n fail(resp.status, resp.err || resp.error);\n });\n }\n\n return reqwest({\n url: same_origin(protocol, domain) ? endpoint : url,\n method: 'post',\n type: 'json',\n crossOrigin: !same_origin(protocol, domain),\n data: {id_token: id_token}\n }).fail(function (err) {\n fail(err.status, err.responseText);\n }).then(function (userinfo) {\n callback(null, userinfo);\n });\n\n};\n\n/**\n * Get profile data by `id_token`\n *\n * @param {String} id_token\n * @param {Function} callback\n * @method getProfile\n */\n\nAuth0.prototype.getProfile = function (id_token, callback) {\n if ('function' !== typeof callback) {\n throw new Error('A callback function is required');\n }\n if (!id_token || typeof id_token !== 'string') {\n return callback(new Error('Invalid token'));\n }\n\n this._getUserInfo(this.decodeJwt(id_token), id_token, callback);\n};\n\n/**\n * Validate a user\n *\n * @param {Object} options\n * @param {Function} callback\n * @method validateUser\n */\n\nAuth0.prototype.validateUser = function (options, callback) {\n var protocol = 'https:';\n var domain = this._domain;\n var endpoint = '/public/api/users/validate_userpassword';\n var url = joinUrl(protocol, domain, endpoint);\n\n var query = xtend(\n options,\n {\n client_id: this._clientID,\n username: trim(options.username || options.email || '')\n });\n\n if (this._useJSONP) {\n return jsonp(url + '?' + qs.stringify(query), jsonpOpts, function (err, resp) {\n if (err) {\n return callback(err);\n }\n if('error' in resp && resp.status !== 404) {\n return callback(new Error(resp.error));\n }\n callback(null, resp.status === 200);\n });\n }\n\n reqwest({\n url: same_origin(protocol, domain) ? endpoint : url,\n method: 'post',\n type: 'text',\n data: query,\n crossOrigin: !same_origin(protocol, domain),\n error: function (err) {\n if (err.status !== 404) { return callback(new Error(err.responseText)); }\n callback(null, false);\n },\n success: function (resp) {\n callback(null, resp.status === 200);\n }\n });\n};\n\n/**\n * Decode Json Web Token\n *\n * @param {String} jwt\n * @method decodeJwt\n */\n\nAuth0.prototype.decodeJwt = function (jwt) {\n var encoded = jwt && jwt.split('.')[1];\n return json_parse(Base64Url.decode(encoded));\n};\n\n/**\n * Given the hash (or a query) of an URL returns a dictionary with only relevant\n * authentication information. If succeeds it will return the following fields:\n * `profile`, `id_token`, `access_token` and `state`. In case of error, it will\n * return `error` and `error_description`.\n *\n * @method parseHash\n * @param {String} [hash=window.location.hash] URL to be parsed\n * @example\n * var auth0 = new Auth0({...});\n *\n * // Returns {profile: {** decoded id token **}, state: \"good\"}\n * auth0.parseHash('#id_token=.....&state=good&foo=bar');\n *\n * // Returns {error: \"invalid_credentials\", error_description: undefined}\n * auth0.parseHash('#error=invalid_credentials');\n *\n * // Returns {error: \"invalid_credentials\", error_description: undefined}\n * auth0.parseHash('?error=invalid_credentials');\n *\n */\n\nAuth0.prototype.parseHash = function (hash) {\n hash = hash || window.location.hash;\n var parsed_qs;\n if (hash.match(/error/)) {\n hash = hash.substr(1).replace(/^\\//, '');\n parsed_qs = qs.parse(hash);\n var err = {\n error: parsed_qs.error,\n error_description: parsed_qs.error_description\n };\n return err;\n }\n if(!hash.match(/access_token/)) {\n // Invalid hash URL\n return null;\n }\n hash = hash.substr(1).replace(/^\\//, '');\n parsed_qs = qs.parse(hash);\n var id_token = parsed_qs.id_token;\n var refresh_token = parsed_qs.refresh_token;\n var prof = this.decodeJwt(id_token);\n var invalidJwt = function (error) {\n var err = {\n error: 'invalid_token',\n error_description: error\n };\n return err;\n };\n\n // aud should be the clientID\n var audiences = is_array(prof.aud) ? prof.aud : [ prof.aud ];\n if (index_of(audiences, this._clientID) === -1) {\n return invalidJwt(\n 'The clientID configured (' + this._clientID + ') does not match with the clientID set in the token (' + audiences.join(', ') + ').');\n }\n\n // iss should be the Auth0 domain (i.e.: https://contoso.auth0.com/)\n if (prof.iss && prof.iss !== 'https://' + this._domain + '/') {\n return invalidJwt(\n 'The domain configured (https://' + this._domain + '/) does not match with the domain set in the token (' + prof.iss + ').');\n }\n\n return {\n profile: prof,\n id_token: id_token,\n access_token: parsed_qs.access_token,\n state: parsed_qs.state,\n refresh_token: refresh_token\n };\n};\n\n/**\n * Signup\n *\n * @param {Object} options Signup Options\n * @param {String} email New user email\n * @param {String} password New user password\n *\n * @param {Function} callback\n * @method signup\n */\n\nAuth0.prototype.signup = function (options, callback) {\n var _this = this;\n\n var opts = {\n client_id: this._clientID,\n redirect_uri: this._getCallbackURL(options),\n username: trim(options.username || ''),\n email: trim(options.email || options.username || ''),\n tenant: this._domain.split('.')[0]\n };\n\n var query = xtend(this._getMode(options), options, opts);\n\n this._configureOfflineMode(query);\n\n // TODO Change this to a property named 'disableSSO' for consistency.\n // By default, options.sso is true\n if (!checkIfSet(options, 'sso')) {\n options.sso = true;\n }\n\n if (!checkIfSet(options, 'auto_login')) {\n options.auto_login = true;\n }\n\n var popup;\n\n var will_popup = options.auto_login && options.popup\n && (!this._getCallbackOnLocationHash(options) || options.sso);\n\n if (will_popup) {\n popup = this._buildPopupWindow(options);\n }\n\n function success () {\n if (options.auto_login) {\n return _this.login(options, callback);\n }\n\n if ('function' === typeof callback) {\n return callback();\n }\n }\n\n function fail (status, resp) {\n var error = new LoginError(status, resp);\n\n // when failed we want the popup closed if opened\n if (popup && 'function' === typeof popup.kill) {\n popup.kill();\n }\n\n if ('function' === typeof callback) {\n return callback(error);\n }\n\n throw error;\n }\n\n var protocol = 'https:';\n var domain = this._domain;\n var endpoint = '/dbconnections/signup';\n var url = joinUrl(protocol, domain, endpoint);\n\n if (this._useJSONP) {\n return jsonp(url + '?' + qs.stringify(query), jsonpOpts, function (err, resp) {\n if (err) {\n return fail(0, err);\n }\n\n return resp.status == 200 ? success() :\n fail(resp.status, resp.err || resp.error);\n });\n }\n\n reqwest({\n url: same_origin(protocol, domain) ? endpoint : url,\n method: 'post',\n type: 'html',\n data: query,\n success: success,\n crossOrigin: !same_origin(protocol, domain),\n error: function (err) {\n fail(err.status, err.responseText);\n }\n });\n};\n\n/**\n * Change password\n *\n * @param {Object} options\n * @param {Function} callback\n * @method changePassword\n */\n\nAuth0.prototype.changePassword = function (options, callback) {\n var query = {\n tenant: this._domain.split('.')[0],\n client_id: this._clientID,\n connection: options.connection,\n username: trim(options.username || ''),\n email: trim(options.email || options.username || ''),\n password: options.password\n };\n\n\n function fail (status, resp) {\n var error = new LoginError(status, resp);\n if (callback) {\n return callback(error);\n }\n }\n\n var protocol = 'https:';\n var domain = this._domain;\n var endpoint = '/dbconnections/change_password';\n var url = joinUrl(protocol, domain, endpoint);\n\n if (this._useJSONP) {\n return jsonp(url + '?' + qs.stringify(query), jsonpOpts, function (err, resp) {\n if (err) {\n return fail(0, err);\n }\n return resp.status == 200 ?\n callback(null, resp.message) :\n fail(resp.status, resp.err || resp.error);\n });\n }\n\n reqwest({\n url: same_origin(protocol, domain) ? endpoint : url,\n method: 'post',\n type: 'html',\n data: query,\n crossOrigin: !same_origin(protocol, domain),\n error: function (err) {\n fail(err.status, err.responseText);\n },\n success: function (r) {\n callback(null, r);\n }\n });\n};\n\n/**\n * Builds query string to be passed to /authorize based on dict key and values.\n *\n * @param {Array} args\n * @param {Array} blacklist\n * @private\n */\n\nAuth0.prototype._buildAuthorizeQueryString = function (args, blacklist) {\n var query = this._buildAuthorizationParameters(args, blacklist);\n return qs.stringify(query);\n};\n\n/**\n * Builds parameter dictionary to be passed to /authorize based on dict key and values.\n *\n * @param {Array} args\n * @param {Array} blacklist\n * @private\n */\n\nAuth0.prototype._buildAuthorizationParameters = function(args, blacklist) {\n var query = xtend.apply(null, args);\n\n // Adds offline mode to the query\n this._configureOfflineMode(query);\n\n // Adds client SDK information (when enabled)\n if ( this._sendClientInfo ) query['auth0Client'] = this._getClientInfoString();\n\n // Elements to filter from query string\n blacklist = blacklist || ['popup', 'popupOptions'];\n\n var i, key;\n\n for (i = 0; i < blacklist.length; i++) {\n key = blacklist[i];\n delete query[key];\n }\n\n if (query.connection_scope && is_array(query.connection_scope)){\n query.connection_scope = query.connection_scope.join(',');\n }\n\n return query;\n};\n\n/**\n * Login user\n *\n * @param {Object} options\n * @param {Function} callback\n * @method login\n */\n\nAuth0.prototype.login = Auth0.prototype.signin = function (options, callback) {\n // TODO Change this to a property named 'disableSSO' for consistency.\n // By default, options.sso is true\n if (!checkIfSet(options, 'sso')) {\n options.sso = true;\n }\n\n if (typeof options.passcode !== 'undefined') {\n return this.loginWithPasscode(options, callback);\n }\n\n if (typeof options.username !== 'undefined' ||\n typeof options.email !== 'undefined') {\n return this.loginWithUsernamePassword(options, callback);\n }\n\n if (!!window.cordova || !!window.electron) {\n return this.loginPhonegap(options, callback);\n }\n\n if (!!options.popup && this._getCallbackOnLocationHash(options)) {\n return this.loginWithPopup(options, callback);\n }\n\n this._authorize(options);\n};\n\nAuth0.prototype._authorize = function(options) {\n var qs = [\n this._getMode(options),\n options,\n {\n client_id: this._clientID,\n redirect_uri: this._getCallbackURL(options)\n }\n ];\n\n var query = this._buildAuthorizeQueryString(qs);\n\n var url = joinUrl('https:', this._domain, '/authorize?' + query);\n\n if (options.popup) {\n this._buildPopupWindow(options, url);\n } else {\n this._redirect(url);\n }\n};\n\n/**\n * Compute `options.width` and `options.height` for the popup to\n * open and return and extended object with optimal `top` and `left`\n * position arguments for the popup windows\n *\n * @param {Object} options\n * @private\n */\n\nAuth0.prototype._computePopupPosition = function (options) {\n options = options || {};\n var width = options.width || 500;\n var height = options.height || 600;\n\n var screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;\n var screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;\n var outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.body.clientWidth;\n var outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : (document.body.clientHeight - 22);\n // XXX: what is the 22?\n\n // Use `outerWidth - width` and `outerHeight - height` for help in\n // positioning the popup centered relative to the current window\n var left = screenX + (outerWidth - width) / 2;\n var top = screenY + (outerHeight - height) / 2;\n\n return { width: width, height: height, left: left, top: top };\n};\n\n/**\n * loginPhonegap method is triggered when !!window.cordova is true.\n *\n * @method loginPhonegap\n * @private\n * @param {Object} options Login options.\n * @param {Function} callback To be called after login happened. Callback arguments\n * should be:\n * function (err, profile, idToken, accessToken, state)\n *\n * @example\n * var auth0 = new Auth0({ clientId: '...', domain: '...'});\n *\n * auth0.signin({}, function (err, profile, idToken, accessToken, state) {\n * if (err) {\n * alert(err);\n * return;\n * }\n *\n * alert('Welcome ' + profile.name);\n * });\n */\n\nAuth0.prototype.loginPhonegap = function (options, callback) {\n if (this._shouldAuthenticateWithCordovaPlugin(options.connection)) {\n this._socialPhonegapLogin(options, callback);\n return;\n }\n\n var mobileCallbackURL = joinUrl('https:', this._domain, '/mobile');\n var _this = this;\n var qs = [\n this._getMode(options),\n options,\n {\n client_id: this._clientID,\n redirect_uri: mobileCallbackURL\n }\n ];\n\n if ( this._sendClientInfo ) {\n qs.push({ auth0Client: this._getClientInfoString() });\n }\n\n var query = this._buildAuthorizeQueryString(qs);\n\n var popupUrl = joinUrl('https:', this._domain, '/authorize?' + query);\n\n var popupOptions = xtend({location: 'yes'} ,\n options.popupOptions);\n\n // This wasn't send before so we don't send it now either\n delete popupOptions.width;\n delete popupOptions.height;\n\n var ref = this.openWindow(popupUrl, '_blank', popupOptions);\n var answered = false;\n\n function errorHandler(event) {\n if (answered) { return; }\n callback(new Error(event.message), null, null, null, null);\n answered = true;\n return ref.close();\n }\n\n function startHandler(event) {\n if (answered) { return; }\n\n if ( event.url && !(event.url.indexOf(mobileCallbackURL + '#') === 0 ||\n event.url.indexOf(mobileCallbackURL + '?') === 0)) { return; }\n\n var result = _this.parseHash(event.url.slice(mobileCallbackURL.length));\n\n if (!result) {\n callback(new Error('Error parsing hash'), null, null, null, null);\n answered = true;\n return ref.close();\n }\n\n if (result.id_token) {\n _this.getProfile(result.id_token, function (err, profile) {\n callback(err, profile, result.id_token, result.access_token, result.state, result.refresh_token);\n });\n answered = true;\n return ref.close();\n }\n\n // Case where we've found an error\n callback(new Error(result.err || result.error || 'Something went wrong'), null, null, null, null);\n answered = true;\n return ref.close();\n }\n\n function exitHandler() {\n if (answered) { return; }\n\n callback(new Error('Browser window closed'), null, null, null, null);\n\n ref.removeEventListener('loaderror', errorHandler);\n ref.removeEventListener('loadstart', startHandler);\n ref.removeEventListener('exit', exitHandler);\n }\n\n ref.addEventListener('loaderror', errorHandler);\n ref.addEventListener('loadstart', startHandler);\n ref.addEventListener('exit', exitHandler);\n\n};\n\n/**\n * loginWithPopup method is triggered when login method receives a {popup: true} in\n * the login options.\n *\n * @method loginWithPopup\n * @param {Object} options Login options.\n * @param {function} callback To be called after login happened (whether\n * success or failure). This parameter is mandatory when\n * option callbackOnLocationHash is truthy but should not\n * be used when falsy.\n * @example\n * var auth0 = new Auth0({ clientId: '...', domain: '...', callbackOnLocationHash: true });\n *\n * // Error! No callback\n * auth0.login({popup: true});\n *\n * // Ok!\n * auth0.login({popup: true}, function () { });\n *\n * @example\n * var auth0 = new Auth0({ clientId: '...', domain: '...'});\n *\n * // Ok!\n * auth0.login({popup: true});\n *\n * // Error! No callback will be executed on response_type=code\n * auth0.login({popup: true}, function () { });\n * @private\n */\n\nAuth0.prototype.loginWithPopup = function(options, callback) {\n var _this = this;\n\n if (!callback) {\n throw new Error('popup mode should receive a mandatory callback');\n }\n\n var qs = [this._getMode(options), options, { client_id: this._clientID, owp: true }];\n\n if (this._sendClientInfo) {\n qs.push({ auth0Client: this._getClientInfoString() });\n }\n\n var query = this._buildAuthorizeQueryString(qs);\n var popupUrl = joinUrl('https:', this._domain, '/authorize?' + query);\n\n var popupPosition = this._computePopupPosition(options.popupOptions);\n var popupOptions = xtend(popupPosition, options.popupOptions);\n\n var popup = WinChan.open({\n url: popupUrl,\n relay_url: 'https://' + this._domain + '/relay.html',\n window_features: stringifyPopupSettings(popupOptions)\n }, function (err, result) {\n // Eliminate `_current_popup` reference manually because\n // Winchan removes `.kill()` method from window and also\n // doesn't call `.kill()` by itself\n _this._current_popup = null;\n\n // Winchan always returns string errors, we wrap them inside Error objects\n if (err) {\n return callback(new LoginError(err), null, null, null, null, null);\n }\n\n // Handle edge case with generic error\n if (!result) {\n return callback(new LoginError('Something went wrong'), null, null, null, null, null);\n }\n\n // Handle profile retrieval from id_token and respond\n if (result.id_token) {\n return _this.getProfile(result.id_token, function (err, profile) {\n callback(err, profile, result.id_token, result.access_token, result.state, result.refresh_token);\n });\n }\n\n // Case where the error is returned at an `err` property from the result\n if (result.err) {\n return callback(new LoginError(result.err.status, result.err.details || result.err), null, null, null, null, null);\n }\n\n // Case for sso_dbconnection_popup returning error at result.error instead of result.err\n if (result.error) {\n return callback(new LoginError(result.status, result.details || result), null, null, null, null, null);\n }\n\n // Case we couldn't match any error, we return a generic one\n return callback(new LoginError('Something went wrong'), null, null, null, null, null);\n });\n\n popup.focus();\n};\n\n/**\n * _shouldAuthenticateWithCordovaPlugin method checks whether Auth0 is properly configured to\n * handle authentication of a social connnection using a phonegap plugin.\n *\n * @param {String} connection Name of the connection.\n * @private\n */\n\nAuth0.prototype._shouldAuthenticateWithCordovaPlugin = function(connection) {\n var socialPlugin = this._cordovaSocialPlugins[connection];\n return this._useCordovaSocialPlugins && !!socialPlugin;\n};\n\n/**\n * _socialPhonegapLogin performs social authentication using a phonegap plugin\n *\n * @param {String} connection Name of the connection.\n * @param {function} callback To be called after login happened (whether\n * success or failure).\n * @private\n */\n\nAuth0.prototype._socialPhonegapLogin = function(options, callback) {\n var socialAuthentication = this._cordovaSocialPlugins[options.connection];\n var _this = this;\n socialAuthentication(options.connection_scope, function(error, accessToken, extras) {\n if (error) {\n callback(error, null, null, null, null);\n return;\n }\n var loginOptions = xtend({ access_token: accessToken }, options, extras);\n _this.loginWithSocialAccessToken(loginOptions, callback);\n });\n};\n\n/**\n * _phonegapFacebookLogin performs social authentication with Facebook using phonegap-facebook-plugin\n *\n * @param {Object} scopes FB scopes used to login. It can be an Array of String or a single String.\n * By default is [\"public_profile\"]\n * @param {function} callback To be called after login happened (whether success or failure). It will\n * yield the accessToken and any extra information neeeded by Auth0 API\n * or an Error if the authentication fails. Callback should be:\n * function (err, accessToken, extras) { }\n * @private\n */\n\nAuth0.prototype._phonegapFacebookLogin = function(scopes, callback) {\n if (!window.facebookConnectPlugin || !window.facebookConnectPlugin.login) {\n callback(new Error('missing plugin phonegap-facebook-plugin'), null, null);\n return;\n }\n\n var fbScopes;\n if (scopes && is_array(scopes)){\n fbScopes = scopes;\n } else if (scopes) {\n fbScopes = [scopes];\n } else {\n fbScopes = ['public_profile'];\n }\n window.facebookConnectPlugin.login(fbScopes, function (state) {\n callback(null, state.authResponse.accessToken, {});\n }, function(error) {\n callback(new Error(error), null, null);\n });\n};\n\n/**\n * This method handles the scenario where a db connection is used with\n * popup: true and sso: true.\n *\n * @private\n */\nAuth0.prototype.loginWithUsernamePasswordAndSSO = function (options, callback) {\n var _this = this;\n var popupPosition = this._computePopupPosition(options.popupOptions);\n var popupOptions = xtend(popupPosition, options.popupOptions);\n\n var payload = {\n // TODO What happens with i18n?\n username: options.username,\n password: options.password,\n connection: options.connection,\n state: options.state,\n scope: options.scope\n };\n\n if (options._csrf) {\n payload._csrf = options._csrf;\n }\n\n var popup = WinChan.open({\n url: 'https://' + this._domain + '/sso_dbconnection_popup/' + this._clientID,\n relay_url: 'https://' + this._domain + '/relay.html',\n window_features: stringifyPopupSettings(popupOptions),\n popup: this._current_popup,\n params: {\n domain: this._domain,\n clientID: this._clientID,\n options: payload\n }\n }, function (err, result) {\n // Eliminate `_current_popup` reference manually because\n // Winchan removes `.kill()` method from window and also\n // doesn't call `.kill()` by itself\n _this._current_popup = null;\n\n // Winchan always returns string errors, we wrap them inside Error objects\n if (err) {\n return callback(new LoginError(err), null, null, null, null, null);\n }\n\n // Handle edge case with generic error\n if (!result) {\n return callback(new LoginError('Something went wrong'), null, null, null, null, null);\n }\n\n // Handle profile retrieval from id_token and respond\n if (result.id_token) {\n return _this.getProfile(result.id_token, function (err, profile) {\n callback(err, profile, result.id_token, result.access_token, result.state, result.refresh_token);\n });\n }\n\n // Case where the error is returned at an `err` property from the result\n if (result.err) {\n return callback(new LoginError(result.err.status, result.err.details || result.err), null, null, null, null, null);\n }\n\n // Case for sso_dbconnection_popup returning error at result.error instead of result.err\n if (result.error) {\n return callback(new LoginError(result.status, result.details || result), null, null, null, null, null);\n }\n\n // Case we couldn't match any error, we return a generic one\n return callback(new LoginError('Something went wrong'), null, null, null, null, null);\n });\n\n popup.focus();\n};\n\n/**\n * Login with Resource Owner (RO)\n *\n * @param {Object} options\n * @param {Function} callback\n * @method loginWithResourceOwner\n */\n\nAuth0.prototype.loginWithResourceOwner = function (options, callback) {\n var _this = this;\n var query = xtend(\n this._getMode(options),\n options,\n {\n client_id: this._clientID,\n username: trim(options.username || options.email || ''),\n grant_type: 'password'\n });\n\n this._configureOfflineMode(query);\n\n var protocol = 'https:';\n var domain = this._domain;\n var endpoint = '/oauth/ro';\n var url = joinUrl(protocol, domain, endpoint);\n\n if ( this._sendClientInfo && this._useJSONP ) {\n query['auth0Client'] = this._getClientInfoString();\n }\n\n function enrichGetProfile(resp, callback) {\n _this.getProfile(resp.id_token, function (err, profile) {\n callback(err, profile, resp.id_token, resp.access_token, resp.state, resp.refresh_token);\n });\n }\n\n if (this._useJSONP) {\n return jsonp(url + '?' + qs.stringify(query), jsonpOpts, function (err, resp) {\n if (err) {\n return callback(err);\n }\n if('error' in resp) {\n var error = new LoginError(resp.status, resp.error);\n return callback(error);\n }\n enrichGetProfile(resp, callback);\n });\n }\n\n reqwest({\n url: same_origin(protocol, domain) ? endpoint : url,\n method: 'post',\n type: 'json',\n data: query,\n headers: this._getClientInfoHeader(),\n crossOrigin: !same_origin(protocol, domain),\n success: function (resp) {\n enrichGetProfile(resp, callback);\n },\n error: function (err) {\n handleRequestError(err, callback);\n }\n });\n};\n\n/**\n * Login with Social Access Token\n *\n * @param {Object} options\n * @param {Function} callback\n * @method loginWithSocialAccessToken\n */\n\nAuth0.prototype.loginWithSocialAccessToken = function (options, callback) {\n var _this = this;\n var query = this._buildAuthorizationParameters([\n { scope: 'openid' },\n options,\n { client_id: this._clientID }\n ]);\n\n var protocol = 'https:';\n var domain = this._domain;\n var endpoint = '/oauth/access_token';\n var url = joinUrl(protocol, domain, endpoint);\n\n function enrichGetProfile(resp, callback) {\n _this.getProfile(resp.id_token, function (err, profile) {\n callback(err, profile, resp.id_token, resp.access_token, resp.state, resp.refresh_token);\n });\n }\n\n if (this._useJSONP) {\n return jsonp(url + '?' + qs.stringify(query), jsonpOpts, function (err, resp) {\n if (err) {\n return callback(err);\n }\n if('error' in resp) {\n var error = new LoginError(resp.status, resp.error);\n return callback(error);\n }\n enrichGetProfile(resp, callback);\n });\n }\n\n reqwest({\n url: same_origin(protocol, domain) ? endpoint : url,\n method: 'post',\n type: 'json',\n data: query,\n headers: this._getClientInfoHeader(),\n crossOrigin: !same_origin(protocol, domain),\n success: function (resp) {\n enrichGetProfile(resp, callback);\n },\n error: function (err) {\n handleRequestError(err, callback);\n }\n });\n};\n\n/**\n * Open a popup, store the winref in the instance and return it.\n *\n * We usually need to call this method before any ajax transaction in order\n * to prevent the browser to block the popup.\n *\n * @param {[type]} options [description]\n * @param {Function} callback [description]\n * @return {[type]} [description]\n * @private\n */\n\nAuth0.prototype._buildPopupWindow = function (options, url) {\n if (this._current_popup && !this._current_popup.closed) {\n return this._current_popup;\n }\n\n url = url || 'about:blank'\n\n var _this = this;\n var defaults = { width: 500, height: 600 };\n var opts = xtend(defaults, options.popupOptions || {});\n var popupOptions = stringifyPopupSettings(opts);\n\n this._current_popup = window.open(url, 'auth0_signup_popup', popupOptions);\n\n if (!this._current_popup) {\n throw new Error('Popup window cannot not been created. Disable popup blocker or make sure to call Auth0 login or singup on an UI event.');\n }\n\n this._current_popup.kill = function () {\n this.close();\n _this._current_popup = null;\n };\n\n return this._current_popup;\n};\n\n/**\n * Login with Username and Password\n *\n * @param {Object} options\n * @param {Function} callback\n * @method loginWithUsernamePassword\n */\n\nAuth0.prototype.loginWithUsernamePassword = function (options, callback) {\n // XXX: Warning: This check is whether callback arguments are\n // fn(err) case callback.length === 1 (a redirect should be performed) vs.\n // fn(err, profile, id_token, access_token, state) callback.length > 1 (no\n // redirect should be performed)\n //\