@optimizely/ocp-local-env 1.0.0-beta.10
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.md +51 -0
- package/dist/package.json +112 -0
- package/dist/public/bundle.82dc5d29fffb9f205051.js +3 -0
- package/dist/public/bundle.82dc5d29fffb9f205051.js.LICENSE.txt +92 -0
- package/dist/public/bundle.82dc5d29fffb9f205051.js.map +1 -0
- package/dist/public/index.html +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +115 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/executor/DestinationExecutor.d.ts +19 -0
- package/dist/src/executor/DestinationExecutor.js +72 -0
- package/dist/src/executor/DestinationExecutor.js.map +1 -0
- package/dist/src/executor/FunctionExecutor.d.ts +67 -0
- package/dist/src/executor/FunctionExecutor.js +189 -0
- package/dist/src/executor/FunctionExecutor.js.map +1 -0
- package/dist/src/executor/JobExecutor.d.ts +79 -0
- package/dist/src/executor/JobExecutor.js +215 -0
- package/dist/src/executor/JobExecutor.js.map +1 -0
- package/dist/src/executor/LifecycleExecutor.d.ts +64 -0
- package/dist/src/executor/LifecycleExecutor.js +167 -0
- package/dist/src/executor/LifecycleExecutor.js.map +1 -0
- package/dist/src/executor/SourceExecutor.d.ts +32 -0
- package/dist/src/executor/SourceExecutor.js +163 -0
- package/dist/src/executor/SourceExecutor.js.map +1 -0
- package/dist/src/executor/watcher.d.ts +62 -0
- package/dist/src/executor/watcher.js +213 -0
- package/dist/src/executor/watcher.js.map +1 -0
- package/dist/src/functions/hello.d.ts +4 -0
- package/dist/src/functions/hello.js +8 -0
- package/dist/src/functions/hello.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jobs/dailyJob.d.ts +4 -0
- package/dist/src/jobs/dailyJob.js +8 -0
- package/dist/src/jobs/dailyJob.js.map +1 -0
- package/dist/src/local_engine/LocalFunctionApi.d.ts +17 -0
- package/dist/src/local_engine/LocalFunctionApi.js +54 -0
- package/dist/src/local_engine/LocalFunctionApi.js.map +1 -0
- package/dist/src/local_engine/LocalJobApi.d.ts +67 -0
- package/dist/src/local_engine/LocalJobApi.js +205 -0
- package/dist/src/local_engine/LocalJobApi.js.map +1 -0
- package/dist/src/local_engine/LocalNotifier.d.ts +9 -0
- package/dist/src/local_engine/LocalNotifier.js +26 -0
- package/dist/src/local_engine/LocalNotifier.js.map +1 -0
- package/dist/src/local_engine/local-engine-child-base.d.ts +110 -0
- package/dist/src/local_engine/local-engine-child-base.js +607 -0
- package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
- package/dist/src/local_engine/local-engine-client.d.ts +161 -0
- package/dist/src/local_engine/local-engine-client.js +888 -0
- package/dist/src/local_engine/local-engine-client.js.map +1 -0
- package/dist/src/local_engine/local-engine-types.d.ts +245 -0
- package/dist/src/local_engine/local-engine-types.js +6 -0
- package/dist/src/local_engine/local-engine-types.js.map +1 -0
- package/dist/src/local_engine/local-engine-unified.d.ts +71 -0
- package/dist/src/local_engine/local-engine-unified.js +723 -0
- package/dist/src/local_engine/local-engine-unified.js.map +1 -0
- package/dist/src/local_engine/local-engine-utils.d.ts +68 -0
- package/dist/src/local_engine/local-engine-utils.js +219 -0
- package/dist/src/local_engine/local-engine-utils.js.map +1 -0
- package/dist/src/local_engine/localSDKConfig.d.ts +40 -0
- package/dist/src/local_engine/localSDKConfig.js +247 -0
- package/dist/src/local_engine/localSDKConfig.js.map +1 -0
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.d.ts +37 -0
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.js +110 -0
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.js.map +1 -0
- package/dist/src/local_engine/storage/LocalConfigStore.d.ts +74 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js +178 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalJobStore.d.ts +111 -0
- package/dist/src/local_engine/storage/LocalJobStore.js +249 -0
- package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalKVStore.d.ts +106 -0
- package/dist/src/local_engine/storage/LocalKVStore.js +1061 -0
- package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +28 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js +149 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +115 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js +350 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.d.ts +19 -0
- package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.js +52 -0
- package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +168 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js +509 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.d.ts +15 -0
- package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.js +28 -0
- package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.js.map +1 -0
- package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
- package/dist/src/local_engine/storage/NumberSet.js +32 -0
- package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
- package/dist/src/local_engine/storage/SourceDataStore.d.ts +23 -0
- package/dist/src/local_engine/storage/SourceDataStore.js +83 -0
- package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +25 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js +61 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +1 -0
- package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
- package/dist/src/local_engine/storage/StringSet.js +32 -0
- package/dist/src/local_engine/storage/StringSet.js.map +1 -0
- package/dist/src/local_engine/types.d.ts +53 -0
- package/dist/src/local_engine/types.js +6 -0
- package/dist/src/local_engine/types.js.map +1 -0
- package/dist/src/local_engine/utils.d.ts +33 -0
- package/dist/src/local_engine/utils.js +143 -0
- package/dist/src/local_engine/utils.js.map +1 -0
- package/dist/src/logging/LogManager.d.ts +246 -0
- package/dist/src/logging/LogManager.js +343 -0
- package/dist/src/logging/LogManager.js.map +1 -0
- package/dist/src/server/api/destinations.d.ts +7 -0
- package/dist/src/server/api/destinations.js +170 -0
- package/dist/src/server/api/destinations.js.map +1 -0
- package/dist/src/server/api/functions.d.ts +7 -0
- package/dist/src/server/api/functions.js +80 -0
- package/dist/src/server/api/functions.js.map +1 -0
- package/dist/src/server/api/jobs.d.ts +10 -0
- package/dist/src/server/api/jobs.js +244 -0
- package/dist/src/server/api/jobs.js.map +1 -0
- package/dist/src/server/api/settings.d.ts +6 -0
- package/dist/src/server/api/settings.js +116 -0
- package/dist/src/server/api/settings.js.map +1 -0
- package/dist/src/server/api/sources.d.ts +7 -0
- package/dist/src/server/api/sources.js +382 -0
- package/dist/src/server/api/sources.js.map +1 -0
- package/dist/src/server/api/stores.d.ts +2 -0
- package/dist/src/server/api/stores.js +341 -0
- package/dist/src/server/api/stores.js.map +1 -0
- package/dist/src/server/api/v1.d.ts +10 -0
- package/dist/src/server/api/v1.js +718 -0
- package/dist/src/server/api/v1.js.map +1 -0
- package/dist/src/server/api.d.ts +8 -0
- package/dist/src/server/api.js +217 -0
- package/dist/src/server/api.js.map +1 -0
- package/dist/src/server/app-discovery.d.ts +5 -0
- package/dist/src/server/app-discovery.js +113 -0
- package/dist/src/server/app-discovery.js.map +1 -0
- package/dist/src/server/config.d.ts +26 -0
- package/dist/src/server/config.js +112 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/mockDataGenerator.d.ts +1 -0
- package/dist/src/server/mockDataGenerator.js +154 -0
- package/dist/src/server/mockDataGenerator.js.map +1 -0
- package/dist/src/server/websocket.d.ts +0 -0
- package/dist/src/server/websocket.js +2 -0
- package/dist/src/server/websocket.js.map +1 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.js +735 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/types/app.d.ts +154 -0
- package/dist/src/types/app.js +24 -0
- package/dist/src/types/app.js.map +1 -0
- package/dist/src/types/kvstore.d.ts +320 -0
- package/dist/src/types/kvstore.js +5 -0
- package/dist/src/types/kvstore.js.map +1 -0
- package/dist/src/ui/components/App.d.ts +6 -0
- package/dist/src/ui/components/App.js +432 -0
- package/dist/src/ui/components/App.js.map +1 -0
- package/dist/src/ui/components/DestinationBatchEditor.d.ts +7 -0
- package/dist/src/ui/components/DestinationBatchEditor.js +160 -0
- package/dist/src/ui/components/DestinationBatchEditor.js.map +1 -0
- package/dist/src/ui/components/DestinationSchemaViewer.d.ts +7 -0
- package/dist/src/ui/components/DestinationSchemaViewer.js +61 -0
- package/dist/src/ui/components/DestinationSchemaViewer.js.map +1 -0
- package/dist/src/ui/components/DestinationsView.d.ts +14 -0
- package/dist/src/ui/components/DestinationsView.js +68 -0
- package/dist/src/ui/components/DestinationsView.js.map +1 -0
- package/dist/src/ui/components/FunctionsView.d.ts +13 -0
- package/dist/src/ui/components/FunctionsView.js +288 -0
- package/dist/src/ui/components/FunctionsView.js.map +1 -0
- package/dist/src/ui/components/JobsView.d.ts +13 -0
- package/dist/src/ui/components/JobsView.js +320 -0
- package/dist/src/ui/components/JobsView.js.map +1 -0
- package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
- package/dist/src/ui/components/KVStoreViewer.js +168 -0
- package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
- package/dist/src/ui/components/MetadataModal.d.ts +14 -0
- package/dist/src/ui/components/MetadataModal.js +28 -0
- package/dist/src/ui/components/MetadataModal.js.map +1 -0
- package/dist/src/ui/components/MetadataModal.test.d.ts +1 -0
- package/dist/src/ui/components/MetadataModal.test.js +143 -0
- package/dist/src/ui/components/MetadataModal.test.js.map +1 -0
- package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
- package/dist/src/ui/components/NotificationViewer.js +69 -0
- package/dist/src/ui/components/NotificationViewer.js.map +1 -0
- package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
- package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
- package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
- package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
- package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
- package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
- package/dist/src/ui/components/SourceDataViewer.d.ts +8 -0
- package/dist/src/ui/components/SourceDataViewer.js +84 -0
- package/dist/src/ui/components/SourceDataViewer.js.map +1 -0
- package/dist/src/ui/components/SourceJobsSection.d.ts +8 -0
- package/dist/src/ui/components/SourceJobsSection.js +99 -0
- package/dist/src/ui/components/SourceJobsSection.js.map +1 -0
- package/dist/src/ui/components/SourceLifecycleSection.d.ts +7 -0
- package/dist/src/ui/components/SourceLifecycleSection.js +58 -0
- package/dist/src/ui/components/SourceLifecycleSection.js.map +1 -0
- package/dist/src/ui/components/SourceSchemaViewer.d.ts +7 -0
- package/dist/src/ui/components/SourceSchemaViewer.js +65 -0
- package/dist/src/ui/components/SourceSchemaViewer.js.map +1 -0
- package/dist/src/ui/components/SourceWebhookEditor.d.ts +8 -0
- package/dist/src/ui/components/SourceWebhookEditor.js +181 -0
- package/dist/src/ui/components/SourceWebhookEditor.js.map +1 -0
- package/dist/src/ui/components/SourcesView.d.ts +14 -0
- package/dist/src/ui/components/SourcesView.js +74 -0
- package/dist/src/ui/components/SourcesView.js.map +1 -0
- package/dist/src/ui/components/StoreViewer.d.ts +16 -0
- package/dist/src/ui/components/StoreViewer.js +86 -0
- package/dist/src/ui/components/StoreViewer.js.map +1 -0
- package/dist/src/ui/components/TabbedConsole.d.ts +17 -0
- package/dist/src/ui/components/TabbedConsole.js +163 -0
- package/dist/src/ui/components/TabbedConsole.js.map +1 -0
- package/dist/src/ui/components/common/DataTree.d.ts +15 -0
- package/dist/src/ui/components/common/DataTree.js +95 -0
- package/dist/src/ui/components/common/DataTree.js.map +1 -0
- package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
- package/dist/src/ui/components/common/EyeIcon.js +11 -0
- package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
- package/dist/src/ui/hooks/useEntityNavigation.d.ts +72 -0
- package/dist/src/ui/hooks/useEntityNavigation.js +150 -0
- package/dist/src/ui/hooks/useEntityNavigation.js.map +1 -0
- package/dist/src/ui/hooks/useQueryParams.d.ts +6 -0
- package/dist/src/ui/hooks/useQueryParams.js +39 -0
- package/dist/src/ui/hooks/useQueryParams.js.map +1 -0
- package/dist/src/ui/index.d.ts +1 -0
- package/dist/src/ui/index.js +23 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/ui/store/formStateSlice.d.ts +54 -0
- package/dist/src/ui/store/formStateSlice.js +94 -0
- package/dist/src/ui/store/formStateSlice.js.map +1 -0
- package/dist/src/ui/store/hooks.d.ts +6 -0
- package/dist/src/ui/store/hooks.js +8 -0
- package/dist/src/ui/store/hooks.js.map +1 -0
- package/dist/src/ui/store/index.d.ts +11 -0
- package/dist/src/ui/store/index.js +107 -0
- package/dist/src/ui/store/index.js.map +1 -0
- package/dist/src/utils/functionEndpoints.d.ts +24 -0
- package/dist/src/utils/functionEndpoints.js +45 -0
- package/dist/src/utils/functionEndpoints.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LocalSecretsStore = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const LogManager_1 = require("../../logging/LogManager");
|
|
10
|
+
/**
|
|
11
|
+
* Local secrets store that manages app secrets in .ocp-local/secrets.json
|
|
12
|
+
* Implements singleton pattern to ensure consistent state across wrapper and API
|
|
13
|
+
* Provides basic obfuscation for secrets at rest
|
|
14
|
+
*/
|
|
15
|
+
class LocalSecretsStore {
|
|
16
|
+
constructor(appRootDir) {
|
|
17
|
+
this.logManager = LogManager_1.LogManager.getInstance();
|
|
18
|
+
this.appRootDir = appRootDir;
|
|
19
|
+
this.configDirPath = path_1.default.join(appRootDir, '.ocp-local');
|
|
20
|
+
this.secretsPath = path_1.default.join(this.configDirPath, 'secrets.json');
|
|
21
|
+
// Initialize secrets file if it doesn't exist
|
|
22
|
+
this.ensureSecretsFileExists();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get or create a singleton instance for the given app directory
|
|
26
|
+
*/
|
|
27
|
+
static getInstance(appRootDir) {
|
|
28
|
+
const normalizedPath = path_1.default.resolve(appRootDir);
|
|
29
|
+
if (!this.instances.has(normalizedPath)) {
|
|
30
|
+
this.instances.set(normalizedPath, new LocalSecretsStore(normalizedPath));
|
|
31
|
+
}
|
|
32
|
+
return this.instances.get(normalizedPath);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Clear all instances (useful for testing)
|
|
36
|
+
*/
|
|
37
|
+
static clearAllInstances() {
|
|
38
|
+
this.instances.clear();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Ensure the secrets file exists with proper permissions
|
|
42
|
+
*/
|
|
43
|
+
ensureSecretsFileExists() {
|
|
44
|
+
try {
|
|
45
|
+
// Create config directory if it doesn't exist
|
|
46
|
+
if (!fs_1.default.existsSync(this.configDirPath)) {
|
|
47
|
+
fs_1.default.mkdirSync(this.configDirPath, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
// Create secrets file if it doesn't exist
|
|
50
|
+
if (!fs_1.default.existsSync(this.secretsPath)) {
|
|
51
|
+
const defaultSecrets = {};
|
|
52
|
+
this.saveSecretsToDisk(defaultSecrets);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Failed to ensure secrets file exists: ${error instanceof Error ? error.message : String(error)}`, {
|
|
57
|
+
id: 'secrets',
|
|
58
|
+
store: 'LocalSecretsStore',
|
|
59
|
+
operation: 'set',
|
|
60
|
+
error
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load secrets from disk with basic deobfuscation
|
|
66
|
+
*/
|
|
67
|
+
loadSecretsFromDisk() {
|
|
68
|
+
try {
|
|
69
|
+
if (!fs_1.default.existsSync(this.secretsPath)) {
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
const fileContent = fs_1.default.readFileSync(this.secretsPath, 'utf-8');
|
|
73
|
+
const obfuscatedData = JSON.parse(fileContent);
|
|
74
|
+
// Deobfuscate the secrets
|
|
75
|
+
const secrets = {};
|
|
76
|
+
for (const [key, value] of Object.entries(obfuscatedData)) {
|
|
77
|
+
try {
|
|
78
|
+
if (typeof value === 'string') {
|
|
79
|
+
// Try to decode Base64, fallback to original value if invalid
|
|
80
|
+
secrets[key] = this.deobfuscateValue(value);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Handle nested objects
|
|
84
|
+
secrets[key] = this.deobfuscateObject(value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// If deobfuscation fails, keep original value
|
|
89
|
+
secrets[key] = value;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return secrets;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Error loading secrets from disk: ${error instanceof Error ? error.message : String(error)}`, {
|
|
96
|
+
id: 'secrets',
|
|
97
|
+
store: 'LocalSecretsStore',
|
|
98
|
+
operation: 'get',
|
|
99
|
+
error
|
|
100
|
+
});
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Save secrets to disk with basic obfuscation
|
|
106
|
+
*/
|
|
107
|
+
saveSecretsToDisk(secrets) {
|
|
108
|
+
try {
|
|
109
|
+
// Obfuscate the secrets before saving
|
|
110
|
+
const obfuscatedSecrets = {};
|
|
111
|
+
for (const [key, value] of Object.entries(secrets)) {
|
|
112
|
+
if (typeof value === 'string') {
|
|
113
|
+
obfuscatedSecrets[key] = this.obfuscateValue(value);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Handle nested objects
|
|
117
|
+
obfuscatedSecrets[key] = this.obfuscateObject(value);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const jsonContent = JSON.stringify(obfuscatedSecrets, null, 2);
|
|
121
|
+
// Write to temp file first, then rename for atomicity
|
|
122
|
+
const tempPath = `${this.secretsPath}.tmp`;
|
|
123
|
+
fs_1.default.writeFileSync(tempPath, jsonContent, 'utf-8');
|
|
124
|
+
// Set restrictive permissions on the temp file
|
|
125
|
+
try {
|
|
126
|
+
fs_1.default.chmodSync(tempPath, 0o600); // Read/write for owner only
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Could not set restrictive permissions on secrets file: ${error instanceof Error ? error.message : String(error)}`, {
|
|
130
|
+
id: 'secrets',
|
|
131
|
+
store: 'LocalSecretsStore',
|
|
132
|
+
operation: 'set',
|
|
133
|
+
error
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// Atomic rename
|
|
137
|
+
fs_1.default.renameSync(tempPath, this.secretsPath);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
this.logManager.error(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Error saving secrets to disk: ${error instanceof Error ? error.message : String(error)}`, {
|
|
141
|
+
id: 'secrets',
|
|
142
|
+
store: 'LocalSecretsStore',
|
|
143
|
+
operation: 'set',
|
|
144
|
+
error
|
|
145
|
+
});
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Basic obfuscation using Base64 encoding
|
|
151
|
+
*/
|
|
152
|
+
obfuscateValue(value) {
|
|
153
|
+
return Buffer.from(value, 'utf-8').toString('base64');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Basic deobfuscation using Base64 decoding
|
|
157
|
+
*/
|
|
158
|
+
deobfuscateValue(value) {
|
|
159
|
+
try {
|
|
160
|
+
return Buffer.from(value, 'base64').toString('utf-8');
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
// If Base64 decoding fails, return original value
|
|
164
|
+
return value;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Recursively obfuscate object values
|
|
169
|
+
*/
|
|
170
|
+
obfuscateObject(obj) {
|
|
171
|
+
if (typeof obj === 'string') {
|
|
172
|
+
return this.obfuscateValue(obj);
|
|
173
|
+
}
|
|
174
|
+
else if (Array.isArray(obj)) {
|
|
175
|
+
return obj.map(item => this.obfuscateObject(item));
|
|
176
|
+
}
|
|
177
|
+
else if (obj !== null && typeof obj === 'object') {
|
|
178
|
+
const obfuscated = {};
|
|
179
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
180
|
+
obfuscated[key] = this.obfuscateObject(value);
|
|
181
|
+
}
|
|
182
|
+
return obfuscated;
|
|
183
|
+
}
|
|
184
|
+
return obj;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Recursively deobfuscate object values
|
|
188
|
+
*/
|
|
189
|
+
deobfuscateObject(obj) {
|
|
190
|
+
if (typeof obj === 'string') {
|
|
191
|
+
return this.deobfuscateValue(obj);
|
|
192
|
+
}
|
|
193
|
+
else if (Array.isArray(obj)) {
|
|
194
|
+
return obj.map(item => this.deobfuscateObject(item));
|
|
195
|
+
}
|
|
196
|
+
else if (obj !== null && typeof obj === 'object') {
|
|
197
|
+
const deobfuscated = {};
|
|
198
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
199
|
+
deobfuscated[key] = this.deobfuscateObject(value);
|
|
200
|
+
}
|
|
201
|
+
return deobfuscated;
|
|
202
|
+
}
|
|
203
|
+
return obj;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get all secrets
|
|
207
|
+
*/
|
|
208
|
+
getSecrets() {
|
|
209
|
+
return this.loadSecretsFromDisk();
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get secrets for a specific section/key
|
|
213
|
+
*/
|
|
214
|
+
getSectionSecrets(section) {
|
|
215
|
+
const secrets = this.loadSecretsFromDisk();
|
|
216
|
+
return secrets[section] || {};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get a specific secret value
|
|
220
|
+
*/
|
|
221
|
+
getSecret(key) {
|
|
222
|
+
const secrets = this.loadSecretsFromDisk();
|
|
223
|
+
return secrets[key];
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Set a specific secret value
|
|
227
|
+
*/
|
|
228
|
+
setSecret(key, value) {
|
|
229
|
+
const secrets = this.loadSecretsFromDisk();
|
|
230
|
+
secrets[key] = value;
|
|
231
|
+
this.saveSecretsToDisk(secrets);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Update multiple secrets at once
|
|
235
|
+
*/
|
|
236
|
+
updateSecrets(newSecrets) {
|
|
237
|
+
const secrets = this.loadSecretsFromDisk();
|
|
238
|
+
const updatedSecrets = { ...secrets, ...newSecrets };
|
|
239
|
+
this.saveSecretsToDisk(updatedSecrets);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Update secrets for a specific section
|
|
243
|
+
*/
|
|
244
|
+
updateSectionSecrets(section, sectionSecrets) {
|
|
245
|
+
const secrets = this.loadSecretsFromDisk();
|
|
246
|
+
if (Object.keys(sectionSecrets).length === 0) {
|
|
247
|
+
// If empty object, delete the section
|
|
248
|
+
delete secrets[section];
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Merge with existing section secrets
|
|
252
|
+
secrets[section] = { ...secrets[section], ...sectionSecrets };
|
|
253
|
+
}
|
|
254
|
+
this.saveSecretsToDisk(secrets);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Delete a specific secret
|
|
258
|
+
*/
|
|
259
|
+
deleteSecret(key) {
|
|
260
|
+
const secrets = this.loadSecretsFromDisk();
|
|
261
|
+
delete secrets[key];
|
|
262
|
+
this.saveSecretsToDisk(secrets);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Delete specific fields from a secret section
|
|
266
|
+
*/
|
|
267
|
+
deleteSecretFields(section, fields) {
|
|
268
|
+
const secrets = this.loadSecretsFromDisk();
|
|
269
|
+
const sectionSecrets = secrets[section];
|
|
270
|
+
if (sectionSecrets && typeof sectionSecrets === 'object') {
|
|
271
|
+
fields.forEach(field => {
|
|
272
|
+
delete sectionSecrets[field];
|
|
273
|
+
});
|
|
274
|
+
// If section is empty after deletion, remove it entirely
|
|
275
|
+
if (Object.keys(sectionSecrets).length === 0) {
|
|
276
|
+
delete secrets[section];
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
secrets[section] = sectionSecrets;
|
|
280
|
+
}
|
|
281
|
+
this.saveSecretsToDisk(secrets);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Clear all secrets (wipe the store)
|
|
286
|
+
*/
|
|
287
|
+
clearSecrets() {
|
|
288
|
+
this.saveSecretsToDisk({});
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Check if secrets store is empty
|
|
292
|
+
*/
|
|
293
|
+
isEmpty() {
|
|
294
|
+
const secrets = this.loadSecretsFromDisk();
|
|
295
|
+
return Object.keys(secrets).length === 0;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Check if a specific secret exists
|
|
299
|
+
*/
|
|
300
|
+
hasSecret(key) {
|
|
301
|
+
const secrets = this.loadSecretsFromDisk();
|
|
302
|
+
return key in secrets;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if a section has any secrets
|
|
306
|
+
*/
|
|
307
|
+
hasSectionSecrets(section) {
|
|
308
|
+
const secrets = this.loadSecretsFromDisk();
|
|
309
|
+
const sectionSecrets = secrets[section];
|
|
310
|
+
return !!(sectionSecrets && typeof sectionSecrets === 'object' && Object.keys(sectionSecrets).length > 0);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get the path to the secrets file
|
|
314
|
+
*/
|
|
315
|
+
getSecretsPath() {
|
|
316
|
+
return this.secretsPath;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get the config directory path
|
|
320
|
+
*/
|
|
321
|
+
getConfigDirPath() {
|
|
322
|
+
return this.configDirPath;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Wipe all secrets and remove the secrets file (for app uninstall)
|
|
326
|
+
*/
|
|
327
|
+
wipeSecrets() {
|
|
328
|
+
try {
|
|
329
|
+
if (fs_1.default.existsSync(this.secretsPath)) {
|
|
330
|
+
fs_1.default.unlinkSync(this.secretsPath);
|
|
331
|
+
}
|
|
332
|
+
this.logManager.info(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Wiped secrets for app: ${this.appRootDir}`, {
|
|
333
|
+
id: 'secrets',
|
|
334
|
+
store: 'LocalSecretsStore',
|
|
335
|
+
operation: 'clear'
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Failed to wipe secrets: ${error instanceof Error ? error.message : String(error)}`, {
|
|
340
|
+
id: 'secrets',
|
|
341
|
+
store: 'LocalSecretsStore',
|
|
342
|
+
operation: 'clear',
|
|
343
|
+
error
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.LocalSecretsStore = LocalSecretsStore;
|
|
349
|
+
LocalSecretsStore.instances = new Map();
|
|
350
|
+
//# sourceMappingURL=LocalSecretsStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalSecretsStore.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalSecretsStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LogCategory } from '../../logging/LogManager';
|
|
2
|
+
import { BaseKVStoreWrapper } from './BaseKVStoreWrapper';
|
|
3
|
+
import { LocalSecretsStore } from './LocalSecretsStore';
|
|
4
|
+
/**
|
|
5
|
+
* Wrapper to make LocalSecretsStore compatible with BaseKVStore interface
|
|
6
|
+
*/
|
|
7
|
+
export declare class LocalSecretsStoreWrapper extends BaseKVStoreWrapper {
|
|
8
|
+
private secretsStore;
|
|
9
|
+
protected readonly storeName = "LocalSecretsStore";
|
|
10
|
+
protected readonly logCategory = LogCategory.Secrets;
|
|
11
|
+
constructor(secretsStore: LocalSecretsStore);
|
|
12
|
+
protected getSectionData(key: string): Record<string, any>;
|
|
13
|
+
protected updateSectionData(key: string, value: any): void;
|
|
14
|
+
protected hasSectionData(key: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Override delete to use deleteSecretFields for field-level deletion
|
|
17
|
+
*/
|
|
18
|
+
delete(key: string, fields?: string[]): Promise<true>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalSecretsStoreWrapper = void 0;
|
|
4
|
+
const LogManager_1 = require("../../logging/LogManager");
|
|
5
|
+
const BaseKVStoreWrapper_1 = require("./BaseKVStoreWrapper");
|
|
6
|
+
/**
|
|
7
|
+
* Wrapper to make LocalSecretsStore compatible with BaseKVStore interface
|
|
8
|
+
*/
|
|
9
|
+
class LocalSecretsStoreWrapper extends BaseKVStoreWrapper_1.BaseKVStoreWrapper {
|
|
10
|
+
constructor(secretsStore) {
|
|
11
|
+
super();
|
|
12
|
+
this.secretsStore = secretsStore;
|
|
13
|
+
this.storeName = 'LocalSecretsStore';
|
|
14
|
+
this.logCategory = LogManager_1.LogCategory.Secrets;
|
|
15
|
+
}
|
|
16
|
+
getSectionData(key) {
|
|
17
|
+
return this.secretsStore.getSectionSecrets(key) || {};
|
|
18
|
+
}
|
|
19
|
+
updateSectionData(key, value) {
|
|
20
|
+
this.secretsStore.updateSectionSecrets(key, value);
|
|
21
|
+
}
|
|
22
|
+
hasSectionData(key) {
|
|
23
|
+
return this.secretsStore.hasSectionSecrets(key);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Override delete to use deleteSecretFields for field-level deletion
|
|
27
|
+
*/
|
|
28
|
+
async delete(key, fields) {
|
|
29
|
+
const context = {
|
|
30
|
+
id: key || 'unknown',
|
|
31
|
+
store: this.storeName,
|
|
32
|
+
operation: 'delete',
|
|
33
|
+
key
|
|
34
|
+
};
|
|
35
|
+
this.logManager.debug(LogManager_1.LogSource.System, this.logCategory, `DELETE: key="${key}", fields=${JSON.stringify(fields)}`, context);
|
|
36
|
+
try {
|
|
37
|
+
if (fields?.length) {
|
|
38
|
+
this.secretsStore.deleteSecretFields(key, fields);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.updateSectionData(key, {});
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logManager.error(LogManager_1.LogSource.System, this.logCategory, `DELETE failed: key="${key}"`, { ...context, error });
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.LocalSecretsStoreWrapper = LocalSecretsStoreWrapper;
|
|
52
|
+
//# sourceMappingURL=LocalSecretsStoreWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalSecretsStoreWrapper.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalSecretsStoreWrapper.ts"],"names":[],"mappings":";;;AAAA,yDAAqF;AACrF,6DAA0D;AAG1D;;GAEG;AACH,MAAa,wBAAyB,SAAQ,uCAAkB;IAI9D,YAAoB,YAA+B;QACjD,KAAK,EAAE,CAAC;QADU,iBAAY,GAAZ,YAAY,CAAmB;QAHhC,cAAS,GAAG,mBAAmB,CAAC;QAChC,gBAAW,GAAG,wBAAW,CAAC,OAAO,CAAC;IAIrD,CAAC;IAES,cAAc,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAES,iBAAiB,CAAC,GAAW,EAAE,KAAU;QACjD,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAES,cAAc,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAiB;QACzC,MAAM,OAAO,GAAsB;YACjC,EAAE,EAAE,GAAG,IAAI,SAAS;YACpB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,SAAS,EAAE,QAAQ;YACnB,GAAG;SACJ,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,sBAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,gBAAgB,GAAG,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7H,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,sBAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,uBAAuB,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAChH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA3CD,4DA2CC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for local app settings
|
|
3
|
+
*/
|
|
4
|
+
export interface LocalAppSettings {
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Interface for settings field metadata
|
|
9
|
+
*/
|
|
10
|
+
export interface SettingsFieldSchema {
|
|
11
|
+
type?: string;
|
|
12
|
+
secret?: boolean;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
description?: string;
|
|
15
|
+
default?: any;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Interface for settings section schema
|
|
19
|
+
*/
|
|
20
|
+
export interface SettingsSectionSchema {
|
|
21
|
+
[fieldName: string]: SettingsFieldSchema;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Interface for complete settings schema
|
|
25
|
+
*/
|
|
26
|
+
export interface SettingsSchema {
|
|
27
|
+
[sectionName: string]: SettingsSectionSchema;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Interface for settings field with metadata
|
|
31
|
+
*/
|
|
32
|
+
export interface SettingsFieldWithMetadata {
|
|
33
|
+
value: any;
|
|
34
|
+
isSecret: boolean;
|
|
35
|
+
isFromYml: boolean;
|
|
36
|
+
hasLocalValue: boolean;
|
|
37
|
+
fieldSchema?: SettingsFieldSchema;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Local settings store that manages app settings in .ocp-local/settings.json
|
|
41
|
+
* Implements singleton pattern to ensure consistent state across wrapper and API
|
|
42
|
+
*/
|
|
43
|
+
export declare class LocalSettingsStore {
|
|
44
|
+
private static instances;
|
|
45
|
+
private logManager;
|
|
46
|
+
private settingsPath;
|
|
47
|
+
private configDirPath;
|
|
48
|
+
private appRootDir;
|
|
49
|
+
private settingsYmlSections;
|
|
50
|
+
private settingsSchema;
|
|
51
|
+
private constructor();
|
|
52
|
+
/**
|
|
53
|
+
* Get or create a singleton instance for the given app directory
|
|
54
|
+
*/
|
|
55
|
+
static getInstance(appRootDir: string): LocalSettingsStore;
|
|
56
|
+
/**
|
|
57
|
+
* Clear singleton instance for the given app directory (useful for testing)
|
|
58
|
+
*/
|
|
59
|
+
static clearInstance(appRootDir: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clear all singleton instances (useful for testing)
|
|
62
|
+
*/
|
|
63
|
+
static clearAllInstances(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Parse settings.yml file to extract sections and field schemas
|
|
66
|
+
*/
|
|
67
|
+
private parseSettingsYml;
|
|
68
|
+
/**
|
|
69
|
+
* Parse field schema from settings.yml fields array
|
|
70
|
+
*/
|
|
71
|
+
private parseFieldsSchema;
|
|
72
|
+
/**
|
|
73
|
+
* Parse field schema from JSON Schema style properties
|
|
74
|
+
*/
|
|
75
|
+
private parseJsonSchemaFields;
|
|
76
|
+
/**
|
|
77
|
+
* Create default settings structure based on sections from settings.yml
|
|
78
|
+
*/
|
|
79
|
+
private createDefaultSettings;
|
|
80
|
+
/**
|
|
81
|
+
* Ensure settings file exists with default structure
|
|
82
|
+
*/
|
|
83
|
+
private ensureSettingsFileExists;
|
|
84
|
+
/**
|
|
85
|
+
* Load settings from disk every time
|
|
86
|
+
*/
|
|
87
|
+
private loadSettingsFromDisk;
|
|
88
|
+
/**
|
|
89
|
+
* Save settings to disk
|
|
90
|
+
*/
|
|
91
|
+
private saveSettingsToDisk;
|
|
92
|
+
/**
|
|
93
|
+
* Get all current settings
|
|
94
|
+
*/
|
|
95
|
+
getSettings(): LocalAppSettings;
|
|
96
|
+
/**
|
|
97
|
+
* Get settings as JSON string for API response
|
|
98
|
+
*/
|
|
99
|
+
getSettingsAsJson(): string;
|
|
100
|
+
/**
|
|
101
|
+
* Get a specific setting value
|
|
102
|
+
*/
|
|
103
|
+
getSetting(key: string): any;
|
|
104
|
+
/**
|
|
105
|
+
* Set a specific setting value
|
|
106
|
+
*/
|
|
107
|
+
setSetting(key: string, value: any): void;
|
|
108
|
+
/**
|
|
109
|
+
* Update multiple settings at once
|
|
110
|
+
*/
|
|
111
|
+
updateSettings(newSettings: Partial<LocalAppSettings>): void;
|
|
112
|
+
/**
|
|
113
|
+
* Update settings from JSON string
|
|
114
|
+
*/
|
|
115
|
+
updateSettingsFromJson(jsonString: string): void;
|
|
116
|
+
/**
|
|
117
|
+
* Clear all settings (reset to empty)
|
|
118
|
+
*/
|
|
119
|
+
clearSettings(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Check if settings are empty
|
|
122
|
+
*/
|
|
123
|
+
isEmpty(): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Remove a specific setting
|
|
126
|
+
*/
|
|
127
|
+
removeSetting(key: string): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Get the list of sections parsed from settings.yml
|
|
130
|
+
*/
|
|
131
|
+
getSections(): string[];
|
|
132
|
+
/**
|
|
133
|
+
* Get settings for a specific section
|
|
134
|
+
*/
|
|
135
|
+
getSectionSettings(sectionName: string): any;
|
|
136
|
+
/**
|
|
137
|
+
* Update settings for a specific section.
|
|
138
|
+
* Preserves original values for secret fields when redacted values are submitted.
|
|
139
|
+
*/
|
|
140
|
+
updateSectionSettings(sectionName: string, sectionSettings: any): void;
|
|
141
|
+
/**
|
|
142
|
+
* Get the parsed settings schema from settings.yml
|
|
143
|
+
*/
|
|
144
|
+
getSettingsSchema(): SettingsSchema;
|
|
145
|
+
/**
|
|
146
|
+
* Get schema for a specific section
|
|
147
|
+
*/
|
|
148
|
+
getSectionSchema(sectionName: string): SettingsSectionSchema;
|
|
149
|
+
/**
|
|
150
|
+
* Get settings for a section with metadata about each field
|
|
151
|
+
*/
|
|
152
|
+
getSectionSettingsWithMetadata(sectionName: string): {
|
|
153
|
+
[fieldName: string]: SettingsFieldWithMetadata;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Get all settings with metadata organized by section
|
|
157
|
+
*/
|
|
158
|
+
getAllSettingsWithMetadata(): {
|
|
159
|
+
[sectionName: string]: {
|
|
160
|
+
[fieldName: string]: SettingsFieldWithMetadata;
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Get form data with secret fields redacted (matches OCP behavior)
|
|
165
|
+
* Secret fields with non-null, non-empty values are replaced with {redacted: true}
|
|
166
|
+
*/
|
|
167
|
+
getRedactedFormData(): LocalAppSettings;
|
|
168
|
+
}
|