@pax8-cta/core 0.1.0
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/LICENSE +198 -0
- package/dist/auth/device-code-login.d.ts +40 -0
- package/dist/auth/device-code-login.d.ts.map +1 -0
- package/dist/auth/device-code-login.js +59 -0
- package/dist/auth/device-code-login.js.map +1 -0
- package/dist/auth/gdap-client.d.ts +81 -0
- package/dist/auth/gdap-client.d.ts.map +1 -0
- package/dist/auth/gdap-client.js +128 -0
- package/dist/auth/gdap-client.js.map +1 -0
- package/dist/auth/index.d.ts +19 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +19 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token-manager.d.ts +54 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +150 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +27 -0
- package/dist/client.js.map +1 -0
- package/dist/config/client.d.ts +24 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +18 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/index.d.ts +18 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +18 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +271 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +751 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +556 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.d.ts +116 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +170 -0
- package/dist/constants.js.map +1 -0
- package/dist/dataverse/agent-resolver.d.ts +98 -0
- package/dist/dataverse/agent-resolver.d.ts.map +1 -0
- package/dist/dataverse/agent-resolver.js +185 -0
- package/dist/dataverse/agent-resolver.js.map +1 -0
- package/dist/dataverse/client.d.ts +104 -0
- package/dist/dataverse/client.d.ts.map +1 -0
- package/dist/dataverse/client.js +272 -0
- package/dist/dataverse/client.js.map +1 -0
- package/dist/dataverse/connection-refs.d.ts +115 -0
- package/dist/dataverse/connection-refs.d.ts.map +1 -0
- package/dist/dataverse/connection-refs.js +203 -0
- package/dist/dataverse/connection-refs.js.map +1 -0
- package/dist/dataverse/index.d.ts +20 -0
- package/dist/dataverse/index.d.ts.map +1 -0
- package/dist/dataverse/index.js +20 -0
- package/dist/dataverse/index.js.map +1 -0
- package/dist/dataverse/solution-ops.d.ts +100 -0
- package/dist/dataverse/solution-ops.d.ts.map +1 -0
- package/dist/dataverse/solution-ops.js +288 -0
- package/dist/dataverse/solution-ops.js.map +1 -0
- package/dist/errors.d.ts +171 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +178 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mock/demo-data.d.ts +213 -0
- package/dist/mock/demo-data.d.ts.map +1 -0
- package/dist/mock/demo-data.js +1096 -0
- package/dist/mock/demo-data.js.map +1 -0
- package/dist/mock/demo-deployment-store.d.ts +77 -0
- package/dist/mock/demo-deployment-store.d.ts.map +1 -0
- package/dist/mock/demo-deployment-store.js +85 -0
- package/dist/mock/demo-deployment-store.js.map +1 -0
- package/dist/powerplatform/admin-client.d.ts +226 -0
- package/dist/powerplatform/admin-client.d.ts.map +1 -0
- package/dist/powerplatform/admin-client.js +315 -0
- package/dist/powerplatform/admin-client.js.map +1 -0
- package/dist/powerplatform/index.d.ts +18 -0
- package/dist/powerplatform/index.d.ts.map +1 -0
- package/dist/powerplatform/index.js +18 -0
- package/dist/powerplatform/index.js.map +1 -0
- package/dist/powerplatform/tenant-discovery.d.ts +100 -0
- package/dist/powerplatform/tenant-discovery.d.ts.map +1 -0
- package/dist/powerplatform/tenant-discovery.js +205 -0
- package/dist/powerplatform/tenant-discovery.js.map +1 -0
- package/dist/preconditions/check.d.ts +41 -0
- package/dist/preconditions/check.d.ts.map +1 -0
- package/dist/preconditions/check.js +173 -0
- package/dist/preconditions/check.js.map +1 -0
- package/dist/preconditions/index.d.ts +20 -0
- package/dist/preconditions/index.d.ts.map +1 -0
- package/dist/preconditions/index.js +20 -0
- package/dist/preconditions/index.js.map +1 -0
- package/dist/preconditions/loader.d.ts +33 -0
- package/dist/preconditions/loader.d.ts.map +1 -0
- package/dist/preconditions/loader.js +65 -0
- package/dist/preconditions/loader.js.map +1 -0
- package/dist/preconditions/schema.d.ts +103 -0
- package/dist/preconditions/schema.d.ts.map +1 -0
- package/dist/preconditions/schema.js +93 -0
- package/dist/preconditions/schema.js.map +1 -0
- package/dist/preconditions/types.d.ts +118 -0
- package/dist/preconditions/types.d.ts.map +1 -0
- package/dist/preconditions/types.js +17 -0
- package/dist/preconditions/types.js.map +1 -0
- package/dist/queue/index.d.ts +17 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +17 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/memory-queue.d.ts +86 -0
- package/dist/queue/memory-queue.d.ts.map +1 -0
- package/dist/queue/memory-queue.js +221 -0
- package/dist/queue/memory-queue.js.map +1 -0
- package/dist/services/audit-log.d.ts +59 -0
- package/dist/services/audit-log.d.ts.map +1 -0
- package/dist/services/audit-log.js +193 -0
- package/dist/services/audit-log.js.map +1 -0
- package/dist/services/auth-error-parser.d.ts +36 -0
- package/dist/services/auth-error-parser.d.ts.map +1 -0
- package/dist/services/auth-error-parser.js +90 -0
- package/dist/services/auth-error-parser.js.map +1 -0
- package/dist/services/deployment-doctor.d.ts +109 -0
- package/dist/services/deployment-doctor.d.ts.map +1 -0
- package/dist/services/deployment-doctor.js +476 -0
- package/dist/services/deployment-doctor.js.map +1 -0
- package/dist/services/deployment-notifications.d.ts +41 -0
- package/dist/services/deployment-notifications.d.ts.map +1 -0
- package/dist/services/deployment-notifications.js +161 -0
- package/dist/services/deployment-notifications.js.map +1 -0
- package/dist/services/deployment-progress.d.ts +89 -0
- package/dist/services/deployment-progress.d.ts.map +1 -0
- package/dist/services/deployment-progress.js +244 -0
- package/dist/services/deployment-progress.js.map +1 -0
- package/dist/services/deployment-service.d.ts +97 -0
- package/dist/services/deployment-service.d.ts.map +1 -0
- package/dist/services/deployment-service.js +375 -0
- package/dist/services/deployment-service.js.map +1 -0
- package/dist/services/drift-analyzer.d.ts +86 -0
- package/dist/services/drift-analyzer.d.ts.map +1 -0
- package/dist/services/drift-analyzer.js +273 -0
- package/dist/services/drift-analyzer.js.map +1 -0
- package/dist/services/environment-setup.d.ts +97 -0
- package/dist/services/environment-setup.d.ts.map +1 -0
- package/dist/services/environment-setup.js +250 -0
- package/dist/services/environment-setup.js.map +1 -0
- package/dist/services/health-check.d.ts +168 -0
- package/dist/services/health-check.d.ts.map +1 -0
- package/dist/services/health-check.js +705 -0
- package/dist/services/health-check.js.map +1 -0
- package/dist/services/index.d.ts +39 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/logger.d.ts +139 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/notification-service.d.ts +55 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +184 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/risk-analyzer.d.ts +252 -0
- package/dist/services/risk-analyzer.d.ts.map +1 -0
- package/dist/services/risk-analyzer.js +866 -0
- package/dist/services/risk-analyzer.js.map +1 -0
- package/dist/services/rollback.d.ts +57 -0
- package/dist/services/rollback.d.ts.map +1 -0
- package/dist/services/rollback.js +270 -0
- package/dist/services/rollback.js.map +1 -0
- package/dist/services/scheduler.d.ts +80 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +350 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/secrets.d.ts +31 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +206 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/settings-service.d.ts +132 -0
- package/dist/services/settings-service.d.ts.map +1 -0
- package/dist/services/settings-service.js +378 -0
- package/dist/services/settings-service.js.map +1 -0
- package/dist/services/solution-diff.d.ts +127 -0
- package/dist/services/solution-diff.d.ts.map +1 -0
- package/dist/services/solution-diff.js +260 -0
- package/dist/services/solution-diff.js.map +1 -0
- package/dist/services/solution-mode-detector.d.ts +35 -0
- package/dist/services/solution-mode-detector.d.ts.map +1 -0
- package/dist/services/solution-mode-detector.js +84 -0
- package/dist/services/solution-mode-detector.js.map +1 -0
- package/dist/services/tenant-resolver.d.ts +55 -0
- package/dist/services/tenant-resolver.d.ts.map +1 -0
- package/dist/services/tenant-resolver.js +126 -0
- package/dist/services/tenant-resolver.js.map +1 -0
- package/dist/services/unmanaged-customizations.d.ts +104 -0
- package/dist/services/unmanaged-customizations.d.ts.map +1 -0
- package/dist/services/unmanaged-customizations.js +521 -0
- package/dist/services/unmanaged-customizations.js.map +1 -0
- package/dist/services/url-templater.d.ts +184 -0
- package/dist/services/url-templater.d.ts.map +1 -0
- package/dist/services/url-templater.js +327 -0
- package/dist/services/url-templater.js.map +1 -0
- package/dist/services/version-checker.d.ts +108 -0
- package/dist/services/version-checker.d.ts.map +1 -0
- package/dist/services/version-checker.js +403 -0
- package/dist/services/version-checker.js.map +1 -0
- package/dist/services/waves.d.ts +90 -0
- package/dist/services/waves.d.ts.map +1 -0
- package/dist/services/waves.js +222 -0
- package/dist/services/waves.js.map +1 -0
- package/dist/services/webhook.d.ts +95 -0
- package/dist/services/webhook.d.ts.map +1 -0
- package/dist/services/webhook.js +244 -0
- package/dist/services/webhook.js.map +1 -0
- package/dist/utils/deployment-tools.d.ts +110 -0
- package/dist/utils/deployment-tools.d.ts.map +1 -0
- package/dist/utils/deployment-tools.js +121 -0
- package/dist/utils/deployment-tools.js.map +1 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Integration settings for Power Platform / Dynamics connection
|
|
18
|
+
*/
|
|
19
|
+
export interface IntegrationSettings {
|
|
20
|
+
partnerTenantId?: string;
|
|
21
|
+
partnerClientId?: string;
|
|
22
|
+
partnerClientSecret?: string;
|
|
23
|
+
sourceTenantId?: string;
|
|
24
|
+
sourceEnvironmentUrl?: string;
|
|
25
|
+
tenantDiscoveryEnabled?: boolean;
|
|
26
|
+
connectionMappingEnabled?: boolean;
|
|
27
|
+
environmentVariablesEnabled?: boolean;
|
|
28
|
+
configuredAt?: string;
|
|
29
|
+
configuredBy?: string;
|
|
30
|
+
lastTestedAt?: string;
|
|
31
|
+
lastTestResult?: "success" | "failed";
|
|
32
|
+
lastTestError?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* General application settings
|
|
36
|
+
*/
|
|
37
|
+
export interface AppSettings {
|
|
38
|
+
demoMode: boolean;
|
|
39
|
+
slackEnabled?: boolean;
|
|
40
|
+
slackWebhookUrl?: string;
|
|
41
|
+
teamsEnabled?: boolean;
|
|
42
|
+
teamsWebhookUrl?: string;
|
|
43
|
+
emailEnabled?: boolean;
|
|
44
|
+
emailRecipients?: string;
|
|
45
|
+
notifyOnDeploymentStart?: boolean;
|
|
46
|
+
notifyOnDeploymentComplete?: boolean;
|
|
47
|
+
notifyOnDeploymentFailure?: boolean;
|
|
48
|
+
notifyOnApprovalNeeded?: boolean;
|
|
49
|
+
defaultMaxConcurrentDeployments?: number;
|
|
50
|
+
defaultDeploymentTimeoutMs?: number;
|
|
51
|
+
autoRetryFailedDeployments?: boolean;
|
|
52
|
+
theme?: "light" | "dark" | "system";
|
|
53
|
+
dateFormat?: string;
|
|
54
|
+
timezone?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface AllSettings {
|
|
57
|
+
integration: IntegrationSettings;
|
|
58
|
+
app: AppSettings;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Settings service for managing application configuration
|
|
62
|
+
* Supports both file-based storage (demo) and encrypted database storage (production)
|
|
63
|
+
*/
|
|
64
|
+
export declare class SettingsService {
|
|
65
|
+
private encryptionKey;
|
|
66
|
+
private settingsDir;
|
|
67
|
+
private encryptionSecretPath;
|
|
68
|
+
private settingsFilePath;
|
|
69
|
+
private cachedSettings;
|
|
70
|
+
constructor(options?: {
|
|
71
|
+
settingsDir?: string;
|
|
72
|
+
encryptionSecret?: string;
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Get all settings
|
|
76
|
+
*/
|
|
77
|
+
getSettings(): Promise<AllSettings>;
|
|
78
|
+
/**
|
|
79
|
+
* Get integration settings
|
|
80
|
+
*/
|
|
81
|
+
getIntegrationSettings(): Promise<IntegrationSettings>;
|
|
82
|
+
/**
|
|
83
|
+
* Get app settings
|
|
84
|
+
*/
|
|
85
|
+
getAppSettings(): Promise<AppSettings>;
|
|
86
|
+
/**
|
|
87
|
+
* Update integration settings
|
|
88
|
+
*/
|
|
89
|
+
updateIntegrationSettings(updates: Partial<IntegrationSettings>, configuredBy?: string): Promise<IntegrationSettings>;
|
|
90
|
+
/**
|
|
91
|
+
* Update app settings
|
|
92
|
+
*/
|
|
93
|
+
updateAppSettings(updates: Partial<AppSettings>): Promise<AppSettings>;
|
|
94
|
+
/**
|
|
95
|
+
* Get decrypted integration settings (for API use)
|
|
96
|
+
*/
|
|
97
|
+
getDecryptedIntegrationSettings(): Promise<IntegrationSettings>;
|
|
98
|
+
/**
|
|
99
|
+
* Get decrypted app settings (for API use)
|
|
100
|
+
*/
|
|
101
|
+
getDecryptedAppSettings(): Promise<AppSettings>;
|
|
102
|
+
private getDecryptedIntegrationSettingsInternal;
|
|
103
|
+
private getDecryptedAppSettingsInternal;
|
|
104
|
+
/**
|
|
105
|
+
* Check if integration is configured
|
|
106
|
+
*/
|
|
107
|
+
isIntegrationConfigured(): Promise<boolean>;
|
|
108
|
+
/**
|
|
109
|
+
* Clear all settings (for testing or reset)
|
|
110
|
+
*/
|
|
111
|
+
clearSettings(): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Record a connection test result
|
|
114
|
+
*/
|
|
115
|
+
recordTestResult(success: boolean, error?: string): Promise<void>;
|
|
116
|
+
private loadFromFile;
|
|
117
|
+
private saveToFile;
|
|
118
|
+
private getDefaultSettings;
|
|
119
|
+
private getOrCreateSalt;
|
|
120
|
+
private getPersistedEncryptionSecret;
|
|
121
|
+
private getOrCreateEncryptionSecret;
|
|
122
|
+
private ensureEncryptionKeyForSensitiveWrites;
|
|
123
|
+
private encrypt;
|
|
124
|
+
private decrypt;
|
|
125
|
+
}
|
|
126
|
+
export declare function getSettingsService(): SettingsService;
|
|
127
|
+
/**
|
|
128
|
+
* Helper to get effective integration settings
|
|
129
|
+
* Prefers database settings, falls back to environment variables
|
|
130
|
+
*/
|
|
131
|
+
export declare function getEffectiveIntegrationSettings(): Promise<IntegrationSettings>;
|
|
132
|
+
//# sourceMappingURL=settings-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-service.d.ts","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from "crypto";
|
|
17
|
+
import { readFileSync, writeFileSync, existsSync, chmodSync } from "fs";
|
|
18
|
+
import { join } from "path";
|
|
19
|
+
import { coreLogger } from "./logger.js";
|
|
20
|
+
const logger = coreLogger.child({ service: "settings" });
|
|
21
|
+
const ENCRYPTION_ALGORITHM = "aes-256-gcm";
|
|
22
|
+
const IV_LENGTH = 16;
|
|
23
|
+
const SALT_LENGTH = 32;
|
|
24
|
+
/**
|
|
25
|
+
* Settings service for managing application configuration
|
|
26
|
+
* Supports both file-based storage (demo) and encrypted database storage (production)
|
|
27
|
+
*/
|
|
28
|
+
export class SettingsService {
|
|
29
|
+
encryptionKey = null;
|
|
30
|
+
settingsDir;
|
|
31
|
+
encryptionSecretPath;
|
|
32
|
+
settingsFilePath;
|
|
33
|
+
cachedSettings = null;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.settingsDir = options?.settingsDir || process.cwd();
|
|
36
|
+
this.encryptionSecretPath = join(this.settingsDir, ".pax8-cta-encryption-key");
|
|
37
|
+
this.settingsFilePath = join(this.settingsDir, ".pax8-cta-settings.json");
|
|
38
|
+
// Derive encryption key from secret
|
|
39
|
+
const secret = options?.encryptionSecret ||
|
|
40
|
+
process.env.SETTINGS_ENCRYPTION_SECRET ||
|
|
41
|
+
this.getPersistedEncryptionSecret();
|
|
42
|
+
if (secret) {
|
|
43
|
+
// Use scrypt to derive a proper key from the secret
|
|
44
|
+
const salt = this.getOrCreateSalt(this.settingsDir);
|
|
45
|
+
this.encryptionKey = scryptSync(secret, salt, 32);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get all settings
|
|
50
|
+
*/
|
|
51
|
+
async getSettings() {
|
|
52
|
+
if (this.cachedSettings) {
|
|
53
|
+
return this.cachedSettings;
|
|
54
|
+
}
|
|
55
|
+
const settings = this.loadFromFile();
|
|
56
|
+
this.cachedSettings = settings;
|
|
57
|
+
return settings;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get integration settings
|
|
61
|
+
*/
|
|
62
|
+
async getIntegrationSettings() {
|
|
63
|
+
const settings = await this.getSettings();
|
|
64
|
+
return settings.integration;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get app settings
|
|
68
|
+
*/
|
|
69
|
+
async getAppSettings() {
|
|
70
|
+
const settings = await this.getSettings();
|
|
71
|
+
return settings.app;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Update integration settings
|
|
75
|
+
*/
|
|
76
|
+
async updateIntegrationSettings(updates, configuredBy) {
|
|
77
|
+
const settings = await this.getSettings();
|
|
78
|
+
// Sensitive fields must always be encrypted at rest.
|
|
79
|
+
if (updates.partnerClientSecret) {
|
|
80
|
+
this.ensureEncryptionKeyForSensitiveWrites();
|
|
81
|
+
updates.partnerClientSecret = this.encrypt(updates.partnerClientSecret);
|
|
82
|
+
}
|
|
83
|
+
settings.integration = {
|
|
84
|
+
...settings.integration,
|
|
85
|
+
...updates,
|
|
86
|
+
configuredAt: new Date().toISOString(),
|
|
87
|
+
configuredBy: configuredBy || settings.integration.configuredBy,
|
|
88
|
+
};
|
|
89
|
+
this.saveToFile(settings);
|
|
90
|
+
this.cachedSettings = settings;
|
|
91
|
+
logger.info("Integration settings updated", {
|
|
92
|
+
configuredBy,
|
|
93
|
+
hasPartnerCredentials: !!settings.integration.partnerTenantId,
|
|
94
|
+
hasSourceEnvironment: !!settings.integration.sourceEnvironmentUrl,
|
|
95
|
+
});
|
|
96
|
+
return this.getDecryptedIntegrationSettingsInternal(settings.integration);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Update app settings
|
|
100
|
+
*/
|
|
101
|
+
async updateAppSettings(updates) {
|
|
102
|
+
const settings = await this.getSettings();
|
|
103
|
+
if (updates.slackWebhookUrl || updates.teamsWebhookUrl) {
|
|
104
|
+
this.ensureEncryptionKeyForSensitiveWrites();
|
|
105
|
+
}
|
|
106
|
+
// Encrypt webhook URLs if provided
|
|
107
|
+
if (updates.slackWebhookUrl) {
|
|
108
|
+
updates.slackWebhookUrl = this.encrypt(updates.slackWebhookUrl);
|
|
109
|
+
}
|
|
110
|
+
if (updates.teamsWebhookUrl) {
|
|
111
|
+
updates.teamsWebhookUrl = this.encrypt(updates.teamsWebhookUrl);
|
|
112
|
+
}
|
|
113
|
+
settings.app = {
|
|
114
|
+
...settings.app,
|
|
115
|
+
...updates,
|
|
116
|
+
};
|
|
117
|
+
this.saveToFile(settings);
|
|
118
|
+
this.cachedSettings = settings;
|
|
119
|
+
logger.info("App settings updated", {
|
|
120
|
+
demoMode: settings.app.demoMode,
|
|
121
|
+
slackEnabled: settings.app.slackEnabled,
|
|
122
|
+
teamsEnabled: settings.app.teamsEnabled,
|
|
123
|
+
emailEnabled: settings.app.emailEnabled,
|
|
124
|
+
});
|
|
125
|
+
return settings.app;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get decrypted integration settings (for API use)
|
|
129
|
+
*/
|
|
130
|
+
async getDecryptedIntegrationSettings() {
|
|
131
|
+
const settings = await this.getSettings();
|
|
132
|
+
return this.getDecryptedIntegrationSettingsInternal(settings.integration);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get decrypted app settings (for API use)
|
|
136
|
+
*/
|
|
137
|
+
async getDecryptedAppSettings() {
|
|
138
|
+
const settings = await this.getSettings();
|
|
139
|
+
return this.getDecryptedAppSettingsInternal(settings.app);
|
|
140
|
+
}
|
|
141
|
+
getDecryptedIntegrationSettingsInternal(settings) {
|
|
142
|
+
const result = { ...settings };
|
|
143
|
+
// Decrypt secret if encrypted
|
|
144
|
+
if (result.partnerClientSecret && this.encryptionKey) {
|
|
145
|
+
try {
|
|
146
|
+
result.partnerClientSecret = this.decrypt(result.partnerClientSecret);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// If decryption fails, it might not be encrypted yet
|
|
150
|
+
logger.warn("Failed to decrypt client secret - may not be encrypted");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
getDecryptedAppSettingsInternal(settings) {
|
|
156
|
+
const result = { ...settings };
|
|
157
|
+
// Decrypt webhook URLs if encrypted
|
|
158
|
+
if (result.slackWebhookUrl && this.encryptionKey) {
|
|
159
|
+
try {
|
|
160
|
+
result.slackWebhookUrl = this.decrypt(result.slackWebhookUrl);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
logger.warn("Failed to decrypt Slack webhook - may not be encrypted");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (result.teamsWebhookUrl && this.encryptionKey) {
|
|
167
|
+
try {
|
|
168
|
+
result.teamsWebhookUrl = this.decrypt(result.teamsWebhookUrl);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
logger.warn("Failed to decrypt Teams webhook - may not be encrypted");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Check if integration is configured
|
|
178
|
+
*/
|
|
179
|
+
async isIntegrationConfigured() {
|
|
180
|
+
const settings = await this.getIntegrationSettings();
|
|
181
|
+
return !!(settings.partnerTenantId && settings.partnerClientId && settings.partnerClientSecret);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Clear all settings (for testing or reset)
|
|
185
|
+
*/
|
|
186
|
+
async clearSettings() {
|
|
187
|
+
this.cachedSettings = null;
|
|
188
|
+
if (existsSync(this.settingsFilePath)) {
|
|
189
|
+
writeFileSync(this.settingsFilePath, JSON.stringify(this.getDefaultSettings(), null, 2));
|
|
190
|
+
}
|
|
191
|
+
logger.info("Settings cleared");
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Record a connection test result
|
|
195
|
+
*/
|
|
196
|
+
async recordTestResult(success, error) {
|
|
197
|
+
const settings = await this.getSettings();
|
|
198
|
+
settings.integration.lastTestedAt = new Date().toISOString();
|
|
199
|
+
settings.integration.lastTestResult = success ? "success" : "failed";
|
|
200
|
+
settings.integration.lastTestError = error;
|
|
201
|
+
this.saveToFile(settings);
|
|
202
|
+
this.cachedSettings = settings;
|
|
203
|
+
}
|
|
204
|
+
// Private methods
|
|
205
|
+
loadFromFile() {
|
|
206
|
+
try {
|
|
207
|
+
if (existsSync(this.settingsFilePath)) {
|
|
208
|
+
const data = readFileSync(this.settingsFilePath, "utf-8");
|
|
209
|
+
const parsed = JSON.parse(data);
|
|
210
|
+
return {
|
|
211
|
+
...this.getDefaultSettings(),
|
|
212
|
+
...parsed,
|
|
213
|
+
integration: {
|
|
214
|
+
...this.getDefaultSettings().integration,
|
|
215
|
+
...parsed.integration,
|
|
216
|
+
},
|
|
217
|
+
app: {
|
|
218
|
+
...this.getDefaultSettings().app,
|
|
219
|
+
...parsed.app,
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
logger.warn("Failed to load settings from file", { error });
|
|
226
|
+
}
|
|
227
|
+
return this.getDefaultSettings();
|
|
228
|
+
}
|
|
229
|
+
saveToFile(settings) {
|
|
230
|
+
try {
|
|
231
|
+
writeFileSync(this.settingsFilePath, JSON.stringify(settings, null, 2));
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
logger.error("Failed to save settings to file", error);
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
getDefaultSettings() {
|
|
239
|
+
return {
|
|
240
|
+
integration: {
|
|
241
|
+
tenantDiscoveryEnabled: false,
|
|
242
|
+
connectionMappingEnabled: false,
|
|
243
|
+
environmentVariablesEnabled: false,
|
|
244
|
+
},
|
|
245
|
+
app: {
|
|
246
|
+
demoMode: process.env.DEMO_MODE !== "false",
|
|
247
|
+
defaultMaxConcurrentDeployments: 3,
|
|
248
|
+
defaultDeploymentTimeoutMs: 600000,
|
|
249
|
+
autoRetryFailedDeployments: false,
|
|
250
|
+
theme: "system",
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
getOrCreateSalt(settingsDir) {
|
|
255
|
+
const saltPath = join(settingsDir, ".pax8-cta-salt");
|
|
256
|
+
try {
|
|
257
|
+
if (existsSync(saltPath)) {
|
|
258
|
+
return Buffer.from(readFileSync(saltPath, "utf-8"), "hex");
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Salt file doesn't exist or is invalid
|
|
263
|
+
}
|
|
264
|
+
// Generate new salt
|
|
265
|
+
const salt = randomBytes(SALT_LENGTH);
|
|
266
|
+
try {
|
|
267
|
+
writeFileSync(saltPath, salt.toString("hex"));
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
logger.warn("Failed to save encryption salt - using ephemeral salt");
|
|
271
|
+
}
|
|
272
|
+
return salt;
|
|
273
|
+
}
|
|
274
|
+
getPersistedEncryptionSecret() {
|
|
275
|
+
try {
|
|
276
|
+
if (existsSync(this.encryptionSecretPath)) {
|
|
277
|
+
const secret = readFileSync(this.encryptionSecretPath, "utf-8").trim();
|
|
278
|
+
if (secret) {
|
|
279
|
+
return secret;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
logger.warn("Failed to load persisted encryption secret");
|
|
285
|
+
}
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
getOrCreateEncryptionSecret() {
|
|
289
|
+
const persisted = this.getPersistedEncryptionSecret();
|
|
290
|
+
if (persisted) {
|
|
291
|
+
return persisted;
|
|
292
|
+
}
|
|
293
|
+
const secret = randomBytes(32).toString("hex");
|
|
294
|
+
try {
|
|
295
|
+
writeFileSync(this.encryptionSecretPath, secret, { mode: 0o600 });
|
|
296
|
+
if (process.platform !== "win32") {
|
|
297
|
+
chmodSync(this.encryptionSecretPath, 0o600);
|
|
298
|
+
}
|
|
299
|
+
return secret;
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
logger.error("Failed to persist encryption secret for settings");
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
ensureEncryptionKeyForSensitiveWrites() {
|
|
307
|
+
if (this.encryptionKey) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const secret = this.getOrCreateEncryptionSecret();
|
|
311
|
+
if (!secret) {
|
|
312
|
+
throw new Error(`Cannot store sensitive settings without encryption. Set SETTINGS_ENCRYPTION_SECRET or ensure write access to ${this.encryptionSecretPath}`);
|
|
313
|
+
}
|
|
314
|
+
const salt = this.getOrCreateSalt(this.settingsDir);
|
|
315
|
+
this.encryptionKey = scryptSync(secret, salt, 32);
|
|
316
|
+
}
|
|
317
|
+
encrypt(text) {
|
|
318
|
+
if (!this.encryptionKey) {
|
|
319
|
+
return text; // No encryption if no key
|
|
320
|
+
}
|
|
321
|
+
const iv = randomBytes(IV_LENGTH);
|
|
322
|
+
const cipher = createCipheriv(ENCRYPTION_ALGORITHM, this.encryptionKey, iv);
|
|
323
|
+
let encrypted = cipher.update(text, "utf8", "hex");
|
|
324
|
+
encrypted += cipher.final("hex");
|
|
325
|
+
const authTag = cipher.getAuthTag();
|
|
326
|
+
// Format: iv:authTag:encrypted
|
|
327
|
+
return `${iv.toString("hex")}:${authTag.toString("hex")}:${encrypted}`;
|
|
328
|
+
}
|
|
329
|
+
decrypt(encryptedText) {
|
|
330
|
+
if (!this.encryptionKey) {
|
|
331
|
+
return encryptedText; // No decryption if no key
|
|
332
|
+
}
|
|
333
|
+
const parts = encryptedText.split(":");
|
|
334
|
+
if (parts.length !== 3) {
|
|
335
|
+
// Not encrypted or invalid format
|
|
336
|
+
return encryptedText;
|
|
337
|
+
}
|
|
338
|
+
const [ivHex, authTagHex, encrypted] = parts;
|
|
339
|
+
const iv = Buffer.from(ivHex, "hex");
|
|
340
|
+
const authTag = Buffer.from(authTagHex, "hex");
|
|
341
|
+
const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, this.encryptionKey, iv);
|
|
342
|
+
decipher.setAuthTag(authTag);
|
|
343
|
+
let decrypted = decipher.update(encrypted, "hex", "utf8");
|
|
344
|
+
decrypted += decipher.final("utf8");
|
|
345
|
+
return decrypted;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Singleton instance
|
|
349
|
+
let settingsInstance = null;
|
|
350
|
+
export function getSettingsService() {
|
|
351
|
+
if (!settingsInstance) {
|
|
352
|
+
settingsInstance = new SettingsService();
|
|
353
|
+
}
|
|
354
|
+
return settingsInstance;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Helper to get effective integration settings
|
|
358
|
+
* Prefers database settings, falls back to environment variables
|
|
359
|
+
*/
|
|
360
|
+
export async function getEffectiveIntegrationSettings() {
|
|
361
|
+
const settingsService = getSettingsService();
|
|
362
|
+
const dbSettings = await settingsService.getDecryptedIntegrationSettings();
|
|
363
|
+
return {
|
|
364
|
+
partnerTenantId: dbSettings.partnerTenantId || process.env.PARTNER_TENANT_ID,
|
|
365
|
+
partnerClientId: dbSettings.partnerClientId || process.env.PARTNER_CLIENT_ID,
|
|
366
|
+
partnerClientSecret: dbSettings.partnerClientSecret || process.env.PARTNER_CLIENT_SECRET,
|
|
367
|
+
sourceTenantId: dbSettings.sourceTenantId || process.env.SOURCE_TENANT_ID,
|
|
368
|
+
sourceEnvironmentUrl: dbSettings.sourceEnvironmentUrl || process.env.SOURCE_ENVIRONMENT_URL,
|
|
369
|
+
tenantDiscoveryEnabled: dbSettings.tenantDiscoveryEnabled ?? process.env.TENANT_DISCOVERY_ENABLED === "true",
|
|
370
|
+
connectionMappingEnabled: dbSettings.connectionMappingEnabled ?? process.env.CONNECTION_MAPPING_ENABLED === "true",
|
|
371
|
+
environmentVariablesEnabled: dbSettings.environmentVariablesEnabled ?? process.env.ENV_VARIABLES_ENABLED === "true",
|
|
372
|
+
configuredAt: dbSettings.configuredAt,
|
|
373
|
+
lastTestedAt: dbSettings.lastTestedAt,
|
|
374
|
+
lastTestResult: dbSettings.lastTestResult,
|
|
375
|
+
lastTestError: dbSettings.lastTestError,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=settings-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { DataverseClient } from "../dataverse/index.js";
|
|
17
|
+
/**
|
|
18
|
+
* Component type codes in Power Platform
|
|
19
|
+
*/
|
|
20
|
+
export declare const ComponentTypes: Record<number, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Solution component record
|
|
23
|
+
*/
|
|
24
|
+
export interface SolutionComponentRecord {
|
|
25
|
+
solutioncomponentid: string;
|
|
26
|
+
componenttype: number;
|
|
27
|
+
objectid: string;
|
|
28
|
+
rootsolutioncomponentid: string | null;
|
|
29
|
+
ismetadata: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Component difference
|
|
33
|
+
*/
|
|
34
|
+
export interface ComponentDiff {
|
|
35
|
+
type: "added" | "removed" | "modified";
|
|
36
|
+
componentType: number;
|
|
37
|
+
componentTypeName: string;
|
|
38
|
+
objectId: string;
|
|
39
|
+
name?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Solution comparison result
|
|
43
|
+
*/
|
|
44
|
+
export interface SolutionComparisonResult {
|
|
45
|
+
source: {
|
|
46
|
+
uniqueName: string;
|
|
47
|
+
version: string;
|
|
48
|
+
componentCount: number;
|
|
49
|
+
};
|
|
50
|
+
target: {
|
|
51
|
+
uniqueName: string;
|
|
52
|
+
version: string;
|
|
53
|
+
componentCount: number;
|
|
54
|
+
} | null;
|
|
55
|
+
summary: {
|
|
56
|
+
added: number;
|
|
57
|
+
removed: number;
|
|
58
|
+
modified: number;
|
|
59
|
+
unchanged: number;
|
|
60
|
+
};
|
|
61
|
+
differences: ComponentDiff[];
|
|
62
|
+
isUpgrade: boolean;
|
|
63
|
+
isNewInstall: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Service for comparing solutions and previewing changes
|
|
67
|
+
*/
|
|
68
|
+
export declare class SolutionDiffService {
|
|
69
|
+
/**
|
|
70
|
+
* Compare a solution file against what's installed in a target environment
|
|
71
|
+
*/
|
|
72
|
+
compareSolutions(solutionPath: string, targetClient: DataverseClient): Promise<SolutionComparisonResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Get all components from a solution
|
|
75
|
+
*/
|
|
76
|
+
getSolutionComponents(client: DataverseClient, solutionId: string): Promise<SolutionComponentRecord[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Parse solution.xml from a solution zip file
|
|
79
|
+
*/
|
|
80
|
+
parseSolutionFile(solutionPath: string): Promise<{
|
|
81
|
+
uniqueName: string;
|
|
82
|
+
version: string;
|
|
83
|
+
friendlyName: string;
|
|
84
|
+
isManaged: boolean;
|
|
85
|
+
componentCount?: number;
|
|
86
|
+
} | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Compare two version strings
|
|
89
|
+
* Returns: >0 if v1 > v2, <0 if v1 < v2, 0 if equal
|
|
90
|
+
*/
|
|
91
|
+
compareVersions(v1: string, v2: string): number;
|
|
92
|
+
/**
|
|
93
|
+
* Preview what will happen during deployment
|
|
94
|
+
*/
|
|
95
|
+
previewDeployment(solutionPath: string, targetClient: DataverseClient): Promise<{
|
|
96
|
+
willInstall: boolean;
|
|
97
|
+
willUpgrade: boolean;
|
|
98
|
+
sourceVersion: string;
|
|
99
|
+
targetVersion: string | null;
|
|
100
|
+
warnings: string[];
|
|
101
|
+
estimatedDurationMs: number;
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* Calculate checksum for a solution file
|
|
105
|
+
*/
|
|
106
|
+
calculateChecksum(solutionPath: string): Promise<string>;
|
|
107
|
+
/**
|
|
108
|
+
* Verify solution file integrity
|
|
109
|
+
*/
|
|
110
|
+
verifySolutionIntegrity(solutionPath: string, expectedChecksum?: string): Promise<{
|
|
111
|
+
valid: boolean;
|
|
112
|
+
checksum: string;
|
|
113
|
+
errors: string[];
|
|
114
|
+
}>;
|
|
115
|
+
/**
|
|
116
|
+
* Get summary of solution contents (for display purposes)
|
|
117
|
+
*/
|
|
118
|
+
getSolutionSummary(solutionPath: string): Promise<{
|
|
119
|
+
uniqueName: string;
|
|
120
|
+
version: string;
|
|
121
|
+
friendlyName: string;
|
|
122
|
+
isManaged: boolean;
|
|
123
|
+
checksum: string;
|
|
124
|
+
fileSizeBytes: number;
|
|
125
|
+
} | null>;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=solution-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solution-diff.d.ts","sourceRoot":"","sources":["../../src/services/solution-diff.ts"],"names":[],"mappings":"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"}
|