ParseUser.js 31 KB

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