cyberia 2.8.885
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/.dockerignore +15 -0
- package/.env.development +45 -0
- package/.env.production +50 -0
- package/.env.test +45 -0
- package/.github/workflows/engine-cyberia.cd.yml +31 -0
- package/.github/workflows/engine-cyberia.ci.yml +60 -0
- package/.github/workflows/ghpkg.ci.yml +87 -0
- package/.github/workflows/npmpkg.ci.yml +72 -0
- package/.github/workflows/publish.ci.yml +84 -0
- package/.github/workflows/publish.cyberia.ci.yml +84 -0
- package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
- package/.github/workflows/release.cd.yml +37 -0
- package/.nycrc +9 -0
- package/.prettierignore +13 -0
- package/.prettierrc +9 -0
- package/.vscode/extensions.json +51 -0
- package/.vscode/settings.json +87 -0
- package/AUTHORS.md +21 -0
- package/CHANGELOG.md +205 -0
- package/Dockerfile +28 -0
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/bin/build.js +209 -0
- package/bin/cron.js +47 -0
- package/bin/cyberia.js +145 -0
- package/bin/db.js +199 -0
- package/bin/deploy.js +1293 -0
- package/bin/file.js +197 -0
- package/bin/hwt.js +49 -0
- package/bin/index.js +145 -0
- package/bin/ssl.js +63 -0
- package/bin/util.js +80 -0
- package/bin/vs.js +74 -0
- package/cli.md +714 -0
- package/conf.js +204 -0
- package/deployment.yaml +138 -0
- package/jsconfig.json +7 -0
- package/jsdoc.json +32 -0
- package/manifests/deployment/adminer/deployment.yaml +32 -0
- package/manifests/deployment/adminer/kustomization.yaml +7 -0
- package/manifests/deployment/adminer/service.yaml +13 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
- package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
- package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
- package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
- package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
- package/manifests/deployment/fastapi/backend-service.yml +19 -0
- package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
- package/manifests/deployment/fastapi/frontend-service.yml +15 -0
- package/manifests/deployment/fastapi/initial_data.sh +56 -0
- package/manifests/deployment/kafka/deployment.yaml +69 -0
- package/manifests/deployment/mongo-express/deployment.yaml +60 -0
- package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
- package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
- package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
- package/manifests/envoy-service-nodeport.yaml +23 -0
- package/manifests/grafana/deployment.yaml +57 -0
- package/manifests/grafana/kustomization.yaml +7 -0
- package/manifests/grafana/pvc.yaml +12 -0
- package/manifests/grafana/service.yaml +14 -0
- package/manifests/kind-config-dev.yaml +12 -0
- package/manifests/kind-config.yaml +12 -0
- package/manifests/kubeadm-calico-config.yaml +119 -0
- package/manifests/kubelet-config.yaml +65 -0
- package/manifests/letsencrypt-prod.yaml +15 -0
- package/manifests/lxd/lxd-admin-profile.yaml +17 -0
- package/manifests/lxd/lxd-preseed.yaml +30 -0
- package/manifests/lxd/underpost-setup.sh +163 -0
- package/manifests/mariadb/config.yaml +10 -0
- package/manifests/mariadb/kustomization.yaml +9 -0
- package/manifests/mariadb/pv.yaml +12 -0
- package/manifests/mariadb/pvc.yaml +10 -0
- package/manifests/mariadb/secret.yaml +8 -0
- package/manifests/mariadb/service.yaml +10 -0
- package/manifests/mariadb/statefulset.yaml +56 -0
- package/manifests/mariadb/storage-class.yaml +10 -0
- package/manifests/mongodb/backup-access.yaml +16 -0
- package/manifests/mongodb/backup-cronjob.yaml +42 -0
- package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
- package/manifests/mongodb/configmap.yaml +26 -0
- package/manifests/mongodb/headless-service.yaml +10 -0
- package/manifests/mongodb/kustomization.yaml +11 -0
- package/manifests/mongodb/pv-pvc.yaml +23 -0
- package/manifests/mongodb/statefulset.yaml +126 -0
- package/manifests/mongodb/storage-class.yaml +9 -0
- package/manifests/mongodb-4.4/kustomization.yaml +7 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
- package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
- package/manifests/mysql/kustomization.yaml +7 -0
- package/manifests/mysql/pv-pvc.yaml +27 -0
- package/manifests/mysql/statefulset.yaml +55 -0
- package/manifests/postgresql/configmap.yaml +9 -0
- package/manifests/postgresql/kustomization.yaml +10 -0
- package/manifests/postgresql/pv.yaml +15 -0
- package/manifests/postgresql/pvc.yaml +13 -0
- package/manifests/postgresql/service.yaml +10 -0
- package/manifests/postgresql/statefulset.yaml +37 -0
- package/manifests/prometheus/deployment.yaml +82 -0
- package/manifests/valkey/kustomization.yaml +7 -0
- package/manifests/valkey/service.yaml +11 -0
- package/manifests/valkey/statefulset.yaml +38 -0
- package/nodemon.json +6 -0
- package/package.json +118 -0
- package/proxy.yaml +35 -0
- package/scripts/device-scan.sh +43 -0
- package/scripts/gpu-diag.sh +19 -0
- package/scripts/maas-setup.sh +120 -0
- package/scripts/nat-iptables.sh +26 -0
- package/scripts/nvim.sh +91 -0
- package/scripts/snap-clean.sh +26 -0
- package/scripts/ssh-cluster-info.sh +14 -0
- package/scripts/ssl.sh +164 -0
- package/src/api/blockchain/blockchain.controller.js +51 -0
- package/src/api/blockchain/blockchain.model.js +90 -0
- package/src/api/blockchain/blockchain.router.js +21 -0
- package/src/api/blockchain/blockchain.service.js +24 -0
- package/src/api/core/core.controller.js +69 -0
- package/src/api/core/core.model.js +11 -0
- package/src/api/core/core.router.js +24 -0
- package/src/api/core/core.service.js +35 -0
- package/src/api/crypto/crypto.controller.js +51 -0
- package/src/api/crypto/crypto.model.js +23 -0
- package/src/api/crypto/crypto.router.js +20 -0
- package/src/api/crypto/crypto.service.js +64 -0
- package/src/api/default/default.controller.js +74 -0
- package/src/api/default/default.model.js +20 -0
- package/src/api/default/default.router.js +27 -0
- package/src/api/default/default.service.js +40 -0
- package/src/api/document/document.controller.js +66 -0
- package/src/api/document/document.model.js +51 -0
- package/src/api/document/document.router.js +24 -0
- package/src/api/document/document.service.js +133 -0
- package/src/api/file/file.controller.js +67 -0
- package/src/api/file/file.model.js +19 -0
- package/src/api/file/file.router.js +22 -0
- package/src/api/file/file.service.js +100 -0
- package/src/api/instance/instance.controller.js +69 -0
- package/src/api/instance/instance.model.js +40 -0
- package/src/api/instance/instance.router.js +34 -0
- package/src/api/instance/instance.service.js +70 -0
- package/src/api/ipfs/ipfs.controller.js +51 -0
- package/src/api/ipfs/ipfs.model.js +17 -0
- package/src/api/ipfs/ipfs.router.js +20 -0
- package/src/api/ipfs/ipfs.service.js +25 -0
- package/src/api/object-layer/README.md +85 -0
- package/src/api/object-layer/object-layer.controller.js +69 -0
- package/src/api/object-layer/object-layer.model.js +181 -0
- package/src/api/object-layer/object-layer.router.js +29 -0
- package/src/api/object-layer/object-layer.service.js +49 -0
- package/src/api/test/test.controller.js +59 -0
- package/src/api/test/test.model.js +14 -0
- package/src/api/test/test.router.js +21 -0
- package/src/api/test/test.service.js +35 -0
- package/src/api/user/postman_collection.json +216 -0
- package/src/api/user/user.build.js +16 -0
- package/src/api/user/user.controller.js +35 -0
- package/src/api/user/user.model.js +100 -0
- package/src/api/user/user.router.js +400 -0
- package/src/api/user/user.service.js +500 -0
- package/src/api.js +23 -0
- package/src/cli/baremetal.js +1310 -0
- package/src/cli/cloud-init.js +548 -0
- package/src/cli/cluster.js +834 -0
- package/src/cli/cron.js +95 -0
- package/src/cli/db.js +414 -0
- package/src/cli/deploy.js +661 -0
- package/src/cli/env.js +101 -0
- package/src/cli/fs.js +256 -0
- package/src/cli/image.js +156 -0
- package/src/cli/index.js +436 -0
- package/src/cli/lxd.js +402 -0
- package/src/cli/monitor.js +260 -0
- package/src/cli/repository.js +274 -0
- package/src/cli/run.js +728 -0
- package/src/cli/script.js +85 -0
- package/src/cli/secrets.js +71 -0
- package/src/cli/ssh.js +46 -0
- package/src/cli/test.js +159 -0
- package/src/client/Cyberia.index.js +50 -0
- package/src/client/CyberiaAdmin.index.js +34 -0
- package/src/client/CyberiaPortal.index.js +36 -0
- package/src/client/Default.index.js +84 -0
- package/src/client/components/core/404.js +20 -0
- package/src/client/components/core/500.js +20 -0
- package/src/client/components/core/Account.js +326 -0
- package/src/client/components/core/AgGrid.js +191 -0
- package/src/client/components/core/Alert.js +77 -0
- package/src/client/components/core/Auth.js +342 -0
- package/src/client/components/core/Badge.js +32 -0
- package/src/client/components/core/Blockchain.js +41 -0
- package/src/client/components/core/Blog.js +9 -0
- package/src/client/components/core/BtnIcon.js +111 -0
- package/src/client/components/core/CalendarCore.js +464 -0
- package/src/client/components/core/Chat.js +64 -0
- package/src/client/components/core/ColorPalette.js +5267 -0
- package/src/client/components/core/CommonJs.js +1010 -0
- package/src/client/components/core/Content.js +196 -0
- package/src/client/components/core/Css.js +1099 -0
- package/src/client/components/core/CssCore.js +882 -0
- package/src/client/components/core/D3Chart.js +44 -0
- package/src/client/components/core/Docs.js +376 -0
- package/src/client/components/core/DropDown.js +223 -0
- package/src/client/components/core/EventsUI.js +133 -0
- package/src/client/components/core/FileExplorer.js +707 -0
- package/src/client/components/core/FullScreen.js +36 -0
- package/src/client/components/core/Input.js +383 -0
- package/src/client/components/core/JoyStick.js +80 -0
- package/src/client/components/core/Keyboard.js +73 -0
- package/src/client/components/core/LoadingAnimation.js +159 -0
- package/src/client/components/core/LogIn.js +190 -0
- package/src/client/components/core/LogOut.js +63 -0
- package/src/client/components/core/Logger.js +29 -0
- package/src/client/components/core/Modal.js +2494 -0
- package/src/client/components/core/NotificationManager.js +84 -0
- package/src/client/components/core/ObjectLayerEngine.js +1229 -0
- package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
- package/src/client/components/core/Pagination.js +207 -0
- package/src/client/components/core/Panel.js +772 -0
- package/src/client/components/core/PanelForm.js +627 -0
- package/src/client/components/core/Polyhedron.js +162 -0
- package/src/client/components/core/Recover.js +207 -0
- package/src/client/components/core/Responsive.js +82 -0
- package/src/client/components/core/RichText.js +43 -0
- package/src/client/components/core/Router.js +317 -0
- package/src/client/components/core/Scroll.js +76 -0
- package/src/client/components/core/SignUp.js +125 -0
- package/src/client/components/core/SocketIo.js +74 -0
- package/src/client/components/core/Stream.js +113 -0
- package/src/client/components/core/ToggleSwitch.js +101 -0
- package/src/client/components/core/ToolTip.js +90 -0
- package/src/client/components/core/Translate.js +522 -0
- package/src/client/components/core/Validator.js +115 -0
- package/src/client/components/core/VanillaJs.js +423 -0
- package/src/client/components/core/Wallet.js +106 -0
- package/src/client/components/core/WebComponent.js +44 -0
- package/src/client/components/core/Webhook.js +25 -0
- package/src/client/components/core/Worker.js +371 -0
- package/src/client/components/core/windowGetDimensions.js +269 -0
- package/src/client/components/cyberia/BagCyberia.js +1253 -0
- package/src/client/components/cyberia/BiomeCyberia.js +130 -0
- package/src/client/components/cyberia/CharacterCyberia.js +321 -0
- package/src/client/components/cyberia/CommonCyberia.js +1834 -0
- package/src/client/components/cyberia/CssCyberia.js +816 -0
- package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
- package/src/client/components/cyberia/ElementsCyberia.js +146 -0
- package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
- package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
- package/src/client/components/cyberia/LogInCyberia.js +68 -0
- package/src/client/components/cyberia/LogOutCyberia.js +24 -0
- package/src/client/components/cyberia/MainUserCyberia.js +424 -0
- package/src/client/components/cyberia/MapCyberia.js +160 -0
- package/src/client/components/cyberia/MatrixCyberia.js +147 -0
- package/src/client/components/cyberia/MenuCyberia.js +575 -0
- package/src/client/components/cyberia/PixiCyberia.js +1639 -0
- package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
- package/src/client/components/cyberia/QuestCyberia.js +1420 -0
- package/src/client/components/cyberia/RoutesCyberia.js +47 -0
- package/src/client/components/cyberia/SettingsCyberia.js +16 -0
- package/src/client/components/cyberia/SignUpCyberia.js +14 -0
- package/src/client/components/cyberia/SkillCyberia.js +124 -0
- package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
- package/src/client/components/cyberia/TileCyberia.js +685 -0
- package/src/client/components/cyberia/TranslateCyberia.js +96 -0
- package/src/client/components/cyberia/UniverseCyberia.js +14 -0
- package/src/client/components/cyberia/WebhookCyberia.js +13 -0
- package/src/client/components/cyberia/WikiCyberia.js +144 -0
- package/src/client/components/cyberia/WorldCyberia.js +680 -0
- package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
- package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
- package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
- package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
- package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
- package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
- package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
- package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
- package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
- package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
- package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
- package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
- package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
- package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
- package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
- package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
- package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
- package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
- package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
- package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
- package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
- package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
- package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
- package/src/client/components/default/CommonDefault.js +29 -0
- package/src/client/components/default/CssDefault.js +27 -0
- package/src/client/components/default/ElementsDefault.js +38 -0
- package/src/client/components/default/LogInDefault.js +14 -0
- package/src/client/components/default/LogOutDefault.js +10 -0
- package/src/client/components/default/MenuDefault.js +743 -0
- package/src/client/components/default/RoutesDefault.js +48 -0
- package/src/client/components/default/SettingsDefault.js +16 -0
- package/src/client/components/default/SignUpDefault.js +9 -0
- package/src/client/components/default/SocketIoDefault.js +54 -0
- package/src/client/components/default/TranslateDefault.js +7 -0
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/dark.svg +557 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/default/assets/logo/base-icon.png +0 -0
- package/src/client/public/default/assets/logo/underpost.gif +0 -0
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/browserconfig.xml +12 -0
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +69 -0
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/plantuml/client-conf.svg +1 -0
- package/src/client/public/default/plantuml/client-schema.svg +1 -0
- package/src/client/public/default/plantuml/cron-conf.svg +1 -0
- package/src/client/public/default/plantuml/cron-schema.svg +1 -0
- package/src/client/public/default/plantuml/server-conf.svg +1 -0
- package/src/client/public/default/plantuml/server-schema.svg +1 -0
- package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
- package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
- package/src/client/public/default/safari-pinned-tab.svg +24 -0
- package/src/client/public/default/site.webmanifest +69 -0
- package/src/client/public/default/sitemap +148 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +9 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +148 -0
- package/src/client/public/test/favicon.ico +0 -0
- package/src/client/public/test/sitemap +148 -0
- package/src/client/services/blockchain/blockchain.service.js +73 -0
- package/src/client/services/core/core.service.js +165 -0
- package/src/client/services/crypto/crypto.service.js +73 -0
- package/src/client/services/default/default.management.js +450 -0
- package/src/client/services/default/default.service.js +98 -0
- package/src/client/services/document/document.service.js +97 -0
- package/src/client/services/file/file.service.js +72 -0
- package/src/client/services/instance/instance.management.js +78 -0
- package/src/client/services/instance/instance.service.js +97 -0
- package/src/client/services/ipfs/ipfs.service.js +73 -0
- package/src/client/services/object-layer/object-layer.service.js +93 -0
- package/src/client/services/test/test.service.js +73 -0
- package/src/client/services/user/user.management.js +56 -0
- package/src/client/services/user/user.service.js +108 -0
- package/src/client/ssr/Render.js +237 -0
- package/src/client/ssr/body/404.js +73 -0
- package/src/client/ssr/body/500.js +72 -0
- package/src/client/ssr/body/CacheControl.js +114 -0
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
- package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
- package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
- package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/head/Css.js +241 -0
- package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
- package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
- package/src/client/ssr/head/CyberiaScripts.js +6 -0
- package/src/client/ssr/head/DefaultScripts.js +6 -0
- package/src/client/ssr/head/Microdata.js +11 -0
- package/src/client/ssr/head/Production.js +1 -0
- package/src/client/ssr/head/Pwa.js +146 -0
- package/src/client/ssr/head/Seo.js +15 -0
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/offline/Maintenance.js +63 -0
- package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
- package/src/client/ssr/pages/404.js +12 -0
- package/src/client/ssr/pages/500.js +12 -0
- package/src/client/ssr/pages/Test.js +198 -0
- package/src/client/ssr/pages/maintenance.js +14 -0
- package/src/client/ssr/pages/offline.js +21 -0
- package/src/client/sw/default.sw.js +108 -0
- package/src/client/sw/template.sw.js +84 -0
- package/src/client.build.js +22 -0
- package/src/client.dev.js +24 -0
- package/src/db/DataBaseProvider.js +98 -0
- package/src/db/mariadb/MariaDB.js +66 -0
- package/src/db/mongo/MongooseDB.js +70 -0
- package/src/index.js +198 -0
- package/src/mailer/EmailRender.js +116 -0
- package/src/mailer/MailerProvider.js +213 -0
- package/src/monitor.js +24 -0
- package/src/proxy.js +22 -0
- package/src/runtime/express/Express.js +256 -0
- package/src/runtime/lampp/Dockerfile +50 -0
- package/src/runtime/lampp/Lampp.js +343 -0
- package/src/server/auth.js +689 -0
- package/src/server/backup.js +96 -0
- package/src/server/client-build-docs.js +205 -0
- package/src/server/client-build-live.js +109 -0
- package/src/server/client-build.js +690 -0
- package/src/server/client-dev-server.js +87 -0
- package/src/server/client-formatted.js +87 -0
- package/src/server/client-icons.js +108 -0
- package/src/server/conf.js +1071 -0
- package/src/server/crypto.js +210 -0
- package/src/server/dns.js +276 -0
- package/src/server/downloader.js +74 -0
- package/src/server/json-schema.js +77 -0
- package/src/server/logger.js +197 -0
- package/src/server/network.js +72 -0
- package/src/server/object-layer.js +294 -0
- package/src/server/peer.js +69 -0
- package/src/server/process.js +171 -0
- package/src/server/proxy.js +110 -0
- package/src/server/runtime.js +170 -0
- package/src/server/ssr.js +127 -0
- package/src/server/start.js +161 -0
- package/src/server/tls.js +251 -0
- package/src/server/valkey.js +293 -0
- package/src/server.js +25 -0
- package/src/ws/IoInterface.js +139 -0
- package/src/ws/IoServer.js +88 -0
- package/src/ws/core/channels/core.ws.chat.js +23 -0
- package/src/ws/core/channels/core.ws.mailer.js +35 -0
- package/src/ws/core/channels/core.ws.stream.js +31 -0
- package/src/ws/core/core.ws.connection.js +62 -0
- package/src/ws/core/core.ws.emit.js +53 -0
- package/src/ws/core/core.ws.server.js +76 -0
- package/src/ws/core/management/core.ws.chat.js +8 -0
- package/src/ws/core/management/core.ws.mailer.js +16 -0
- package/src/ws/core/management/core.ws.stream.js +8 -0
- package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
- package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
- package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
- package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
- package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
- package/src/ws/cyberia/cyberia.ws.server.js +67 -0
- package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
- package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
- package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
- package/src/ws/default/channels/default.ws.main.js +16 -0
- package/src/ws/default/default.ws.connection.js +22 -0
- package/src/ws/default/default.ws.emit.js +14 -0
- package/src/ws/default/default.ws.server.js +20 -0
- package/src/ws/default/management/default.ws.main.js +8 -0
- package/test/api.test.js +53 -0
- package/test/crypto.test.js +117 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages the startup and runtime configuration of Underpost applications.
|
|
3
|
+
* @module src/server/start.js
|
|
4
|
+
* @namespace UnderpostStartUp
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import UnderpostDeploy from '../cli/deploy.js';
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import { awaitDeployMonitor } from './conf.js';
|
|
10
|
+
import { actionInitLog, loggerFactory } from './logger.js';
|
|
11
|
+
import { shellCd, shellExec } from './process.js';
|
|
12
|
+
import UnderpostRootEnv from '../cli/env.js';
|
|
13
|
+
|
|
14
|
+
const logger = loggerFactory(import.meta);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @class UnderpostStartUp
|
|
18
|
+
* @description Manages the startup and runtime configuration of Underpost applications.
|
|
19
|
+
* @memberof UnderpostStartUp
|
|
20
|
+
*/
|
|
21
|
+
class UnderpostStartUp {
|
|
22
|
+
static API = {
|
|
23
|
+
/**
|
|
24
|
+
* Logs the runtime network configuration.
|
|
25
|
+
* @memberof UnderpostStartUp
|
|
26
|
+
*/
|
|
27
|
+
logRuntimeRouter: () => {
|
|
28
|
+
const displayLog = {};
|
|
29
|
+
|
|
30
|
+
for (const host of Object.keys(UnderpostDeploy.NETWORK))
|
|
31
|
+
for (const path of Object.keys(UnderpostDeploy.NETWORK[host]))
|
|
32
|
+
displayLog[UnderpostDeploy.NETWORK[host][path].publicHost] = UnderpostDeploy.NETWORK[host][path].local;
|
|
33
|
+
|
|
34
|
+
logger.info('Runtime network', displayLog);
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Creates a server factory.
|
|
38
|
+
* @memberof UnderpostStartUp
|
|
39
|
+
* @param {Function} logic - The logic to execute when the server is listening.
|
|
40
|
+
* @returns {Object} An object with a listen method.
|
|
41
|
+
*/
|
|
42
|
+
listenServerFactory: (logic = async () => {}) => {
|
|
43
|
+
return {
|
|
44
|
+
listen: async (...args) => {
|
|
45
|
+
const msDelta = 1000;
|
|
46
|
+
const msMax = 30 * 24 * 60 * 60 * 1000; // ~ 1 month
|
|
47
|
+
let msCount = 0;
|
|
48
|
+
setInterval(() => {
|
|
49
|
+
msCount += msDelta;
|
|
50
|
+
if (msCount >= msMax) {
|
|
51
|
+
const message = 'Listen server factory timeout';
|
|
52
|
+
logger.error(message);
|
|
53
|
+
throw new Error(message);
|
|
54
|
+
}
|
|
55
|
+
}, msDelta);
|
|
56
|
+
return logic ? await logic(...args) : undefined, args[1]();
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Controls the listening port for a server.
|
|
63
|
+
* @memberof UnderpostStartUp
|
|
64
|
+
* @param {Object} server - The server to listen on.
|
|
65
|
+
* @param {number|string} port - The port number or colon for all ports.
|
|
66
|
+
* @param {Object} metadata - Metadata for the server.
|
|
67
|
+
* @returns {Promise<boolean>} A promise that resolves to true if the server is listening, false otherwise.
|
|
68
|
+
*/
|
|
69
|
+
listenPortController: async (server, port, metadata) =>
|
|
70
|
+
new Promise((resolve) => {
|
|
71
|
+
try {
|
|
72
|
+
if (port === ':') {
|
|
73
|
+
server.listen(port, actionInitLog);
|
|
74
|
+
return resolve(true);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const { host, path, client, runtime, meta } = metadata;
|
|
78
|
+
const error = [];
|
|
79
|
+
if (port === undefined) error.push(`port`);
|
|
80
|
+
if (host === undefined) error.push(`host`);
|
|
81
|
+
if (path === undefined) error.push(`path`);
|
|
82
|
+
if (client === undefined) error.push(`client`);
|
|
83
|
+
if (runtime === undefined) error.push(`runtime`);
|
|
84
|
+
if (meta === undefined) error.push(`meta`);
|
|
85
|
+
if (error.length > 0) throw new Error('Listen port controller requires values: ' + error.join(', '));
|
|
86
|
+
|
|
87
|
+
server.listen(port, () => {
|
|
88
|
+
if (!UnderpostDeploy.NETWORK[host]) UnderpostDeploy.NETWORK[host] = {};
|
|
89
|
+
UnderpostDeploy.NETWORK[host][path] = {
|
|
90
|
+
meta,
|
|
91
|
+
client,
|
|
92
|
+
runtime,
|
|
93
|
+
port,
|
|
94
|
+
publicHost:
|
|
95
|
+
port === 80
|
|
96
|
+
? `http://${host}${path}`
|
|
97
|
+
: port === 443
|
|
98
|
+
? `https://${host}${path}`
|
|
99
|
+
: `http://${host}:${port}${path}`,
|
|
100
|
+
local: `http://localhost:${port}${path}`,
|
|
101
|
+
apis: metadata.apis,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return resolve(true);
|
|
105
|
+
});
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logger.error(error, { metadata, port, stack: error.stack });
|
|
108
|
+
resolve(false);
|
|
109
|
+
}
|
|
110
|
+
}),
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Starts a deployment.
|
|
114
|
+
* @memberof UnderpostStartUp
|
|
115
|
+
* @param {string} deployId - The ID of the deployment.
|
|
116
|
+
* @param {string} env - The environment of the deployment.
|
|
117
|
+
* @param {Object} options - Options for the deployment.
|
|
118
|
+
* @param {boolean} options.build - Whether to build the deployment.
|
|
119
|
+
* @param {boolean} options.run - Whether to run the deployment.
|
|
120
|
+
*/
|
|
121
|
+
async callback(deployId = 'dd-default', env = 'development', options = { build: false, run: false }) {
|
|
122
|
+
if (options.build === true) await UnderpostStartUp.API.build(deployId, env);
|
|
123
|
+
if (options.run === true) await UnderpostStartUp.API.run(deployId, env);
|
|
124
|
+
},
|
|
125
|
+
async build(deployId = 'dd-default', env = 'development') {
|
|
126
|
+
const buildBasePath = `/home/dd`;
|
|
127
|
+
const repoName = `engine-${deployId.split('-')[1]}`;
|
|
128
|
+
shellExec(`cd ${buildBasePath} && underpost clone ${process.env.GITHUB_USERNAME}/${repoName}`);
|
|
129
|
+
shellExec(`cd ${buildBasePath} && sudo mv ./${repoName} ./engine`);
|
|
130
|
+
shellExec(`cd ${buildBasePath}/engine && underpost clone ${process.env.GITHUB_USERNAME}/${repoName}-private`);
|
|
131
|
+
shellExec(`cd ${buildBasePath}/engine && sudo mv ./${repoName}-private ./engine-private`);
|
|
132
|
+
shellCd(`${buildBasePath}/engine`);
|
|
133
|
+
shellExec(`npm install`);
|
|
134
|
+
shellExec(`node bin/deploy conf ${deployId} ${env}`);
|
|
135
|
+
if (fs.existsSync('./engine-private/itc-scripts')) {
|
|
136
|
+
const itcScripts = await fs.readdir('./engine-private/itc-scripts');
|
|
137
|
+
for (const itcScript of itcScripts)
|
|
138
|
+
if (itcScript.match(deployId)) shellExec(`node ./engine-private/itc-scripts/${itcScript}`);
|
|
139
|
+
}
|
|
140
|
+
shellExec(`node bin/deploy build-full-client ${deployId}`);
|
|
141
|
+
},
|
|
142
|
+
async run(deployId = 'dd-default', env = 'development') {
|
|
143
|
+
const runCmd = env === 'production' ? 'run prod-img' : 'run dev-img';
|
|
144
|
+
if (fs.existsSync(`./engine-private/replica`)) {
|
|
145
|
+
const replicas = await fs.readdir(`./engine-private/replica`);
|
|
146
|
+
for (const replica of replicas) {
|
|
147
|
+
if (!replica.match(deployId)) continue;
|
|
148
|
+
shellExec(`node bin/deploy conf ${replica} ${env}`);
|
|
149
|
+
shellExec(`npm ${runCmd} ${replica}`, { async: true });
|
|
150
|
+
await awaitDeployMonitor(true);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
shellExec(`node bin/deploy conf ${deployId} ${env}`);
|
|
154
|
+
shellExec(`npm ${runCmd} ${deployId}`, { async: true });
|
|
155
|
+
await awaitDeployMonitor(true);
|
|
156
|
+
UnderpostRootEnv.API.set('container-status', `${deployId}-${env}-running-deployment`);
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export default UnderpostStartUp;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provides utilities for managing, building, and serving SSL/TLS contexts,
|
|
3
|
+
* primarily using Certbot files and creating HTTPS servers.
|
|
4
|
+
* @module src/server/tls.js
|
|
5
|
+
* @namespace TransportLayerSecurity
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import https from 'https';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import dotenv from 'dotenv';
|
|
12
|
+
import { loggerFactory } from './logger.js';
|
|
13
|
+
|
|
14
|
+
dotenv.config();
|
|
15
|
+
const logger = loggerFactory(import.meta);
|
|
16
|
+
|
|
17
|
+
const DEFAULT_HOST = 'localhost';
|
|
18
|
+
const SSL_BASE = (host = DEFAULT_HOST) => path.resolve(`./engine-private/ssl/${host}`);
|
|
19
|
+
|
|
20
|
+
// Common filename candidates for certs/keys produced by various tools (mkcert, certbot, openssl scripts).
|
|
21
|
+
const CERT_CANDIDATES = [
|
|
22
|
+
'fullchain.pem',
|
|
23
|
+
'cert.pem',
|
|
24
|
+
'ca_bundle.crt',
|
|
25
|
+
'crt.crt',
|
|
26
|
+
`${DEFAULT_HOST}.pem`,
|
|
27
|
+
`${DEFAULT_HOST}.crt`,
|
|
28
|
+
`${DEFAULT_HOST}-fullchain.pem`,
|
|
29
|
+
];
|
|
30
|
+
const KEY_CANDIDATES = [
|
|
31
|
+
'privkey.pem',
|
|
32
|
+
'key.key',
|
|
33
|
+
'private.key',
|
|
34
|
+
'key.pem',
|
|
35
|
+
`${DEFAULT_HOST}-key.pem`,
|
|
36
|
+
`${DEFAULT_HOST}.key`,
|
|
37
|
+
];
|
|
38
|
+
const ROOT_CANDIDATES = ['rootCA.pem', 'ca.pem', 'ca.crt', 'root.pem'];
|
|
39
|
+
|
|
40
|
+
class TLS {
|
|
41
|
+
/**
|
|
42
|
+
* Look for existing SSL files under engine-private/ssl/<host> and return canonical paths.
|
|
43
|
+
* It attempts to be permissive: accepts cert-only, cert+ca, or fullchain.
|
|
44
|
+
* @param {string} host
|
|
45
|
+
* @returns {{key?:string, cert?:string, fullchain?:string, ca?:string, dir:string}}
|
|
46
|
+
* @memberof TransportLayerSecurity
|
|
47
|
+
*/
|
|
48
|
+
static locateSslFiles(host = DEFAULT_HOST) {
|
|
49
|
+
const dir = SSL_BASE(host);
|
|
50
|
+
const result = { dir };
|
|
51
|
+
|
|
52
|
+
if (!fs.existsSync(dir)) {
|
|
53
|
+
logger.warn('SSL dir does not exist', { dir });
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// find key
|
|
58
|
+
for (const name of KEY_CANDIDATES) {
|
|
59
|
+
const p = path.join(dir, name);
|
|
60
|
+
if (fs.existsSync(p) && fs.statSync(p).isFile()) {
|
|
61
|
+
result.key = p;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// find fullchain first
|
|
67
|
+
for (const name of CERT_CANDIDATES) {
|
|
68
|
+
const p = path.join(dir, name);
|
|
69
|
+
if (fs.existsSync(p) && fs.statSync(p).isFile()) {
|
|
70
|
+
// treat fullchain.pem / ca_bundle.crt as fullchain if name indicates so
|
|
71
|
+
if (
|
|
72
|
+
['fullchain.pem', 'ca_bundle.crt', `${host}-fullchain.pem`].includes(name) ||
|
|
73
|
+
name.endsWith('fullchain.pem')
|
|
74
|
+
) {
|
|
75
|
+
result.fullchain = p;
|
|
76
|
+
result.cert = p; // fullchain will be used as cert when building context
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
// otherwise candidate may be leaf cert
|
|
80
|
+
if (!result.cert) result.cert = p;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// find root/ca if not using fullchain
|
|
85
|
+
if (!result.fullchain) {
|
|
86
|
+
// check for direct ca bundle (cert + ca combined) names
|
|
87
|
+
const caCandidates = ROOT_CANDIDATES.concat(['ca_bundle.crt']);
|
|
88
|
+
for (const name of caCandidates) {
|
|
89
|
+
const p = path.join(dir, name);
|
|
90
|
+
if (fs.existsSync(p) && fs.statSync(p).isFile()) {
|
|
91
|
+
result.ca = p;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// if no dedicated ca found but cert looks like leaf and there is separate ca under other known names,
|
|
96
|
+
// try to detect cert + ca in a single file (not trivial) — we prefer explicit ca
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Validate that a secure context can be built for host (key + cert or fullchain present)
|
|
104
|
+
* @param {string} host
|
|
105
|
+
* @returns {boolean}
|
|
106
|
+
* @memberof TransportLayerSecurity
|
|
107
|
+
*/
|
|
108
|
+
static validateSecureContext(host = DEFAULT_HOST) {
|
|
109
|
+
const files = TLS.locateSslFiles(host);
|
|
110
|
+
return Boolean((files.key && files.cert) || (files.key && files.fullchain));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Build a Node.js https.createServer options object (key, cert, ca) for the given host.
|
|
115
|
+
* If a fullchain is available it will be used for cert and ca will be omitted (fullchain already includes chain).
|
|
116
|
+
* If separate cert + ca are found, they will be used accordingly.
|
|
117
|
+
* @param {string} host
|
|
118
|
+
* @returns {{key:string, cert:string, ca?:string}} options
|
|
119
|
+
* @memberof TransportLayerSecurity
|
|
120
|
+
*/
|
|
121
|
+
static buildSecureContext(host = DEFAULT_HOST) {
|
|
122
|
+
const files = TLS.locateSslFiles(host);
|
|
123
|
+
if (!files.key) throw new Error(`SSL key not found for host ${host} (looked in ${files.dir})`);
|
|
124
|
+
if (!files.cert) throw new Error(`SSL certificate not found for host ${host} (looked in ${files.dir})`);
|
|
125
|
+
|
|
126
|
+
const key = fs.readFileSync(files.key, 'utf8');
|
|
127
|
+
const cert = fs.readFileSync(files.cert, 'utf8');
|
|
128
|
+
|
|
129
|
+
// If we have a root CA file (explicit) and cert is leaf-only, include ca
|
|
130
|
+
if (files.ca && files.ca !== files.cert) {
|
|
131
|
+
const ca = fs.readFileSync(files.ca, 'utf8');
|
|
132
|
+
return { key, cert, ca };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// If cert is fullchain (already contains chain), just return key/cert
|
|
136
|
+
return { key, cert };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Convenience: ensure default host directory exists and copy any matching cert/key files into it using canonical names.
|
|
141
|
+
* This is useful if your generator produced nonstandard names and you want to normalize them.
|
|
142
|
+
* The function will copy existing discovered files to: key.key, crt.crt, ca_bundle.crt when possible.
|
|
143
|
+
* @param {string} host
|
|
144
|
+
* @returns {boolean} true if at least key+cert exist after operation
|
|
145
|
+
* @memberof TransportLayerSecurity
|
|
146
|
+
*/
|
|
147
|
+
static async buildLocalSSL(host = DEFAULT_HOST) {
|
|
148
|
+
const dir = SSL_BASE(host);
|
|
149
|
+
await fs.ensureDir(dir);
|
|
150
|
+
const files = TLS.locateSslFiles(host);
|
|
151
|
+
|
|
152
|
+
// If key+cert already exist under canonical names, done
|
|
153
|
+
const canonicalKey = path.join(dir, 'key.key');
|
|
154
|
+
const canonicalCert = path.join(dir, 'crt.crt');
|
|
155
|
+
const canonicalCa = path.join(dir, 'ca_bundle.crt');
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
if (files.key && files.key !== canonicalKey) await fs.copy(files.key, canonicalKey, { overwrite: true });
|
|
159
|
+
if (files.cert && files.cert !== canonicalCert) await fs.copy(files.cert, canonicalCert, { overwrite: true });
|
|
160
|
+
if (files.ca && files.ca !== canonicalCa) await fs.copy(files.ca, canonicalCa, { overwrite: true });
|
|
161
|
+
|
|
162
|
+
// If we had a fullchain but not a separate ca, write fullchain also to ca_bundle if missing
|
|
163
|
+
if (files.fullchain && !fs.existsSync(canonicalCa)) {
|
|
164
|
+
await fs.copy(files.fullchain, canonicalCa, { overwrite: false });
|
|
165
|
+
}
|
|
166
|
+
} catch (err) {
|
|
167
|
+
logger.warn('buildLocalSSL copy step failed', { err: err.message });
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return TLS.validateSecureContext(host);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Create an HTTPS server (first host) and/or attach SNI contexts for additional hosts.
|
|
175
|
+
* hosts param is an object whose keys are hostnames (e.g. { 'localhost': {...} }).
|
|
176
|
+
* Returns the created https.Server instance (or undefined if none created).
|
|
177
|
+
* @param {import('express').Application} app
|
|
178
|
+
* @param {Object<string, any>} hosts
|
|
179
|
+
* @returns {{ServerSSL?: https.Server}}
|
|
180
|
+
* @memberof TransportLayerSecurity
|
|
181
|
+
*/
|
|
182
|
+
static async createSslServer(app, hosts = { [DEFAULT_HOST]: {} }) {
|
|
183
|
+
let server;
|
|
184
|
+
for (const host of Object.keys(hosts)) {
|
|
185
|
+
// ensure canonical files exist (copies where possible)
|
|
186
|
+
await TLS.buildLocalSSL(host);
|
|
187
|
+
if (!TLS.validate_secure_context_check(host)) {
|
|
188
|
+
// backward compatibility: some callers expect validateSecureContext
|
|
189
|
+
if (!TLS.validateSecureContext(host)) {
|
|
190
|
+
logger.error('Invalid SSL context, skipping host', { host });
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// build secure context options
|
|
196
|
+
try {
|
|
197
|
+
const ctx = TLS.buildSecureContext(host);
|
|
198
|
+
if (!server) {
|
|
199
|
+
server = https.createServer(ctx, app);
|
|
200
|
+
logger.info('Created HTTPS server for host', { host });
|
|
201
|
+
} else {
|
|
202
|
+
server.addContext(host, ctx);
|
|
203
|
+
logger.info('Added SNI context for host', { host });
|
|
204
|
+
}
|
|
205
|
+
} catch (err) {
|
|
206
|
+
logger.error('Failed to build secure context', { host, message: err.message });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return { ServerSSL: server };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Middleware that redirects HTTP -> HTTPS in production for recognized hosts.
|
|
215
|
+
* Skips ACME challenge paths.
|
|
216
|
+
* @param {import('express').Request} req
|
|
217
|
+
* @param {import('express').Response} res
|
|
218
|
+
* @param {number} port
|
|
219
|
+
* @param {Object<string, any>} proxyRouter
|
|
220
|
+
* @returns {import('express').RequestHandler}
|
|
221
|
+
* @memberof TransportLayerSecurity
|
|
222
|
+
*/
|
|
223
|
+
static sslRedirectMiddleware(req, res, port = 80, proxyRouter = {}) {
|
|
224
|
+
const sslRedirectUrl = `https://${req.headers.host}${req.url}`;
|
|
225
|
+
if (
|
|
226
|
+
process.env.NODE_ENV === 'production' &&
|
|
227
|
+
port !== 443 &&
|
|
228
|
+
!req.secure &&
|
|
229
|
+
!req.url.startsWith('/.well-known/acme-challenge') &&
|
|
230
|
+
proxyRouter[443] &&
|
|
231
|
+
Object.keys(proxyRouter[443]).find((host) => {
|
|
232
|
+
const [hostSSL] = host.split('/');
|
|
233
|
+
return sslRedirectUrl.match(hostSSL) && TLS.validateSecureContext(hostSSL);
|
|
234
|
+
})
|
|
235
|
+
) {
|
|
236
|
+
return res.status(302).redirect(sslRedirectUrl);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// small helper for internal backward compatibility check name typo in older code
|
|
242
|
+
TLS.validate_secure_context_check = TLS.validateSecureContext;
|
|
243
|
+
|
|
244
|
+
// Backward compatibility exports
|
|
245
|
+
const buildSSL = TLS.buildLocalSSL;
|
|
246
|
+
const buildSecureContext = TLS.buildSecureContext;
|
|
247
|
+
const validateSecureContext = TLS.validateSecureContext;
|
|
248
|
+
const createSslServer = TLS.createSslServer;
|
|
249
|
+
const sslRedirectMiddleware = TLS.sslRedirectMiddleware;
|
|
250
|
+
|
|
251
|
+
export { TLS, buildSSL, buildSecureContext, validateSecureContext, createSslServer, sslRedirectMiddleware };
|