UNPKG

@n8n-plus/n8n-plus

Version:

n8n Workflow Automation Tool (plus edition)

146 lines 8.06 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DynamicCredentialService = void 0; const backend_common_1 = require("@n8n/backend-common"); const decorators_1 = require("@n8n/decorators"); const di_1 = require("@n8n/di"); const n8n_core_1 = require("n8n-core"); const n8n_workflow_1 = require("n8n-workflow"); const load_nodes_and_credentials_1 = require("../../../load-nodes-and-credentials"); const credential_resolver_registry_service_1 = require("./credential-resolver-registry.service"); const shared_fields_1 = require("./shared-fields"); const credential_resolver_repository_1 = require("../database/repositories/credential-resolver.repository"); const credential_resolution_error_1 = require("../errors/credential-resolution.error"); let DynamicCredentialService = class DynamicCredentialService { constructor(resolverRegistry, resolverRepository, loadNodesAndCredentials, cipher, logger) { this.resolverRegistry = resolverRegistry; this.resolverRepository = resolverRepository; this.loadNodesAndCredentials = loadNodesAndCredentials; this.cipher = cipher; this.logger = logger; } async resolveIfNeeded(credentialsResolveMetadata, staticData, executionContext, workflowSettings) { const resolverId = credentialsResolveMetadata.resolverId ?? workflowSettings?.credentialResolverId; if (!credentialsResolveMetadata.isResolvable || !resolverId) { return staticData; } const resolverEntity = await this.resolverRepository.findOneBy({ id: resolverId, }); if (!resolverEntity) { return this.handleMissingResolver(credentialsResolveMetadata, staticData, resolverId); } const resolver = this.resolverRegistry.getResolverByTypename(resolverEntity.type); if (!resolver) { return this.handleMissingResolver(credentialsResolveMetadata, staticData, resolverId); } const credentialContext = this.buildCredentialContext(executionContext); if (!credentialContext) { return this.handleMissingContext(credentialsResolveMetadata, staticData); } try { const credentialType = this.loadNodesAndCredentials.getCredential(credentialsResolveMetadata.type); const sharedFields = (0, shared_fields_1.extractSharedFields)(credentialType.type); const decryptedConfig = this.cipher.decrypt(resolverEntity.config); const resolverConfig = (0, n8n_workflow_1.jsonParse)(decryptedConfig); const dynamicData = await resolver.getSecret(credentialsResolveMetadata.id, credentialContext, { resolverId: resolverEntity.id, resolverName: resolverEntity.type, configuration: resolverConfig, }); this.logger.debug('Successfully resolved dynamic credentials', { credentialId: credentialsResolveMetadata.id, resolverId, resolverSource: credentialsResolveMetadata.resolverId ? 'credential' : 'workflow', identity: credentialContext.identity, }); for (const field of sharedFields) { if (field in dynamicData) { delete dynamicData[field]; } } return { ...staticData, ...dynamicData }; } catch (error) { return this.handleResolutionError(credentialsResolveMetadata, staticData, error, resolverId); } } buildCredentialContext(executionContext) { if (!executionContext?.credentials) { return undefined; } try { const decrypted = this.cipher.decrypt(executionContext.credentials); return (0, n8n_workflow_1.toCredentialContext)(decrypted); } catch (error) { this.logger.error('Failed to decrypt credential context from execution context', { error: error instanceof Error ? error.message : String(error), }); return undefined; } } handleResolutionError(credentialsResolveMetadata, staticData, error, resolverId) { const isDataNotFound = error instanceof decorators_1.CredentialResolverDataNotFoundError; if (credentialsResolveMetadata.resolvableAllowFallback) { this.logger.debug('Dynamic credential resolution failed, falling back to static', { credentialId: credentialsResolveMetadata.id, credentialName: credentialsResolveMetadata.name, resolverId, resolverSource: credentialsResolveMetadata.resolverId ? 'credential' : 'workflow', error: error instanceof Error ? error.message : String(error), isDataNotFound, }); return staticData; } this.logger.debug('Dynamic credential resolution failed without fallback', { credentialId: credentialsResolveMetadata.id, credentialName: credentialsResolveMetadata.name, resolverId, resolverSource: credentialsResolveMetadata.resolverId ? 'credential' : 'workflow', error, }); throw new credential_resolution_error_1.CredentialResolutionError(`Failed to resolve dynamic credentials for "${credentialsResolveMetadata.name}"`, { cause: error }); } handleMissingResolver(credentialsResolveMetadata, staticData, resolverId) { if (credentialsResolveMetadata.resolvableAllowFallback) { this.logger.debug('Resolver not found, falling back to static credentials', { credentialId: credentialsResolveMetadata.id, credentialName: credentialsResolveMetadata.name, resolverId, resolverSource: credentialsResolveMetadata.resolverId ? 'credential' : 'workflow', }); return staticData; } throw new credential_resolution_error_1.CredentialResolutionError(`Resolver "${resolverId}" not found for credential "${credentialsResolveMetadata.name}"`); } handleMissingContext(credentialsResolveMetadata, staticData) { if (credentialsResolveMetadata.resolvableAllowFallback) { this.logger.debug('No execution context available, falling back to static credentials', { credentialId: credentialsResolveMetadata.id, credentialName: credentialsResolveMetadata.name, }); return staticData; } throw new credential_resolution_error_1.CredentialResolutionError(`Cannot resolve dynamic credentials without execution context for "${credentialsResolveMetadata.name}"`); } }; exports.DynamicCredentialService = DynamicCredentialService; exports.DynamicCredentialService = DynamicCredentialService = __decorate([ (0, di_1.Service)(), __metadata("design:paramtypes", [credential_resolver_registry_service_1.DynamicCredentialResolverRegistry, credential_resolver_repository_1.DynamicCredentialResolverRepository, load_nodes_and_credentials_1.LoadNodesAndCredentials, n8n_core_1.Cipher, backend_common_1.Logger]) ], DynamicCredentialService); //# sourceMappingURL=dynamic-credential.service.js.map