ParseUser.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
  7. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  8. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  9. var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
  10. var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
  11. var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
  12. var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
  13. var _CoreManager = _interopRequireDefault(require("./CoreManager"));
  14. var _isRevocableSession = _interopRequireDefault(require("./isRevocableSession"));
  15. var _ParseError = _interopRequireDefault(require("./ParseError"));
  16. var _ParseObject2 = _interopRequireDefault(require("./ParseObject"));
  17. var _Storage = _interopRequireDefault(require("./Storage"));
  18. function _callSuper(t, o, e) {
  19. return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e));
  20. }
  21. function _isNativeReflectConstruct() {
  22. try {
  23. var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
  24. } catch (t) {}
  25. return (_isNativeReflectConstruct = function () {
  26. return !!t;
  27. })();
  28. }
  29. var CURRENT_USER_KEY = 'currentUser';
  30. var canUseCurrentUser = !_CoreManager.default.get('IS_NODE');
  31. var currentUserCacheMatchesDisk = false;
  32. var currentUserCache = null;
  33. var authProviders = {};
  34. var ParseUser = function (_ParseObject) {
  35. function ParseUser(attributes) {
  36. var _this;
  37. (0, _classCallCheck2.default)(this, ParseUser);
  38. _this = _callSuper(this, ParseUser, ['_User']);
  39. if (attributes && typeof attributes === 'object') {
  40. if (!_this.set(attributes || {})) {
  41. throw new Error("Can't create an invalid Parse User");
  42. }
  43. }
  44. return _this;
  45. }
  46. (0, _inherits2.default)(ParseUser, _ParseObject);
  47. return (0, _createClass2.default)(ParseUser, [{
  48. key: "_upgradeToRevocableSession",
  49. value: function (options) {
  50. options = options || {};
  51. var upgradeOptions = {};
  52. if (options.hasOwnProperty('useMasterKey')) {
  53. upgradeOptions.useMasterKey = options.useMasterKey;
  54. }
  55. var controller = _CoreManager.default.getUserController();
  56. return controller.upgradeToRevocableSession(this, upgradeOptions);
  57. }
  58. }, {
  59. key: "linkWith",
  60. value: function (provider, options) {
  61. var _this2 = this;
  62. var saveOpts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  63. saveOpts.sessionToken = saveOpts.sessionToken || this.getSessionToken() || '';
  64. var authType;
  65. if (typeof provider === 'string') {
  66. authType = provider;
  67. if (authProviders[provider]) {
  68. provider = authProviders[provider];
  69. } else {
  70. var authProvider = {
  71. restoreAuthentication: function () {
  72. return true;
  73. },
  74. getAuthType: function () {
  75. return authType;
  76. }
  77. };
  78. authProviders[authProvider.getAuthType()] = authProvider;
  79. provider = authProvider;
  80. }
  81. } else {
  82. authType = provider.getAuthType();
  83. }
  84. if (options && options.hasOwnProperty('authData')) {
  85. var _authData = this.get('authData') || {};
  86. if (typeof _authData !== 'object') {
  87. throw new Error('Invalid type: authData field should be an object');
  88. }
  89. _authData[authType] = options.authData;
  90. var oldAnonymousData = _authData.anonymous;
  91. this.stripAnonymity();
  92. var controller = _CoreManager.default.getUserController();
  93. return controller.linkWith(this, _authData, saveOpts).catch(function (e) {
  94. delete _authData[authType];
  95. _this2.restoreAnonimity(oldAnonymousData);
  96. throw e;
  97. });
  98. } else {
  99. return new Promise(function (resolve, reject) {
  100. provider.authenticate({
  101. success: function (provider, result) {
  102. var opts = {};
  103. opts.authData = result;
  104. _this2.linkWith(provider, opts, saveOpts).then(function () {
  105. resolve(_this2);
  106. }, function (error) {
  107. reject(error);
  108. });
  109. },
  110. error: function (provider, _error) {
  111. reject(_error);
  112. }
  113. });
  114. });
  115. }
  116. }
  117. }, {
  118. key: "_linkWith",
  119. value: function (provider, options) {
  120. var saveOpts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  121. return this.linkWith(provider, options, saveOpts);
  122. }
  123. }, {
  124. key: "_synchronizeAuthData",
  125. value: function (provider) {
  126. if (!this.isCurrent() || !provider) {
  127. return;
  128. }
  129. var authType;
  130. if (typeof provider === 'string') {
  131. authType = provider;
  132. provider = authProviders[authType];
  133. } else {
  134. authType = provider.getAuthType();
  135. }
  136. var authData = this.get('authData');
  137. if (!provider || !authData || typeof authData !== 'object') {
  138. return;
  139. }
  140. var success = provider.restoreAuthentication(authData[authType]);
  141. if (!success) {
  142. this._unlinkFrom(provider);
  143. }
  144. }
  145. }, {
  146. key: "_synchronizeAllAuthData",
  147. value: function () {
  148. var authData = this.get('authData');
  149. if (typeof authData !== 'object') {
  150. return;
  151. }
  152. for (var _key in authData) {
  153. this._synchronizeAuthData(_key);
  154. }
  155. }
  156. }, {
  157. key: "_cleanupAuthData",
  158. value: function () {
  159. if (!this.isCurrent()) {
  160. return;
  161. }
  162. var authData = this.get('authData');
  163. if (typeof authData !== 'object') {
  164. return;
  165. }
  166. for (var _key2 in authData) {
  167. if (!authData[_key2]) {
  168. delete authData[_key2];
  169. }
  170. }
  171. }
  172. }, {
  173. key: "_unlinkFrom",
  174. value: function (provider, options) {
  175. var _this3 = this;
  176. return this.linkWith(provider, {
  177. authData: null
  178. }, options).then(function () {
  179. _this3._synchronizeAuthData(provider);
  180. return Promise.resolve(_this3);
  181. });
  182. }
  183. }, {
  184. key: "_isLinked",
  185. value: function (provider) {
  186. var authType;
  187. if (typeof provider === 'string') {
  188. authType = provider;
  189. } else {
  190. authType = provider.getAuthType();
  191. }
  192. var authData = this.get('authData') || {};
  193. if (typeof authData !== 'object') {
  194. return false;
  195. }
  196. return !!authData[authType];
  197. }
  198. }, {
  199. key: "_logOutWithAll",
  200. value: function () {
  201. var authData = this.get('authData');
  202. if (typeof authData !== 'object') {
  203. return;
  204. }
  205. for (var _key3 in authData) {
  206. this._logOutWith(_key3);
  207. }
  208. }
  209. }, {
  210. key: "_logOutWith",
  211. value: function (provider) {
  212. if (!this.isCurrent()) {
  213. return;
  214. }
  215. if (typeof provider === 'string') {
  216. provider = authProviders[provider];
  217. }
  218. if (provider && provider.deauthenticate) {
  219. provider.deauthenticate();
  220. }
  221. }
  222. }, {
  223. key: "_preserveFieldsOnFetch",
  224. value: function () {
  225. return {
  226. sessionToken: this.get('sessionToken')
  227. };
  228. }
  229. }, {
  230. key: "isCurrent",
  231. value: function () {
  232. var current = ParseUser.current();
  233. return !!current && current.id === this.id;
  234. }
  235. }, {
  236. key: "isCurrentAsync",
  237. value: function () {
  238. var _isCurrentAsync = (0, _asyncToGenerator2.default)(function* () {
  239. var current = yield ParseUser.currentAsync();
  240. return !!current && current.id === this.id;
  241. });
  242. function isCurrentAsync() {
  243. return _isCurrentAsync.apply(this, arguments);
  244. }
  245. return isCurrentAsync;
  246. }()
  247. }, {
  248. key: "stripAnonymity",
  249. value: function () {
  250. var authData = this.get('authData');
  251. if (authData && typeof authData === 'object' && authData.hasOwnProperty('anonymous')) {
  252. authData.anonymous = null;
  253. }
  254. }
  255. }, {
  256. key: "restoreAnonimity",
  257. value: function (anonymousData) {
  258. if (anonymousData) {
  259. var _authData2 = this.get('authData');
  260. _authData2.anonymous = anonymousData;
  261. }
  262. }
  263. }, {
  264. key: "getUsername",
  265. value: function () {
  266. var username = this.get('username');
  267. if (username == null || typeof username === 'string') {
  268. return username;
  269. }
  270. return '';
  271. }
  272. }, {
  273. key: "setUsername",
  274. value: function (username) {
  275. this.stripAnonymity();
  276. this.set('username', username);
  277. }
  278. }, {
  279. key: "setPassword",
  280. value: function (password) {
  281. this.set('password', password);
  282. }
  283. }, {
  284. key: "getEmail",
  285. value: function () {
  286. var email = this.get('email');
  287. if (email == null || typeof email === 'string') {
  288. return email;
  289. }
  290. return '';
  291. }
  292. }, {
  293. key: "setEmail",
  294. value: function (email) {
  295. return this.set('email', email);
  296. }
  297. }, {
  298. key: "getSessionToken",
  299. value: function () {
  300. var token = this.get('sessionToken');
  301. if (token == null || typeof token === 'string') {
  302. return token;
  303. }
  304. return '';
  305. }
  306. }, {
  307. key: "authenticated",
  308. value: function () {
  309. var current = ParseUser.current();
  310. return !!this.get('sessionToken') && !!current && current.id === this.id;
  311. }
  312. }, {
  313. key: "signUp",
  314. value: function (attrs, options) {
  315. options = options || {};
  316. var signupOptions = {};
  317. if (options.hasOwnProperty('useMasterKey')) {
  318. signupOptions.useMasterKey = options.useMasterKey;
  319. }
  320. if (options.hasOwnProperty('installationId')) {
  321. signupOptions.installationId = options.installationId;
  322. }
  323. if (options.hasOwnProperty('context') && Object.prototype.toString.call(options.context) === '[object Object]') {
  324. signupOptions.context = options.context;
  325. }
  326. var controller = _CoreManager.default.getUserController();
  327. return controller.signUp(this, attrs, signupOptions);
  328. }
  329. }, {
  330. key: "logIn",
  331. value: function () {
  332. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  333. options = options || {};
  334. var loginOptions = {
  335. usePost: true
  336. };
  337. if (options.hasOwnProperty('useMasterKey')) {
  338. loginOptions.useMasterKey = options.useMasterKey;
  339. }
  340. if (options.hasOwnProperty('installationId')) {
  341. loginOptions.installationId = options.installationId;
  342. }
  343. if (options.hasOwnProperty('usePost')) {
  344. loginOptions.usePost = options.usePost;
  345. }
  346. if (options.hasOwnProperty('context') && Object.prototype.toString.call(options.context) === '[object Object]') {
  347. loginOptions.context = options.context;
  348. }
  349. var controller = _CoreManager.default.getUserController();
  350. return controller.logIn(this, loginOptions);
  351. }
  352. }, {
  353. key: "save",
  354. value: function () {
  355. var _save = (0, _asyncToGenerator2.default)(function* () {
  356. for (var _len = arguments.length, args = new Array(_len), _key4 = 0; _key4 < _len; _key4++) {
  357. args[_key4] = arguments[_key4];
  358. }
  359. yield (0, _get2.default)((0, _getPrototypeOf2.default)(ParseUser.prototype), "save", this).apply(this, args);
  360. var current = yield this.isCurrentAsync();
  361. if (current) {
  362. return _CoreManager.default.getUserController().updateUserOnDisk(this);
  363. }
  364. return this;
  365. });
  366. function save() {
  367. return _save.apply(this, arguments);
  368. }
  369. return save;
  370. }()
  371. }, {
  372. key: "destroy",
  373. value: function () {
  374. var _destroy = (0, _asyncToGenerator2.default)(function* () {
  375. for (var _len2 = arguments.length, args = new Array(_len2), _key5 = 0; _key5 < _len2; _key5++) {
  376. args[_key5] = arguments[_key5];
  377. }
  378. yield (0, _get2.default)((0, _getPrototypeOf2.default)(ParseUser.prototype), "destroy", this).apply(this, args);
  379. var current = yield this.isCurrentAsync();
  380. if (current) {
  381. return _CoreManager.default.getUserController().removeUserFromDisk();
  382. }
  383. return this;
  384. });
  385. function destroy() {
  386. return _destroy.apply(this, arguments);
  387. }
  388. return destroy;
  389. }()
  390. }, {
  391. key: "fetch",
  392. value: function () {
  393. var _fetch = (0, _asyncToGenerator2.default)(function* () {
  394. for (var _len3 = arguments.length, args = new Array(_len3), _key6 = 0; _key6 < _len3; _key6++) {
  395. args[_key6] = arguments[_key6];
  396. }
  397. yield (0, _get2.default)((0, _getPrototypeOf2.default)(ParseUser.prototype), "fetch", this).apply(this, args);
  398. var current = yield this.isCurrentAsync();
  399. if (current) {
  400. return _CoreManager.default.getUserController().updateUserOnDisk(this);
  401. }
  402. return this;
  403. });
  404. function fetch() {
  405. return _fetch.apply(this, arguments);
  406. }
  407. return fetch;
  408. }()
  409. }, {
  410. key: "fetchWithInclude",
  411. value: function () {
  412. var _fetchWithInclude = (0, _asyncToGenerator2.default)(function* () {
  413. for (var _len4 = arguments.length, args = new Array(_len4), _key7 = 0; _key7 < _len4; _key7++) {
  414. args[_key7] = arguments[_key7];
  415. }
  416. yield (0, _get2.default)((0, _getPrototypeOf2.default)(ParseUser.prototype), "fetchWithInclude", this).apply(this, args);
  417. var current = yield this.isCurrentAsync();
  418. if (current) {
  419. return _CoreManager.default.getUserController().updateUserOnDisk(this);
  420. }
  421. return this;
  422. });
  423. function fetchWithInclude() {
  424. return _fetchWithInclude.apply(this, arguments);
  425. }
  426. return fetchWithInclude;
  427. }()
  428. }, {
  429. key: "verifyPassword",
  430. value: function (password, options) {
  431. var username = this.getUsername() || '';
  432. return ParseUser.verifyPassword(username, password, options);
  433. }
  434. }], [{
  435. key: "readOnlyAttributes",
  436. value: function () {
  437. return ['sessionToken'];
  438. }
  439. }, {
  440. key: "extend",
  441. value: function (protoProps, classProps) {
  442. if (protoProps) {
  443. for (var prop in protoProps) {
  444. if (prop !== 'className') {
  445. Object.defineProperty(ParseUser.prototype, prop, {
  446. value: protoProps[prop],
  447. enumerable: false,
  448. writable: true,
  449. configurable: true
  450. });
  451. }
  452. }
  453. }
  454. if (classProps) {
  455. for (var _prop in classProps) {
  456. if (_prop !== 'className') {
  457. Object.defineProperty(ParseUser, _prop, {
  458. value: classProps[_prop],
  459. enumerable: false,
  460. writable: true,
  461. configurable: true
  462. });
  463. }
  464. }
  465. }
  466. return ParseUser;
  467. }
  468. }, {
  469. key: "current",
  470. value: function () {
  471. if (!canUseCurrentUser) {
  472. return null;
  473. }
  474. var controller = _CoreManager.default.getUserController();
  475. return controller.currentUser();
  476. }
  477. }, {
  478. key: "currentAsync",
  479. value: function () {
  480. if (!canUseCurrentUser) {
  481. return Promise.resolve(null);
  482. }
  483. var controller = _CoreManager.default.getUserController();
  484. return controller.currentUserAsync();
  485. }
  486. }, {
  487. key: "signUp",
  488. value: function (username, password, attrs, options) {
  489. attrs = attrs || {};
  490. attrs.username = username;
  491. attrs.password = password;
  492. var user = new this(attrs);
  493. return user.signUp({}, options);
  494. }
  495. }, {
  496. key: "logIn",
  497. value: function (username, password, options) {
  498. if (typeof username !== 'string') {
  499. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Username must be a string.'));
  500. } else if (typeof password !== 'string') {
  501. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Password must be a string.'));
  502. }
  503. var user = new this();
  504. user._finishFetch({
  505. username: username,
  506. password: password
  507. });
  508. return user.logIn(options);
  509. }
  510. }, {
  511. key: "logInWithAdditionalAuth",
  512. value: function (username, password, authData, options) {
  513. if (typeof username !== 'string') {
  514. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Username must be a string.'));
  515. }
  516. if (typeof password !== 'string') {
  517. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Password must be a string.'));
  518. }
  519. if (Object.prototype.toString.call(authData) !== '[object Object]') {
  520. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Auth must be an object.'));
  521. }
  522. var user = new this();
  523. user._finishFetch({
  524. username: username,
  525. password: password,
  526. authData: authData
  527. });
  528. return user.logIn(options);
  529. }
  530. }, {
  531. key: "loginAs",
  532. value: function (userId) {
  533. if (!userId) {
  534. throw new _ParseError.default(_ParseError.default.USERNAME_MISSING, 'Cannot log in as user with an empty user id');
  535. }
  536. var controller = _CoreManager.default.getUserController();
  537. var user = new this();
  538. return controller.loginAs(user, userId);
  539. }
  540. }, {
  541. key: "become",
  542. value: function (sessionToken, options) {
  543. if (!canUseCurrentUser) {
  544. throw new Error('It is not memory-safe to become a user in a server environment');
  545. }
  546. options = options || {};
  547. var becomeOptions = {
  548. sessionToken: sessionToken
  549. };
  550. if (options.hasOwnProperty('useMasterKey')) {
  551. becomeOptions.useMasterKey = options.useMasterKey;
  552. }
  553. var controller = _CoreManager.default.getUserController();
  554. var user = new this();
  555. return controller.become(user, becomeOptions);
  556. }
  557. }, {
  558. key: "me",
  559. value: function (sessionToken) {
  560. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  561. var controller = _CoreManager.default.getUserController();
  562. var meOptions = {
  563. sessionToken: sessionToken
  564. };
  565. if (options.useMasterKey) {
  566. meOptions.useMasterKey = options.useMasterKey;
  567. }
  568. var user = new this();
  569. return controller.me(user, meOptions);
  570. }
  571. }, {
  572. key: "hydrate",
  573. value: function (userJSON) {
  574. var controller = _CoreManager.default.getUserController();
  575. var user = new this();
  576. return controller.hydrate(user, userJSON);
  577. }
  578. }, {
  579. key: "logInWith",
  580. value: function (provider, options, saveOpts) {
  581. var user = new this();
  582. return user.linkWith(provider, options, saveOpts);
  583. }
  584. }, {
  585. key: "logOut",
  586. value: function () {
  587. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  588. var controller = _CoreManager.default.getUserController();
  589. return controller.logOut(options);
  590. }
  591. }, {
  592. key: "requestPasswordReset",
  593. value: function (email, options) {
  594. options = options || {};
  595. var requestOptions = {};
  596. if (options.hasOwnProperty('useMasterKey')) {
  597. requestOptions.useMasterKey = options.useMasterKey;
  598. }
  599. var controller = _CoreManager.default.getUserController();
  600. return controller.requestPasswordReset(email, requestOptions);
  601. }
  602. }, {
  603. key: "requestEmailVerification",
  604. value: function (email, options) {
  605. options = options || {};
  606. var requestOptions = {};
  607. if (options.hasOwnProperty('useMasterKey')) {
  608. requestOptions.useMasterKey = options.useMasterKey;
  609. }
  610. var controller = _CoreManager.default.getUserController();
  611. return controller.requestEmailVerification(email, requestOptions);
  612. }
  613. }, {
  614. key: "verifyPassword",
  615. value: function (username, password, options) {
  616. if (typeof username !== 'string') {
  617. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Username must be a string.'));
  618. }
  619. if (typeof password !== 'string') {
  620. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Password must be a string.'));
  621. }
  622. var controller = _CoreManager.default.getUserController();
  623. return controller.verifyPassword(username, password, options || {});
  624. }
  625. }, {
  626. key: "allowCustomUserClass",
  627. value: function (isAllowed) {
  628. _CoreManager.default.set('PERFORM_USER_REWRITE', !isAllowed);
  629. }
  630. }, {
  631. key: "enableRevocableSession",
  632. value: function (options) {
  633. options = options || {};
  634. _CoreManager.default.set('FORCE_REVOCABLE_SESSION', true);
  635. if (canUseCurrentUser) {
  636. var current = ParseUser.current();
  637. if (current) {
  638. return current._upgradeToRevocableSession(options);
  639. }
  640. }
  641. return Promise.resolve();
  642. }
  643. }, {
  644. key: "enableUnsafeCurrentUser",
  645. value: function () {
  646. canUseCurrentUser = true;
  647. }
  648. }, {
  649. key: "disableUnsafeCurrentUser",
  650. value: function () {
  651. canUseCurrentUser = false;
  652. }
  653. }, {
  654. key: "_registerAuthenticationProvider",
  655. value: function (provider) {
  656. authProviders[provider.getAuthType()] = provider;
  657. ParseUser.currentAsync().then(function (current) {
  658. if (current) {
  659. current._synchronizeAuthData(provider.getAuthType());
  660. }
  661. });
  662. }
  663. }, {
  664. key: "_logInWith",
  665. value: function (provider, options, saveOpts) {
  666. var user = new this();
  667. return user.linkWith(provider, options, saveOpts);
  668. }
  669. }, {
  670. key: "_clearCache",
  671. value: function () {
  672. currentUserCache = null;
  673. currentUserCacheMatchesDisk = false;
  674. }
  675. }, {
  676. key: "_setCurrentUserCache",
  677. value: function (user) {
  678. currentUserCache = user;
  679. }
  680. }]);
  681. }(_ParseObject2.default);
  682. _ParseObject2.default.registerSubclass('_User', ParseUser);
  683. var DefaultController = {
  684. updateUserOnDisk: function (user) {
  685. var path = _Storage.default.generatePath(CURRENT_USER_KEY);
  686. var json = user.toJSON();
  687. delete json.password;
  688. json.className = '_User';
  689. var userData = JSON.stringify(json);
  690. if (_CoreManager.default.get('ENCRYPTED_USER')) {
  691. var crypto = _CoreManager.default.getCryptoController();
  692. userData = crypto.encrypt(json, _CoreManager.default.get('ENCRYPTED_KEY'));
  693. }
  694. return _Storage.default.setItemAsync(path, userData).then(function () {
  695. return user;
  696. });
  697. },
  698. removeUserFromDisk: function () {
  699. var path = _Storage.default.generatePath(CURRENT_USER_KEY);
  700. currentUserCacheMatchesDisk = true;
  701. currentUserCache = null;
  702. return _Storage.default.removeItemAsync(path);
  703. },
  704. setCurrentUser: function (user) {
  705. currentUserCache = user;
  706. user._cleanupAuthData();
  707. user._synchronizeAllAuthData();
  708. return DefaultController.updateUserOnDisk(user);
  709. },
  710. currentUser: function () {
  711. if (currentUserCache) {
  712. return currentUserCache;
  713. }
  714. if (currentUserCacheMatchesDisk) {
  715. return null;
  716. }
  717. if (_Storage.default.async()) {
  718. throw new Error('Cannot call currentUser() when using a platform with an async ' + 'storage system. Call currentUserAsync() instead.');
  719. }
  720. var path = _Storage.default.generatePath(CURRENT_USER_KEY);
  721. var userData = _Storage.default.getItem(path);
  722. currentUserCacheMatchesDisk = true;
  723. if (!userData) {
  724. currentUserCache = null;
  725. return null;
  726. }
  727. if (_CoreManager.default.get('ENCRYPTED_USER')) {
  728. var crypto = _CoreManager.default.getCryptoController();
  729. userData = crypto.decrypt(userData, _CoreManager.default.get('ENCRYPTED_KEY'));
  730. }
  731. userData = JSON.parse(userData);
  732. if (!userData.className) {
  733. userData.className = '_User';
  734. }
  735. if (userData._id) {
  736. if (userData.objectId !== userData._id) {
  737. userData.objectId = userData._id;
  738. }
  739. delete userData._id;
  740. }
  741. if (userData._sessionToken) {
  742. userData.sessionToken = userData._sessionToken;
  743. delete userData._sessionToken;
  744. }
  745. var current = _ParseObject2.default.fromJSON(userData);
  746. currentUserCache = current;
  747. current._synchronizeAllAuthData();
  748. return current;
  749. },
  750. currentUserAsync: function () {
  751. if (currentUserCache) {
  752. return Promise.resolve(currentUserCache);
  753. }
  754. if (currentUserCacheMatchesDisk) {
  755. return Promise.resolve(null);
  756. }
  757. var path = _Storage.default.generatePath(CURRENT_USER_KEY);
  758. return _Storage.default.getItemAsync(path).then(function (userData) {
  759. currentUserCacheMatchesDisk = true;
  760. if (!userData) {
  761. currentUserCache = null;
  762. return Promise.resolve(null);
  763. }
  764. if (_CoreManager.default.get('ENCRYPTED_USER')) {
  765. var crypto = _CoreManager.default.getCryptoController();
  766. userData = crypto.decrypt(userData.toString(), _CoreManager.default.get('ENCRYPTED_KEY'));
  767. }
  768. userData = JSON.parse(userData);
  769. if (!userData.className) {
  770. userData.className = '_User';
  771. }
  772. if (userData._id) {
  773. if (userData.objectId !== userData._id) {
  774. userData.objectId = userData._id;
  775. }
  776. delete userData._id;
  777. }
  778. if (userData._sessionToken) {
  779. userData.sessionToken = userData._sessionToken;
  780. delete userData._sessionToken;
  781. }
  782. var current = _ParseObject2.default.fromJSON(userData);
  783. currentUserCache = current;
  784. current._synchronizeAllAuthData();
  785. return Promise.resolve(current);
  786. });
  787. },
  788. signUp: function (user, attrs, options) {
  789. var username = attrs && attrs.username || user.get('username');
  790. var password = attrs && attrs.password || user.get('password');
  791. if (!username || !username.length) {
  792. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Cannot sign up user with an empty username.'));
  793. }
  794. if (!password || !password.length) {
  795. return Promise.reject(new _ParseError.default(_ParseError.default.OTHER_CAUSE, 'Cannot sign up user with an empty password.'));
  796. }
  797. return user.save(attrs, options).then(function () {
  798. user._finishFetch({
  799. password: undefined
  800. });
  801. if (canUseCurrentUser) {
  802. return DefaultController.setCurrentUser(user);
  803. }
  804. return user;
  805. });
  806. },
  807. logIn: function (user, options) {
  808. var RESTController = _CoreManager.default.getRESTController();
  809. var stateController = _CoreManager.default.getObjectStateController();
  810. var auth = {
  811. username: user.get('username'),
  812. password: user.get('password'),
  813. authData: user.get('authData')
  814. };
  815. return RESTController.request(options.usePost ? 'POST' : 'GET', 'login', auth, options).then(function (response) {
  816. user._migrateId(response.objectId);
  817. user._setExisted(true);
  818. stateController.setPendingOp(user._getStateIdentifier(), 'username', undefined);
  819. stateController.setPendingOp(user._getStateIdentifier(), 'password', undefined);
  820. response.password = undefined;
  821. user._finishFetch(response);
  822. if (!canUseCurrentUser) {
  823. return Promise.resolve(user);
  824. }
  825. return DefaultController.setCurrentUser(user);
  826. });
  827. },
  828. loginAs: function (user, userId) {
  829. var RESTController = _CoreManager.default.getRESTController();
  830. return RESTController.request('POST', 'loginAs', {
  831. userId: userId
  832. }, {
  833. useMasterKey: true
  834. }).then(function (response) {
  835. user._finishFetch(response);
  836. user._setExisted(true);
  837. if (!canUseCurrentUser) {
  838. return Promise.resolve(user);
  839. }
  840. return DefaultController.setCurrentUser(user);
  841. });
  842. },
  843. become: function (user, options) {
  844. var RESTController = _CoreManager.default.getRESTController();
  845. return RESTController.request('GET', 'users/me', {}, options).then(function (response) {
  846. user._finishFetch(response);
  847. user._setExisted(true);
  848. return DefaultController.setCurrentUser(user);
  849. });
  850. },
  851. hydrate: function (user, userJSON) {
  852. user._finishFetch(userJSON);
  853. user._setExisted(true);
  854. if (userJSON.sessionToken && canUseCurrentUser) {
  855. return DefaultController.setCurrentUser(user);
  856. } else {
  857. return Promise.resolve(user);
  858. }
  859. },
  860. me: function (user, options) {
  861. var RESTController = _CoreManager.default.getRESTController();
  862. return RESTController.request('GET', 'users/me', {}, options).then(function (response) {
  863. user._finishFetch(response);
  864. user._setExisted(true);
  865. return user;
  866. });
  867. },
  868. logOut: function (options) {
  869. var RESTController = _CoreManager.default.getRESTController();
  870. if (options.sessionToken) {
  871. return RESTController.request('POST', 'logout', {}, options);
  872. }
  873. return DefaultController.currentUserAsync().then(function (currentUser) {
  874. var path = _Storage.default.generatePath(CURRENT_USER_KEY);
  875. var promise = _Storage.default.removeItemAsync(path);
  876. if (currentUser !== null) {
  877. var currentSession = currentUser.getSessionToken();
  878. if (currentSession && (0, _isRevocableSession.default)(currentSession)) {
  879. promise = promise.then(function () {
  880. return RESTController.request('POST', 'logout', {}, {
  881. sessionToken: currentSession
  882. });
  883. });
  884. }
  885. currentUser._logOutWithAll();
  886. currentUser._finishFetch({
  887. sessionToken: undefined
  888. });
  889. }
  890. currentUserCacheMatchesDisk = true;
  891. currentUserCache = null;
  892. return promise;
  893. });
  894. },
  895. requestPasswordReset: function (email, options) {
  896. var RESTController = _CoreManager.default.getRESTController();
  897. return RESTController.request('POST', 'requestPasswordReset', {
  898. email: email
  899. }, options);
  900. },
  901. upgradeToRevocableSession: function () {
  902. var _upgradeToRevocableSession2 = (0, _asyncToGenerator2.default)(function* (user, options) {
  903. var token = user.getSessionToken();
  904. if (!token) {
  905. return Promise.reject(new _ParseError.default(_ParseError.default.SESSION_MISSING, 'Cannot upgrade a user with no session token'));
  906. }
  907. options.sessionToken = token;
  908. var RESTController = _CoreManager.default.getRESTController();
  909. var result = yield RESTController.request('POST', 'upgradeToRevocableSession', {}, options);
  910. user._finishFetch({
  911. sessionToken: (result == null ? void 0 : result.sessionToken) || ''
  912. });
  913. var current = yield user.isCurrentAsync();
  914. if (current) {
  915. return DefaultController.setCurrentUser(user);
  916. }
  917. return Promise.resolve(user);
  918. });
  919. function upgradeToRevocableSession() {
  920. return _upgradeToRevocableSession2.apply(this, arguments);
  921. }
  922. return upgradeToRevocableSession;
  923. }(),
  924. linkWith: function (user, authData, options) {
  925. return user.save({
  926. authData: authData
  927. }, options).then(function () {
  928. if (canUseCurrentUser) {
  929. return DefaultController.setCurrentUser(user);
  930. }
  931. return user;
  932. });
  933. },
  934. verifyPassword: function (username, password, options) {
  935. var RESTController = _CoreManager.default.getRESTController();
  936. var data = Object.assign({
  937. username: username,
  938. password: password
  939. }, options.ignoreEmailVerification !== undefined && {
  940. ignoreEmailVerification: options.ignoreEmailVerification
  941. });
  942. return RESTController.request('GET', 'verifyPassword', data, options);
  943. },
  944. requestEmailVerification: function (email, options) {
  945. var RESTController = _CoreManager.default.getRESTController();
  946. return RESTController.request('POST', 'verificationEmailRequest', {
  947. email: email
  948. }, options);
  949. }
  950. };
  951. _CoreManager.default.setParseUser(ParseUser);
  952. _CoreManager.default.setUserController(DefaultController);
  953. var _default = exports.default = ParseUser;