"use strict"; var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct"); var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); _Object$defineProperty2(exports, "__esModule", { value: true }); exports.default = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator")); var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise")); var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property")); var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator")); var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf")); var _AnonymousUtils = _interopRequireDefault(require("./AnonymousUtils")); var _CoreManager = _interopRequireDefault(require("./CoreManager")); var _isRevocableSession = _interopRequireDefault(require("./isRevocableSession")); var _ParseError = _interopRequireDefault(require("./ParseError")); var _ParseObject2 = _interopRequireDefault(require("./ParseObject")); var _ParseSession = _interopRequireDefault(require("./ParseSession")); var _MoralisWeb = _interopRequireDefault(require("./MoralisWeb3")); var _Storage = _interopRequireDefault(require("./Storage")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var CURRENT_USER_KEY = 'currentUser'; var canUseCurrentUser = !_CoreManager.default.get('IS_NODE'); var currentUserCacheMatchesDisk = false; var currentUserCache = null; var authProviders = {}; /** *
A Parse.User object is a local representation of a user persisted to the * Parse cloud. This class is a subclass of a Parse.Object, and retains the * same functionality of a Parse.Object, but also extends it with various * user specific methods, like authentication, signing up, and validation of * uniqueness.
* * @alias Parse.User * @augments Parse.Object */ var ParseUser = /*#__PURE__*/function (_ParseObject) { (0, _inherits2.default)(ParseUser, _ParseObject); var _super = _createSuper(ParseUser); /** * @param {object} attributes The initial set of data to store in the user. */ function ParseUser(attributes /*: ?AttributeMap*/ ) { var _this; (0, _classCallCheck2.default)(this, ParseUser); _this = _super.call(this, '_User'); if (attributes && (0, _typeof2.default)(attributes) === 'object') { if (!_this.set(attributes || {})) { throw new Error("Can't create an invalid Parse User"); } } return _this; } /** * Request a revocable session token to replace the older style of token. * * @param {object} options * @returns {Promise} A promise that is resolved when the replacement * token has been fetched. */ (0, _createClass2.default)(ParseUser, [{ key: "_upgradeToRevocableSession", value: function (options /*: RequestOptions*/ ) /*: Promisecurrent
would return this user.
*
* @returns {boolean} true if user is cached on disk
*/
}, {
key: "isCurrent",
value: function ()
/*: boolean*/
{
var current = ParseUser.current();
return !!current && current.id === this.id;
}
/**
* Returns get("username").
*
* @returns {string}
*/
}, {
key: "getUsername",
value: function ()
/*: ?string*/
{
var username = this.get('username');
if (username == null || typeof username === 'string') {
return username;
}
return '';
}
/**
* Calls set("username", username, options) and returns the result.
*
* @param {string} username
*/
}, {
key: "setUsername",
value: function (username
/*: string*/
) {
// Strip anonymity, even we do not support anonymous user in js SDK, we may
// encounter anonymous user created by android/iOS in cloud code.
var authData = this.get('authData');
if (authData && (0, _typeof2.default)(authData) === 'object' && authData.hasOwnProperty('anonymous')) {
// We need to set anonymous to null instead of deleting it in order to remove it from Parse.
authData.anonymous = null;
}
this.set('username', username);
}
/**
* Calls set("password", password, options) and returns the result.
*
* @param {string} password User's Password
*/
}, {
key: "setPassword",
value: function (password
/*: string*/
) {
this.set('password', password);
}
/**
* Returns get("email").
*
* @returns {string} User's Email
*/
}, {
key: "getEmail",
value: function ()
/*: ?string*/
{
var email = this.get('email');
if (email == null || typeof email === 'string') {
return email;
}
return '';
}
/**
* Calls set("email", email) and returns the result.
*
* @param {string} email
* @returns {boolean}
*/
}, {
key: "setEmail",
value: function (email
/*: string*/
) {
return this.set('email', email);
}
/**
* Returns the session token for this user, if the user has been logged in,
* or if it is the result of a query with the master key. Otherwise, returns
* undefined.
*
* @returns {string} the session token, or undefined
*/
}, {
key: "getSessionToken",
value: function ()
/*: ?string*/
{
var token = this.get('sessionToken');
if (token == null || typeof token === 'string') {
return token;
}
return '';
}
/**
* Checks whether this user is the current user and has been authenticated.
*
* @returns {boolean} whether this user is the current user and is logged in.
*/
}, {
key: "authenticated",
value: function ()
/*: boolean*/
{
var current = ParseUser.current();
return !!this.get('sessionToken') && !!current && current.id === this.id;
}
/**
* Signs up a new user. You should call this instead of save for
* new Parse.Users. This will create a new Parse.User on the server, and
* also persist the session on disk so that you can access the user using
* current
.
*
* A username and password must be set before calling signUp.
* * @param {object} attrs Extra fields to set on the new user, or null. * @param {object} options * @returns {Promise} A promise that is fulfilled when the signup * finishes. */ }, { key: "signUp", value: function (attrs /*: AttributeMap*/ , options /*:: ?: FullOptions*/ ) /*: Promisecurrent
.
*
* A username and password must be set before calling logIn.
* * @param {object} options * @returns {Promise} A promise that is fulfilled with the user when * the login is complete. */ }, { key: "logIn", value: function (options /*:: ?: FullOptions*/ ) /*: Promisecurrent
.
*
* @param {string} username The username (or email) to log in with.
* @param {string} password The password to log in with.
* @param {object} options
* @static
* @returns {Promise} A promise that is fulfilled with the user when
* the login completes.
*/
}, {
key: "logIn",
value: function (username
/*: string*/
, password
/*: string*/
, options
/*:: ?: FullOptions*/
) {
if (typeof username !== 'string') {
return _promise.default.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Username must be a string.'));
}
if (typeof password !== 'string') {
return _promise.default.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Password must be a string.'));
}
var user = new this();
user._finishFetch({
username: username,
password: password
});
return user.logIn(options);
}
}, {
key: "loginOrSignup",
value: function (username
/*: string*/
, password
/*: string*/
) {
var _this8 = this;
return this.logIn(username, password).catch(function (err) {
if (err.code === 101) {
var newUser = new _this8();
newUser.set('username', username);
newUser.set('password', password);
return newUser.signUp();
}
throw err;
});
}
/**
* Logs in a user with a session token. On success, this saves the session
* to disk, so you can retrieve the currently logged in user using
* current
.
*
* @param {string} sessionToken The sessionToken to log in with.
* @param {object} options
* @static
* @returns {Promise} A promise that is fulfilled with the user when
* the login completes.
*/
}, {
key: "become",
value: function (sessionToken
/*: string*/
, options
/*:: ?: RequestOptions*/
) {
if (!canUseCurrentUser) {
throw new Error('It is not memory-safe to become a user in a server environment');
}
options = options || {};
var becomeOptions
/*: RequestOptions*/
= {
sessionToken: sessionToken
};
if (options.hasOwnProperty('useMasterKey')) {
becomeOptions.useMasterKey = options.useMasterKey;
}
var controller = _CoreManager.default.getUserController();
var user = new this();
return controller.become(user, becomeOptions);
}
/**
* Retrieves a user with a session token.
*
* @param {string} sessionToken The sessionToken to get user with.
* @param {object} options
* @static
* @returns {Promise} A promise that is fulfilled with the user is fetched.
*/
}, {
key: "me",
value: function (sessionToken
/*: string*/
) {
var options
/*:: ?: RequestOptions*/
= arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var controller = _CoreManager.default.getUserController();
var meOptions
/*: RequestOptions*/
= {
sessionToken: sessionToken
};
if (options.useMasterKey) {
meOptions.useMasterKey = options.useMasterKey;
}
var user = new this();
return controller.me(user, meOptions);
}
/**
* Logs in a user with a session token. On success, this saves the session
* to disk, so you can retrieve the currently logged in user using
* current
. If there is no session token the user will not logged in.
*
* @param {object} userJSON The JSON map of the User's data
* @static
* @returns {Promise} A promise that is fulfilled with the user when
* the login completes.
*/
}, {
key: "hydrate",
value: function (userJSON
/*: AttributeMap*/
) {
var controller = _CoreManager.default.getUserController();
var user = new this();
return controller.hydrate(user, userJSON);
}
/**
* Static version of {@link https://parseplatform.org/Parse-SDK-JS/api/master/Parse.User.html#linkWith linkWith}
*
* @param provider
* @param options
* @param saveOpts
* @static
* @returns {Promise}
*/
}, {
key: "logInWith",
value: function (provider
/*: any*/
, options
/*: { authData?: AuthData }*/
, saveOpts
/*:: ?: FullOptions*/
)
/*: Promisecurrent
will return null
.
*
* @param {object} options
* @static
* @returns {Promise} A promise that is resolved when the session is
* destroyed on the server.
*/
}, {
key: "logOut",
value: function () {
var options
/*: RequestOptions*/
= arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var controller = _CoreManager.default.getUserController();
return controller.logOut(options);
}
/**
* Requests a password reset email to be sent to the specified email address
* associated with the user account. This email allows the user to securely
* reset their password on the Parse site.
*
* @param {string} email The email address associated with the user that
* forgot their password.
* @param {object} options
* @static
* @returns {Promise}
*/
}, {
key: "requestPasswordReset",
value: function (email
/*: string*/
, options
/*:: ?: RequestOptions*/
) {
options = options || {};
var requestOptions = {};
if (options.hasOwnProperty('useMasterKey')) {
requestOptions.useMasterKey = options.useMasterKey;
}
var controller = _CoreManager.default.getUserController();
return controller.requestPasswordReset(email, requestOptions);
}
/**
* Request an email verification.
*
* @param {string} email The email address associated with the user that
* forgot their password.
* @param {object} options
* @static
* @returns {Promise}
*/
}, {
key: "requestEmailVerification",
value: function (email
/*: string*/
, options
/*:: ?: RequestOptions*/
) {
options = options || {};
var requestOptions = {};
if (options.hasOwnProperty('useMasterKey')) {
requestOptions.useMasterKey = options.useMasterKey;
}
var controller = _CoreManager.default.getUserController();
return controller.requestEmailVerification(email, requestOptions);
}
/**
* Verify whether a given password is the password of the current user.
*
* @param {string} username A username to be used for identificaiton
* @param {string} password A password to be verified
* @param {object} options
* @static
* @returns {Promise} A promise that is fulfilled with a user
* when the password is correct.
*/
}, {
key: "verifyPassword",
value: function (username
/*: string*/
, password
/*: string*/
, options
/*:: ?: RequestOptions*/
) {
if (typeof username !== 'string') {
return _promise.default.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Username must be a string.'));
}
if (typeof password !== 'string') {
return _promise.default.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Password must be a string.'));
}
options = options || {};
var verificationOption = {};
if (options.hasOwnProperty('useMasterKey')) {
verificationOption.useMasterKey = options.useMasterKey;
}
var controller = _CoreManager.default.getUserController();
return controller.verifyPassword(username, password, verificationOption);
}
/**
* Allow someone to define a custom User class without className
* being rewritten to _User. The default behavior is to rewrite
* User to _User for legacy reasons. This allows developers to
* override that behavior.
*
* @param {boolean} isAllowed Whether or not to allow custom User class
* @static
*/
}, {
key: "allowCustomUserClass",
value: function (isAllowed
/*: boolean*/
) {
_CoreManager.default.set('PERFORM_USER_REWRITE', !isAllowed);
}
/**
* Allows a legacy application to start using revocable sessions. If the
* current session token is not revocable, a request will be made for a new,
* revocable session.
* It is not necessary to call this method from cloud code unless you are
* handling user signup or login from the server side. In a cloud code call,
* this function will not attempt to upgrade the current token.
*
* @param {object} options
* @static
* @returns {Promise} A promise that is resolved when the process has
* completed. If a replacement session token is requested, the promise
* will be resolved after a new token has been fetched.
*/
}, {
key: "enableRevocableSession",
value: function (options
/*:: ?: RequestOptions*/
) {
options = options || {};
_CoreManager.default.set('FORCE_REVOCABLE_SESSION', true);
if (canUseCurrentUser) {
var current = ParseUser.current();
if (current) {
return current._upgradeToRevocableSession(options);
}
}
return _promise.default.resolve();
}
/**
* Enables the use of become or the current user in a server
* environment. These features are disabled by default, since they depend on
* global objects that are not memory-safe for most servers.
*
* @static
*/
}, {
key: "enableUnsafeCurrentUser",
value: function () {
canUseCurrentUser = true;
}
/**
* Disables the use of become or the current user in any environment.
* These features are disabled on servers by default, since they depend on
* global objects that are not memory-safe for most servers.
*
* @static
*/
}, {
key: "disableUnsafeCurrentUser",
value: function () {
canUseCurrentUser = false;
}
/**
* When registering users with {@link https://parseplatform.org/Parse-SDK-JS/api/master/Parse.User.html#linkWith linkWith} a basic auth provider
* is automatically created for you.
*
* For advanced authentication, you can register an Auth provider to
* implement custom authentication, deauthentication.
*
* @param provider
* @see {@link https://parseplatform.org/Parse-SDK-JS/api/master/AuthProvider.html AuthProvider}
* @see {@link https://docs.parseplatform.org/js/guide/#custom-authentication-module Custom Authentication Module}
* @static
*/
}, {
key: "_registerAuthenticationProvider",
value: function (provider
/*: any*/
) {
authProviders[provider.getAuthType()] = provider; // Synchronize the current user with the auth provider.
ParseUser.currentAsync().then(function (current) {
if (current) {
current._synchronizeAuthData(provider.getAuthType());
}
});
}
/**
* @param provider
* @param options
* @param saveOpts
* @deprecated since 2.9.0 see {@link https://parseplatform.org/Parse-SDK-JS/api/master/Parse.User.html#logInWith logInWith}
* @static
* @returns {Promise}
*/
}, {
key: "_logInWith",
value: function (provider
/*: any*/
, options
/*: { authData?: AuthData }*/
, saveOpts
/*:: ?: FullOptions*/
) {
var user = new this();
return user.linkWith(provider, options, saveOpts);
}
}, {
key: "_clearCache",
value: function () {
currentUserCache = null;
currentUserCacheMatchesDisk = false;
}
}, {
key: "_setCurrentUserCache",
value: function (user
/*: ParseUser*/
) {
currentUserCache = user;
}
}]);
return ParseUser;
}(_ParseObject2.default);
_ParseObject2.default.registerSubclass('_User', ParseUser);
var DefaultController = {
updateUserOnDisk: function (user) {
var path = _Storage.default.generatePath(CURRENT_USER_KEY);
var json = user.toJSON();
delete json.password;
json.className = '_User';
var userData = (0, _stringify.default)(json);
if (_CoreManager.default.get('ENCRYPTED_USER')) {
var crypto = _CoreManager.default.getCryptoController();
userData = crypto.encrypt(json, _CoreManager.default.get('ENCRYPTED_KEY'));
}
return _Storage.default.setItemAsync(path, userData).then(function () {
return user;
});
},
removeUserFromDisk: function () {
var path = _Storage.default.generatePath(CURRENT_USER_KEY);
currentUserCacheMatchesDisk = true;
currentUserCache = null;
return _Storage.default.removeItemAsync(path);
},
setCurrentUser: function (user) {
var _this9 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
var currentUser;
return _regenerator.default.wrap(function (_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return _this9.currentUserAsync();
case 2:
currentUser = _context.sent;
if (!(currentUser && !user.equals(currentUser) && _AnonymousUtils.default.isLinked(currentUser))) {
_context.next = 6;
break;
}
_context.next = 6;
return currentUser.destroy({
sessionToken: currentUser.getSessionToken()
});
case 6:
currentUserCache = user;
user._cleanupAuthData();
user._synchronizeAllAuthData();
return _context.abrupt("return", DefaultController.updateUserOnDisk(user));
case 10:
case "end":
return _context.stop();
}
}
}, _callee);
}))();
},
currentUser: function ()
/*: ?ParseUser*/
{
if (currentUserCache) {
return currentUserCache;
}
if (currentUserCacheMatchesDisk) {
return null;
}
if (_Storage.default.async()) {
throw new Error('Cannot call currentUser() when using a platform with an async ' + 'storage system. Call currentUserAsync() instead.');
}
var path = _Storage.default.generatePath(CURRENT_USER_KEY);
var userData = _Storage.default.getItem(path);
currentUserCacheMatchesDisk = true;
if (!userData) {
currentUserCache = null;
return null;
}
if (_CoreManager.default.get('ENCRYPTED_USER')) {
var crypto = _CoreManager.default.getCryptoController();
userData = crypto.decrypt(userData, _CoreManager.default.get('ENCRYPTED_KEY'));
}
userData = JSON.parse(userData);
if (!userData.className) {
userData.className = '_User';
}
if (userData._id) {
if (userData.objectId !== userData._id) {
userData.objectId = userData._id;
}
delete userData._id;
}
if (userData._sessionToken) {
userData.sessionToken = userData._sessionToken;
delete userData._sessionToken;
}
var current = _ParseObject2.default.fromJSON(userData);
currentUserCache = current;
current._synchronizeAllAuthData();
return current;
},
currentUserAsync: function ()
/*: Promise*/
{
if (currentUserCache) {
return _promise.default.resolve(currentUserCache);
}
if (currentUserCacheMatchesDisk) {
return _promise.default.resolve(null);
}
var path = _Storage.default.generatePath(CURRENT_USER_KEY);
return _Storage.default.getItemAsync(path).then(function (userData) {
currentUserCacheMatchesDisk = true;
if (!userData) {
currentUserCache = null;
return _promise.default.resolve(null);
}
if (_CoreManager.default.get('ENCRYPTED_USER')) {
var crypto = _CoreManager.default.getCryptoController();
userData = crypto.decrypt(userData.toString(), _CoreManager.default.get('ENCRYPTED_KEY'));
}
userData = JSON.parse(userData);
if (!userData.className) {
userData.className = '_User';
}
if (userData._id) {
if (userData.objectId !== userData._id) {
userData.objectId = userData._id;
}
delete userData._id;
}
if (userData._sessionToken) {
userData.sessionToken = userData._sessionToken;
delete userData._sessionToken;
}
var current = _ParseObject2.default.fromJSON(userData);
currentUserCache = current;
current._synchronizeAllAuthData();
return _promise.default.resolve(current);
});
},
signUp: function (user
/*: ParseUser*/
, attrs
/*: AttributeMap*/
, options
/*: RequestOptions*/
)
/*: Promise