UNPKG

@kineticdata/react

Version:
560 lines (559 loc) 19.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports.timedOut = exports.logout = exports.getToken = exports.getCsrfToken = exports.AuthenticationContainer = exports.AuthenticationComponent = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createSuper")); var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regeneratorRuntime")); var _react = require("react"); var _effects = require("redux-saga/effects"); var _lodashEs = require("lodash-es"); var _moment = _interopRequireDefault(require("moment")); var _store = require("../../../store"); var _apis = require("../../../apis"); var defaultLoginProps = { error: null, password: '', pending: false, username: '' }; (0, _store.regHandlers)({ INITIALIZE: function INITIALIZE(state) { return state.set('login', defaultLoginProps); }, LOGIN: function LOGIN(state) { return state.mergeIn(['login'], { error: null, pending: true }); }, LOGOUT: function LOGOUT(state) { return state.mergeIn(['session'], { loggedIn: false, token: null }).set('login', defaultLoginProps); }, SET_AUTHENTICATED: function SET_AUTHENTICATED(state, action) { return state.mergeIn(['session'], { loggedIn: true, token: action.payload.token }).set('login', defaultLoginProps); }, SET_INITIALIZED: function SET_INITIALIZED(state, action) { return state.mergeIn(['session'], { csrfToken: action.payload.csrfToken, initialized: true, loggedIn: !!action.payload.token, securityStrategies: action.payload.securityStrategies, spaceSlug: action.payload.spaceSlug, token: action.payload.token, system: action.payload.system }).set('login', defaultLoginProps); }, SET_SERVER_ERROR: function SET_SERVER_ERROR(state, action) { return state.set('serverError', action.payload); }, SET_ERROR: function SET_ERROR(state, action) { return state.mergeIn(['login'], { error: action.payload, password: '', pending: false }); }, SET_PASSWORD: function SET_PASSWORD(state, action) { return state.setIn(['login', 'password'], action.payload); }, SET_USERNAME: function SET_USERNAME(state, action) { return state.setIn(['login', 'username'], action.payload); }, SINGLE_SIGN_ON: function SINGLE_SIGN_ON(state) { return state.mergeIn(['login'], { error: null, pending: true }); }, TIMEOUT: function TIMEOUT(state) { return state.setIn(['session', 'token'], null); } }); (0, _store.regSaga)('WATCH_SYSTEM_AUTHENTICATION', /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee() { var system, pollingActive, _yield$race, authenticated, refresh, _yield$call, error, token; return (0, _regeneratorRuntime2["default"])().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _effects.take)('LOGIN'); case 2: _context.next = 4; return (0, _effects.select)(function (state) { return state.getIn(['session', 'system'], false); }); case 4: system = _context.sent; pollingActive = false; case 6: if (!system) { _context.next = 41; break; } _context.prev = 7; _context.next = 10; return (0, _effects.race)({ authenticated: (0, _effects.take)('SET_AUTHENTICATED'), refresh: (0, _effects.delay)(180000), // 3 minutes. isLoggingOut: (0, _effects.take)('LOGOUT'), isTimingOut: (0, _effects.take)('TIMEOUT') }); case 10: _yield$race = _context.sent; authenticated = _yield$race.authenticated; refresh = _yield$race.refresh; if (!authenticated) { _context.next = 17; break; } // The authentication event occurred, so now we want to periodically // refresh the token. pollingActive = true; _context.next = 34; break; case 17: if (!(refresh && pollingActive)) { _context.next = 33; break; } _context.next = 20; return (0, _effects.call)(_apis.refreshSystemToken); case 20: _yield$call = _context.sent; error = _yield$call.error; token = _yield$call.token; if (!error) { _context.next = 28; break; } _context.next = 26; return (0, _effects.put)((0, _store.action)('TIMEOUT')); case 26: _context.next = 31; break; case 28: _context.next = 30; return (0, _effects.put)((0, _store.action)('SET_AUTHENTICATED', { token: token })); case 30: localStorage.setItem(SYSTEM_TOKEN, token); case 31: _context.next = 34; break; case 33: // Logging out or timing out happened to stop refreshing. pollingActive = false; case 34: _context.next = 39; break; case 36: _context.prev = 36; _context.t0 = _context["catch"](7); console.error(_context.t0); case 39: _context.next = 6; break; case 41: case "end": return _context.stop(); } }, _callee, null, [[7, 36]]); })); (0, _store.regSaga)((0, _effects.takeEvery)('LOGIN', function (_ref) { var payload = _ref.payload; return /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee2() { var system, _yield$select, username, password, _yield$call2, error, systemToken, token; return (0, _regeneratorRuntime2["default"])().wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return (0, _effects.select)(function (state) { return state.getIn(['session', 'system']); }); case 3: system = _context2.sent; _context2.next = 6; return (0, _effects.select)(function (state) { return state.get('login'); }); case 6: _yield$select = _context2.sent; username = _yield$select.username; password = _yield$select.password; _context2.next = 11; return (0, _effects.call)(system ? _apis.systemLogin : _apis.login, { username: username, password: password }); case 11: _yield$call2 = _context2.sent; error = _yield$call2.error; systemToken = _yield$call2.token; if (!error) { _context2.next = 19; break; } _context2.next = 17; return (0, _effects.put)({ type: 'SET_ERROR', payload: error.message }); case 17: _context2.next = 30; break; case 19: if (!system) { _context2.next = 23; break; } _context2.t0 = systemToken; _context2.next = 26; break; case 23: _context2.next = 25; return (0, _effects.call)(_apis.retrieveJwt); case 25: _context2.t0 = _context2.sent; case 26: token = _context2.t0; if (system) { localStorage.setItem(SYSTEM_TOKEN, token); } _context2.next = 30; return (0, _effects.put)({ type: 'SET_AUTHENTICATED', payload: { token: token, callback: payload } }); case 30: _context2.next = 35; break; case 32: _context2.prev = 32; _context2.t1 = _context2["catch"](0); console.error(_context2.t1); case 35: case "end": return _context2.stop(); } }, _callee2, null, [[0, 32]]); })(); })); (0, _store.regSaga)((0, _effects.takeEvery)('SINGLE_SIGN_ON', function (_ref2) { var _ref2$payload = _ref2.payload, callback = _ref2$payload.callback, spaceSlug = _ref2$payload.spaceSlug; return /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee3() { var _yield$call3, error, token; return (0, _regeneratorRuntime2["default"])().wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _context3.prev = 0; _context3.next = 3; return (0, _effects.call)(_apis.singleSignOn, spaceSlug, { width: 770, height: 750 }); case 3: _yield$call3 = _context3.sent; error = _yield$call3.error; if (!error) { _context3.next = 10; break; } _context3.next = 8; return (0, _effects.put)({ type: 'SET_ERROR', payload: error }); case 8: _context3.next = 15; break; case 10: _context3.next = 12; return (0, _effects.call)(_apis.retrieveJwt); case 12: token = _context3.sent; _context3.next = 15; return (0, _effects.put)({ type: 'SET_AUTHENTICATED', payload: { token: token, callback: callback } }); case 15: _context3.next = 20; break; case 17: _context3.prev = 17; _context3.t0 = _context3["catch"](0); console.error(_context3.t0); case 20: case "end": return _context3.stop(); } }, _callee3, null, [[0, 17]]); })(); })); var SYSTEM_TOKEN = 'kd-system'; (0, _store.regSaga)((0, _effects.takeEvery)('INITIALIZE', function (_ref3) { var _ref3$payload = _ref3.payload, system = _ref3$payload.system, skipInit = _ref3$payload.skipInit; return /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee4() { var token, localToken, parsedToken, isValid, _yield$call4, securityStrategies, _yield$call4$session, _yield$call4$session2, csrfToken, isAuthenticated, spaceSlug, error, _token; return (0, _regeneratorRuntime2["default"])().wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.prev = 0; if (!system) { _context4.next = 8; break; } localToken = localStorage ? localStorage.getItem(SYSTEM_TOKEN) : null; if (localToken) { parsedToken = JSON.parse(atob(localToken.split('.')[1])); isValid = _moment["default"].unix(parsedToken.exp).isAfter(new Date()); token = isValid ? localToken : null; } _context4.next = 6; return (0, _effects.put)((0, _store.action)('SET_INITIALIZED', { system: system, token: token })); case 6: _context4.next = 33; break; case 8: _context4.next = 10; return (0, _effects.call)(_apis.fetchSpaMeta); case 10: _yield$call4 = _context4.sent; securityStrategies = _yield$call4.securityStrategies; _yield$call4$session = _yield$call4.session; _yield$call4$session2 = _yield$call4$session === void 0 ? {} : _yield$call4$session; csrfToken = _yield$call4$session2.csrfToken; isAuthenticated = _yield$call4$session2.isAuthenticated; spaceSlug = _yield$call4.spaceSlug; error = _yield$call4.error; if (!error) { _context4.next = 23; break; } _context4.next = 21; return (0, _effects.put)((0, _store.action)('SET_SERVER_ERROR', error)); case 21: _context4.next = 33; break; case 23: if (!(isAuthenticated && !skipInit)) { _context4.next = 29; break; } _context4.next = 26; return (0, _effects.call)(_apis.retrieveJwt); case 26: _context4.t0 = _context4.sent; _context4.next = 30; break; case 29: _context4.t0 = null; case 30: _token = _context4.t0; _context4.next = 33; return (0, _effects.put)((0, _store.action)('SET_INITIALIZED', { csrfToken: csrfToken, securityStrategies: securityStrategies, spaceSlug: spaceSlug, token: _token })); case 33: _context4.next = 38; break; case 35: _context4.prev = 35; _context4.t1 = _context4["catch"](0); console.error(_context4.t1); case 38: case "end": return _context4.stop(); } }, _callee4, null, [[0, 35]]); })(); })); (0, _store.regSaga)((0, _effects.takeEvery)('LOGOUT_START', function (_ref4) { var payload = _ref4.payload; return /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee5() { var callback, isSaml, system, loggedIn; return (0, _regeneratorRuntime2["default"])().wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: callback = payload.callback, isSaml = payload.isSaml; _context5.prev = 1; _context5.next = 4; return (0, _effects.select)(function (state) { return state.getIn(['session', 'system']); }); case 4: system = _context5.sent; _context5.next = 7; return (0, _effects.select)(function (state) { return state.getIn(['session', 'token']); }); case 7: loggedIn = _context5.sent; if (!(!system && loggedIn)) { _context5.next = 11; break; } _context5.next = 11; return (0, _effects.call)(_apis.logoutDirect, isSaml); case 11: _context5.next = 13; return (0, _effects.put)((0, _store.action)('LOGOUT')); case 13: if (!(0, _lodashEs.isFunction)(callback)) { _context5.next = 16; break; } _context5.next = 16; return (0, _effects.call)(callback); case 16: _context5.next = 21; break; case 18: _context5.prev = 18; _context5.t0 = _context5["catch"](1); console.error(_context5.t0); case 21: case "end": return _context5.stop(); } }, _callee5, null, [[1, 18]]); })(); })); (0, _store.regSaga)((0, _effects.takeEvery)('SET_AUTHENTICATED', function (_ref5) { var payload = _ref5.payload; return /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee6() { return (0, _regeneratorRuntime2["default"])().wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: if (!(0, _lodashEs.isFunction)(payload.callback)) { _context6.next = 3; break; } _context6.next = 3; return (0, _effects.call)(payload.callback); case 3: case "end": return _context6.stop(); } }, _callee6); })(); })); var onChangeUsername = function onChangeUsername(e) { (0, _store.dispatch)('SET_USERNAME', e.target.value); }; var onChangePassword = function onChangePassword(e) { (0, _store.dispatch)('SET_PASSWORD', e.target.value); }; var onLogin = function onLogin(e, callback) { e.preventDefault(); (0, _store.dispatch)('LOGIN', callback); }; var logout = exports.logout = function logout(callback, isSaml) { (0, _store.dispatch)('LOGOUT_START', { callback: callback, isSaml: isSaml }); }; var timedOut = exports.timedOut = function timedOut() { (0, _store.dispatch)('TIMEOUT'); }; var getToken = exports.getToken = function getToken() { return _store.store.getState().getIn(['session', 'token']); }; var getCsrfToken = exports.getCsrfToken = function getCsrfToken() { return _store.store.getState().getIn(['session', 'csrfToken']); }; var AuthenticationComponent = exports.AuthenticationComponent = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(AuthenticationComponent, _Component); var _super = (0, _createSuper2["default"])(AuthenticationComponent); function AuthenticationComponent() { (0, _classCallCheck2["default"])(this, AuthenticationComponent); return _super.apply(this, arguments); } (0, _createClass2["default"])(AuthenticationComponent, [{ key: "componentDidMount", value: function componentDidMount() { if (this.props.system) { (0, _store.dispatch)('INITIALIZE', { system: true }); } else { (0, _store.dispatch)('INITIALIZE', { skipInit: this.props.skipInit }); } } }, { key: "render", value: function render() { var _this$props = this.props, initialized = _this$props.initialized, loggedIn = _this$props.loggedIn, login = _this$props.login, securityStrategies = _this$props.securityStrategies, serverError = _this$props.serverError, spaceSlug = _this$props.spaceSlug, token = _this$props.token; return this.props.children({ serverError: serverError, initialized: initialized, timedOut: loggedIn && !token, loggedIn: loggedIn, loginProps: (0, _objectSpread2["default"])({ onChangeUsername: onChangeUsername, onChangePassword: onChangePassword, onLogin: onLogin, onSso: securityStrategies && securityStrategies.length > 0 ? function (callback) { return (0, _store.dispatch)('SINGLE_SIGN_ON', { callback: callback, spaceSlug: spaceSlug }); } : null }, login) }); } }]); return AuthenticationComponent; }(_react.Component); var mapStateToProps = function mapStateToProps(state) { return { initialized: state.getIn(['session', 'initialized'], false), loggedIn: state.getIn(['session', 'loggedIn'], false), token: state.getIn(['session', 'token'], null), login: state.get('login', defaultLoginProps), spaceSlug: state.getIn(['session', 'spaceSlug'], ''), securityStrategies: state.getIn(['session', 'securityStrategies'], []), serverError: state.get('serverError') }; }; var AuthenticationContainer = exports.AuthenticationContainer = (0, _store.connect)(mapStateToProps)(AuthenticationComponent);