From 11eed81e806943cbd31b1752e5c2784fb7ea2231 Mon Sep 17 00:00:00 2001 From: Luke Berndt Date: Sun, 24 Jan 2021 14:08:53 -0500 Subject: [PATCH] mostly seems to be working! --- .env.test | 37 +++ .gitignore | 1 + account/.dockerignore | 3 +- account/.eslintcache | 2 +- account/.not-env | 12 - account/Dockerfile | 9 + account/server/config/express.js | 38 ++- .../config/passport-strategies/local.js | 6 +- account/server/controllers/plans.js | 8 +- account/server/controllers/users.js | 28 +- account/server/index.js | 41 ++- account/server/models/user.js | 22 +- account/src/App/Navigation.js | 2 +- account/src/User/user-actions.js | 18 +- account/src/index.js | 2 + admin/.dockerignore | 2 + admin/.eslintcache | 2 +- admin/.not-env | 10 - admin/Dockerfile | 7 + admin/env-example | 12 - admin/package.json | 9 + admin/server/config/express.js | 5 +- admin/server/config/passport.js | 7 +- admin/server/controllers/systems.js | 27 +- admin/server/index.js | 84 ++++-- admin/src/App/Navigation.js | 2 +- admin/src/App/Restricted.js | 1 - admin/src/Components/Message.js | 31 +++ admin/src/Group/group-actions.js | 13 +- admin/src/Permission/permission-actions.js | 14 +- admin/src/System/CallChart.js | 13 +- admin/src/System/ErrorChart.js | 135 +++++----- admin/src/System/ResponsiveCallChart.js | 2 +- admin/src/System/ResponsiveErrorChart.js | 2 +- admin/src/System/System.js | 35 +-- admin/src/System/system-actions.js | 8 +- admin/src/Talkgroups/talkgroup-actions.js | 19 +- admin/src/index.js | 11 +- admin/src/redux-router/reducers.js | 2 + admin/yarn.lock | 252 +++++++++++++++++- backend/config/express.js | 20 +- backend/controllers/stats.js | 1 + backend/index.js | 7 - data/mongo/.gitignore | 4 - docker-compose.yml | 83 +++--- docker-test.sh | 7 +- frontend/.dockerignore | 2 + frontend/Dockerfile | 4 + frontend/src/Call/call-actions.js | 2 - mongo/Dockerfile | 2 +- 50 files changed, 723 insertions(+), 343 deletions(-) create mode 100644 .env.test delete mode 100644 account/.not-env create mode 100644 admin/.dockerignore delete mode 100644 admin/.not-env delete mode 100644 admin/env-example create mode 100644 admin/src/Components/Message.js delete mode 100644 data/mongo/.gitignore create mode 100644 frontend/.dockerignore diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..dd4df7c --- /dev/null +++ b/.env.test @@ -0,0 +1,37 @@ +MEDIA=/Users/luke/Testing/media +DATA=/Users/luke/Testing/data +MAILJET_KEY="4d2a0f6deb20a7890afee2daf595c22d" +MAILJET_SECRET="fb74f682d68bf6b05ab626c0ac93a6da" +STAGE=test +TAG=1.7 +DOMAIN_NAME="openmhz.test" +PROTOCOL="http://" + + +REACT_APP_BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}" +REACT_APP_FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}" +REACT_APP_SOCKET_SERVER=wss://socket.${DOMAIN_NAME} +REACT_APP_ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}" +REACT_APP_ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}" +REACT_APP_COOKIE_DOMAIN=".${DOMAIN_NAME}" +REACT_APP_ADMIN_EMAIL=luke@robotastic.com +REACT_APP_SITE_NAME=OpenMHz +REACT_APP_ARCHIVE_DAYS=30 +STRIPE_PUBLISHABLE_KEY="" +STRIPE_SECRET_KEY="sk_test_S5kfQwdyRDgKtu9FQYpPh3B3" +BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}" +FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}" +ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}" +SOCKET_SERVER="wss://socket.${DOMAIN_NAME}" +ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}" +COOKIE_DOMAIN=".${DOMAIN_NAME}" +SITE_NAME="OpenMHz" +ADMIN_EMAIL="luke@robotastic.com" +S3_PROFILE='wasabi-account' +S3_ENPOINT='s3.us-west-1.wasabisys.com' +FREE_PLAN=0 +PRO_PLAN=10 +FREE_PLAN_PRICE=0 +PRO_PLAN_PRICE=15 +FREE_PLAN_ARCHIVE=7 +PRO_PLAN_ARCHIVE=30 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 317d411..31cc58b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ prod.env test.env account/.eslintcache +account/.eslintcache diff --git a/account/.dockerignore b/account/.dockerignore index 30bc162..563ba71 100644 --- a/account/.dockerignore +++ b/account/.dockerignore @@ -1 +1,2 @@ -/node_modules \ No newline at end of file +/node_modules +/build \ No newline at end of file diff --git a/account/.eslintcache b/account/.eslintcache index ca9e728..732a49e 100644 --- a/account/.eslintcache +++ b/account/.eslintcache @@ -1 +1 @@ -[{"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/index.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/reducers.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/NavigationContainer.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-actions.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Navigation.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/configureStore.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-reducer.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Login.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/query-string.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/LoginContainer.js":"10","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/UserForm.js":"11","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/RegisterContainer.js":"12","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPasswordContainer.js":"13","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPassword.js":"14","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmail.js":"15","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmailContainer.js":"16","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmailContainer.js":"17","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmail.js":"18","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ProfileContainer.js":"19","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Restricted.js":"20","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/App.js":"21","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmailContainer.js":"22","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPasswordContainer.js":"23","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/TermsContainer.js":"24","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Register.js":"25","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Profile.js":"26","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmail.js":"27","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-constants.js":"28","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPassword.js":"29","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Terms.js":"30"},{"size":2128,"mtime":1610891944991,"results":"31","hashOfConfig":"32"},{"size":333,"mtime":1609904150827,"results":"33","hashOfConfig":"32"},{"size":570,"mtime":1609902896319,"results":"34","hashOfConfig":"32"},{"size":10143,"mtime":1609987516024,"results":"35","hashOfConfig":"32"},{"size":1489,"mtime":1609987532309,"results":"36","hashOfConfig":"32"},{"size":759,"mtime":1609902457124,"results":"37","hashOfConfig":"32"},{"size":3424,"mtime":1609902858959,"results":"38","hashOfConfig":"32"},{"size":5806,"mtime":1609987528328,"results":"39","hashOfConfig":"32"},{"size":362,"mtime":1609987504726,"results":"40","hashOfConfig":"32"},{"size":942,"mtime":1609985062605,"results":"41","hashOfConfig":"32"},{"size":8461,"mtime":1609987520749,"results":"42","hashOfConfig":"32"},{"size":273,"mtime":1609902858948,"results":"43","hashOfConfig":"32"},{"size":285,"mtime":1609902858952,"results":"44","hashOfConfig":"32"},{"size":2861,"mtime":1609986763111,"results":"45","hashOfConfig":"32"},{"size":1813,"mtime":1609987539627,"results":"46","hashOfConfig":"32"},{"size":270,"mtime":1609902858943,"results":"47","hashOfConfig":"32"},{"size":282,"mtime":1609902858956,"results":"48","hashOfConfig":"32"},{"size":692,"mtime":1609987522924,"results":"49","hashOfConfig":"32"},{"size":290,"mtime":1609902858946,"results":"50","hashOfConfig":"32"},{"size":1911,"mtime":1609987530612,"results":"51","hashOfConfig":"32"},{"size":253,"mtime":1609987534146,"results":"52","hashOfConfig":"32"},{"size":282,"mtime":1609902858953,"results":"53","hashOfConfig":"32"},{"size":273,"mtime":1609902858951,"results":"54","hashOfConfig":"32"},{"size":250,"mtime":1609902858954,"results":"55","hashOfConfig":"32"},{"size":1598,"mtime":1609987526511,"results":"56","hashOfConfig":"32"},{"size":1204,"mtime":1609902858945,"results":"57","hashOfConfig":"32"},{"size":1390,"mtime":1609987518565,"results":"58","hashOfConfig":"32"},{"size":1839,"mtime":1609902858958,"results":"59","hashOfConfig":"32"},{"size":2802,"mtime":1609987524544,"results":"60","hashOfConfig":"32"},{"size":3381,"mtime":1609986995536,"results":"61","hashOfConfig":"32"},{"filePath":"62","messages":"63","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"3sdj67",{"filePath":"64","messages":"65","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"67","messages":"68","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"69","messages":"70","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"71","messages":"72","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"73","messages":"74","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"75","messages":"76","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"77","messages":"78","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"79","messages":"80","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"81","usedDeprecatedRules":"66"},{"filePath":"82","messages":"83","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"84","messages":"85","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"86","messages":"87","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"88","messages":"89","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"90","messages":"91","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"92","messages":"93","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"94","messages":"95","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"96","messages":"97","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"98","messages":"99","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"100","messages":"101","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"102","messages":"103","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"104","messages":"105","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"106","messages":"107","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"108","messages":"109","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"110","messages":"111","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"112","messages":"113","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"114","messages":"115","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"116","messages":"117","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"118","messages":"119","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"120","messages":"121","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},{"filePath":"122","messages":"123","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"66"},"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/index.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/reducers.js",[],["124","125"],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/NavigationContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Navigation.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/configureStore.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Login.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/query-string.js",["126"],"export default {\n parse: function parse(queryString) {\n var query = {};\n var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i].split('=');\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n }\n return query;\n }\n}\n","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/LoginContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/UserForm.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/RegisterContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPasswordContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPassword.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmail.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmailContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmailContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmail.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ProfileContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Restricted.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmailContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPasswordContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/TermsContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Register.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Profile.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmail.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPassword.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Terms.js",[],{"ruleId":"127","replacedBy":"128"},{"ruleId":"129","replacedBy":"130"},{"ruleId":"131","severity":1,"message":"132","line":1,"column":1,"nodeType":"133","endLine":11,"endColumn":2},"no-native-reassign",["134"],"no-negated-in-lhs",["135"],"import/no-anonymous-default-export","Assign object to a variable before exporting as module default","ExportDefaultDeclaration","no-global-assign","no-unsafe-negation"] \ No newline at end of file +[{"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/index.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/reducers.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/NavigationContainer.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-actions.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Navigation.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/configureStore.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-reducer.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Login.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/query-string.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/LoginContainer.js":"10","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/UserForm.js":"11","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/RegisterContainer.js":"12","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPasswordContainer.js":"13","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPassword.js":"14","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmail.js":"15","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmailContainer.js":"16","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmailContainer.js":"17","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmail.js":"18","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ProfileContainer.js":"19","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Restricted.js":"20","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/App.js":"21","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmailContainer.js":"22","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPasswordContainer.js":"23","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/TermsContainer.js":"24","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Register.js":"25","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Profile.js":"26","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmail.js":"27","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-constants.js":"28","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPassword.js":"29","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Terms.js":"30"},{"size":2128,"mtime":1610891944991,"results":"31","hashOfConfig":"32"},{"size":333,"mtime":1609904150827,"results":"33","hashOfConfig":"32"},{"size":570,"mtime":1609902896319,"results":"34","hashOfConfig":"32"},{"size":10455,"mtime":1610977327935,"results":"35","hashOfConfig":"32"},{"size":1489,"mtime":1609987532309,"results":"36","hashOfConfig":"32"},{"size":759,"mtime":1609902457124,"results":"37","hashOfConfig":"32"},{"size":3424,"mtime":1609902858959,"results":"38","hashOfConfig":"32"},{"size":5806,"mtime":1609987528328,"results":"39","hashOfConfig":"32"},{"size":362,"mtime":1609987504726,"results":"40","hashOfConfig":"32"},{"size":942,"mtime":1609985062605,"results":"41","hashOfConfig":"32"},{"size":8461,"mtime":1609987520749,"results":"42","hashOfConfig":"32"},{"size":273,"mtime":1609902858948,"results":"43","hashOfConfig":"32"},{"size":285,"mtime":1609902858952,"results":"44","hashOfConfig":"32"},{"size":2861,"mtime":1609986763111,"results":"45","hashOfConfig":"32"},{"size":1813,"mtime":1609987539627,"results":"46","hashOfConfig":"32"},{"size":270,"mtime":1609902858943,"results":"47","hashOfConfig":"32"},{"size":282,"mtime":1609902858956,"results":"48","hashOfConfig":"32"},{"size":692,"mtime":1609987522924,"results":"49","hashOfConfig":"32"},{"size":290,"mtime":1609902858946,"results":"50","hashOfConfig":"32"},{"size":1911,"mtime":1609987530612,"results":"51","hashOfConfig":"32"},{"size":253,"mtime":1609987534146,"results":"52","hashOfConfig":"32"},{"size":282,"mtime":1609902858953,"results":"53","hashOfConfig":"32"},{"size":273,"mtime":1609902858951,"results":"54","hashOfConfig":"32"},{"size":250,"mtime":1609902858954,"results":"55","hashOfConfig":"32"},{"size":1598,"mtime":1609987526511,"results":"56","hashOfConfig":"32"},{"size":1204,"mtime":1609902858945,"results":"57","hashOfConfig":"32"},{"size":1390,"mtime":1609987518565,"results":"58","hashOfConfig":"32"},{"size":1839,"mtime":1609902858958,"results":"59","hashOfConfig":"32"},{"size":2802,"mtime":1609987524544,"results":"60","hashOfConfig":"32"},{"size":3381,"mtime":1609986995536,"results":"61","hashOfConfig":"32"},{"filePath":"62","messages":"63","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},"3sdj67",{"filePath":"65","messages":"66","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"67","messages":"68","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"69","messages":"70","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"71","messages":"72","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"73","messages":"74","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"75","messages":"76","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"77","messages":"78","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"79","messages":"80","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"81","usedDeprecatedRules":"64"},{"filePath":"82","messages":"83","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"84","messages":"85","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"86","messages":"87","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"88","messages":"89","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"90","messages":"91","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"92","messages":"93","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"94","messages":"95","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"96","messages":"97","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"98","messages":"99","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"100","messages":"101","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"102","messages":"103","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"104","messages":"105","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"106","messages":"107","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"108","messages":"109","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"110","messages":"111","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"112","messages":"113","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"114","messages":"115","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"116","messages":"117","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"118","messages":"119","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"120","messages":"121","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},{"filePath":"122","messages":"123","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"64"},"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/index.js",[],["124","125"],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/reducers.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/NavigationContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Navigation.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/redux-router/configureStore.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Login.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/query-string.js",["126"],"export default {\n parse: function parse(queryString) {\n var query = {};\n var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i].split('=');\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n }\n return query;\n }\n}\n","/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/LoginContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/UserForm.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/RegisterContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPasswordContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SendResetPassword.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmail.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ConfirmEmailContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmailContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmail.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ProfileContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/Restricted.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/App/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/SentConfirmEmailContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPasswordContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/TermsContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Register.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Profile.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/WaitConfirmEmail.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/user-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/ResetPassword.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/account/src/User/Terms.js",[],{"ruleId":"127","replacedBy":"128"},{"ruleId":"129","replacedBy":"130"},{"ruleId":"131","severity":1,"message":"132","line":1,"column":1,"nodeType":"133","endLine":11,"endColumn":2},"no-native-reassign",["134"],"no-negated-in-lhs",["135"],"import/no-anonymous-default-export","Assign object to a variable before exporting as module default","ExportDefaultDeclaration","no-global-assign","no-unsafe-negation"] \ No newline at end of file diff --git a/account/.not-env b/account/.not-env deleted file mode 100644 index bab6502..0000000 --- a/account/.not-env +++ /dev/null @@ -1,12 +0,0 @@ -REACT_APP_BACKEND_SERVER=https://api.openmhz.com -REACT_APP_FRONTEND_SERVER=https://openmhz.com -REACT_APP_SOCKET_SERVER=wss://api.openmhz.com -REACT_APP_ACCOUNT_SERVER=https://account.openmhz.com -REACT_APP_ADMIN_SERVER=localhost:3000 -REACT_APP_ADMIN_EMAIL=luke@robotastic.com -REACT_APP_SITE_NAME=OpenMHz -REACT_APP_ARCHIVE_DAYS=30 -REACT_APP_PRO_PLAN=1 -REACT_APP_FREE_PLAN=0 -REACT_APP_PRO_PLAN_ARCHIVE=30 -REACT_APP_FREE_PLAN_ARCHIVE=7 diff --git a/account/Dockerfile b/account/Dockerfile index 713548e..03c1f20 100644 --- a/account/Dockerfile +++ b/account/Dockerfile @@ -2,11 +2,19 @@ FROM node:13.12.0-alpine as build WORKDIR /app ENV PATH /app/node_modules/.bin:$PATH +ARG REACT_APP_BACKEND_SERVER +ARG REACT_APP_ADMIN_SERVER +ARG REACT_APP_ACCOUNT_SERVER +ARG REACT_APP_FRONTEND_SERVER +ARG REACT_APP_SITE_NAME +ARG REACT_APP_ADMIN_EMAIL +ARG NODE_ENV COPY package.json ./ RUN npm install RUN npm install react-scripts@3.4.1 -g --silent COPY . ./ RUN npm run build +RUN env # production environment FROM node:13.12.0-alpine @@ -14,6 +22,7 @@ RUN mkdir -p /app/public COPY ./package.json /tmp RUN cd /tmp && npm install RUN cp -a /tmp/node_modules /app +RUN env WORKDIR /app COPY server /app COPY --from=build /app/build /app/public diff --git a/account/server/config/express.js b/account/server/config/express.js index 5a8f638..38da07c 100644 --- a/account/server/config/express.js +++ b/account/server/config/express.js @@ -6,8 +6,12 @@ const connectMongo = require("connect-mongo"); const secrets = require("./secrets"); const MongoStore = connectMongo(session) -var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; - +var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; +var backend_server = process.env['REACT_APP_BACKEND_SERVER'] != null ? process.env['REACT_APP_BACKEND_SERVER'] : 'https://api.openmhz.com'; +var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com'; +var socket_server = process.env['REACT_APP_SOCKET_SERVER'] != null ? process.env['REACT_APP_SOCKET_SERVER'] : 'wss://socket.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; +var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; +var dev_server = frontend_server + ":3000" module.exports = function(app, passport) { app.set("port", 3009) @@ -22,7 +26,6 @@ module.exports = function(app, passport) { app.use(express.static(path.join(process.cwd(), 'public'))); const sess = { - secret: 'secret', /*saveUninitialized: false, resave: false,*/ resave: true, @@ -56,5 +59,34 @@ module.exports = function(app, passport) { app.use(passport.initialize()) app.use(passport.session()) + + app.use('/*', function(req, res, next) { + var allowedOrigins = [ account_server]; + allowedOrigins.push(frontend_server); + allowedOrigins.push(backend_server); + allowedOrigins.push(socket_server); + allowedOrigins.push(dev_server); + var origin = req.headers.origin; + + + if (allowedOrigins.indexOf(origin) > -1) { + res.setHeader('Access-Control-Allow-Origin', origin); + } else if (req.headers["user-agent"] == 'TrunkRecorder1.0') { + res.setHeader('Access-Control-Allow-Origin', "*"); + } else { + res.setHeader('Access-Control-Allow-Origin', "*"); + if (origin) { + console.warn("forcing CORS for: " + origin + " referer: " + req.headers.referer); + } + } + res.header("Access-Control-Allow-Headers", "X-Requested-With"); + res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS,WEBSOCKET'); + res.header('Access-Control-Allow-Credentials', 'true'); + res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Access-Control-Allow-Credentials, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Max-Age"); + res.header('Access-Control-Max-Age', '600'); + next(); + }); + + } diff --git a/account/server/config/passport-strategies/local.js b/account/server/config/passport-strategies/local.js index d01cdc9..21c5bc7 100644 --- a/account/server/config/passport-strategies/local.js +++ b/account/server/config/passport-strategies/local.js @@ -21,11 +21,15 @@ const local = new LocalStrategy({ } }] }, (err, user) => { - if(!user) return done(null, false, { message: `Email ${email} not found` }) + if(!user) { + console.error("Auth Error - user not found: " + email); + return done(null, false, { message: `Invalid email or password` }) + } user.comparePassword(password, (err, isMatch) => { if (isMatch) { return done(null, user) } else { + console.error("Auth Error - password mismatch: " + email); return done(null, false, { message: "Invalid email or password" }) } }) diff --git a/account/server/controllers/plans.js b/account/server/controllers/plans.js index b4d6307..7b943c6 100644 --- a/account/server/controllers/plans.js +++ b/account/server/controllers/plans.js @@ -7,10 +7,10 @@ const stripeKeySecret = process.env.STRIPE_SECRET_KEY; const stripe = require("stripe")(stripeKeySecret); -var admin_email = process.env['ADMIN_EMAIL'] != null ? process.env['ADMIN_EMAIL'] : "luke@openmhz.com"; -var site_name = process.env['SITE_NAME'] != null ? process.env['SITE_NAME'] : "OpenMHz"; -var account_server = process.env['ACCOUNT_SERVER'] != null ? process.env['ACCOUNT_SERVER'] : "https://account.openmhz.com"; -var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; +var admin_email = process.env['REACT_APP_ADMIN_EMAIL'] != null ? process.env['REACT_ADMIN_ADMIN_EMAIL'] : "luke@openmhz.com"; +var site_name = process.env['REACT_APP_SITE_NAME'] != null ? process.env['REACT_APP_SITE_NAME'] : "OpenMHz"; +var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : "https://account.openmhz.com"; +var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; exports.isLoggedIn = function (req, res, next) { if (req.isAuthenticated()) return next(); diff --git a/account/server/controllers/users.js b/account/server/controllers/users.js index f916874..1708530 100644 --- a/account/server/controllers/users.js +++ b/account/server/controllers/users.js @@ -7,10 +7,10 @@ process.env['MAILJET_KEY'], ); const crypto = require("crypto"); -var admin_email = process.env['ADMIN_EMAIL'] != null ? process.env['ADMIN_EMAIL'] : "luke@openmhz.com"; -var site_name = process.env['SITE_NAME'] != null ? process.env['SITE_NAME'] : "OpenMHz"; -var account_server = process.env['ACCOUNT_SERVER'] != null ? process.env['ACCOUNT_SERVER'] : "https://account.openmhz.com"; -var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; +var admin_email = process.env['REACT_APP_ADMIN_EMAIL'] != null ? process.env['REACT_APP_ADMIN_EMAIL'] : "luke@openmhz.com"; +var site_name = process.env['REACT_APP_SITE_NAME'] != null ? process.env['REACT_APP_SITE_NAME'] : "OpenMHz"; +var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : "https://account.openmhz.com"; +var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic'; exports.isLoggedIn = function(req, res, next) { if (req.isAuthenticated()) return next(); @@ -21,8 +21,7 @@ exports.isLoggedIn = function(req, res, next) { exports.authenticated = function(req, res, next) { res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); - console.log("auth: " + req.isAuthenticated()); - console.log("req.user: " + req.user); + console.log("account/server/controllers/users.js - exports.authenticated() Auth check for user: " + req.user + " is: " + req.isAuthenticated()); if (req.isAuthenticated()) { var clientUser = (({ firstName, @@ -42,11 +41,7 @@ exports.authenticated = function(req, res, next) { req.user ); clientUser.userId = req.user.id - if (req.user.customerId) { - clientUser.billing = true; - } else { - clientUser.billing = false; - } + return res.json({ success: true, user: clientUser @@ -93,7 +88,7 @@ exports.login = function(req, res, next) { userId: user.id }); } - console.log(user); + console.log("account/server/controllers/users.js - req.login() Authenicated: " + user.email); // go ahead and create the new user var clientUser = (({ firstName, @@ -454,6 +449,7 @@ exports.terms = function(req, res, next) { exports.validateProfile = function(req, res, next) { + console.log("Validating user profile: "+ req.body.email); if (!req.body.firstName || (req.body.firstName.length < 2)) { console.error("ERROR: Validate System - req.body.firstName"); res.json({ @@ -549,6 +545,8 @@ exports.updateProfile = function(req, res, next) { // ------------------------------------------- exports.register = function(req, res, next) { + console.log("Registration request for: " + req.body.email); + User.findOne({ $or: [{ email: req.body.email @@ -585,16 +583,16 @@ exports.register = function(req, res, next) { ); user.password = req.body.password; user.email = req.body.email; - + User.create(user).then(function(dbUser) { - console.log(dbUser); + console.log("Successfully registered: " + dbUser.email + ", now sending confirmation email."); // Since regiestration worked, send a confirmation email. return handleSendConfirmEmail(dbUser); }).then(function(result) { res.json(result); return; }).catch(function(err) { - console.error(err); + console.error("Error creating user: " + user.email + " Error: " +err); res.json({ success: false, message: err diff --git a/account/server/index.js b/account/server/index.js index c7d87c7..0ed2e58 100644 --- a/account/server/index.js +++ b/account/server/index.js @@ -15,19 +15,44 @@ const app = express() // ------------------------------------------- -const connect = () => { - mongoose.connect(secrets.db, (err, res) => { +async function connect() { + + // Demonstrate the readyState and on event emitters + console.log(mongoose.connection.readyState); //logs 0 + mongoose.connection.on('connecting', () => { + console.log('Mongoose is connecting') + console.log(mongoose.connection.readyState); //logs 2 + }); + mongoose.connection.on('connected', () => { + console.log('Mongoose is connected'); + console.log(mongoose.connection.readyState); //logs 1 + }); + mongoose.connection.on('disconnecting', () => { + console.log('Mongoose is disconnecting'); + console.log(mongoose.connection.readyState); // logs 3 + }); + + // Connect to a MongoDB server running on 'localhost:27017' and use the + // 'test' database. + await mongoose.connect(secrets.db, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }, (err, res) => { if (err) { - console.log(`Error connecting to ${secrets.db}. ${err}`) + console.log(`Mongoose - Error connecting to ${secrets.db}. ${err}`) } else { - console.log(`Successfully connected to ${secrets.db}.`) + console.log(`Mongoose Successfully connected to ${secrets.db}.`) } }) + console.log("All Done"); } -connect() - -mongoose.connection.on("error", console.error) -mongoose.connection.on("disconnected", connect) +connect(); +mongoose.connection.on('error', err => { + console.error("Mongoose Error!") + console.error(err); + }); +mongoose.connection.on('disconnected', () => { + console.log('Mongoose disconnected'); + console.log(mongoose.connection.readyState); //logs 0 + connect(); +}); // ------------------------------------------- diff --git a/account/server/models/user.js b/account/server/models/user.js index 2d8b18e..08ebad7 100644 --- a/account/server/models/user.js +++ b/account/server/models/user.js @@ -58,6 +58,7 @@ const UserSchema = new mongoose.Schema({ /** * Password hash middleware. */ +/* UserSchema.pre("save", function(next) { var user = this if (!user.isModified("password")) return next() @@ -70,11 +71,23 @@ UserSchema.pre("save", function(next) { next() }) }) -}) +})*/ + +UserSchema.pre("save", function(next) { + if(!this.isModified("password")) { + return next(); + } + hashed = bcrypt.hashSync(this.password, 8); + this.password = hashed; + this.local.password = hashed; + + next(); +}); /* Defining our own custom document instance method */ +/* UserSchema.methods = { comparePassword: function(candidatePassword, cb) { bcrypt.compare(candidatePassword, this.local.password, (err, isMatch) => { @@ -82,7 +95,12 @@ UserSchema.pre("save", function(next) { cb(null, isMatch) }) } - } + }*/ + + UserSchema.methods.comparePassword = function(plaintext, callback) { + return callback(null, bcrypt.compareSync(plaintext, this.local.password)); +}; + /** * Statics diff --git a/account/src/App/Navigation.js b/account/src/App/Navigation.js index 221748f..cd69f71 100644 --- a/account/src/App/Navigation.js +++ b/account/src/App/Navigation.js @@ -23,7 +23,7 @@ class Navigation extends Component { {this.props.user.authenticated ? ( - OpenMHz + {process.env.REACT_APP_SITE_NAME} {/* diff --git a/account/src/User/user-actions.js b/account/src/User/user-actions.js index 0d58ce0..83c2756 100644 --- a/account/src/User/user-actions.js +++ b/account/src/User/user-actions.js @@ -156,7 +156,7 @@ export function manualLogin( return dispatch => { dispatch(beginLogin()); - return makeUserRequest("post", data, "/login", { withCredentials: true }) + return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/login", { withCredentials: true }) .then(response => { if (response.data.success) { const user = response.data.user @@ -252,7 +252,7 @@ export function manualLogout() { export function confirmEmail(userId, token) { return dispatch => { dispatch(beginConfirm()); - return makeUserRequest("post", {}, "/users/" + userId + "/confirm/" + token).then( + return makeUserRequest("post", {}, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + userId + "/confirm/" + token).then( response => { if (response.data.success) { dispatch(confirmSuccess()); @@ -271,7 +271,7 @@ export function confirmEmail(userId, token) { export function resetPassword(userId, token, password) { return dispatch => { dispatch(beginResetPassword()); - return makeUserRequest("post", { password: password }, "/users/" + userId + "/reset-password/" + token).then( + return makeUserRequest("post", { password: password }, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + userId + "/reset-password/" + token).then( response => { if (response.data.success) { dispatch(resetPasswordSuccess()); @@ -289,7 +289,7 @@ export function resetPassword(userId, token, password) { export function sendResetPassword(data) { return dispatch => { dispatch(beginSendResetPassword()); - return makeUserRequest("post", data, "/api/send-reset-password").then( + return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/api/send-reset-password").then( response => { if (response.data.success) { dispatch(sendResetPasswordSuccess()); @@ -307,7 +307,7 @@ export function sendResetPassword(data) { export function sendConfirmEmail(data) { return dispatch => { dispatch(beginSendConfirm()); - return makeUserRequest("post", data, "/users/" + data + "/send-confirm").then( + return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + data + "/send-confirm").then( response => { if (response.data.success) { dispatch(sendConfirmSuccess()); @@ -325,7 +325,7 @@ export function sendConfirmEmail(data) { export function acceptTerms(data) { return dispatch => { dispatch(beginAgreeTerms()); - return makeUserRequest("post", data, "/users/" + data + "/terms").then( + return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + data + "/terms").then( response => { if (response.data.success) { dispatch(agreeTermsSuccess()); @@ -343,7 +343,7 @@ export function updateProfile(data) { return dispatch => { dispatch(beginUpdateProfile()); - return makeUserRequest("post", data, "/users/" + data.userId) + return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + data.userId) .then(response => { if (response.data.success) { const user = response.data.user @@ -367,8 +367,8 @@ export function updateProfile(data) { export function manualRegister(data) { return dispatch => { dispatch(beginRegister()); - - return makeUserRequest("post", data, "/register") + console.log("It is: " + process.env.REACT_APP_ACCOUNT_SERVER ); + return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/register") .then(response => { if (response.data.success) { data.userId = response.data.userId; diff --git a/account/src/index.js b/account/src/index.js index f3dfb86..e382bc9 100644 --- a/account/src/index.js +++ b/account/src/index.js @@ -20,6 +20,8 @@ import TermsContainer from "./User/TermsContainer" const store = configureStore(/* provide initial state if any */) +console.log(process.env); +//This thssi ReactDOM.render( { /* place ConnectedRouter under Provider */ } diff --git a/admin/.dockerignore b/admin/.dockerignore new file mode 100644 index 0000000..563ba71 --- /dev/null +++ b/admin/.dockerignore @@ -0,0 +1,2 @@ +/node_modules +/build \ No newline at end of file diff --git a/admin/.eslintcache b/admin/.eslintcache index 4d4abd4..b5d4dad 100644 --- a/admin/.eslintcache +++ b/admin/.eslintcache @@ -1 +1 @@ -[{"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/features/counter/Counter.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Navigation.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-constants.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/configureStore.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-reducer.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-reducer.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-reducer.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/index.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Components/About.js":"10","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/NavigationContainer.js":"11","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-constants.js":"12","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-actions.js":"13","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemCard.js":"14","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Restricted.js":"15","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-actions.js":"16","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-constants.js":"17","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-reducer.js":"18","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/App.js":"19","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-constants.js":"20","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/ListSystems.js":"21","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-reducer.js":"22","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/reducers.js":"23","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-constants.js":"24","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-constants.js":"25","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemForm.js":"26","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystemContainer.js":"27","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystem.js":"28"},{"size":1463,"mtime":499162500000,"results":"29","hashOfConfig":"30"},{"size":1626,"mtime":499162500000,"results":"31","hashOfConfig":"30"},{"size":1499,"mtime":1609685400124,"results":"32","hashOfConfig":"30"},{"size":115,"mtime":1545362103836,"results":"33","hashOfConfig":"30"},{"size":759,"mtime":1609425817988,"results":"34","hashOfConfig":"30"},{"size":2037,"mtime":1545362103826,"results":"35","hashOfConfig":"30"},{"size":3029,"mtime":1609813173090,"results":"36","hashOfConfig":"30"},{"size":636,"mtime":1545362103837,"results":"37","hashOfConfig":"30"},{"size":1377,"mtime":1609814695852,"results":"38","hashOfConfig":"30"},{"size":1278,"mtime":1609812739781,"results":"39","hashOfConfig":"30"},{"size":570,"mtime":1609684078480,"results":"40","hashOfConfig":"30"},{"size":862,"mtime":1545362103839,"results":"41","hashOfConfig":"30"},{"size":1344,"mtime":1609686206535,"results":"42","hashOfConfig":"30"},{"size":1145,"mtime":1609813170344,"results":"43","hashOfConfig":"30"},{"size":2064,"mtime":1609813175115,"results":"44","hashOfConfig":"30"},{"size":5836,"mtime":1609813859389,"results":"45","hashOfConfig":"30"},{"size":320,"mtime":1546657322904,"results":"46","hashOfConfig":"30"},{"size":1045,"mtime":1609813166756,"results":"47","hashOfConfig":"30"},{"size":253,"mtime":1609814499873,"results":"48","hashOfConfig":"30"},{"size":688,"mtime":1545362103825,"results":"49","hashOfConfig":"30"},{"size":1156,"mtime":1609813188195,"results":"50","hashOfConfig":"30"},{"size":2262,"mtime":1609813202417,"results":"51","hashOfConfig":"30"},{"size":768,"mtime":1609684363308,"results":"52","hashOfConfig":"30"},{"size":848,"mtime":1545362103820,"results":"53","hashOfConfig":"30"},{"size":537,"mtime":1545362103845,"results":"54","hashOfConfig":"30"},{"size":13151,"mtime":1608606472255,"results":"55","hashOfConfig":"30"},{"size":381,"mtime":1609814717150,"results":"56","hashOfConfig":"30"},{"size":1137,"mtime":1609814723480,"results":"57","hashOfConfig":"30"},{"filePath":"58","messages":"59","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"108517c",{"filePath":"60","messages":"61","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"62","messages":"63","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"64","messages":"65","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"66","messages":"67","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"68","messages":"69","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"71","messages":"72","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"73","messages":"74","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"75","messages":"76","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"77","messages":"78","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"79"},{"filePath":"80","messages":"81","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"82","messages":"83","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"84","messages":"85","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"86","messages":"87","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"88","messages":"89","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"90","messages":"91","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"92","messages":"93","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"94","messages":"95","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"96","messages":"97","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"98","messages":"99","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"100","messages":"101","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"102","messages":"103","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"70"},{"filePath":"104","messages":"105","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"106","messages":"107","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"108","messages":"109","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"110","messages":"111","errorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"112","messages":"113","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"114","messages":"115","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/features/counter/Counter.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Navigation.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/configureStore.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-reducer.js",[],["116","117"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/index.js",["118"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Components/About.js",[],["119","120"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/NavigationContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemCard.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Restricted.js",["121"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/ListSystems.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/reducers.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemForm.js",["122","123","124","125","126","127","128","129","130","131","132"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystemContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystem.js",["133"],{"ruleId":"134","replacedBy":"135"},{"ruleId":"136","replacedBy":"137"},{"ruleId":"138","severity":1,"message":"139","line":9,"column":8,"nodeType":"140","messageId":"141","endLine":9,"endColumn":18},{"ruleId":"134","replacedBy":"142"},{"ruleId":"136","replacedBy":"143"},{"ruleId":"138","severity":1,"message":"144","line":22,"column":21,"nodeType":"140","messageId":"141","endLine":22,"endColumn":28},{"ruleId":"138","severity":1,"message":"145","line":2,"column":8,"nodeType":"140","messageId":"141","endLine":2,"endColumn":16},{"ruleId":"138","severity":1,"message":"146","line":4,"column":3,"nodeType":"140","messageId":"141","endLine":4,"endColumn":12},{"ruleId":"138","severity":1,"message":"147","line":5,"column":3,"nodeType":"140","messageId":"141","endLine":5,"endColumn":9},{"ruleId":"138","severity":1,"message":"148","line":6,"column":3,"nodeType":"140","messageId":"141","endLine":6,"endColumn":11},{"ruleId":"138","severity":1,"message":"149","line":8,"column":3,"nodeType":"140","messageId":"141","endLine":8,"endColumn":11},{"ruleId":"138","severity":1,"message":"150","line":10,"column":3,"nodeType":"140","messageId":"141","endLine":10,"endColumn":7},{"ruleId":"138","severity":1,"message":"151","line":11,"column":3,"nodeType":"140","messageId":"141","endLine":11,"endColumn":10},{"ruleId":"138","severity":1,"message":"152","line":12,"column":3,"nodeType":"140","messageId":"141","endLine":12,"endColumn":8},{"ruleId":"138","severity":1,"message":"153","line":20,"column":7,"nodeType":"140","messageId":"141","endLine":20,"endColumn":29},{"ruleId":"154","severity":1,"message":"155","line":97,"column":37,"nodeType":"156","messageId":"157","endLine":97,"endColumn":39},{"ruleId":"154","severity":1,"message":"158","line":419,"column":26,"nodeType":"156","messageId":"157","endLine":419,"endColumn":28},{"ruleId":"138","severity":1,"message":"159","line":19,"column":14,"nodeType":"140","messageId":"141","endLine":19,"endColumn":22},"no-native-reassign",["160"],"no-negated-in-lhs",["161"],"no-unused-vars","'Restricted' is defined but never used.","Identifier","unusedVar",["160"],["161"],"'history' is assigned a value but never used.","'ReactDOM' is defined but never used.","'Container' is defined but never used.","'Header' is defined but never used.","'Dropdown' is defined but never used.","'TextArea' is defined but never used.","'Grid' is defined but never used.","'Segment' is defined but never used.","'Input' is defined but never used.","'checkInputMessagestyle' is assigned a value but never used.","eqeqeq","Expected '===' and instead saw '=='.","BinaryExpression","unexpected","Expected '!==' and instead saw '!='.","'dispatch' is assigned a value but never used.","no-global-assign","no-unsafe-negation"] \ No newline at end of file +[{"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/features/counter/Counter.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Navigation.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-constants.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/configureStore.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-reducer.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-reducer.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-reducer.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/index.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Components/About.js":"10","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/NavigationContainer.js":"11","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-constants.js":"12","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-actions.js":"13","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemCard.js":"14","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Restricted.js":"15","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-actions.js":"16","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-constants.js":"17","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-reducer.js":"18","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/App.js":"19","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-constants.js":"20","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/ListSystems.js":"21","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-reducer.js":"22","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/reducers.js":"23","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-constants.js":"24","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-constants.js":"25","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemForm.js":"26","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystemContainer.js":"27","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystem.js":"28","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/AddPermissionModalContainer.js":"29","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/CallChart.js":"30","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/CreateSystemContainer.js":"31","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/System.js":"32","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/ResponsiveCallChart.js":"33","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/GroupModal.js":"34","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/UpdatePermissionModalContainer.js":"35","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/ErrorChart.js":"36","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemContainer.js":"37","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-actions.js":"38","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-actions.js":"39","/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-actions.js":"40"},{"size":1463,"mtime":499162500000,"results":"41","hashOfConfig":"42"},{"size":1626,"mtime":499162500000,"results":"43","hashOfConfig":"42"},{"size":1499,"mtime":1609685400124,"results":"44","hashOfConfig":"42"},{"size":115,"mtime":1545362103836,"results":"45","hashOfConfig":"42"},{"size":759,"mtime":1609425817988,"results":"46","hashOfConfig":"42"},{"size":2037,"mtime":1545362103826,"results":"47","hashOfConfig":"42"},{"size":3029,"mtime":1609813173090,"results":"48","hashOfConfig":"42"},{"size":636,"mtime":1545362103837,"results":"49","hashOfConfig":"42"},{"size":1684,"mtime":1611441482755,"results":"50","hashOfConfig":"42"},{"size":1278,"mtime":1609812739781,"results":"51","hashOfConfig":"42"},{"size":570,"mtime":1609684078480,"results":"52","hashOfConfig":"42"},{"size":862,"mtime":1545362103839,"results":"53","hashOfConfig":"42"},{"size":1344,"mtime":1609686206535,"results":"54","hashOfConfig":"42"},{"size":1145,"mtime":1609813170344,"results":"55","hashOfConfig":"42"},{"size":2024,"mtime":1611506108884,"results":"56","hashOfConfig":"42"},{"size":5933,"mtime":1611507011039,"results":"57","hashOfConfig":"42"},{"size":320,"mtime":1546657322904,"results":"58","hashOfConfig":"42"},{"size":1045,"mtime":1609813166756,"results":"59","hashOfConfig":"42"},{"size":253,"mtime":1609814499873,"results":"60","hashOfConfig":"42"},{"size":688,"mtime":1545362103825,"results":"61","hashOfConfig":"42"},{"size":1156,"mtime":1609813188195,"results":"62","hashOfConfig":"42"},{"size":2262,"mtime":1609813202417,"results":"63","hashOfConfig":"42"},{"size":858,"mtime":1611513056121,"results":"64","hashOfConfig":"42"},{"size":848,"mtime":1545362103820,"results":"65","hashOfConfig":"42"},{"size":537,"mtime":1545362103845,"results":"66","hashOfConfig":"42"},{"size":13151,"mtime":1608606472255,"results":"67","hashOfConfig":"42"},{"size":381,"mtime":1609814717150,"results":"68","hashOfConfig":"42"},{"size":1137,"mtime":1609814723480,"results":"69","hashOfConfig":"42"},{"size":608,"mtime":1545362103822,"results":"70","hashOfConfig":"42"},{"size":3099,"mtime":1611496772792,"results":"71","hashOfConfig":"42"},{"size":277,"mtime":1546482642525,"results":"72","hashOfConfig":"42"},{"size":20243,"mtime":1611495881969,"results":"73","hashOfConfig":"42"},{"size":613,"mtime":1611443036463,"results":"74","hashOfConfig":"42"},{"size":7830,"mtime":1608606472254,"results":"75","hashOfConfig":"42"},{"size":617,"mtime":1545362103824,"results":"76","hashOfConfig":"42"},{"size":4201,"mtime":1611495367506,"results":"77","hashOfConfig":"42"},{"size":1677,"mtime":1611514031099,"results":"78","hashOfConfig":"42"},{"size":4717,"mtime":1611514305299,"results":"79","hashOfConfig":"42"},{"size":6194,"mtime":1611514572537,"results":"80","hashOfConfig":"42"},{"size":4578,"mtime":1611514663911,"results":"81","hashOfConfig":"42"},{"filePath":"82","messages":"83","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"108517c",{"filePath":"84","messages":"85","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"86","messages":"87","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"88","messages":"89","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"90","messages":"91","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"92","messages":"93","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"94"},{"filePath":"95","messages":"96","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"97","messages":"98","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"99"},{"filePath":"100","messages":"101","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"102","messages":"103","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"105","messages":"106","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"94"},{"filePath":"107","messages":"108","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"109"},{"filePath":"110","messages":"111","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"109"},{"filePath":"112","messages":"113","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"114","messages":"115","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"116","messages":"117","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"118","messages":"119","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"120"},{"filePath":"121","messages":"122","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"123","messages":"124","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"120"},{"filePath":"125","messages":"126","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"99"},{"filePath":"127","messages":"128","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"94"},{"filePath":"129","messages":"130","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"94"},{"filePath":"131","messages":"132","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"133","messages":"134","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"135","messages":"136","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"137","messages":"138","errorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"139","messages":"140","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"141","messages":"142","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"143","messages":"144","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"120"},{"filePath":"145","messages":"146","errorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"147","messages":"148","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"149","messages":"150","errorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"151","usedDeprecatedRules":"109"},{"filePath":"152","messages":"153","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"154","usedDeprecatedRules":"109"},{"filePath":"155","messages":"156","errorCount":0,"warningCount":8,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"157","messages":"158","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"159","messages":"160","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"161","messages":"162","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"163","messages":"164","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"165","messages":"166","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"167","messages":"168","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/features/counter/Counter.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Navigation.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/configureStore.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-reducer.js",[],["169","170"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/error-reducer.js",[],["171","172"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/index.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Components/About.js",[],["173","174"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/NavigationContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-constants.js",[],["175","176"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemCard.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/Restricted.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/User/user-constants.js",[],["177","178"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/App/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/permission-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/ListSystems.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/system-reducer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/redux-router/reducers.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Group/group-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Talkgroups/talkgroup-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/SystemForm.js",["179","180","181","182","183","184","185","186","187","188","189"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystemContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/UpdateSystem.js",["190"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/Permission/AddPermissionModalContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/CallChart.js",["191","192","193","194","195","196"],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/CreateSystemContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/admin/src/System/System.js",["197","198","199","200","201"],"import React, {Component} from \"react\";\nimport {Link} from \"react-router-dom\";\nimport ListTalkgroups from \"../Talkgroups/ListTalkgroups.js\";\nimport MessageBox from \"../Components/Message.js\";\nimport ListGroups from \"../Group/ListGroups.js\";\nimport GroupModal from \"../Group/GroupModalContainer.js\";\nimport UpdatePermissionModal from \"../Permission/UpdatePermissionModalContainer.js\";\nimport AddPermissionModal from \"../Permission/AddPermissionModalContainer.js\";\nimport ErrorChart from \"./ResponsiveErrorChart\"\nimport CallChart from \"./ResponsiveCallChart\"\nimport {\n Button,\n Confirm,\n Icon,\n Form,\n TextArea,\n Header,\n Container,\n Message,\n List,\n Segment,\n Tab,\n Divider,\n Label\n} from \"semantic-ui-react\";\n\n\nclass System extends Component {\n constructor(props) {\n super(props);\n\n this.handleUpload = this.handleUpload.bind(this);\n this.reorderGroup = this.reorderGroup.bind(this);\n this.deleteGroup = this.deleteGroup.bind(this);\n this.editGroup = this.editGroup.bind(this);\n this.saveGroupOrder = this.saveGroupOrder.bind(this);\n this.showSystemDeleteConfirm = this.showSystemDeleteConfirm.bind(this);\n this.showPermissionDeleteConfirm = this.showPermissionDeleteConfirm.bind(\n this\n );\n this.updatePermission = this.updatePermission.bind(this);\n this.handlePermissionDeleteConfirm = this.handlePermissionDeleteConfirm.bind(\n this\n );\n this.handlePermissionDeleteCancel = this.handlePermissionDeleteCancel.bind(\n this\n );\n this.handleSystemDeleteConfirm = this.handleSystemDeleteConfirm.bind(this);\n this.handleSystemDeleteCancel = this.handleSystemDeleteCancel.bind(this);\n this.handleUpdatePermissionClose = this.handleUpdatePermissionClose.bind(\n this\n );\n this.handleGroupToggle = this.handleGroupToggle.bind(this);\n this.handleGroupClose = this.handleGroupClose.bind(this);\n this.handleAddPermissionToggle = this.handleAddPermissionToggle.bind(this);\n this.handleAddPermissionClose = this.handleAddPermissionClose.bind(this);\n this.processErrors = this.processErrors.bind(this);\n this.processStatistics = this.processStatistics.bind(this);\n this.state = {\n openSystemDeleteConfirm: false,\n openPermissionDeleteConfirm: false,\n openMessage: false,\n requestMessage: \"\",\n groupVisible: false,\n editGroupId: false,\n selectedPermission: false,\n addPermissionVisible: false,\n updatePermissionVisible: false,\n updatePermissionId: false\n };\n }\n\n processErrors(errors) {\n var allData = [];\n\n var num = 0;\n const now = new Date();\n var maxDate = now;\n var minDate = now;\n var minValue = 0;\n var maxValue = 0;\n var legend = [];\n for (var j = 0; j < errors.length; j++) {\n var data = [];\n for (var i = 0; i < errors[j].values.length; i++) {\n var time = new Date(errors[j].values[i].time);\n if (errors[j].values[i].errors > maxValue)\n maxValue = errors[j].values[i].errors;\n if (time < minDate) minDate = time;\n var value = {\n id: num++,\n y: errors[j].values[i].errors,\n x: time\n };\n data.push(value);\n }\n const id = Math.floor(errors[j]._id / 1000) / 1000 + \"MHz\";\n legend.push(id);\n var obj = {\n id: id,\n data: data\n };\n allData.push(obj);\n }\n const errorData = {\n data: allData,\n minDate: minDate,\n maxDate: maxDate,\n minValue: minValue,\n maxValue: maxValue,\n legend: legend\n };\n\n this.setState({ errorData: errorData });\n }\n processStatistics(statistic) {\n var callTotals = [];\n var errorTotals = [];\n const now = new Date();\n var maxDate = now;\n var minDate = now;\n var minValue = 0;\n var maxValue = 0;\n var MS_PER_MINUTE = 60000;\n for (var j = 0; j < statistic.callTotals.length; j++) {\n var spotsBack = statistic.callTotals.length - j;\n var time = new Date(now - spotsBack * 15 * MS_PER_MINUTE);\n if (time < minDate) minDate = time;\n if (statistic.callTotals[j] > maxValue)\n maxValue = statistic.callTotals[j];\n callTotals.push({ y: statistic.callTotals[j], x: time });\n }\n for (var j = 0; j < statistic.errorTotals.length; j++) {\n var spotsBack = statistic.errorTotals.length - j;\n var time = new Date(now - spotsBack * 15 * MS_PER_MINUTE);\n if (time < minDate) minDate = time;\n if (statistic.errorTotals[j] > maxValue)\n maxValue = statistic.errorTotals[j];\n errorTotals.push({ x: time, y: statistic.errorTotals[j] });\n }\n var callData = {\n minDate: minDate,\n maxDate: maxDate,\n minValue: minValue,\n maxValue: maxValue,\n callTotals: callTotals,\n errorTotals: errorTotals\n };\n\n this.setState({ callData: callData });\n }\n componentDidMount() {\n this.props.systemActions.fetchSystems();\n this.props.talkgroupActions.fetchTalkgroups(this.props.shortName);\n this.props.groupActions.fetchGroups(this.props.shortName);\n this.props.errorActions.fetch(this.props.shortName);\n this.props.permissionActions.fetch(this.props.shortName);\n if (this.props.statistic) {\n this.processStatistics(this.props.statistic);\n }\n if (this.props.errors) {\n this.processErrors(this.props.errors);\n }\n }\n\n componentWillReceiveProps(nextProp) {\n if (!this.props.errors && nextProp.errors) {\n this.processErrors(nextProp.errors);\n }\n if (!this.props.statistic && nextProp.statistic) {\n this.processStatistics(nextProp.statistic);\n }\n }\n\n updatePermission(permissionId) {\n this.setState({\n updatePermissionId: permissionId,\n updatePermissionVisible: !this.state.updatePermissionVisible\n });\n }\n\n editGroup(groupId) {\n this.setState({\n editGroupId: groupId,\n groupVisible: !this.state.groupVisible\n });\n }\n\n deleteGroup(groupId) {\n this.props.groupActions.deleteGroup(this.props.shortName, groupId);\n }\n\n reorderGroup(oldIndex, newIndex) {\n this.props.groupActions.reorderGroup(\n this.props.shortName,\n oldIndex,\n newIndex\n );\n }\n\n handleUpdatePermissionClose(didUpdate) {\n this.setState({\n updatePermissionVisible: !this.state.updatePermissionVisible,\n updatePermissionId: false\n });\n }\n\n handleAddPermissionClose(didUpdate) {\n this.setState({\n addPermissionVisible: !this.state.addPermissionVisible\n });\n }\n\n handleAddPermissionToggle = () =>\n this.setState({\n addPermissionVisible: !this.state.addPermissionVisible\n });\n\n handleGroupClose(didUpdate) {\n this.setState({\n groupVisible: !this.state.groupVisible,\n editGroupId: false\n });\n }\n handleGroupToggle = () => this.setState({\n editGroupId: false,\n groupVisible: !this.state.groupVisible\n })\n handleExport() {\n this.props.talkgroupActions\n .exportTalkgroups(this.props.system.shortName)\n .then(requestMessage => {\n if (requestMessage) {\n // report to the user is there was a problem during registration\n this.setState({ requestMessage });\n }\n });\n }\n\n saveGroupOrder() {\n const order = this.props.groups.map(x => x._id);\n const data = {\n groupOrder: JSON.stringify(order)\n };\n this.props.groupActions\n .saveGroupOrder(this.props.system.shortName, data)\n .then(requestMessage => {\n if (requestMessage) {\n }\n });\n }\n\n\n handleUpload(file) {\n this.props.talkgroupActions\n .importTalkgroups(this.props.system.shortName, file)\n .then(requestMessage => {\n if (requestMessage) {\n // report to the user is there was a problem during registration\n this.setState({ requestMessage });\n }\n });\n }\n\n // https://github.com/Semantic-Org/Semantic-UI-React/issues/2103\n\n showPermissionDeleteConfirm = permission =>\n this.setState({\n openPermissionDeleteConfirm: true,\n selectedPermission: permission\n });\n showSystemDeleteConfirm = () =>\n this.setState({ openSystemDeleteConfirm: true });\n\n handlePermissionDeleteConfirm = permissionId => {\n this.setState({ openPermissionDeleteConfirm: false });\n this.props.permissionActions\n .deletePermission({\n shortName: this.props.system.shortName,\n permissionId: this.state.selectedPermission._id\n })\n .then(requestMessage => {\n if (requestMessage) {\n // report to the user is there was a problem during login\n this.setState({ requestMessage: requestMessage, openMessage: true });\n }\n });\n };\n\n handleSystemDeleteConfirm = () => {\n this.setState({ openSystemDeleteConfirm: false });\n this.props.systemActions\n .deleteSystem(this.props.system.shortName)\n .then(requestMessage => {\n if (requestMessage) {\n // report to the user is there was a problem during login\n this.setState({ requestMessage: requestMessage, openMessage: true });\n }\n });\n };\n handleSystemDeleteCancel = () =>\n this.setState({ openSystemDeleteConfirm: false });\n handlePermissionDeleteCancel = () =>\n this.setState({ openPermissionDeleteConfirm: false });\n render() {\n const system = this.props.system;\n let fileInput = null;\n var location = \"\";\n var example = \"\";\n var groupRender = () => {};\n\n if (system) {\n if (this.props.talkgroups && this.props.talkgroups.length) {\n groupRender = () => (\n
\n \n \n \n
\n );\n } else {\n groupRender = () => (\n \n \n \n );\n }\n\n\n example =\n '{\\n\\t\"systems\": [\\n\\t\\t{\\n\\t\\t\\t\"shortName\": \"' +\n system.shortName +\n '\",\\n\\t\\t\\t\"apiKey\": \"' +\n system.key +\n '\"\\n\\t\\t}\\n\\t],\\n\\t\"uploadServer\": \"' +\n process.env.REACT_APP_BACKEND_SERVER +\n '\"\\n}';\n\n switch (system.systemType) {\n case \"state\":\n location = system.state;\n break;\n case \"city\":\n location = system.city + \", \" + system.state;\n break;\n case \"county\":\n location = system.county + \", \" + system.state;\n break;\n case \"international\":\n location = system.country;\n break;\n }\n }\n\n const panes = [\n {\n menuItem: \"Overview\",\n render: () => (\n
\n \n \n \n
Location
\n {location}\n
\n \n
Short Name
\n {this.props.system.shortName}\n
\n \n
Description
\n {this.props.system.description}\n
\n\n \n \n \n \n
\n
\n
\n )\n },\n {\n menuItem: \"Config\",\n render: () => (\n
\n \n
Configure Trunk Recorder
\n

\n Below are the parameters you will need to configure Trunk\n Recorder. The example below shows how they should be added to\n the config.json file.\n

\n\n \n \n
API Key
\n {this.props.system.key}\n
\n \n
Short Name
\n {this.props.system.shortName}\n
\n \n
Upload Server
\n {process.env.REACT_APP_BACKEND_SERVER}\n
\n \n
Example
\n
\n