mindoodb 0.0.2 → 0.0.4
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/README-server.md +1001 -0
- package/README.md +89 -28
- package/dist/__mocks__/expo-standard-web-crypto.d.ts +10 -0
- package/dist/__mocks__/expo-standard-web-crypto.d.ts.map +1 -0
- package/dist/__mocks__/expo-standard-web-crypto.js +22 -0
- package/dist/__mocks__/expo-standard-web-crypto.js.map +1 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts +8 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts.map +1 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js +16 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js.map +1 -0
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts +1 -1
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts.map +1 -1
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js +2 -2
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +30 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +152 -5
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +17 -2
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +129 -0
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +22 -2
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +110 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/index.d.ts +1 -1
- package/dist/appendonlystores/network/index.d.ts.map +1 -1
- package/dist/appendonlystores/network/index.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +65 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +741 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.d.ts +25 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.d.ts.map +1 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.js +41 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.js.map +1 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts +21 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts.map +1 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.js +106 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.js.map +1 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +21 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/core/BaseMindooDB.d.ts +115 -13
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +1232 -269
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +69 -6
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +302 -109
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +13 -10
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +144 -27
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +27 -29
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +185 -112
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/MindooDBServerAdmin.d.ts +238 -0
- package/dist/core/MindooDBServerAdmin.d.ts.map +1 -0
- package/dist/core/MindooDBServerAdmin.js +345 -0
- package/dist/core/MindooDBServerAdmin.js.map +1 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +68 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js +659 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +45 -3
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +184 -23
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/MaterializationPlanner.d.ts +49 -0
- package/dist/core/appendonlystores/MaterializationPlanner.d.ts.map +1 -0
- package/dist/core/appendonlystores/MaterializationPlanner.js +325 -0
- package/dist/core/appendonlystores/MaterializationPlanner.js.map +1 -0
- package/dist/core/appendonlystores/bloom.d.ts +85 -0
- package/dist/core/appendonlystores/bloom.d.ts.map +1 -0
- package/dist/core/appendonlystores/bloom.js +228 -0
- package/dist/core/appendonlystores/bloom.js.map +1 -0
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +37 -2
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +12 -0
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/types.d.ts +206 -0
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/automerge-adapter.d.ts +15 -0
- package/dist/core/automerge-adapter.d.ts.map +1 -0
- package/dist/core/automerge-adapter.js +73 -0
- package/dist/core/automerge-adapter.js.map +1 -0
- package/dist/core/cache/CacheManager.d.ts +75 -0
- package/dist/core/cache/CacheManager.d.ts.map +1 -0
- package/dist/core/cache/CacheManager.js +101 -0
- package/dist/core/cache/CacheManager.js.map +1 -0
- package/dist/core/cache/EncryptedLocalCacheStore.d.ts +41 -0
- package/dist/core/cache/EncryptedLocalCacheStore.d.ts.map +1 -0
- package/dist/core/cache/EncryptedLocalCacheStore.js +120 -0
- package/dist/core/cache/EncryptedLocalCacheStore.js.map +1 -0
- package/dist/core/cache/LocalCacheStore.d.ts +50 -0
- package/dist/core/cache/LocalCacheStore.d.ts.map +1 -0
- package/dist/core/cache/LocalCacheStore.js +39 -0
- package/dist/core/cache/LocalCacheStore.js.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts +12 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.js +55 -0
- package/dist/core/crypto/pbkdf2Iterations.js.map +1 -0
- package/dist/core/crypto/privateKeyEncryption.d.ts +5 -0
- package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -0
- package/dist/core/crypto/privateKeyEncryption.js +87 -0
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -0
- package/dist/core/index.d.ts +18 -6
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +42 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +4 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +39 -11
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts +1 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js +3 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +43 -0
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.js +173 -0
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +7 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +28 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
- package/dist/core/keys/KeyBag.d.ts +56 -12
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +156 -70
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/keys/KeyContext.d.ts +4 -0
- package/dist/core/keys/KeyContext.d.ts.map +1 -0
- package/dist/core/keys/KeyContext.js +17 -0
- package/dist/core/keys/KeyContext.js.map +1 -0
- package/dist/core/types.d.ts +512 -60
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +9 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts +58 -0
- package/dist/core/uri/MindooURI.d.ts.map +1 -0
- package/dist/core/uri/MindooURI.js +169 -0
- package/dist/core/uri/MindooURI.js.map +1 -0
- package/dist/core/userid/index.d.ts +0 -10
- package/dist/core/userid/index.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +37 -3
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +544 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +1358 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -0
- package/dist/node/attachments/writeAttachmentToFile.d.ts +15 -0
- package/dist/node/attachments/writeAttachmentToFile.d.ts.map +1 -0
- package/dist/node/attachments/writeAttachmentToFile.js +73 -0
- package/dist/node/attachments/writeAttachmentToFile.js.map +1 -0
- package/dist/node/cache/FileSystemLocalCacheStore.d.ts +17 -0
- package/dist/node/cache/FileSystemLocalCacheStore.d.ts.map +1 -0
- package/dist/node/cache/FileSystemLocalCacheStore.js +128 -0
- package/dist/node/cache/FileSystemLocalCacheStore.js.map +1 -0
- package/dist/node/cli/change-identity-password.d.ts +7 -0
- package/dist/node/cli/change-identity-password.d.ts.map +1 -0
- package/dist/node/cli/change-identity-password.js +67 -0
- package/dist/node/cli/change-identity-password.js.map +1 -0
- package/dist/node/cli/cli-utils.d.ts +16 -0
- package/dist/node/cli/cli-utils.d.ts.map +1 -0
- package/dist/node/cli/cli-utils.js +113 -0
- package/dist/node/cli/cli-utils.js.map +1 -0
- package/dist/node/cli/identity-export-public.d.ts +4 -0
- package/dist/node/cli/identity-export-public.d.ts.map +1 -0
- package/dist/node/cli/identity-export-public.js +55 -0
- package/dist/node/cli/identity-export-public.js.map +1 -0
- package/dist/node/cli/identity-info.d.ts +4 -0
- package/dist/node/cli/identity-info.d.ts.map +1 -0
- package/dist/node/cli/identity-info.js +57 -0
- package/dist/node/cli/identity-info.js.map +1 -0
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +8 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/server/CapabilityMatcher.d.ts +45 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -0
- package/dist/node/server/CapabilityMatcher.js +117 -0
- package/dist/node/server/CapabilityMatcher.js.map +1 -0
- package/dist/node/server/MindooDBServer.d.ts +87 -0
- package/dist/node/server/MindooDBServer.d.ts.map +1 -0
- package/dist/node/server/MindooDBServer.js +1040 -0
- package/dist/node/server/MindooDBServer.js.map +1 -0
- package/dist/node/server/ServerSync.d.ts +41 -0
- package/dist/node/server/ServerSync.d.ts.map +1 -0
- package/dist/node/server/ServerSync.js +187 -0
- package/dist/node/server/ServerSync.js.map +1 -0
- package/dist/node/server/StoreFactory.d.ts +45 -0
- package/dist/node/server/StoreFactory.d.ts.map +1 -0
- package/dist/node/server/StoreFactory.js +89 -0
- package/dist/node/server/StoreFactory.js.map +1 -0
- package/dist/node/server/SystemAdminAuth.d.ts +65 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -0
- package/dist/node/server/SystemAdminAuth.js +200 -0
- package/dist/node/server/SystemAdminAuth.js.map +1 -0
- package/dist/node/server/SystemIpAllowlist.d.ts +21 -0
- package/dist/node/server/SystemIpAllowlist.d.ts.map +1 -0
- package/dist/node/server/SystemIpAllowlist.js +210 -0
- package/dist/node/server/SystemIpAllowlist.js.map +1 -0
- package/dist/node/server/TenantManager.d.ts +85 -0
- package/dist/node/server/TenantManager.d.ts.map +1 -0
- package/dist/node/server/TenantManager.js +493 -0
- package/dist/node/server/TenantManager.js.map +1 -0
- package/dist/node/server/add-to-network.d.ts +20 -0
- package/dist/node/server/add-to-network.d.ts.map +1 -0
- package/dist/node/server/add-to-network.js +275 -0
- package/dist/node/server/add-to-network.js.map +1 -0
- package/dist/node/server/config.d.ts +51 -0
- package/dist/node/server/config.d.ts.map +1 -0
- package/dist/node/server/config.js +218 -0
- package/dist/node/server/config.js.map +1 -0
- package/dist/node/server/resolveServerPassword.d.ts +7 -0
- package/dist/node/server/resolveServerPassword.d.ts.map +1 -0
- package/dist/node/server/resolveServerPassword.js +25 -0
- package/dist/node/server/resolveServerPassword.js.map +1 -0
- package/dist/node/server/server.d.ts +22 -0
- package/dist/node/server/server.d.ts.map +1 -0
- package/dist/node/server/server.js +225 -0
- package/dist/node/server/server.js.map +1 -0
- package/dist/node/server/serverinit.d.ts +21 -0
- package/dist/node/server/serverinit.d.ts.map +1 -0
- package/dist/node/server/serverinit.js +317 -0
- package/dist/node/server/serverinit.js.map +1 -0
- package/dist/node/server/types.d.ts +162 -0
- package/dist/node/server/types.d.ts.map +1 -0
- package/dist/node/server/types.js +24 -0
- package/dist/node/server/types.js.map +1 -0
- package/dist/node/server/validation.d.ts +47 -0
- package/dist/node/server/validation.d.ts.map +1 -0
- package/dist/node/server/validation.js +114 -0
- package/dist/node/server/validation.js.map +1 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts +48 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts.map +1 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.js +113 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.js.map +1 -0
- package/dist/reactnative/crypto/AESAdapter.d.ts +18 -0
- package/dist/reactnative/crypto/AESAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/AESAdapter.js +112 -0
- package/dist/reactnative/crypto/AESAdapter.js.map +1 -0
- package/dist/reactnative/crypto/Ed25519Adapter.d.ts +34 -0
- package/dist/reactnative/crypto/Ed25519Adapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/Ed25519Adapter.js +386 -0
- package/dist/reactnative/crypto/Ed25519Adapter.js.map +1 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.d.ts +23 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.js +51 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.js.map +1 -0
- package/dist/reactnative/crypto/HMACAdapter.d.ts +13 -0
- package/dist/reactnative/crypto/HMACAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/HMACAdapter.js +50 -0
- package/dist/reactnative/crypto/HMACAdapter.js.map +1 -0
- package/dist/reactnative/crypto/KeyFormatConverter.d.ts +21 -0
- package/dist/reactnative/crypto/KeyFormatConverter.d.ts.map +1 -0
- package/dist/reactnative/crypto/KeyFormatConverter.js +72 -0
- package/dist/reactnative/crypto/KeyFormatConverter.js.map +1 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.d.ts +19 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.js +67 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.js.map +1 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.d.ts +37 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.js +72 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.js.map +1 -0
- package/dist/reactnative/crypto/RSAAdapter.d.ts +38 -0
- package/dist/reactnative/crypto/RSAAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/RSAAdapter.js +184 -0
- package/dist/reactnative/crypto/RSAAdapter.js.map +1 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.d.ts +33 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.js +61 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.js.map +1 -0
- package/dist/reactnative/crypto/SHA256Adapter.d.ts +9 -0
- package/dist/reactnative/crypto/SHA256Adapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/SHA256Adapter.js +29 -0
- package/dist/reactnative/crypto/SHA256Adapter.js.map +1 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.d.ts +63 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.d.ts.map +1 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.js +350 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.js.map +1 -0
- package/dist/reactnative/index.d.ts +9 -0
- package/dist/reactnative/index.d.ts.map +1 -0
- package/dist/reactnative/index.js +41 -0
- package/dist/reactnative/index.js.map +1 -0
- package/package.json +63 -7
- package/patches/PATCHES.md +111 -0
- package/patches/react-native+0.76.9.patch +34 -0
- package/patches/react-native-quick-crypto+1.0.7.patch +42 -0
- package/scripts/cli.js +21 -0
- package/scripts/setup-react-native.js +228 -0
- package/templates/reactnative/App.js +252 -0
- package/templates/reactnative/app.json +29 -0
- package/templates/reactnative/babel.config.js +6 -0
- package/templates/reactnative/index.js +26 -0
- package/templates/reactnative/metro.config.snippet.js +39 -0
- package/templates/reactnative/mindoodb-polyfills.js +116 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* System admin authentication service.
|
|
4
|
+
*
|
|
5
|
+
* Reuses the existing `AuthenticationService` by providing a
|
|
6
|
+
* `SystemAdminDirectory` adapter that derives user lookup data from
|
|
7
|
+
* the capabilities section of `config.json` rather than a tenant
|
|
8
|
+
* directory. Challenges require both username and publicsignkey so
|
|
9
|
+
* the issued JWT can carry both fields for capability matching.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SystemAdminAuthService = void 0;
|
|
13
|
+
const uuid_1 = require("uuid");
|
|
14
|
+
const config_1 = require("./config");
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// SystemAdminAuthService
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
class SystemAdminAuthService {
|
|
19
|
+
constructor(cryptoAdapter, config, options) {
|
|
20
|
+
this.challenges = new Map();
|
|
21
|
+
this.cryptoAdapter = cryptoAdapter;
|
|
22
|
+
this.principals = (0, config_1.extractAllPrincipals)(config);
|
|
23
|
+
this.allowTenantCreationWildcardPrincipal =
|
|
24
|
+
(0, config_1.hasTenantCreationWildcardPrincipal)(config);
|
|
25
|
+
this.jwtSecret =
|
|
26
|
+
options?.jwtSecret ?? cryptoAdapter.getRandomValues(new Uint8Array(32));
|
|
27
|
+
this.challengeExpirationMs = options?.challengeExpirationMs ?? 5 * 60 * 1000;
|
|
28
|
+
this.tokenExpirationMs = options?.tokenExpirationMs ?? 60 * 60 * 1000;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Hot-swap the principal list from a new config.
|
|
32
|
+
* In-flight challenges and existing JWTs remain valid (same HMAC secret);
|
|
33
|
+
* removed principals will fail the CapabilityMatcher check on their next request.
|
|
34
|
+
*/
|
|
35
|
+
reloadPrincipals(config) {
|
|
36
|
+
this.principals = (0, config_1.extractAllPrincipals)(config);
|
|
37
|
+
this.allowTenantCreationWildcardPrincipal =
|
|
38
|
+
(0, config_1.hasTenantCreationWildcardPrincipal)(config);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate a challenge for a system admin.
|
|
42
|
+
* Both `username` and `publicsignkey` are required so we can bind
|
|
43
|
+
* the issued JWT to a specific keypair.
|
|
44
|
+
*/
|
|
45
|
+
async generateChallenge(username, publicsignkey) {
|
|
46
|
+
const normalizedUsername = username.toLowerCase();
|
|
47
|
+
const found = this.principals.some((p) => p.username.toLowerCase() === normalizedUsername &&
|
|
48
|
+
p.publicsignkey === publicsignkey);
|
|
49
|
+
if (!found && !this.allowTenantCreationWildcardPrincipal) {
|
|
50
|
+
throw new Error("Unknown system admin principal");
|
|
51
|
+
}
|
|
52
|
+
const challenge = (0, uuid_1.v7)();
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
this.challenges.set(challenge, {
|
|
55
|
+
challenge,
|
|
56
|
+
username,
|
|
57
|
+
publicsignkey,
|
|
58
|
+
createdAt: now,
|
|
59
|
+
expiresAt: now + this.challengeExpirationMs,
|
|
60
|
+
used: false,
|
|
61
|
+
});
|
|
62
|
+
this.cleanupExpiredChallenges();
|
|
63
|
+
return challenge;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Verify a signed challenge and return a JWT containing both
|
|
67
|
+
* `sub` (username) and `publicsignkey`.
|
|
68
|
+
*/
|
|
69
|
+
async authenticate(challenge, signature) {
|
|
70
|
+
const stored = this.challenges.get(challenge);
|
|
71
|
+
if (!stored) {
|
|
72
|
+
return { success: false, error: "Challenge not found or expired" };
|
|
73
|
+
}
|
|
74
|
+
if (Date.now() > stored.expiresAt) {
|
|
75
|
+
this.challenges.delete(challenge);
|
|
76
|
+
return { success: false, error: "Challenge expired" };
|
|
77
|
+
}
|
|
78
|
+
if (stored.used) {
|
|
79
|
+
return { success: false, error: "Challenge already used" };
|
|
80
|
+
}
|
|
81
|
+
stored.used = true;
|
|
82
|
+
const isValid = await this.verifySignature(challenge, signature, stored.publicsignkey);
|
|
83
|
+
if (!isValid) {
|
|
84
|
+
return { success: false, error: "Invalid signature" };
|
|
85
|
+
}
|
|
86
|
+
const token = await this.generateToken(stored.username, stored.publicsignkey);
|
|
87
|
+
return { success: true, token };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Validate and decode a system admin JWT.
|
|
91
|
+
*/
|
|
92
|
+
async validateToken(token) {
|
|
93
|
+
const parts = token.split(".");
|
|
94
|
+
if (parts.length !== 3)
|
|
95
|
+
return null;
|
|
96
|
+
const [headerB64, payloadB64, signatureB64] = parts;
|
|
97
|
+
try {
|
|
98
|
+
const subtle = this.cryptoAdapter.getSubtle();
|
|
99
|
+
const signingKey = await subtle.importKey("raw", this.jwtSecret.buffer, { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
|
|
100
|
+
const dataToVerify = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
|
|
101
|
+
const sig = this.base64UrlToUint8Array(signatureB64);
|
|
102
|
+
const isValid = await subtle.verify("HMAC", signingKey, sig.buffer.slice(sig.byteOffset, sig.byteOffset + sig.byteLength), dataToVerify.buffer);
|
|
103
|
+
if (!isValid)
|
|
104
|
+
return null;
|
|
105
|
+
const payload = JSON.parse(this.base64UrlDecode(payloadB64));
|
|
106
|
+
const now = Math.floor(Date.now() / 1000);
|
|
107
|
+
if (payload.exp < now)
|
|
108
|
+
return null;
|
|
109
|
+
return payload;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// -----------------------------------------------------------------------
|
|
116
|
+
// Private helpers
|
|
117
|
+
// -----------------------------------------------------------------------
|
|
118
|
+
async verifySignature(message, signature, publicKeyPem) {
|
|
119
|
+
const subtle = this.cryptoAdapter.getSubtle();
|
|
120
|
+
try {
|
|
121
|
+
const pemContents = publicKeyPem
|
|
122
|
+
.replace(/-----BEGIN PUBLIC KEY-----/g, "")
|
|
123
|
+
.replace(/-----END PUBLIC KEY-----/g, "")
|
|
124
|
+
.replace(/\s/g, "");
|
|
125
|
+
const keyData = this.base64ToUint8Array(pemContents);
|
|
126
|
+
const publicKey = await subtle.importKey("spki", keyData.buffer, { name: "Ed25519" }, false, ["verify"]);
|
|
127
|
+
const messageBytes = new TextEncoder().encode(message);
|
|
128
|
+
return await subtle.verify({ name: "Ed25519" }, publicKey, signature.buffer.slice(signature.byteOffset, signature.byteOffset + signature.byteLength), messageBytes.buffer);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async generateToken(username, publicsignkey) {
|
|
135
|
+
const subtle = this.cryptoAdapter.getSubtle();
|
|
136
|
+
const now = Math.floor(Date.now() / 1000);
|
|
137
|
+
const payload = {
|
|
138
|
+
sub: username,
|
|
139
|
+
publicsignkey,
|
|
140
|
+
iat: now,
|
|
141
|
+
exp: now + Math.floor(this.tokenExpirationMs / 1000),
|
|
142
|
+
};
|
|
143
|
+
const header = { alg: "HS256", typ: "JWT" };
|
|
144
|
+
const headerB64 = this.base64UrlEncode(JSON.stringify(header));
|
|
145
|
+
const payloadB64 = this.base64UrlEncode(JSON.stringify(payload));
|
|
146
|
+
const signingKey = await subtle.importKey("raw", this.jwtSecret.buffer, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
147
|
+
const dataToSign = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
|
|
148
|
+
const signature = await subtle.sign("HMAC", signingKey, dataToSign.buffer);
|
|
149
|
+
const signatureB64 = this.uint8ArrayToBase64Url(new Uint8Array(signature));
|
|
150
|
+
return `${headerB64}.${payloadB64}.${signatureB64}`;
|
|
151
|
+
}
|
|
152
|
+
cleanupExpiredChallenges() {
|
|
153
|
+
const now = Date.now();
|
|
154
|
+
for (const [key, ch] of this.challenges) {
|
|
155
|
+
if (ch.expiresAt < now) {
|
|
156
|
+
this.challenges.delete(key);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Base64 utilities
|
|
161
|
+
base64UrlEncode(str) {
|
|
162
|
+
const base64 = btoa(str);
|
|
163
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
164
|
+
}
|
|
165
|
+
base64UrlDecode(str) {
|
|
166
|
+
let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
167
|
+
while (base64.length % 4)
|
|
168
|
+
base64 += "=";
|
|
169
|
+
return atob(base64);
|
|
170
|
+
}
|
|
171
|
+
uint8ArrayToBase64Url(bytes) {
|
|
172
|
+
let binary = "";
|
|
173
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
174
|
+
binary += String.fromCharCode(bytes[i]);
|
|
175
|
+
}
|
|
176
|
+
const base64 = btoa(binary);
|
|
177
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
178
|
+
}
|
|
179
|
+
base64UrlToUint8Array(str) {
|
|
180
|
+
let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
181
|
+
while (base64.length % 4)
|
|
182
|
+
base64 += "=";
|
|
183
|
+
const binary = atob(base64);
|
|
184
|
+
const bytes = new Uint8Array(binary.length);
|
|
185
|
+
for (let i = 0; i < binary.length; i++) {
|
|
186
|
+
bytes[i] = binary.charCodeAt(i);
|
|
187
|
+
}
|
|
188
|
+
return bytes;
|
|
189
|
+
}
|
|
190
|
+
base64ToUint8Array(base64) {
|
|
191
|
+
const binary = atob(base64);
|
|
192
|
+
const bytes = new Uint8Array(binary.length);
|
|
193
|
+
for (let i = 0; i < binary.length; i++) {
|
|
194
|
+
bytes[i] = binary.charCodeAt(i);
|
|
195
|
+
}
|
|
196
|
+
return bytes;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.SystemAdminAuthService = SystemAdminAuthService;
|
|
200
|
+
//# sourceMappingURL=SystemAdminAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemAdminAuth.js","sourceRoot":"","sources":["../../../src/node/server/SystemAdminAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional IP allowlist for /system/* routes (MINDOODB_ADMIN_ALLOWED_IPS).
|
|
3
|
+
*
|
|
4
|
+
* Comma-separated IPv4/IPv6 addresses or IPv4/IPv6 CIDRs. Use `*` to allow all.
|
|
5
|
+
* IPv4-mapped IPv6 (::ffff:x.x.x.x) is normalized to the IPv4 form for matching.
|
|
6
|
+
*/
|
|
7
|
+
import type { NextFunction, Request, Response } from "express";
|
|
8
|
+
export declare function readSystemIpAllowListFromEnv(): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* When unset or `*`, no IP restriction (JWT + capabilities still apply).
|
|
11
|
+
*/
|
|
12
|
+
export declare function isSystemIpAllowListDisabled(raw: string | undefined): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Returns true if clientIp is allowed by the allowlist string (non-empty, not `*`).
|
|
15
|
+
*/
|
|
16
|
+
export declare function isClientIpAllowedForSystemList(clientIpRaw: string, allowListRaw: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Express middleware: 403 if client IP not in allowlist (when env is set).
|
|
19
|
+
*/
|
|
20
|
+
export declare function systemIpAllowlistMiddleware(req: Request, res: Response, next: NextFunction): void;
|
|
21
|
+
//# sourceMappingURL=SystemIpAllowlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemIpAllowlist.d.ts","sourceRoot":"","sources":["../../../src/node/server/SystemIpAllowlist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK/D,wBAAgB,4BAA4B,IAAI,MAAM,GAAG,SAAS,CAMjE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAK5E;AAwJD;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAuBT;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CAwBN"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Optional IP allowlist for /system/* routes (MINDOODB_ADMIN_ALLOWED_IPS).
|
|
4
|
+
*
|
|
5
|
+
* Comma-separated IPv4/IPv6 addresses or IPv4/IPv6 CIDRs. Use `*` to allow all.
|
|
6
|
+
* IPv4-mapped IPv6 (::ffff:x.x.x.x) is normalized to the IPv4 form for matching.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.readSystemIpAllowListFromEnv = readSystemIpAllowListFromEnv;
|
|
10
|
+
exports.isSystemIpAllowListDisabled = isSystemIpAllowListDisabled;
|
|
11
|
+
exports.isClientIpAllowedForSystemList = isClientIpAllowedForSystemList;
|
|
12
|
+
exports.systemIpAllowlistMiddleware = systemIpAllowlistMiddleware;
|
|
13
|
+
const net_1 = require("net");
|
|
14
|
+
const ENV_KEY = "MINDOODB_ADMIN_ALLOWED_IPS";
|
|
15
|
+
function readSystemIpAllowListFromEnv() {
|
|
16
|
+
const raw = process.env[ENV_KEY];
|
|
17
|
+
if (raw === undefined || raw.trim() === "") {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
return raw.trim();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* When unset or `*`, no IP restriction (JWT + capabilities still apply).
|
|
24
|
+
*/
|
|
25
|
+
function isSystemIpAllowListDisabled(raw) {
|
|
26
|
+
if (raw === undefined || raw === "*") {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
function normalizeClientIp(ip) {
|
|
32
|
+
if (ip.startsWith("::ffff:")) {
|
|
33
|
+
const v4 = ip.slice(7);
|
|
34
|
+
if ((0, net_1.isIPv4)(v4)) {
|
|
35
|
+
return v4;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return ip;
|
|
39
|
+
}
|
|
40
|
+
function ipv4ToInt(ip) {
|
|
41
|
+
const parts = ip.split(".").map((p) => parseInt(p, 10));
|
|
42
|
+
if (parts.length !== 4 || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255)) {
|
|
43
|
+
return -1;
|
|
44
|
+
}
|
|
45
|
+
return (((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0);
|
|
46
|
+
}
|
|
47
|
+
function ipv4MatchesCidr(ip, cidr) {
|
|
48
|
+
const slash = cidr.indexOf("/");
|
|
49
|
+
if (slash === -1) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const base = cidr.slice(0, slash);
|
|
53
|
+
const bits = parseInt(cidr.slice(slash + 1), 10);
|
|
54
|
+
if (!(0, net_1.isIPv4)(base) || Number.isNaN(bits) || bits < 0 || bits > 32) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const ipNum = ipv4ToInt(ip);
|
|
58
|
+
const baseNum = ipv4ToInt(base);
|
|
59
|
+
if (ipNum < 0 || baseNum < 0) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (bits === 0) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
const mask = bits === 32 ? 0xffffffff : ((0xffffffff << (32 - bits)) >>> 0);
|
|
66
|
+
return (ipNum & mask) === (baseNum & mask);
|
|
67
|
+
}
|
|
68
|
+
function parseIpv4Parts(ip) {
|
|
69
|
+
if (!(0, net_1.isIPv4)(ip)) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const parts = ip.split(".").map((p) => parseInt(p, 10));
|
|
73
|
+
if (parts.length !== 4 || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255)) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return parts;
|
|
77
|
+
}
|
|
78
|
+
function parseIpv6SegmentList(part) {
|
|
79
|
+
if (part === "") {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const segments = [];
|
|
83
|
+
for (const token of part.split(":")) {
|
|
84
|
+
if (token.length === 0) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
if (token.includes(".")) {
|
|
88
|
+
const ipv4Parts = parseIpv4Parts(token);
|
|
89
|
+
if (!ipv4Parts) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
segments.push((ipv4Parts[0] << 8) | ipv4Parts[1]);
|
|
93
|
+
segments.push((ipv4Parts[2] << 8) | ipv4Parts[3]);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!/^[0-9a-fA-F]{1,4}$/.test(token)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
segments.push(parseInt(token, 16));
|
|
100
|
+
}
|
|
101
|
+
return segments;
|
|
102
|
+
}
|
|
103
|
+
function ipv6ToBigInt(ip) {
|
|
104
|
+
if (!(0, net_1.isIPv6)(ip)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const doubleColonCount = ip.split("::").length - 1;
|
|
108
|
+
if (doubleColonCount > 1) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
let parts;
|
|
112
|
+
if (ip.includes("::")) {
|
|
113
|
+
const [leftRaw, rightRaw] = ip.split("::");
|
|
114
|
+
const left = parseIpv6SegmentList(leftRaw);
|
|
115
|
+
const right = parseIpv6SegmentList(rightRaw);
|
|
116
|
+
if (!left || !right) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const missing = 8 - (left.length + right.length);
|
|
120
|
+
if (missing < 1) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
parts = [...left, ...new Array(missing).fill(0), ...right];
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const parsed = parseIpv6SegmentList(ip);
|
|
127
|
+
if (!parsed || parsed.length !== 8) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
parts = parsed;
|
|
131
|
+
}
|
|
132
|
+
if (parts.length !== 8 || parts.some((n) => n < 0 || n > 0xffff)) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
let result = 0n;
|
|
136
|
+
for (const part of parts) {
|
|
137
|
+
result = (result << 16n) | BigInt(part);
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
function ipv6MatchesCidr(ip, cidr) {
|
|
142
|
+
const slash = cidr.indexOf("/");
|
|
143
|
+
if (slash === -1) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const base = cidr.slice(0, slash);
|
|
147
|
+
const bits = parseInt(cidr.slice(slash + 1), 10);
|
|
148
|
+
if (!(0, net_1.isIPv6)(base) || Number.isNaN(bits) || bits < 0 || bits > 128) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
const ipNum = ipv6ToBigInt(ip);
|
|
152
|
+
const baseNum = ipv6ToBigInt(base);
|
|
153
|
+
if (ipNum === null || baseNum === null) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (bits === 0) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const shift = 128n - BigInt(bits);
|
|
160
|
+
return (ipNum >> shift) === (baseNum >> shift);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Returns true if clientIp is allowed by the allowlist string (non-empty, not `*`).
|
|
164
|
+
*/
|
|
165
|
+
function isClientIpAllowedForSystemList(clientIpRaw, allowListRaw) {
|
|
166
|
+
const clientIp = normalizeClientIp(clientIpRaw.trim());
|
|
167
|
+
const entries = allowListRaw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (entry.includes("/")) {
|
|
170
|
+
if ((0, net_1.isIPv4)(clientIp) && ipv4MatchesCidr(clientIp, entry)) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
if ((0, net_1.isIPv6)(clientIp) && ipv6MatchesCidr(clientIp, entry)) {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (clientIp === entry) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
if ((0, net_1.isIPv6)(clientIp) && (0, net_1.isIPv6)(entry) && ipv6ToBigInt(clientIp) === ipv6ToBigInt(entry)) {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Express middleware: 403 if client IP not in allowlist (when env is set).
|
|
189
|
+
*/
|
|
190
|
+
function systemIpAllowlistMiddleware(req, res, next) {
|
|
191
|
+
const raw = readSystemIpAllowListFromEnv();
|
|
192
|
+
if (isSystemIpAllowListDisabled(raw)) {
|
|
193
|
+
next();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const ip = (typeof req.ip === "string" && req.ip.length > 0
|
|
197
|
+
? req.ip
|
|
198
|
+
: req.socket?.remoteAddress) || "";
|
|
199
|
+
const normalized = normalizeClientIp(ip);
|
|
200
|
+
if (!normalized || (!(0, net_1.isIPv4)(normalized) && !(0, net_1.isIPv6)(normalized))) {
|
|
201
|
+
res.status(403).json({ error: "Forbidden: system admin IP not allowed" });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!isClientIpAllowedForSystemList(normalized, raw)) {
|
|
205
|
+
res.status(403).json({ error: "Forbidden: system admin IP not allowed" });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
next();
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=SystemIpAllowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemIpAllowlist.js","sourceRoot":"","sources":["../../../src/node/server/SystemIpAllowlist.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAOH,oEAMC;AAKD,kEAKC;AA2JD,wEA0BC;AAKD,kEA4BC;AA1OD,6BAAqC;AAErC,MAAM,OAAO,GAAG,4BAA4B,CAAC;AAE7C,SAAgB,4BAA4B;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,2BAA2B,CAAC,GAAuB;IACjE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAU;IACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAA,YAAM,EAAC,EAAE,CAAC,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjF,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAW,CAAC;AAC9F,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,IAAA,YAAM,EAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GACR,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,IAAI,CAAC,IAAA,YAAM,EAAC,EAAE,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,IAAI,CAAC,IAAA,YAAM,EAAC,EAAE,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACnD,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAe,CAAC;IAEpB,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,CAAS,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,IAAA,YAAM,EAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,8BAA8B,CAC5C,WAAmB,EACnB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,IAAA,YAAM,EAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,IAAA,YAAM,EAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAA,YAAM,EAAC,QAAQ,CAAC,IAAI,IAAA,YAAM,EAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,2BAA2B,CACzC,GAAY,EACZ,GAAa,EACb,IAAkB;IAElB,MAAM,GAAG,GAAG,4BAA4B,EAAE,CAAC;IAC3C,IAAI,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GACN,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;QAC9C,CAAC,CAAC,GAAG,CAAC,EAAE;QACR,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAEzC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAA,YAAM,EAAC,UAAU,CAAC,IAAI,CAAC,IAAA,YAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,IAAI,CAAC,8BAA8B,CAAC,UAAU,EAAE,GAAI,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TenantManager handles loading, caching, and registration of tenants.
|
|
3
|
+
*
|
|
4
|
+
* Uses a global server identity (one per server, not per tenant) for
|
|
5
|
+
* authenticating with remote servers and opening tenant directories.
|
|
6
|
+
*
|
|
7
|
+
* When a tenant has a $publicinfos key (sent during publishToServer), the
|
|
8
|
+
* manager creates a real BaseMindooTenant for directory reading. User
|
|
9
|
+
* authentication is then validated against the admin-signed directory DB
|
|
10
|
+
* rather than a static JSON config.
|
|
11
|
+
*
|
|
12
|
+
* When no $publicinfos key is available, a SimpleMindooDirectory backed
|
|
13
|
+
* by config.json users[] is used as a fallback (useful for tests).
|
|
14
|
+
*
|
|
15
|
+
* A CompositeMindooDirectory wraps whichever directory source is used and
|
|
16
|
+
* also checks the global trusted-servers list, enabling server-to-server
|
|
17
|
+
* auth without servers being in each tenant's user directory.
|
|
18
|
+
*/
|
|
19
|
+
import { NodeCryptoAdapter } from "../crypto/NodeCryptoAdapter";
|
|
20
|
+
import { AuthenticationService } from "../../core/appendonlystores/network/AuthenticationService";
|
|
21
|
+
import { ServerNetworkContentAddressedStore } from "../../appendonlystores/network/ServerNetworkContentAddressedStore";
|
|
22
|
+
import type { MindooTenant, MindooTenantDirectory, ContentAddressedStore } from "../../core/types";
|
|
23
|
+
import type { PrivateUserId } from "../../core/userid";
|
|
24
|
+
import { StoreFactory } from "./StoreFactory";
|
|
25
|
+
import type { TenantConfig, TenantContext, RegisterTenantRequest, TrustedServer, NamedRemoteServerConfig } from "./types";
|
|
26
|
+
interface LoadedTenant {
|
|
27
|
+
context: TenantContext;
|
|
28
|
+
storeFactory: StoreFactory;
|
|
29
|
+
authService: AuthenticationService;
|
|
30
|
+
directory: MindooTenantDirectory;
|
|
31
|
+
mindooTenant?: MindooTenant;
|
|
32
|
+
serverStores: Map<string, ServerNetworkContentAddressedStore>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* TenantManager is responsible for:
|
|
36
|
+
* - Loading the global server identity and trusted servers
|
|
37
|
+
* - Loading tenant configurations from disk
|
|
38
|
+
* - Caching loaded tenants
|
|
39
|
+
* - Registering new tenants
|
|
40
|
+
* - Managing tenant stores and authentication services
|
|
41
|
+
* - Creating a real MindooDB tenant for directory reading (when keys available)
|
|
42
|
+
* - Runtime management of trusted servers
|
|
43
|
+
*/
|
|
44
|
+
export declare class TenantManager {
|
|
45
|
+
private dataDir;
|
|
46
|
+
private serverPassword;
|
|
47
|
+
private cryptoAdapter;
|
|
48
|
+
private loadedTenants;
|
|
49
|
+
private serverIdentity;
|
|
50
|
+
private trustedServers;
|
|
51
|
+
constructor(dataDir: string, serverPassword?: string);
|
|
52
|
+
getServerIdentity(): PrivateUserId | null;
|
|
53
|
+
getServerPublicInfo(): TrustedServer | null;
|
|
54
|
+
listTrustedServers(): TrustedServer[];
|
|
55
|
+
addTrustedServer(server: TrustedServer): void;
|
|
56
|
+
removeTrustedServer(name: string): boolean;
|
|
57
|
+
private persistTrustedServers;
|
|
58
|
+
registerTenant(request: RegisterTenantRequest): TenantContext;
|
|
59
|
+
getTenant(tenantId: string): Promise<LoadedTenant>;
|
|
60
|
+
tenantExists(tenantId: string): boolean;
|
|
61
|
+
listTenants(): string[];
|
|
62
|
+
/**
|
|
63
|
+
* Update operator-owned fields of an existing tenant configuration.
|
|
64
|
+
* Only the fields present in `updates` are overwritten.
|
|
65
|
+
*/
|
|
66
|
+
updateTenantConfig(tenantId: string, updates: Partial<Pick<TenantConfig, "defaultStoreType" | "remoteServers">>): void;
|
|
67
|
+
removeTenant(tenantId: string): void;
|
|
68
|
+
getTenantSyncServers(tenantId: string): NamedRemoteServerConfig[];
|
|
69
|
+
addTenantSyncServer(tenantId: string, server: NamedRemoteServerConfig): void;
|
|
70
|
+
removeTenantSyncServer(tenantId: string, serverName: string): boolean;
|
|
71
|
+
getServerStore(tenantId: string, dbId: string): Promise<ServerNetworkContentAddressedStore>;
|
|
72
|
+
getStore(tenantId: string, dbId: string): Promise<ContentAddressedStore>;
|
|
73
|
+
getAuthService(tenantId: string): Promise<AuthenticationService>;
|
|
74
|
+
getCryptoAdapter(): NodeCryptoAdapter;
|
|
75
|
+
reloadTenant(tenantId: string): Promise<LoadedTenant>;
|
|
76
|
+
clearCache(): void;
|
|
77
|
+
private loadTenant;
|
|
78
|
+
/**
|
|
79
|
+
* Create a real BaseMindooTenant for directory reading using the global
|
|
80
|
+
* server identity.
|
|
81
|
+
*/
|
|
82
|
+
private createDirectoryTenant;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=TenantManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TenantManager.d.ts","sourceRoot":"","sources":["../../../src/node/server/TenantManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,EAAE,kCAAkC,EAAE,MAAM,mEAAmE,CAAC;AAGvH,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EAKtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,qBAAqB,EAErB,aAAa,EACb,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAMjB,UAAU,YAAY;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,qBAAqB,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;CAC/D;AAuKD;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,aAAa,CAAwC;IAE7D,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IA+BpD,iBAAiB,IAAI,aAAa,GAAG,IAAI;IAIzC,mBAAmB,IAAI,aAAa,GAAG,IAAI;IAa3C,kBAAkB,IAAI,aAAa,EAAE;IAIrC,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAY7C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAW1C,OAAO,CAAC,qBAAqB;IAS7B,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa;IA6BvD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAcxD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOvC,WAAW,IAAI,MAAM,EAAE;IAoBvB;;;OAGG;IACH,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,eAAe,CAAC,CAAC,GACzE,IAAI;IAoBP,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAkBpC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,EAAE;IAUjE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAyB5E,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IA2B/D,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kCAAkC,CAAC;IAsB3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKxE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKtE,gBAAgB,IAAI,iBAAiB;IAI/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAM3D,UAAU,IAAI,IAAI;YASJ,UAAU;IAqExB;;;OAGG;YACW,qBAAqB;CAyCpC"}
|