{"version":3,"sources":["services/auth.js","aws-exports.js","lib/utils.js","App.js","serviceWorker.js","store.js","index.js"],"names":["async","signIn","username","password","statusReturn","resetCode","newpassword","newPassRequiredAttributes","setUserInfo","data","Auth","forgotPasswordSubmit","console","log","e","status","error","message","user","challengeName","requiredAttributes","challengeParam","signInNewPassword","userIsAuthenticated","signOut","domain","window","location","hostname","includes","subdomain","split","subdomainRedirect","getSubdomainRedirect","currentUrl","toString","newUrl","replace","setSubdomainRedirect","href","userObject","completeNewPassword","then","catch","redirect","navHref","forgotPassword","errorOut","err","getUserGroup","currentAuthenticatedUser","groups","signInUserSession","accessToken","payload","LEVEL_DEVS","group","level","LEVEL_JAMBER","LEVEL_FBADMINS","LEVEL_FBUSERS","LEVELS","getUserLevel","userGroup","userLevel","getUserInfo","userInfo_str","localStorage","getItem","userInfo","JSON","parse","clear","reload","undefined","currentUserInfo","name","email","attributes","stringify","setItem","userIsDev","userIsJamber","userIsFBAdmin","userIsFBUser","authenticated","Authentication","React","Component","constructor","props","super","this","toggleUserLevel","bind","getModalAlert","closeModalAlert","state","modalAlert","visible","title","body","newLevelIndex","map","L","indexOf","length","incrementUserLevel","String","setState","forceUpdate","onClose","size","closeButton","render","action","timeout","PrivateRoute","to","pathname","referrer","PrivateDevRoute","PrivateJamberRoute","PrivateFBAdminsRoute","PrivateFBUsersRoute","awsmobile","objDiff","primaryObj","compareObj","nestDepth","diffNumerics","diffKeys","Object","keys","filter","key","notEqual","Array","isArray","nestObjDiff","diff","hasOwnProperty","objContains","obj","subObj","objProps","getOwnPropertyNames","subProps","subProp","API","configure","aws_config","Amplify","loading","className","DefaultLayout","lazy","Login","Page404","Page500","ChatBot","App","componentDidMount","userInfoLoaded","queryString","search","urlParams","URLSearchParams","code","get","session","callback","origin","postStonksResp","post","expiresAt","Suspense","fallback","exact","path","Boolean","match","initialState","sidebarShow","store","createStore","type","rest","ReactDOM","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.35e2bc65.chunk.js","sourcesContent":["import React from 'react';\nimport { Redirect, Route } from 'react-router-dom';\nimport { Auth } from '@aws-amplify/auth';\nimport Konami from 'react-konami-code';\nimport { CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react';\nimport { navHref } from 'src/lib/utils';\n\nexport async function signIn(\n username, //\n password,\n resetCode = null,\n newpassword = null,\n newPassRequiredAttributes = {},\n) {\n // run Amplify authentication, return status from sign-in\n // if new password required, return status so that login page shows the new password prompt\n // if resetcode passed, use that for login with password\n setUserInfo(null);\n let statusReturn;\n if (!resetCode) {\n // if not reset code, use just username and password\n let user;\n try {\n user = await Auth.signIn(username, password);\n } catch (e) {\n console.log('signIn err', e);\n return { status: 'signIn err', error: e.message };\n }\n if (user.challengeName === 'NEW_PASSWORD_REQUIRED') {\n // if new password required, use newpassword input\n const { requiredAttributes } = user.challengeParam; // the array of required attributes, e.g ['email', 'phone_number']\n if (newpassword) {\n try {\n const data = await signInNewPassword(user, newpassword, newPassRequiredAttributes);\n console.log('signInNewPassword', data);\n } catch (e) {\n console.log('signInNewPassword err', e);\n return { status: 'signInNewPassword err', error: e.message };\n }\n if (statusReturn?.status) {\n return statusReturn;\n }\n } else {\n // return status regarding needing a new password\n return { status: 'new_password_required', requiredAttributes };\n }\n }\n } else {\n try {\n const data = await Auth.forgotPasswordSubmit(username, resetCode, password);\n console.log('forgotPasswordSubmit', data);\n } catch (e) {\n console.log('forgotPasswordSubmit err', e);\n return { status: 'forgotPasswordSubmit err', error: e.message };\n }\n try {\n const data = await Auth.signIn(username, password);\n console.log('signIn', data);\n } catch (e) {\n console.log('signIn after forgotPassword err', e);\n return { status: 'signIn after forgotPassword err', error: e.message };\n }\n }\n // after sign in get latest userinfo and check authentication\n await setUserInfo();\n if (userIsAuthenticated()) {\n // if authenticated, get subdomain redirect so we can handle redirect from login. to location.\n // this does nothing if the user is already on the correct subdomain\n const domain = window.location.hostname;\n if (domain.includes('.')) {\n const subdomain = domain.split('.')[0];\n const subdomainRedirect = getSubdomainRedirect();\n const currentUrl = window.location.toString();\n if (subdomainRedirect && !currentUrl.includes(subdomainRedirect)) {\n // if redirect, perform redirect to href and perform sign-in again at new domain\n // this fails because sign in occurs before the href. Would need to work on cross-domain sign in somehow\n const newUrl = currentUrl.replace(subdomain, subdomainRedirect);\n setSubdomainRedirect(null);\n await Auth.signOut();\n window.location.href = newUrl;\n // await signIn(username, newpassword ? newpassword : password);\n }\n }\n } else {\n // failed auth, sign out and return error\n await Auth.signOut();\n await setUserInfo(null);\n return { status: 'not_authorized', error: 'User not authorized for this site.' };\n }\n return { status: 'success' };\n}\n\nasync function signInNewPassword(userObject, password, requiredAttributes = {}) {\n await Auth.completeNewPassword(\n userObject, // the Cognito User Object\n password, // the new password\n requiredAttributes,\n )\n .then((user) => {\n // at this time the user is logged in if no MFA required\n console.log('completeNewPassword user', user);\n })\n .catch((e) => {\n console.log('completeNewPassword err', e);\n });\n}\n\nexport async function signOut(redirect = true) {\n try {\n await Auth.signOut();\n await setUserInfo(null);\n redirect && navHref('/login');\n } catch (error) {\n console.log('error signing out: ', error);\n }\n}\n\nexport async function forgotPassword(username) {\n let errorOut;\n await Auth.forgotPassword(username)\n .then((data) => console.log('forgotPassword data', data))\n .catch((err) => {\n console.log('forgotPassword err', err);\n errorOut = err;\n });\n return errorOut;\n}\n\nexport function getUserGroup(currentAuthenticatedUser) {\n // get user and user groups from AWS Auth\n // based on user group, return userGroup\n const groups = currentAuthenticatedUser.signInUserSession.accessToken.payload['cognito:groups'];\n if (groups?.includes('devs')) {\n return 'devs';\n } else if (groups?.includes('jamber')) {\n return 'jamber';\n } else if (groups?.includes('fbadmins')) {\n return 'fbadmins';\n } else if (groups?.includes('fbusers')) {\n return 'fbusers';\n } else {\n return 'public';\n }\n}\n\nconst LEVEL_DEVS = { group: 'devs', level: 0 };\nconst LEVEL_JAMBER = { group: 'jamber', level: 10 };\nconst LEVEL_FBADMINS = { group: 'fbadmins', level: 20 };\nconst LEVEL_FBUSERS = { group: 'fbusers', level: 30 };\nconst LEVELS = [LEVEL_DEVS, LEVEL_JAMBER, LEVEL_FBADMINS, LEVEL_FBUSERS];\nexport function getUserLevel(userGroup) {\n // get user level from group name\n let userLevel;\n switch (userGroup) {\n case LEVEL_DEVS.group:\n userLevel = LEVEL_DEVS.level;\n break;\n case LEVEL_JAMBER.group:\n userLevel = LEVEL_JAMBER.level;\n break;\n case LEVEL_FBADMINS.group:\n userLevel = LEVEL_FBADMINS.level;\n break;\n case LEVEL_FBUSERS.group:\n userLevel = LEVEL_FBUSERS.level;\n break;\n default:\n userLevel = 100;\n }\n return userLevel;\n}\n\nexport function getUserInfo() {\n // get user info from session storage as object\n let userInfo_str = window.localStorage.getItem('userInfo');\n let userInfo = null;\n if (userInfo_str !== '') {\n try {\n userInfo = JSON.parse(userInfo_str);\n } catch (error) {\n console.error('Failed parsing local storage, clearing local storage', error);\n window.localStorage.clear();\n window.location.reload();\n }\n }\n return userInfo;\n}\n\nexport async function setUserInfo(userInfo = undefined) {\n const currentUserInfo = getUserInfo();\n if (userInfo === undefined && !currentUserInfo) {\n // if no userInfo input and not already set, get user info from Auth, set user info to session storage\n try {\n const user = await Auth.currentAuthenticatedUser();\n const name = user.username;\n const email = user.attributes.email;\n const group = getUserGroup(user);\n const level = getUserLevel(group);\n userInfo = {\n name,\n email,\n group,\n level,\n };\n } catch (error) {\n console.log('failed setUserInfo, setting to empty, error:', error);\n userInfo = null;\n }\n } else if (userInfo === undefined && currentUserInfo) {\n // return current user info if already set and user has not input their own\n return currentUserInfo;\n }\n console.log('setUserInfo', JSON.stringify(userInfo));\n window.localStorage.setItem('userInfo', userInfo && JSON.stringify(userInfo));\n return userInfo;\n}\n\nexport function setSubdomainRedirect(subdomain) {\n window.localStorage.setItem('subdomainRedirect', subdomain);\n}\nexport function getSubdomainRedirect() {\n return window.localStorage.getItem('subdomainRedirect');\n}\n\nexport async function incrementUserLevel() {\n // get userInfo.level, get next index in LEVELS and set\n let userInfo = getUserInfo();\n if (userInfo) {\n console.log('Konami!! userInfo before set:', userInfo);\n const currentLevel = LEVELS.map((L) => L.level).indexOf(userInfo.level);\n const newLevelIndex = (currentLevel + 1) % LEVELS.length;\n userInfo.level = LEVELS[newLevelIndex].level;\n userInfo.group = LEVELS[newLevelIndex].group;\n userInfo = await setUserInfo(userInfo);\n return userInfo;\n } else {\n console.error('Failed getUserInfo', userInfo);\n }\n}\n\nexport function userIsDev(userInfo = getUserInfo()) {\n return userInfo && userInfo.level <= LEVEL_DEVS.level;\n}\nexport function userIsJamber(userInfo = getUserInfo()) {\n return userInfo && userInfo.level <= LEVEL_JAMBER.level;\n}\nexport function userIsFBAdmin(userInfo = getUserInfo()) {\n return userInfo && userInfo.level <= LEVEL_FBADMINS.level;\n}\nexport function userIsFBUser(userInfo = getUserInfo()) {\n return userInfo && userInfo.level <= LEVEL_FBUSERS.level;\n}\n\nexport function userIsAuthenticated(userInfo = getUserInfo()) {\n const authenticated = userInfo && userInfo.name;\n return authenticated;\n}\n\nexport class Authentication extends React.Component {\n constructor(props) {\n super(props);\n // bind functions to 'this' so they can be called within react component calls\n this.toggleUserLevel = this.toggleUserLevel.bind(this);\n this.getModalAlert = this.getModalAlert.bind(this);\n this.closeModalAlert = this.closeModalAlert.bind(this);\n // set session variable for userGroup to public by default\n window.localStorage.setItem('userInfo', '');\n this.state = {\n modalAlert: {\n visible: false,\n title: '',\n body: '',\n },\n };\n }\n\n async componentDidMount() {\n await setUserInfo();\n }\n\n async toggleUserLevel() {\n const userInfo = await incrementUserLevel();\n const modalAlert = {\n visible: true,\n title: 'Toggled User Level',\n body: 'New level: ' + String(userInfo.group),\n };\n this.setState({ modalAlert });\n this.forceUpdate();\n }\n\n closeModalAlert() {\n const { modalAlert } = this.state;\n modalAlert.visible = false;\n this.setState({ modalAlert });\n }\n\n getModalAlert() {\n const { modalAlert } = this.state;\n return (\n
&session=\n const urlParams = new URLSearchParams(queryString);\n const code = urlParams.get('code');\n const session = urlParams.get('session');\n if (code && session && queryString) {\n const callback = window.location.origin;\n const redirect = callback + queryString;\n console.log('code and session present, navigating to stonks', {\n code,\n session,\n queryString,\n callback,\n redirect,\n });\n // post to stonks API\n const postStonksResp = await API.post('glorypantscomrest', '/stonks', {\n body: { code, session, queryString, callback, redirect },\n });\n // redirect to stonks page\n if (postStonksResp?.expiresAt) {\n window.location.href = `/#/stonks?expiresAt=${postStonksResp?.expiresAt}`;\n } else {\n window.location.href = `/#/stonks`;\n }\n }\n }\n\n render() {\n if (!this.state.userInfoLoaded) {\n return null;\n }\n return (\n \n {/* re-mount after konami because top level code will set new developer level */}\n \n \n \n \n } />\n } />\n } />\n } />\n } />\n \n \n \n );\n }\n}\n\nexport default App;\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://goo.gl/SC7cgQ',\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n\n // Execute callback\n if (config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (response.status === 404 || response.headers.get('content-type').indexOf('javascript') === -1) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister();\n });\n }\n}\n","import { createStore } from 'redux';\n\nconst initialState = {\n sidebarShow: true,\n};\n\nconst changeState = (state = initialState, { type, ...rest }) => {\n switch (type) {\n case 'set':\n return { ...state, ...rest };\n default:\n return state;\n }\n};\n\nconst store = createStore(changeState);\nexport default store;\n","import 'react-app-polyfill/stable';\nimport 'core-js';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport { Provider } from 'react-redux';\nimport store from './store';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root'),\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}