@syngrisi/syngrisi 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nvmrc +1 -0
- package/LICENSE.md +9 -0
- package/README.md +139 -0
- package/config.js +17 -0
- package/dist/config.js +16 -0
- package/dist/src/server/models/index.js +508 -0
- package/dist/src/server/models/plugins/index.js +4 -0
- package/dist/src/server/models/plugins/paginate.plugin.js +76 -0
- package/dist/src/server/models/plugins/paginateDistinct.plugin.js +76 -0
- package/dist/src/server/models/plugins/toJSON.plugin.js +39 -0
- package/dist/src/server/schemas/createCheck.shema.js +17 -0
- package/dist/src/server/schemas/getBaseline.shema.js +12 -0
- package/dist/src/server/utils/paramsGuard.js +18 -0
- package/dist/src/tasks/backup.js +68 -0
- package/dist/src/tasks/lib/common.js +14 -0
- package/dist/src/tasks/lib/utils.js +14 -0
- package/dist/src/tasks/migrations/2.0.migration.js +86 -0
- package/dist/src/tasks/migrations/2.0.migration_mql.js +57 -0
- package/dist/src/tasks/reindex.js +28 -0
- package/dist/src/tasks/restore.js +86 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docker-compose.yml +70 -0
- package/mvc/views/react/admin/index.html +22 -0
- package/mvc/views/react/assets/LogicalGroup.95929360.js +15993 -0
- package/mvc/views/react/assets/PasswordInput.8a73fdd2.js +299 -0
- package/mvc/views/react/assets/admin.94703bdc.js +14448 -0
- package/mvc/views/react/assets/auth.748478ef.js +673 -0
- package/mvc/views/react/assets/bg_2_0_dark_L2.3a31edc0.png +0 -0
- package/mvc/views/react/assets/favicon.bf5828d5.svg +7 -0
- package/mvc/views/react/assets/index.a5606313.css +23 -0
- package/mvc/views/react/assets/roboto-v30-latin-100.0f303f31.woff2 +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-100.34e9582c.woff +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-500.9ce7f3ac.woff +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-500.b0195382.woff2 +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-700.e0fd57c0.woff +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-700.f5aebdfe.woff2 +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-regular.f2abf7fb.woff +0 -0
- package/mvc/views/react/assets/roboto-v30-latin-regular.f6734f81.woff2 +0 -0
- package/mvc/views/react/assets/root.136e0ea3.js +25451 -0
- package/mvc/views/react/assets/use-form.57ebe175.js +24472 -0
- package/mvc/views/react/assets/use-form.ecb4391b.css +36 -0
- package/mvc/views/react/auth/index.html +22 -0
- package/mvc/views/react/index.html +19 -0
- package/mvc/views/react/index2/index.html +21 -0
- package/package.json +144 -0
- package/server.js +166 -0
- package/src/server/controllers/app.controller.js +21 -0
- package/src/server/controllers/auth.controller.js +156 -0
- package/src/server/controllers/baseline.controller.js +24 -0
- package/src/server/controllers/check.controller.js +56 -0
- package/src/server/controllers/client.controller.js +173 -0
- package/src/server/controllers/index.js +12 -0
- package/src/server/controllers/logs.controller.js +30 -0
- package/src/server/controllers/runs.controller.js +25 -0
- package/src/server/controllers/settings.controller.js +23 -0
- package/src/server/controllers/snapshots.controller.js +17 -0
- package/src/server/controllers/suite.controller.js +24 -0
- package/src/server/controllers/tasks.controller.js +47 -0
- package/src/server/controllers/test.controller.js +70 -0
- package/src/server/controllers/users.controller.js +79 -0
- package/src/server/data/custom_devices.json +8 -0
- package/src/server/data/devices.json +773 -0
- package/src/server/data/get_devices.sh +2 -0
- package/src/server/lib/AppSettings.js +56 -0
- package/src/server/lib/admin.json +9 -0
- package/src/server/lib/comparator.js +147 -0
- package/src/server/lib/compareImagesNode.js +60 -0
- package/src/server/lib/dbItems.js +215 -0
- package/src/server/lib/ensureLogin/ensureLoggedIn.js +223 -0
- package/src/server/lib/ensureLogin/ensureLoggedOut.js +44 -0
- package/src/server/lib/getElementsByPixPositionsFromDump.js +72 -0
- package/src/server/lib/guest.json +9 -0
- package/src/server/lib/initialAppSettings.json +18 -0
- package/src/server/lib/logger.js +95 -0
- package/src/server/lib/onStart.js +53 -0
- package/src/server/lib/parseDiff.js.bak +72 -0
- package/src/server/lib/testAdmin.json +9 -0
- package/src/server/lib/testUsers.json +41 -0
- package/src/server/middlewares/authorization.js +50 -0
- package/src/server/middlewares/disableCors.js +19 -0
- package/src/server/models/index.js +534 -0
- package/src/server/models/plugins/index.js +3 -0
- package/src/server/models/plugins/paginate.plugin.js +83 -0
- package/src/server/models/plugins/paginateDistinct.plugin.js +80 -0
- package/src/server/models/plugins/toJSON.plugin.js +44 -0
- package/src/server/routes/ui/admin.js +20 -0
- package/src/server/routes/ui/auth.js +15 -0
- package/src/server/routes/ui/index.js +19 -0
- package/src/server/routes/v1/app.route.js +9 -0
- package/src/server/routes/v1/auth.route.js +12 -0
- package/src/server/routes/v1/baselines.route.js +14 -0
- package/src/server/routes/v1/checks.route.js +25 -0
- package/src/server/routes/v1/client.route.js +39 -0
- package/src/server/routes/v1/index.js +82 -0
- package/src/server/routes/v1/logs.route.js +16 -0
- package/src/server/routes/v1/runs.route.js +15 -0
- package/src/server/routes/v1/settings.route.js +23 -0
- package/src/server/routes/v1/snapshots.route.js +11 -0
- package/src/server/routes/v1/suites.route.js +15 -0
- package/src/server/routes/v1/tasks.route.js +59 -0
- package/src/server/routes/v1/test.route.js +20 -0
- package/src/server/routes/v1/test_distinct.route.js +14 -0
- package/src/server/routes/v1/users.route.js +36 -0
- package/src/server/schemas/createCheck.shema.ts +17 -0
- package/src/server/schemas/getBaseline.shema.ts +12 -0
- package/src/server/services/app.service.js +23 -0
- package/src/server/services/check.service.js +178 -0
- package/src/server/services/client.service.js +648 -0
- package/src/server/services/generic.service.js +51 -0
- package/src/server/services/index.js +12 -0
- package/src/server/services/logs.service.js +38 -0
- package/src/server/services/run.service.js +40 -0
- package/src/server/services/suite.service.js +39 -0
- package/src/server/services/tasks.service.js +536 -0
- package/src/server/services/test.service.js +72 -0
- package/src/server/services/user.service.js +128 -0
- package/src/server/utils/ApiError.js +14 -0
- package/src/server/utils/catchAsync.js +8 -0
- package/src/server/utils/check.js +58 -0
- package/src/server/utils/dateToISO8601.js +2 -0
- package/src/server/utils/deserializeIfJSON.js +9 -0
- package/src/server/utils/formatISOToDateTime.js +6 -0
- package/src/server/utils/index.js +10 -0
- package/src/server/utils/isJSON.js +6 -0
- package/src/server/utils/paramsGuard.ts +15 -0
- package/src/server/utils/pick.js +15 -0
- package/src/server/utils/prettyCheckParams.js +13 -0
- package/src/server/utils/snapshots.js +73 -0
- package/src/server/utils/subDays.js +7 -0
- package/src/server/utils/tests.js +36 -0
- package/src/server/utils/utils.js +146 -0
- package/src/tasks/backup.js.bak +84 -0
- package/src/tasks/backup.ts +53 -0
- package/src/tasks/lib/common.js +24 -0
- package/src/tasks/lib/utils.js +15 -0
- package/src/tasks/migrations/2.0.migration.js +86 -0
- package/src/tasks/migrations/2.0.migration.ts +95 -0
- package/src/tasks/migrations/2.0.migration_mql.js +63 -0
- package/src/tasks/reindex.js +36 -0
- package/src/tasks/restore.js.bak +100 -0
- package/src/tasks/restore.ts +75 -0
- package/src/ui-app/.eslintrc.json +119 -0
- package/src/ui-app/README.md +15 -0
- package/src/ui-app/admin/AdminLayout.tsx +38 -0
- package/src/ui-app/admin/App.tsx +108 -0
- package/src/ui-app/admin/AppContext.ts +3 -0
- package/src/ui-app/admin/components/Header/AdminHeader.tsx +148 -0
- package/src/ui-app/admin/components/Logs/AdminLogs.tsx +142 -0
- package/src/ui-app/admin/components/Logs/RefreshActionIcon.tsx +60 -0
- package/src/ui-app/admin/components/Logs/Table/AdminLogsTable.tsx +81 -0
- package/src/ui-app/admin/components/Logs/Table/AdminLogsTableFilter.tsx +170 -0
- package/src/ui-app/admin/components/Logs/Table/AdminLogsTableHeads.tsx +50 -0
- package/src/ui-app/admin/components/Logs/Table/AdminLogsTableRows.tsx +207 -0
- package/src/ui-app/admin/components/Logs/Table/AdminLogsTableSettings.tsx +95 -0
- package/src/ui-app/admin/components/Logs/Table/InfinityScrollSkeleton.tsx +77 -0
- package/src/ui-app/admin/components/Logs/Table/InfinityScrollSkeletonFIller.tsx +57 -0
- package/src/ui-app/admin/components/Logs/Table/PagesCountAffix.tsx +61 -0
- package/src/ui-app/admin/components/Logs/Table/adminLogsCreateStyle.tsx +36 -0
- package/src/ui-app/admin/components/Logs/Table/adminLogsTableColumns.ts +52 -0
- package/src/ui-app/admin/components/Logs/UnfoldActionIcon.tsx +39 -0
- package/src/ui-app/admin/components/Navbar/AdminNavbar.tsx +50 -0
- package/src/ui-app/admin/components/Navbar/NavbarLinksGroup.tsx +104 -0
- package/src/ui-app/admin/components/Settings/AdminSettings.tsx +51 -0
- package/src/ui-app/admin/components/Settings/Forms/Boolean.tsx +59 -0
- package/src/ui-app/admin/components/Settings/Forms/FormWrapper.tsx +45 -0
- package/src/ui-app/admin/components/Settings/Forms/index.tsx +5 -0
- package/src/ui-app/admin/components/Settings/Forms/interfaces.tsx +17 -0
- package/src/ui-app/admin/components/Tasks/Task.tsx +138 -0
- package/src/ui-app/admin/components/Tasks/TaskWrapper.tsx +11 -0
- package/src/ui-app/admin/components/Tasks/tasksList.ts +59 -0
- package/src/ui-app/admin/components/Users/AdminUsers.tsx +182 -0
- package/src/ui-app/admin/components/Users/UserAddForm.tsx +137 -0
- package/src/ui-app/admin/components/Users/UserForm.tsx +196 -0
- package/src/ui-app/admin/hooks/useParams.tsx +18 -0
- package/src/ui-app/admin/index.html +17 -0
- package/src/ui-app/admin/main.tsx +24 -0
- package/src/ui-app/asserts/css/auth/index.css +23 -0
- package/src/ui-app/asserts/css/styles.css +36 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.eot +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.svg +313 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.ttf +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.woff +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.woff2 +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.eot +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.svg +305 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.ttf +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.woff +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.woff2 +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.eot +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.svg +309 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.ttf +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.woff +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.woff2 +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.eot +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.svg +308 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.ttf +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.woff +0 -0
- package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.woff2 +0 -0
- package/src/ui-app/asserts/images/background.jpg +0 -0
- package/src/ui-app/asserts/images/bg_2_0_dark_L2.png +0 -0
- package/src/ui-app/asserts/images/favicon.svg +7 -0
- package/src/ui-app/auth/App.tsx +82 -0
- package/src/ui-app/auth/commonStyles.tsx +26 -0
- package/src/ui-app/auth/components/AuthFooter.tsx +51 -0
- package/src/ui-app/auth/components/AuthLogo.tsx +58 -0
- package/src/ui-app/auth/components/ChangePasswordForm.tsx +216 -0
- package/src/ui-app/auth/components/ChangePasswordSuccessForm.tsx +38 -0
- package/src/ui-app/auth/components/LoginForm.tsx +148 -0
- package/src/ui-app/auth/components/LogoutForm.tsx +89 -0
- package/src/ui-app/auth/components/ToggleThemeButton.tsx +41 -0
- package/src/ui-app/auth/components/change-password/Bars.tsx +45 -0
- package/src/ui-app/auth/components/change-password/PasswordRequirement.tsx +14 -0
- package/src/ui-app/auth/components/change-password/requirements.tsx +6 -0
- package/src/ui-app/auth/index.html +17 -0
- package/src/ui-app/auth/main.tsx +12 -0
- package/src/ui-app/auth/routes.tsx +26 -0
- package/src/ui-app/config.ts +15 -0
- package/src/ui-app/index.html +12 -0
- package/src/ui-app/index2/App.tsx +162 -0
- package/src/ui-app/index2/AppContext.ts +3 -0
- package/src/ui-app/index2/IndexLayout.tsx +34 -0
- package/src/ui-app/index2/components/Header/HeaderIndex.tsx +248 -0
- package/src/ui-app/index2/components/Header/QuickFilter.tsx +312 -0
- package/src/ui-app/index2/components/Navbar/Items/AcceptStatusItem.tsx +42 -0
- package/src/ui-app/index2/components/Navbar/Items/BaseItemWrapper.tsx +94 -0
- package/src/ui-app/index2/components/Navbar/Items/BrowserItem.tsx +42 -0
- package/src/ui-app/index2/components/Navbar/Items/PlatformItem.tsx +42 -0
- package/src/ui-app/index2/components/Navbar/Items/RemoveItemModalAsk.tsx +71 -0
- package/src/ui-app/index2/components/Navbar/Items/RemoveItemPopover.tsx +58 -0
- package/src/ui-app/index2/components/Navbar/Items/RemoveSuiteModalAsk.tsx +61 -0
- package/src/ui-app/index2/components/Navbar/Items/RunItem.tsx +149 -0
- package/src/ui-app/index2/components/Navbar/Items/StatusItem.tsx +42 -0
- package/src/ui-app/index2/components/Navbar/Items/SuiteItem.tsx +109 -0
- package/src/ui-app/index2/components/Navbar/Items/index.tsx +6 -0
- package/src/ui-app/index2/components/Navbar/NavbarFilter.tsx +93 -0
- package/src/ui-app/index2/components/Navbar/NavbarGroupBySelect.tsx +83 -0
- package/src/ui-app/index2/components/Navbar/NavbarIndex.tsx +247 -0
- package/src/ui-app/index2/components/Navbar/NavbarItems.tsx +38 -0
- package/src/ui-app/index2/components/Navbar/NavbarSort.tsx +105 -0
- package/src/ui-app/index2/components/Navbar/Skeletons/RunsDummySkeleton.tsx +27 -0
- package/src/ui-app/index2/components/Navbar/Skeletons/SimpleDummySkeleton.tsx +23 -0
- package/src/ui-app/index2/components/Navbar/Skeletons/SkeletonWrapper.tsx +45 -0
- package/src/ui-app/index2/components/Navbar/Skeletons/SuitesDummySkeleton.tsx +27 -0
- package/src/ui-app/index2/components/Tests/Table/AcceptTestModalAsk.tsx +68 -0
- package/src/ui-app/index2/components/Tests/Table/AcceptTestsButton.tsx +44 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/Branch.tsx +35 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/BrowserName.tsx +33 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/BrowserVersion.tsx +31 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/CellWrapper.tsx +49 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/Os.tsx +32 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/StartDate.tsx +34 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/Status.tsx +50 -0
- package/src/ui-app/index2/components/Tests/Table/Cells/ViewPort.tsx +46 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/AcceptButton.tsx +142 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/Check.tsx +281 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/Canvas.tsx +36 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/helpers.ts +72 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/mainView.ts +495 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/sideToSideView.ts +398 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/simpleView.ts +21 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/CheckDetails.tsx +237 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Header.tsx +221 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedCheckItem.tsx +167 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedCheckSort.tsx +81 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecks.tsx +197 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecksItems.tsx +31 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecksSkeleton.tsx +37 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/HighlightButton.tsx +56 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/RegionsToolbar.tsx +150 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ScreenshotDetails.tsx +137 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/Toolbar.tsx +101 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ViewSegmentedControl.tsx +159 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ZoomToolbar.tsx +326 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/highlightDiff.ts +167 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/hooks/useRelatedChecks.tsx +43 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/CheckModal.tsx +119 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/Checks.tsx +91 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/ChecksSkeleton.tsx +21 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/PreviewCheckTooltipLabel.tsx +121 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/RemoveButton.tsx +63 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/ViewPortLabel.tsx +94 -0
- package/src/ui-app/index2/components/Tests/Table/Checks/checkSizes.ts +27 -0
- package/src/ui-app/index2/components/Tests/Table/Filter.tsx +179 -0
- package/src/ui-app/index2/components/Tests/Table/Heads.tsx +54 -0
- package/src/ui-app/index2/components/Tests/Table/InfinityScrollSkeleton.tsx +71 -0
- package/src/ui-app/index2/components/Tests/Table/PagesCountAffix.tsx +61 -0
- package/src/ui-app/index2/components/Tests/Table/RefreshActionIcon.tsx +65 -0
- package/src/ui-app/index2/components/Tests/Table/RemoveTestModalAsk.tsx +66 -0
- package/src/ui-app/index2/components/Tests/Table/RemoveTestsButton.tsx +43 -0
- package/src/ui-app/index2/components/Tests/Table/Row.tsx +128 -0
- package/src/ui-app/index2/components/Tests/Table/Rows.tsx +87 -0
- package/src/ui-app/index2/components/Tests/Table/Settings.tsx +121 -0
- package/src/ui-app/index2/components/Tests/Table/TestsTable.tsx +140 -0
- package/src/ui-app/index2/components/Tests/Table/UnfoldActionIcon.tsx +39 -0
- package/src/ui-app/index2/components/Tests/Table/tableColumns.ts +80 -0
- package/src/ui-app/index2/components/Tests/Table/testsCreateStyle.tsx +35 -0
- package/src/ui-app/index2/components/Tests/Tests.tsx +157 -0
- package/src/ui-app/index2/hooks/useIndexSubpageEffect.tsx +14 -0
- package/src/ui-app/index2/hooks/useNavbarActiveItems.tsx +66 -0
- package/src/ui-app/index2/hooks/useParams.tsx +25 -0
- package/src/ui-app/index2/index.html +17 -0
- package/src/ui-app/index2/main.tsx +33 -0
- package/src/ui-app/package-lock.json +6150 -0
- package/src/ui-app/package.json +58 -0
- package/src/ui-app/shared/components/ActionPopoverIcon.tsx +116 -0
- package/src/ui-app/shared/components/Check/AcceptedStatusIcon.tsx +51 -0
- package/src/ui-app/shared/components/Check/BrowserIcon.tsx +50 -0
- package/src/ui-app/shared/components/Check/OsIcon.tsx +73 -0
- package/src/ui-app/shared/components/Check/Status.tsx +37 -0
- package/src/ui-app/shared/components/Check/StatusIcon.tsx +66 -0
- package/src/ui-app/shared/components/Email.tsx +83 -0
- package/src/ui-app/shared/components/Header/ApiKeyModalAsk.tsx +31 -0
- package/src/ui-app/shared/components/Header/ApiKeyModalResult.tsx +89 -0
- package/src/ui-app/shared/components/Header/HeaderLogo.tsx +82 -0
- package/src/ui-app/shared/components/Header/UserInfoModal.tsx +92 -0
- package/src/ui-app/shared/components/Header/UserMenu.tsx +151 -0
- package/src/ui-app/shared/components/Password.tsx +95 -0
- package/src/ui-app/shared/components/RelativeDrawer.tsx +43 -0
- package/src/ui-app/shared/components/SafeSelect.tsx +95 -0
- package/src/ui-app/shared/components/Tests/StatusesRing.tsx +66 -0
- package/src/ui-app/shared/components/ToggleThemeButton.tsx +33 -0
- package/src/ui-app/shared/components/Users/LabelUser.tsx +60 -0
- package/src/ui-app/shared/components/errors/ErrorFallback.tsx +66 -0
- package/src/ui-app/shared/components/filter/AcceptedFilter.tsx +20 -0
- package/src/ui-app/shared/components/filter/BrowserNameFilter.tsx +20 -0
- package/src/ui-app/shared/components/filter/CommonDistinctFilter.tsx +104 -0
- package/src/ui-app/shared/components/filter/DateFilter.tsx +54 -0
- package/src/ui-app/shared/components/filter/FilterWrapper.tsx +80 -0
- package/src/ui-app/shared/components/filter/IdFilter.tsx +60 -0
- package/src/ui-app/shared/components/filter/LogLevelFilter.tsx +77 -0
- package/src/ui-app/shared/components/filter/LogicalGroup.tsx +179 -0
- package/src/ui-app/shared/components/filter/OsFilter.tsx +20 -0
- package/src/ui-app/shared/components/filter/StatusFilter.tsx +20 -0
- package/src/ui-app/shared/components/filter/StringFilter.tsx +55 -0
- package/src/ui-app/shared/components/filter/index.ts +19 -0
- package/src/ui-app/shared/components/heaserLinks.tsx +4 -0
- package/src/ui-app/shared/hooks/index.ts +3 -0
- package/src/ui-app/shared/hooks/useColorSheme.ts +22 -0
- package/src/ui-app/shared/hooks/useDistinctLogQuery.tsx +33 -0
- package/src/ui-app/shared/hooks/useDistinctQuery.tsx +37 -0
- package/src/ui-app/shared/hooks/useInfinityScroll.tsx +163 -0
- package/src/ui-app/shared/hooks/useInfinityScrollRelatedChecks.tsx +60 -0
- package/src/ui-app/shared/hooks/useNavProgressFetchEffect.tsx +17 -0
- package/src/ui-app/shared/hooks/useSubpageEffect.tsx +28 -0
- package/src/ui-app/shared/hooks/user.hooks.ts +49 -0
- package/src/ui-app/shared/interfaces/ILog.tsx +13 -0
- package/src/ui-app/shared/interfaces/IUser.tsx +13 -0
- package/src/ui-app/shared/interfaces/logQueries.tsx +31 -0
- package/src/ui-app/shared/navigation/interfaces.tsx +7 -0
- package/src/ui-app/shared/navigation/navigationData.tsx +191 -0
- package/src/ui-app/shared/services/checks.service.ts +39 -0
- package/src/ui-app/shared/services/generic.service.ts +115 -0
- package/src/ui-app/shared/services/index.ts +6 -0
- package/src/ui-app/shared/services/runs.service.ts +20 -0
- package/src/ui-app/shared/services/suites.service.ts +20 -0
- package/src/ui-app/shared/services/tests.service.ts +39 -0
- package/src/ui-app/shared/services/users.service.ts +29 -0
- package/src/ui-app/shared/utils/Logger.ts +12 -0
- package/src/ui-app/shared/utils/SearchParams.ts +17 -0
- package/src/ui-app/shared/utils/filters.tsx +14 -0
- package/src/ui-app/shared/utils/index.ts +5 -0
- package/src/ui-app/shared/utils/utils.tsx +70 -0
- package/src/ui-app/stub.html +12 -0
- package/src/ui-app/stub.tsx +58 -0
- package/src/ui-app/stubDemoColors.tsx +47 -0
- package/src/ui-app/stubDemoNav.tsx +41 -0
- package/src/ui-app/tsconfig.json +21 -0
- package/src/ui-app/tsconfig.node.json +12 -0
- package/static/A.png +0 -0
- package/static/B.png +0 -0
- package/static/affected.html +39 -0
- package/static/affected_2.html +40 -0
- package/static/data/custom_devices.json +14 -0
- package/static/grids/desktop-higher.html +72 -0
- package/static/grids/desktop-wider.html +72 -0
- package/static/grids/desktop.html +61 -0
- package/static/grids/fit-in-view.html +62 -0
- package/static/js/canvasjs.min.js.bak +957 -0
- package/static/js/chart.js.bak +92 -0
- package/static/js/jquery-3.3.1.slim.js.bak +8269 -0
- package/static/js/jquery-3.3.1.slim.min.js.bak +2 -0
- package/static/js/moment.min.js.bak +2 -0
- package/static/low_diff_0.png +0 -0
- package/static/low_diff_1.png +0 -0
- package/static/vShift.png +0 -0
- package/static/vShift_bottom.png +0 -0
- package/static/vShift_top.png +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure that a user is logged in before proceeding to next route middleware.
|
|
3
|
+
*
|
|
4
|
+
* This middleware ensures that a user is logged in. If a request is received
|
|
5
|
+
* that is unauthenticated, the request will be redirected to a login page (by
|
|
6
|
+
* default to `/login`).
|
|
7
|
+
*
|
|
8
|
+
* Additionally, `returnTo` will be be set in the session to the URL of the
|
|
9
|
+
* current request. After authentication, this value can be used to redirect
|
|
10
|
+
* the user to the page that was originally requested.
|
|
11
|
+
*
|
|
12
|
+
* Options:
|
|
13
|
+
* - `redirectTo` URL to redirect to for login, defaults to _/login_
|
|
14
|
+
* - `setReturnTo` set redirectTo in session, defaults to _true_
|
|
15
|
+
*
|
|
16
|
+
* Examples:
|
|
17
|
+
*
|
|
18
|
+
* app.get('/profile',
|
|
19
|
+
* ensureLoggedIn(),
|
|
20
|
+
* function(req, res) { ... });
|
|
21
|
+
*
|
|
22
|
+
* app.get('/profile',
|
|
23
|
+
* ensureLoggedIn('/signin'),
|
|
24
|
+
* function(req, res) { ... });
|
|
25
|
+
*
|
|
26
|
+
* app.get('/profile',
|
|
27
|
+
* ensureLoggedIn({ redirectTo: '/session/new', setReturnTo: false }),
|
|
28
|
+
* function(req, res) { ... });
|
|
29
|
+
*
|
|
30
|
+
* @param {Object} options
|
|
31
|
+
* @return {Function}
|
|
32
|
+
* @api public
|
|
33
|
+
*/
|
|
34
|
+
const { User } = require('../../models');
|
|
35
|
+
|
|
36
|
+
const $this = this;
|
|
37
|
+
$this.logMeta = {
|
|
38
|
+
scope: 'Authentication',
|
|
39
|
+
msgType: 'LOGIN',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// eslint-disable-next-line consistent-return
|
|
43
|
+
const handleBasicAuth = async (req) => {
|
|
44
|
+
const logOpts = {
|
|
45
|
+
scope: 'handleBasicAuth',
|
|
46
|
+
msgType: 'AUTH_API',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
if (req.isAuthenticated()) {
|
|
50
|
+
return { type: 'success', status: 200 };
|
|
51
|
+
}
|
|
52
|
+
if (!(await global.AppSettings.isAuthEnabled())) {
|
|
53
|
+
const guest = await User.findOne({ username: 'Guest' });
|
|
54
|
+
// noinspection UnnecessaryLocalVariableJS
|
|
55
|
+
const result = new Promise((resolve) => {
|
|
56
|
+
req.logIn(guest, (err) => {
|
|
57
|
+
if (err) {
|
|
58
|
+
log.error(`cannot find quest user: '${err}'`, $this, logOpts);
|
|
59
|
+
resolve({
|
|
60
|
+
type: 'redirect',
|
|
61
|
+
status: 301,
|
|
62
|
+
value: `/auth?=Error: cannot find quest user: ${err}`,
|
|
63
|
+
user: null,
|
|
64
|
+
});
|
|
65
|
+
} else {
|
|
66
|
+
resolve({
|
|
67
|
+
type: 'success',
|
|
68
|
+
status: 200,
|
|
69
|
+
value: '',
|
|
70
|
+
user: guest,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const result = {
|
|
79
|
+
type: 'error',
|
|
80
|
+
status: 400,
|
|
81
|
+
value: '',
|
|
82
|
+
user: null,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
if ((await global.AppSettings.isAuthEnabled())
|
|
86
|
+
&& ((await global.AppSettings.isFirstRun()))
|
|
87
|
+
&& process.env.SYNGRISI_DISABLE_FIRST_RUN !== '1'
|
|
88
|
+
) {
|
|
89
|
+
log.info('first run, set admin password', $this, logOpts);
|
|
90
|
+
result.type = 'redirect';
|
|
91
|
+
result.status = 301;
|
|
92
|
+
result.value = '/auth/change?first_run=true';
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (await global.AppSettings.isAuthEnabled()) {
|
|
97
|
+
log.info(`user is not authenticated - ${req.originalUrl}`, $this, logOpts);
|
|
98
|
+
|
|
99
|
+
result.type = 'redirect';
|
|
100
|
+
result.status = 301;
|
|
101
|
+
|
|
102
|
+
if (req?.originalUrl !== '/') {
|
|
103
|
+
result.value = `/auth?origin=${encodeURIComponent(req.originalUrl)}`;
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
result.value = '/auth';
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
exports.ensureLoggedIn = function ensureLoggedIn() {
|
|
113
|
+
// eslint-disable-next-line consistent-return
|
|
114
|
+
return async (req, res, next) => {
|
|
115
|
+
const result = await handleBasicAuth(req);
|
|
116
|
+
// log.silly(result, {
|
|
117
|
+
// scope: 'ensureLoggedIn',
|
|
118
|
+
// msgType: 'AUTH_API',
|
|
119
|
+
// }, $this);
|
|
120
|
+
req.user = result.user || req.user;
|
|
121
|
+
if (result.type === 'success') {
|
|
122
|
+
return next();
|
|
123
|
+
}
|
|
124
|
+
res.status(result.status)
|
|
125
|
+
.redirect(result.value);
|
|
126
|
+
return next('redirect');
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const handleAPIAuth = async (hashedApiKey) => {
|
|
131
|
+
const logOpts = {
|
|
132
|
+
scope: 'handleAPIAuth',
|
|
133
|
+
msgType: 'AUTH_API',
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const result = {
|
|
137
|
+
status: 400,
|
|
138
|
+
type: 'error',
|
|
139
|
+
value: '',
|
|
140
|
+
user: null,
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
if (!(await global.AppSettings.isAuthEnabled())) {
|
|
144
|
+
const guest = await User.findOne({ username: 'Guest' });
|
|
145
|
+
|
|
146
|
+
if (!guest) {
|
|
147
|
+
log.error('cannot find Guest user');
|
|
148
|
+
result.type = 'error';
|
|
149
|
+
result.value = 'cannot find Guest user';
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
log.debug('authentication disabled', logOpts, { user: 'Guest' });
|
|
153
|
+
result.type = 'success';
|
|
154
|
+
result.user = guest;
|
|
155
|
+
result.status = 200;
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!hashedApiKey) {
|
|
160
|
+
log.debug('API key missing', logOpts);
|
|
161
|
+
result.type = 'error';
|
|
162
|
+
result.status = 401;
|
|
163
|
+
result.value = 'API key missing';
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const user = await User.findOne({ apiKey: hashedApiKey });
|
|
168
|
+
if (!user) {
|
|
169
|
+
log.error(`wrong API key: ${hashedApiKey}`, logOpts);
|
|
170
|
+
result.type = 'error';
|
|
171
|
+
result.status = 401;
|
|
172
|
+
result.value = 'wrong API key';
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
log.debug('authenticated', $this, { ...logOpts, ...{ user: user?.username } });
|
|
176
|
+
result.type = 'success';
|
|
177
|
+
result.status = 200;
|
|
178
|
+
result.user = user;
|
|
179
|
+
return result;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
exports.ensureApiKey = function ensureApiKey() {
|
|
183
|
+
const logOpts = {
|
|
184
|
+
scope: 'ensureApiKey',
|
|
185
|
+
msgType: 'AUTH_API',
|
|
186
|
+
};
|
|
187
|
+
// eslint-disable-next-line consistent-return
|
|
188
|
+
return async (req, res, next) => {
|
|
189
|
+
log.silly(`headers: ${JSON.stringify(req.headers, null, '..')}`, logOpts);
|
|
190
|
+
log.silly(`SYNGRISI_AUTH: '${process.env.SYNGRISI_AUTH}'`);
|
|
191
|
+
const hashedApiKey = req.headers.apikey || req.query.apikey;
|
|
192
|
+
const result = await handleAPIAuth(hashedApiKey);
|
|
193
|
+
req.user = req.user || result.user;
|
|
194
|
+
req.headers.apikey = result?.user?.apiKey || req?.headers?.apikey;
|
|
195
|
+
if (result.type !== 'success') {
|
|
196
|
+
log.info(`${result.value} - ${req.originalUrl}`, $this, logOpts);
|
|
197
|
+
res.status(result.status)
|
|
198
|
+
.json({ error: result.value });
|
|
199
|
+
return next(new Error(result.value));
|
|
200
|
+
}
|
|
201
|
+
return next();
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
exports.ensureLoggedInOrApiKey = () => async (req, res, next) => {
|
|
206
|
+
const basicAuthResult = await handleBasicAuth(req);
|
|
207
|
+
|
|
208
|
+
const hashedApiKey = req.headers.apikey || req.query.apikey;
|
|
209
|
+
const apiKeyResult = await handleAPIAuth(hashedApiKey);
|
|
210
|
+
req.user = req.user || apiKeyResult.user;
|
|
211
|
+
|
|
212
|
+
if (
|
|
213
|
+
(basicAuthResult.type !== 'success')
|
|
214
|
+
&& (apiKeyResult.type !== 'success')
|
|
215
|
+
) {
|
|
216
|
+
log.info(`Unauthorized - ${req.originalUrl}`);
|
|
217
|
+
// res.status(401).json({ error: `${`${apiKeyResult.value} ${basicAuthResult.value}`} - ${req.originalUrl}` });
|
|
218
|
+
res.status(401)
|
|
219
|
+
.json({ error: `Unauthorized - ${req.originalUrl}` });
|
|
220
|
+
return next(new Error(`Unauthorized - ${req.originalUrl}`));
|
|
221
|
+
}
|
|
222
|
+
return next();
|
|
223
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure that no user is logged in before proceeding to next route middleware.
|
|
3
|
+
*
|
|
4
|
+
* This middleware ensures that no user is logged in. If a request is received
|
|
5
|
+
* that is authenticated, the request will be redirected to another page (by
|
|
6
|
+
* default to `/`).
|
|
7
|
+
*
|
|
8
|
+
* Options:
|
|
9
|
+
* - `redirectTo` URL to redirect to in logged in, defaults to _/_
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
*
|
|
13
|
+
* app.get('/login',
|
|
14
|
+
* ensureLoggedOut(),
|
|
15
|
+
* function(req, res) { ... });
|
|
16
|
+
*
|
|
17
|
+
* app.get('/login',
|
|
18
|
+
* ensureLoggedOut('/home'),
|
|
19
|
+
* function(req, res) { ... });
|
|
20
|
+
*
|
|
21
|
+
* app.get('/login',
|
|
22
|
+
* ensureLoggedOut({ redirectTo: '/home' }),
|
|
23
|
+
* function(req, res) { ... });
|
|
24
|
+
*
|
|
25
|
+
* @param {Object} options
|
|
26
|
+
* @return {Function}
|
|
27
|
+
* @api public
|
|
28
|
+
*/
|
|
29
|
+
module.exports = function ensureLoggedOut(options) {
|
|
30
|
+
let opts;
|
|
31
|
+
if (typeof options === 'string') {
|
|
32
|
+
opts = { redirectTo: options };
|
|
33
|
+
}
|
|
34
|
+
opts = options || {};
|
|
35
|
+
|
|
36
|
+
const url = opts.redirectTo || '/';
|
|
37
|
+
|
|
38
|
+
return function (req, res, next) {
|
|
39
|
+
if (req.isAuthenticated && req.isAuthenticated()) {
|
|
40
|
+
return res.redirect(url);
|
|
41
|
+
}
|
|
42
|
+
return next();
|
|
43
|
+
};
|
|
44
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const getElementsByPositionFromDump = function getElementsByPositionFromDump(x, y, dump, offset = 1) {
|
|
2
|
+
return new Promise(function (resolve, reject) {
|
|
3
|
+
try {
|
|
4
|
+
// check if position is gets into dumped elements rects boundaries
|
|
5
|
+
let data = dump
|
|
6
|
+
.filter(function (item) {
|
|
7
|
+
return (x >= item.left) &&
|
|
8
|
+
(x <= item.right) &&
|
|
9
|
+
(y >= item.top) &&
|
|
10
|
+
(y <= item.bottom);
|
|
11
|
+
})
|
|
12
|
+
.sort((a, b) => (a.domPath.length) < (b.domPath.length) ? 1 : -1);
|
|
13
|
+
if (data.length < 1) {
|
|
14
|
+
return resolve(null);
|
|
15
|
+
}
|
|
16
|
+
const pos = data[0];
|
|
17
|
+
return resolve({
|
|
18
|
+
tag: pos.tag,
|
|
19
|
+
id: pos.id,
|
|
20
|
+
x: pos.x,
|
|
21
|
+
y: pos.y,
|
|
22
|
+
width: pos.width,
|
|
23
|
+
height: pos.height,
|
|
24
|
+
domPath: pos.domPath,
|
|
25
|
+
request: `${x}, ${y}`
|
|
26
|
+
});
|
|
27
|
+
} catch (e) {
|
|
28
|
+
return reject(e);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const getAllElementsByPositionFromDump = function getAllElementsByPositionFromDump(dump, positions) {
|
|
33
|
+
return new Promise(function (resolve, reject) {
|
|
34
|
+
try {
|
|
35
|
+
let executionTimer = process.hrtime();
|
|
36
|
+
console.log(`Start parse elements from dump based on diff`);
|
|
37
|
+
let promResults = [];
|
|
38
|
+
for (const position of positions) {
|
|
39
|
+
const el = getElementsByPositionFromDump(position.x, position.y, dump);
|
|
40
|
+
promResults.push(el);
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
console.log(`Promises formed, time: ${process.hrtime(executionTimer)
|
|
44
|
+
.toString()}`);
|
|
45
|
+
|
|
46
|
+
let dumpResults = {};
|
|
47
|
+
Promise.all(promResults)
|
|
48
|
+
.then((values) => {
|
|
49
|
+
console.log(`Promises resolved, time: ${process.hrtime(executionTimer)
|
|
50
|
+
.toString()}`);
|
|
51
|
+
for (el of values) {
|
|
52
|
+
// to make dump unique
|
|
53
|
+
if (el !== null) {
|
|
54
|
+
const key = `${el.tag}_${el.id}_${el.x}_${el.y}_${el.width}_${el.height}_${el.domPath.toString()}`;
|
|
55
|
+
dumpResults[key] = el;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
console.log(`End parse elements from dump based on diff, time: '${process.hrtime(executionTimer)
|
|
59
|
+
.toString()}'`);
|
|
60
|
+
return resolve(Object.values(dumpResults)
|
|
61
|
+
.map(x => x));
|
|
62
|
+
});
|
|
63
|
+
} catch (e) {
|
|
64
|
+
reject(e);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
module.exports = {
|
|
70
|
+
getElementsByPositionFromDump: getElementsByPositionFromDump,
|
|
71
|
+
getAllElementsByPositionFromDump: getAllElementsByPositionFromDump,
|
|
72
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"username": "Guest",
|
|
3
|
+
"role": "user",
|
|
4
|
+
"firstName": "Syngrisi",
|
|
5
|
+
"lastName": "Guest",
|
|
6
|
+
"salt": "861d0193d9a4cd27597d672dd73100b1218cc7629c59bf18f9faef4480d1f58a",
|
|
7
|
+
"password": "cdd8541c318008fe0eee35d311b428c666d7ddf78722735e40b21b0b9e734eabe1b60f6db6deb8f3f101ed559a7365a497bfa73156ba3fadcbb14c5cae441edfe301568a47320abcda308920fecc482b1082468fd2197893561f5d174ecafdfb930bdc8e070fbed07353231d255616d3072e899a4ae1e6ff71f171edc34ba871d091b657a3207b571d2db0f3fce1fb2bc48942657d35aac7fa1fc2ebcbacdc00e46b184e1e5e4988171bcd843f7bb4adb2920df06c4f6b830154234350f9d65cc6e10d445a242c2149a3ce24458bd741035629bb73bdf29e0db4dcd3e37d85332d58d58674ca56b632294135a3354705b3281ea7564b962d544cfcee7069f3065c394098e11999385b077755f9c7e3d42f55b23ecb3366187d3a8ce2475615fbd06d707020274d7f50fe6c824e589955a667210fa031828f832e3cc050d1c0c5360647bfd88d411d3f76e8c6d9c610e2bc5a22da498888d2c94ad25b6448ca2eb9606210b2018136116fda6fdd87b24bcdfe86daefcdaa97d1f9e3a102188a4314a5a4018599cc70dab82157f5d88f7ada008a1f8e0d6e8abf51ed87ebdab982c01645f4f907414d1bb13b1fac410648cc2e94554ecbe0f472aee26623888878139bd44e109d5ce673ecfbe71269d22bea55a03ad4409fc8578de6001f5601fab4cf800be1d420f76586ed9c31214f30c632de99260256c9d2ce45476c135d32",
|
|
8
|
+
"apiKey": "4ba2659e94f48ce771a78ee479dc3ab12c2cc6d2484c967b4c564f0a1718a8a254f6aaec3169eb7b29e7d2542d73d378339e311cf912e46fe67eac4eef44636c"
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "first_run",
|
|
4
|
+
"label": "First Run",
|
|
5
|
+
"description": "Indicates if the application is running the first time",
|
|
6
|
+
"type": "Boolean",
|
|
7
|
+
"value": "true",
|
|
8
|
+
"enabled": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "authentication",
|
|
12
|
+
"label": "Authentication",
|
|
13
|
+
"description": "Enable application authentication",
|
|
14
|
+
"type": "Boolean",
|
|
15
|
+
"value": "false",
|
|
16
|
+
"enabled": true
|
|
17
|
+
}
|
|
18
|
+
]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const winston = require('winston');
|
|
2
|
+
require('winston-mongodb');
|
|
3
|
+
const {
|
|
4
|
+
blue,
|
|
5
|
+
gray,
|
|
6
|
+
magenta,
|
|
7
|
+
} = require('chalk');
|
|
8
|
+
const { formatISOToDateTime } = require('../utils');
|
|
9
|
+
|
|
10
|
+
const logLevel = process.env.SYNGRISI_LOG_LEVEL ? process.env.SYNGRISI_LOG_LEVEL : '';
|
|
11
|
+
|
|
12
|
+
module.exports.Logger = class Logger {
|
|
13
|
+
constructor(opts) {
|
|
14
|
+
this.connectionString = opts.connectionString;
|
|
15
|
+
this.winstonLogger = winston.createLogger({
|
|
16
|
+
transports: [
|
|
17
|
+
new winston.transports.Console({
|
|
18
|
+
level: logLevel || 'silly',
|
|
19
|
+
format: winston.format.combine(
|
|
20
|
+
winston.format.colorize(),
|
|
21
|
+
winston.format.timestamp(),
|
|
22
|
+
winston.format.ms(),
|
|
23
|
+
winston.format.metadata(),
|
|
24
|
+
winston.format.printf((info) => {
|
|
25
|
+
const user = info.metadata.user ? blue(` <${info.metadata.user}>`) : '';
|
|
26
|
+
const ref = info.metadata.ref ? gray(` ${info.metadata.ref}`) : '';
|
|
27
|
+
const msgType = info.metadata.msgType ? ` ${info.metadata.msgType}` : '';
|
|
28
|
+
const itemType = info.metadata.itemType ? magenta(` ${info.metadata.itemType}`) : '';
|
|
29
|
+
const scope = info.metadata.scope ? magenta(` [${info.metadata.scope}] `) : '';
|
|
30
|
+
const msg = typeof info.message === 'object'
|
|
31
|
+
? `\n${JSON.stringify(info.message, null, 2)}`
|
|
32
|
+
: info.message;
|
|
33
|
+
|
|
34
|
+
// return `${info.level} ${scope}${formatISO9075(parseISO(info.metadata.timestamp))} `
|
|
35
|
+
return `${info.level} ${scope}${formatISOToDateTime(info.metadata.timestamp)} `
|
|
36
|
+
+ `${info.metadata.ms}${user}${ref}${msgType}${itemType} '${msg}'`;
|
|
37
|
+
}),
|
|
38
|
+
winston.format.padLevels(),
|
|
39
|
+
),
|
|
40
|
+
}),
|
|
41
|
+
new winston.transports.MongoDB({
|
|
42
|
+
level: logLevel || 'debug',
|
|
43
|
+
format: winston.format.combine(
|
|
44
|
+
winston.format.timestamp(),
|
|
45
|
+
winston.format.json(),
|
|
46
|
+
winston.format.metadata(),
|
|
47
|
+
),
|
|
48
|
+
options: {
|
|
49
|
+
useUnifiedTopology: true,
|
|
50
|
+
},
|
|
51
|
+
db: opts.dbConnectionString,
|
|
52
|
+
collection: 'vrslogs',
|
|
53
|
+
storeHost: true,
|
|
54
|
+
meta: true,
|
|
55
|
+
}),
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static merge(meta, context) {
|
|
61
|
+
if ((meta?.ref) && (typeof meta?.ref) !== 'string') {
|
|
62
|
+
// eslint-disable-next-line no-param-reassign
|
|
63
|
+
meta.ref = meta.ref.toString();
|
|
64
|
+
}
|
|
65
|
+
if (context?.logMeta) {
|
|
66
|
+
// return Object.assign(context.logMeta, meta);
|
|
67
|
+
return { ...context.logMeta, ...meta };
|
|
68
|
+
}
|
|
69
|
+
return meta;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
error(msg, context, meta) {
|
|
73
|
+
this.winstonLogger.error(`${msg}\n stacktrace: ${new Error().stack}`, Logger.merge(meta, context));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
warn(msg, context, meta) {
|
|
77
|
+
this.winstonLogger.warn(`${msg}\n stacktrace: ${new Error().stack}`, Logger.merge(meta, context));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
info(msg, context, meta) {
|
|
81
|
+
this.winstonLogger.info(msg, Logger.merge(meta, context));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
verbose(msg, context, meta) {
|
|
85
|
+
this.winstonLogger.verbose(msg, Logger.merge(meta, context));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
debug(msg, context, meta) {
|
|
89
|
+
this.winstonLogger.debug(msg, Logger.merge(meta, context));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
silly(msg, meta, context) {
|
|
93
|
+
this.winstonLogger.silly(msg, Logger.merge(meta, context));
|
|
94
|
+
}
|
|
95
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* eslint-disable no-underscore-dangle */
|
|
2
|
+
// this code should run only once at server start
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
// eslint-disable-next-line no-unused-vars
|
|
5
|
+
const testUsers = require('./testUsers.json');
|
|
6
|
+
const { User } = require('../models');
|
|
7
|
+
|
|
8
|
+
const $this = this;
|
|
9
|
+
$this.logMeta = {
|
|
10
|
+
scope: 'on_start',
|
|
11
|
+
msgType: 'SETUP',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
exports.createTempDir = function createTempDir() {
|
|
15
|
+
const dir = '.tmp';
|
|
16
|
+
if (!fs.existsSync(dir)) {
|
|
17
|
+
fs.mkdirSync(dir);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.createInitialSettings = async function createInitialSettings() {
|
|
22
|
+
if ((await global.AppSettings.count()) < 1) {
|
|
23
|
+
await global.AppSettings.loadInitialFromFile();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
exports.createBasicUsers = async function createBasicUsers() {
|
|
28
|
+
const defAdmin = await User.findOne({ username: 'Administrator' }).exec();
|
|
29
|
+
const defGuest = await User.findOne({ username: 'Guest' }).exec();
|
|
30
|
+
if (!defAdmin) {
|
|
31
|
+
log.info('create the default Administrator', $this);
|
|
32
|
+
const adminData = JSON.parse(fs.readFileSync(`${__dirname}/admin.json`));
|
|
33
|
+
|
|
34
|
+
const admin = await User.create(adminData);
|
|
35
|
+
log.info(`administrator with id: '${admin._id}' was created`, $this);
|
|
36
|
+
}
|
|
37
|
+
if (!defGuest) {
|
|
38
|
+
log.info('create the default Guest', $this);
|
|
39
|
+
const guestData = JSON.parse(fs.readFileSync(`${__dirname}/guest.json`));
|
|
40
|
+
const guest = await User.create(guestData);
|
|
41
|
+
log.info(`guest with id: '${guest._id}' was created`, $this);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
exports.createTestsUsers = async function createTestsUsers() {
|
|
46
|
+
const users = require('./testUsers.json');
|
|
47
|
+
log.debug('creating tests users', $this);
|
|
48
|
+
try {
|
|
49
|
+
await User.insertMany(users);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
console.warn(e);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const Canvas = require('canvas');
|
|
2
|
+
|
|
3
|
+
const loop = function loop(w, h, callback) {
|
|
4
|
+
let x;
|
|
5
|
+
let y;
|
|
6
|
+
|
|
7
|
+
for (x = 0; x < w; x++) {
|
|
8
|
+
for (y = 0; y < h; y++) {
|
|
9
|
+
callback(x, y);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const parseDiff = function (dataDiff) {
|
|
15
|
+
console.log('Start parse diff - prepare data');
|
|
16
|
+
Img = Canvas.Image;
|
|
17
|
+
let image = new Img();
|
|
18
|
+
image.src = dataDiff;
|
|
19
|
+
const width = image.width;
|
|
20
|
+
const height = image.height;
|
|
21
|
+
|
|
22
|
+
const canvas = Canvas.createCanvas(width, height);
|
|
23
|
+
const ctx = canvas.getContext('2d');
|
|
24
|
+
ctx.drawImage(image, 0, 0);
|
|
25
|
+
|
|
26
|
+
const sourceImageData = ctx.getImageData(0, 0, width, height).data;
|
|
27
|
+
|
|
28
|
+
let diffPixCount = 0;
|
|
29
|
+
let allPixCount = 0;
|
|
30
|
+
let positions = [];
|
|
31
|
+
let s = {};
|
|
32
|
+
console.log('Start collect diff pixel positions');
|
|
33
|
+
loop(width, height, async function (horizontalPos, verticalPos) {
|
|
34
|
+
let offset = (verticalPos * width + horizontalPos) * 4;
|
|
35
|
+
let red = sourceImageData[offset];
|
|
36
|
+
let green = sourceImageData[offset + 1];
|
|
37
|
+
let blue = sourceImageData[offset + 2];
|
|
38
|
+
let alpha = sourceImageData[offset + 3];
|
|
39
|
+
if (!s[`${red}, ${green}, ${blue}, ${alpha}`]) {
|
|
40
|
+
s[`${red}, ${green}, ${blue}, ${alpha}`] = 1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
s[`${red}, ${green}, ${blue}, ${alpha}`] = s[`${red}, ${green}, ${blue}, ${alpha}`] + 1;
|
|
44
|
+
|
|
45
|
+
if
|
|
46
|
+
(
|
|
47
|
+
((red === 252) && (green === 0) && (blue === 236)) ||
|
|
48
|
+
((red === 196) && (green === 0) && (blue === 132)) ||
|
|
49
|
+
((red === 255) && (green === 0) && (blue === 255))
|
|
50
|
+
) {
|
|
51
|
+
|
|
52
|
+
diffPixCount++;
|
|
53
|
+
positions.push({
|
|
54
|
+
x: horizontalPos,
|
|
55
|
+
y: verticalPos
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
allPixCount++;
|
|
60
|
+
});
|
|
61
|
+
console.log(s);
|
|
62
|
+
console.log(`'${diffPixCount}' diff pixels positions of '${allPixCount}' was collected`);
|
|
63
|
+
console.log('Start sorting pixel positions by "y"');
|
|
64
|
+
const out = positions.sort((a, b) => (a.y > b.y) ? 1 : -1);
|
|
65
|
+
console.log('End of sorting');
|
|
66
|
+
return out;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
module.exports = {
|
|
70
|
+
parseDiff,
|
|
71
|
+
loop,
|
|
72
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"username": "Test",
|
|
3
|
+
"firstName": "Test",
|
|
4
|
+
"lastName": "Admin",
|
|
5
|
+
"role": "admin",
|
|
6
|
+
"password": "7c68c97c24f19fd760234b20fea21a9db0ef982f50d24ae356379193ecb649e1b819810f7d3640c20002b7cabe357be7723cc30be8197a5cad6ecb2712badd07938a3010637dc5c64e91b58adc4b2a20a58ab4c3d67c8a028e19829bdc88b4d6d98a393b75272f5b6d4ab5a4e5a9770957f963f6b53d52b428d8e2de06b6bc51eea4b6a415780f68184dabaf288492200587e78ab7f3769f7073ef1ba047c8038207bce2a5cc9dd69a59805becd3c9dda7a95d7defa3a745fffc3d7a3efa25d2ddb90e85722c91237b5333fe98c3bf106d85516947a3655d05fa0f83da07c6eb0c9b69d27f48f2bf25475c02ab94a777e4850c7c40883f1a7a471c6a928a3bfbf8eba560bf9750e6f270f3001480cc54090ec8685c6dbf6d73cc6ad157646698feb494c275fca2c71dc1f30f3d2c38837491dc327cb0fcceb98d8cb1cba9c509bf49e9c7ad65f5ac0aa515ca96e722ee6ba1da8a610f7c013b330b8ba9fee21942b7827d623eafbf22e5de2505dd72c7e69cc1c3bed8015ae1fe3ea1e7fc65104f0875b78d3bb57d50a267f29933c1fa00424a7e1f9d5f1b913aab317adf488a32d7098fd54825c5c90e813094fbc7bca89c86d72301a22dbfeada0cd98a30cba8f98f56bcb5d8089bd3e93e558179bd7e1f535012e732144a68803d38f1f52a86ade86b1434c4b94b1bb7daffc3fb4b9937b9b3d63cb660cd4332ca91a37a86",
|
|
7
|
+
"apiKey": "12345",
|
|
8
|
+
"salt": "7410d0bd960fba56427745742d1a5cb64cd1ce769f611ed9efec7bca13b56f6b"
|
|
9
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"PASSWORD_": "Test-123",
|
|
4
|
+
"API_KEY_": "GV640BD-9CG4RDB-NY8WH76-NJB5599",
|
|
5
|
+
"username": "testreviewer@test.com",
|
|
6
|
+
"firstName": "Test",
|
|
7
|
+
"lastName": "Reviewer",
|
|
8
|
+
"role": "reviewer",
|
|
9
|
+
"password": "152046e9cd34cdcd6cea5e66a9ec3fd262f61056b51e4a82d4fe8d6dacaa71fa8419e4b16bc11dfad9d2d90a8b8f4eb79b8e0dc93bededa7d8524521b122392dde0b4e9ca3bccb23b9bade5eb991d78d98246c009e983af42274f9d701c313ef8c47f23fea7701063a19be77f7d31c7cd537ee8f3bc31e861a81cc88bb2f47424e2903d06c99cf053e3be21d191075c92eaee48e1f964ace6357d7f5fea5412e56b26331f9e67354e3f0e0937f826011ddb0058a6c59021c9b7880b5c0ecdbaef1f8491e78288a00ff5ab5fa3e58528794f1bd84f097e8dccc8a8c3a15f760389d9b57f5313c63f68688ad44b53727d1c6e2078824e3c042ccfc6351772737807f46b7e24e30d8c48c1a1a55a3eb0d465d657004e17060afe4b354a4f3946b3dce8c105a2d521cd2c63161af0c039d41c212165c6133fe3b24d8ccdc82045450ce8e189d03ec7bb948bd0ad22140089d6f63352833b56232d7cad498efb65fb609077b6de73beb8e946fe54d7b417cefef0a07e26cbf33a7c58323f414aeaa4b83118e19bffdb3eb6d4f5150f1901b340c16e71c2683d7c6faede630396c4c92ba12485c6c8e00ecb3be785604ce41fdf42315cf02ad7f96eff2b018b415b1550f50756ace62965cadd4080a3e4bd8e3d70042bb3a5f0ba8ab357bfad9290af6a93236f294b3e7547295227b8d5b33cca35393d4b76e750805249b81b2a186aa",
|
|
10
|
+
"apiKey": "9aa20a336f91ea6c9657c3391934227059d4c28d2c7924813176ac4f6633d9c65baee77ca6f34c0d13e574ec285b54fd23c10b26abefec7df981e2884f91a84c",
|
|
11
|
+
"createdDate": "2022-09-19T15:23:09.360+04:00",
|
|
12
|
+
"updatedDate": null,
|
|
13
|
+
"salt": "09067fc22c1b821db81bc83c33f217cd8a54cb8f370d1da4a12d8be867a66b93"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"PASSWORD_": "Test-123",
|
|
17
|
+
"API_KEY_": "NTSAEXR-CZ1MFWD-KY0Q3MG-HY6SKD1",
|
|
18
|
+
"username": "testuser@test.com",
|
|
19
|
+
"firstName": "Test",
|
|
20
|
+
"lastName": "User",
|
|
21
|
+
"role": "user",
|
|
22
|
+
"password": "60271a5363308e14af295c0ce34818ce32781296d10908f941d8c9589dced5b193f6e1a1962c4e5e718c00974497baa5a3fd6a797bf2cc91e7f76018711c1a7a35809c04fa92b256987f0835601b789609311c862f4c91220741fc30bd79aff25c0b0565834ca16cd313e45fc1b5846f25cabab695680edd739a85b479fbf51c2f860fd427003b10e5bec0b7bf776bfed7b6dbe33a3ca666e69995f4160ddc54e00075b1844807529f0fd8bf650eab71bf6732fd91018cfaedf950d94fd75cfe2b758c3610fb5ab1b863e119073637b33aeaf781e33ed1c73a050f8b8e540761f205d5b19347039599d647a25f1ba7d1422bf3029f9a35b8eb8633db09afd807d18a6ff22d55862e7aa401538eb705fca451fee132324bc05aff3eab10d6031a5e21ff4c6e3a6cb03c32730e1e8b550ebab0ca39942277782b32f9399a14c2876a2a01acecd70f819cce77407b1fee231d5674dd6dc8d9c56a38e9f50e4271e2d9725d830b6f187009726179cb6d1d67c614461bb294003b23f7979f16dbcc71ad9ab9285d7aa4a5550d15915d34ac50dee6fa7f2b90113a3cbf83a92811df0dee1f97c92328273cb8556136219569286666a1bc49c86c9e0e8175cf564168ada14e9f14c174f45789cc68667cecfda6f5d343f79d12ac4c0934f189dab0c8b6c29d01488a8dd0f37dcbba34ec45a9be8c52230189804beecf52603ce22ec95d",
|
|
23
|
+
"apiKey": "c45d0a87c4eea0f6ace90f1f780761f3e4daa9f11b5bc3732cb9014ad269a4bafa73c7ae6af891dd0fcc3e7ecaee40ca6236948ede1a3eb9c84757cd18c06bc3",
|
|
24
|
+
"createdDate": "2022-09-19T15:22:23.631+04:00",
|
|
25
|
+
"updatedDate": null,
|
|
26
|
+
"salt": "c23b0eafe172a9d1fad3651f02ae256a2f6932faac09fd1f4385c1f406c8c83f"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"PASSWORD_": "Test-123",
|
|
30
|
+
"API_KEY_": "3APH5SM-X9G4T6G-H3ZZNQ2-55G4REB",
|
|
31
|
+
"username": "testadmin@test.com",
|
|
32
|
+
"firstName": "Test",
|
|
33
|
+
"lastName": "Admin",
|
|
34
|
+
"role": "admin",
|
|
35
|
+
"password": "5046e8420581be0c726c1cade6b6e15fe7cb0c34dad070d3a3030ed12d79d7a56b1217916522cd8813f578d8b24571dab848f22e774abb1db70f4fb725249694afa25c3733decd78fa4d5ab875ec0de43cbbe511ea6b059482f721f96d437622374f715ea316e2f03dc40d7217b1951f6022bdff89b17357b24706306ad38115db2aab3f8a609d172f734cabd7ca5eddcaa772d4cca8b6338c86edd639b91e9fdac3b17be22b3c010eac7c9cac128b675b87ec39fa5b8fea0593137df01eca1678d197d4ed536eb209b83c477a7cd62e9e8e06b8459ebefcd267fc38d7705313303d3b038e31996b66e54415494db34544c617f03740feecc3427f7a92ebcc50e10f45f38a01c6ccbc182bf5b5c48b7eb33432f86d14d6972afcdafa5aab2d82a1b49a559c63a5a719e4fbdaa8eaad0c80cb3bec83f16854b4280b13f1976b24b7ca52d18118eec3546038b8e682aa3005f091927f64905122e41f95e9b729afbd833771e1b802dd962bbda3d5ccd0c8966da7cd902db6a3283d1a631195cdc2efa032ddfb69d924ccb3a4808b21b424dee46abc7f07edfbe2c9e9092d1d6f0da828ca98734909ed8d40802f5403d5e9070c356c594b4758759400b263601237192c6de2fd321fa9e480f2261cac7b3cd3ac2b41289a79f90efa17b890d7ff3f391654e62a7bbc557b9dc03824acdbcdb760e8209c74d29d827fc3c75de5468c",
|
|
36
|
+
"apiKey": "db6e323f7f559a62aa8cd3838b1cdd3c95acc0b064bfd21f6810b2aa6c147ae8e45ebbc49f7e720d31f0bd18d71ab05eaeedd343d1f345c35d18fbf685db91cb",
|
|
37
|
+
"createdDate": "2022-09-19T15:19:19.825+04:00",
|
|
38
|
+
"updatedDate": null,
|
|
39
|
+
"salt": "a7e22101f6886dbdf07fc01d92e633d8b323f5d868a6d1214c7f9a12f266a2b2"
|
|
40
|
+
}
|
|
41
|
+
]
|