@rytass/bpm-core-nestjs-module 0.13.2 → 0.13.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.
Files changed (145) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/package.json +13 -6
  3. package/src/index.d.ts +1 -0
  4. package/src/index.js +1 -0
  5. package/src/index.js.map +1 -1
  6. package/src/lib/attachment/attachment-storage.provider.d.ts +11 -0
  7. package/src/lib/attachment/attachment-storage.provider.js +15 -1
  8. package/src/lib/attachment/attachment-storage.provider.js.map +1 -1
  9. package/src/lib/attachment/attachment.module.js +16 -1
  10. package/src/lib/attachment/attachment.module.js.map +1 -1
  11. package/src/lib/bpm/bpm-root-options.d.ts +134 -0
  12. package/src/lib/bpm/bpm-root-options.js +61 -0
  13. package/src/lib/bpm/bpm-root-options.js.map +1 -0
  14. package/src/lib/bpm/bpm-root.module.d.ts +101 -137
  15. package/src/lib/bpm/bpm-root.module.js +83 -118
  16. package/src/lib/bpm/bpm-root.module.js.map +1 -1
  17. package/src/lib/bpm/index.d.ts +1 -0
  18. package/src/lib/bpm/index.js +1 -0
  19. package/src/lib/bpm/index.js.map +1 -1
  20. package/src/lib/calendar/business-calendar.provider.d.ts +8 -4
  21. package/src/lib/calendar/business-calendar.provider.js +15 -6
  22. package/src/lib/calendar/business-calendar.provider.js.map +1 -1
  23. package/src/lib/common/outbox.d.ts +26 -0
  24. package/src/lib/common/outbox.js +64 -0
  25. package/src/lib/common/outbox.js.map +1 -0
  26. package/src/lib/delegation/delegation.service.js +7 -7
  27. package/src/lib/delegation/delegation.service.js.map +1 -1
  28. package/src/lib/form-data-source/form-data-source.module.js +2 -4
  29. package/src/lib/form-data-source/form-data-source.module.js.map +1 -1
  30. package/src/lib/form-data-source/form-data-source.provider.d.ts +14 -0
  31. package/src/lib/form-data-source/form-data-source.provider.js +23 -0
  32. package/src/lib/form-data-source/form-data-source.provider.js.map +1 -0
  33. package/src/lib/form-data-source/index.d.ts +1 -0
  34. package/src/lib/form-data-source/index.js +1 -0
  35. package/src/lib/form-data-source/index.js.map +1 -1
  36. package/src/lib/identity/default-member-resolver.d.ts +39 -0
  37. package/src/lib/identity/default-member-resolver.js +81 -0
  38. package/src/lib/identity/default-member-resolver.js.map +1 -0
  39. package/src/lib/identity/identity.module.d.ts +12 -2
  40. package/src/lib/identity/identity.module.js +2 -1
  41. package/src/lib/identity/identity.module.js.map +1 -1
  42. package/src/lib/identity/index.d.ts +1 -0
  43. package/src/lib/identity/index.js +1 -0
  44. package/src/lib/identity/index.js.map +1 -1
  45. package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.d.ts +17 -0
  46. package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.js +61 -0
  47. package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.js.map +1 -0
  48. package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.d.ts +16 -0
  49. package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.js +71 -0
  50. package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.js.map +1 -0
  51. package/src/lib/migrations/index.d.ts +2 -0
  52. package/src/lib/migrations/index.js +6 -0
  53. package/src/lib/migrations/index.js.map +1 -1
  54. package/src/lib/notification/notification-delivery.service.js +4 -57
  55. package/src/lib/notification/notification-delivery.service.js.map +1 -1
  56. package/src/lib/notification/notification.service.js +4 -3
  57. package/src/lib/notification/notification.service.js.map +1 -1
  58. package/src/lib/template/template.service.d.ts +9 -0
  59. package/src/lib/template/template.service.js +31 -0
  60. package/src/lib/template/template.service.js.map +1 -1
  61. package/src/lib/template/workflow-definition.validator.js +54 -1
  62. package/src/lib/template/workflow-definition.validator.js.map +1 -1
  63. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +3 -1
  64. package/src/lib/workflow-engine/workflow-engine.enums.js +2 -0
  65. package/src/lib/workflow-engine/workflow-engine.enums.js.map +1 -1
  66. package/src/lib/workflow-engine/workflow-engine.module.js +3 -0
  67. package/src/lib/workflow-engine/workflow-engine.module.js.map +1 -1
  68. package/src/lib/workflow-engine/workflow-engine.service.d.ts +5 -2
  69. package/src/lib/workflow-engine/workflow-engine.service.js +142 -26
  70. package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -1
  71. package/src/lib/workflow-webhook/index.d.ts +24 -0
  72. package/src/lib/workflow-webhook/index.js +28 -0
  73. package/src/lib/workflow-webhook/index.js.map +1 -0
  74. package/src/lib/workflow-webhook/workflow-webhook-allowlist.d.ts +38 -0
  75. package/src/lib/workflow-webhook/workflow-webhook-allowlist.js +296 -0
  76. package/src/lib/workflow-webhook/workflow-webhook-allowlist.js.map +1 -0
  77. package/src/lib/workflow-webhook/workflow-webhook-database-source.d.ts +33 -0
  78. package/src/lib/workflow-webhook/workflow-webhook-database-source.js +129 -0
  79. package/src/lib/workflow-webhook/workflow-webhook-database-source.js.map +1 -0
  80. package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.d.ts +25 -0
  81. package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.js +92 -0
  82. package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.js.map +1 -0
  83. package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.d.ts +53 -0
  84. package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.js +97 -0
  85. package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.js.map +1 -0
  86. package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.d.ts +28 -0
  87. package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.js +36 -0
  88. package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.js.map +1 -0
  89. package/src/lib/workflow-webhook/workflow-webhook-delivery.object.d.ts +28 -0
  90. package/src/lib/workflow-webhook/workflow-webhook-delivery.object.js +88 -0
  91. package/src/lib/workflow-webhook/workflow-webhook-delivery.object.js.map +1 -0
  92. package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.d.ts +9 -0
  93. package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.js +66 -0
  94. package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.js.map +1 -0
  95. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.d.ts +116 -0
  96. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js +705 -0
  97. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js.map +1 -0
  98. package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.d.ts +23 -0
  99. package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.js +85 -0
  100. package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.js.map +1 -0
  101. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.d.ts +85 -0
  102. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.js +345 -0
  103. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.js.map +1 -0
  104. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.d.ts +23 -0
  105. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.js +159 -0
  106. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.js.map +1 -0
  107. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.d.ts +93 -0
  108. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.js +464 -0
  109. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.js.map +1 -0
  110. package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.d.ts +52 -0
  111. package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.js +135 -0
  112. package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.js.map +1 -0
  113. package/src/lib/workflow-webhook/workflow-webhook-enqueue.d.ts +46 -0
  114. package/src/lib/workflow-webhook/workflow-webhook-enqueue.js +134 -0
  115. package/src/lib/workflow-webhook/workflow-webhook-enqueue.js.map +1 -0
  116. package/src/lib/workflow-webhook/workflow-webhook-options.d.ts +86 -0
  117. package/src/lib/workflow-webhook/workflow-webhook-options.js +88 -0
  118. package/src/lib/workflow-webhook/workflow-webhook-options.js.map +1 -0
  119. package/src/lib/workflow-webhook/workflow-webhook-options.module.d.ts +18 -0
  120. package/src/lib/workflow-webhook/workflow-webhook-options.module.js +57 -0
  121. package/src/lib/workflow-webhook/workflow-webhook-options.module.js.map +1 -0
  122. package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.d.ts +20 -0
  123. package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.js +66 -0
  124. package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.js.map +1 -0
  125. package/src/lib/workflow-webhook/workflow-webhook.errors.d.ts +35 -0
  126. package/src/lib/workflow-webhook/workflow-webhook.errors.js +41 -0
  127. package/src/lib/workflow-webhook/workflow-webhook.errors.js.map +1 -0
  128. package/src/lib/workflow-webhook/workflow-webhook.module.d.ts +9 -0
  129. package/src/lib/workflow-webhook/workflow-webhook.module.js +62 -0
  130. package/src/lib/workflow-webhook/workflow-webhook.module.js.map +1 -0
  131. package/src/lib/workflow-webhook/workflow-webhook.provider.d.ts +12 -0
  132. package/src/lib/workflow-webhook/workflow-webhook.provider.js +21 -0
  133. package/src/lib/workflow-webhook/workflow-webhook.provider.js.map +1 -0
  134. package/src/lib/workflow-webhook/workflow-webhook.queries.d.ts +38 -0
  135. package/src/lib/workflow-webhook/workflow-webhook.queries.js +142 -0
  136. package/src/lib/workflow-webhook/workflow-webhook.queries.js.map +1 -0
  137. package/src/lib/workflow-webhook/workflow-webhook.service.d.ts +50 -0
  138. package/src/lib/workflow-webhook/workflow-webhook.service.js +221 -0
  139. package/src/lib/workflow-webhook/workflow-webhook.service.js.map +1 -0
  140. package/src/lib/workflow-webhook/workflow-webhook.types.d.ts +127 -0
  141. package/src/lib/workflow-webhook/workflow-webhook.types.js +33 -0
  142. package/src/lib/workflow-webhook/workflow-webhook.types.js.map +1 -0
  143. package/src/lib/workflow-webhook/workflow-webhook.validator.d.ts +20 -0
  144. package/src/lib/workflow-webhook/workflow-webhook.validator.js +97 -0
  145. package/src/lib/workflow-webhook/workflow-webhook.validator.js.map +1 -0
@@ -0,0 +1,24 @@
1
+ export * from './workflow-webhook-allowlist';
2
+ export * from './workflow-webhook-database-source';
3
+ export * from './workflow-webhook-delivery-scheduler.service';
4
+ export * from './workflow-webhook-delivery.entity';
5
+ export * from './workflow-webhook-delivery.enums';
6
+ export * from './workflow-webhook-delivery.object';
7
+ export * from './workflow-webhook-delivery.resolver';
8
+ export * from './workflow-webhook-delivery.service';
9
+ export * from './workflow-webhook-delivery.subscriber';
10
+ export * from './workflow-webhook-endpoint-admin.dto';
11
+ export * from './workflow-webhook-endpoint-admin.resolver';
12
+ export * from './workflow-webhook-endpoint-admin.service';
13
+ export * from './workflow-webhook-endpoint.entity';
14
+ export * from './workflow-webhook-enqueue';
15
+ export * from './workflow-webhook-options';
16
+ export * from './workflow-webhook-options.module';
17
+ export * from './workflow-webhook-secret-cipher';
18
+ export * from './workflow-webhook.errors';
19
+ export * from './workflow-webhook.module';
20
+ export * from './workflow-webhook.provider';
21
+ export * from './workflow-webhook.queries';
22
+ export * from './workflow-webhook.service';
23
+ export * from './workflow-webhook.types';
24
+ export * from './workflow-webhook.validator';
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./workflow-webhook-allowlist"), exports);
5
+ tslib_1.__exportStar(require("./workflow-webhook-database-source"), exports);
6
+ tslib_1.__exportStar(require("./workflow-webhook-delivery-scheduler.service"), exports);
7
+ tslib_1.__exportStar(require("./workflow-webhook-delivery.entity"), exports);
8
+ tslib_1.__exportStar(require("./workflow-webhook-delivery.enums"), exports);
9
+ tslib_1.__exportStar(require("./workflow-webhook-delivery.object"), exports);
10
+ tslib_1.__exportStar(require("./workflow-webhook-delivery.resolver"), exports);
11
+ tslib_1.__exportStar(require("./workflow-webhook-delivery.service"), exports);
12
+ tslib_1.__exportStar(require("./workflow-webhook-delivery.subscriber"), exports);
13
+ tslib_1.__exportStar(require("./workflow-webhook-endpoint-admin.dto"), exports);
14
+ tslib_1.__exportStar(require("./workflow-webhook-endpoint-admin.resolver"), exports);
15
+ tslib_1.__exportStar(require("./workflow-webhook-endpoint-admin.service"), exports);
16
+ tslib_1.__exportStar(require("./workflow-webhook-endpoint.entity"), exports);
17
+ tslib_1.__exportStar(require("./workflow-webhook-enqueue"), exports);
18
+ tslib_1.__exportStar(require("./workflow-webhook-options"), exports);
19
+ tslib_1.__exportStar(require("./workflow-webhook-options.module"), exports);
20
+ tslib_1.__exportStar(require("./workflow-webhook-secret-cipher"), exports);
21
+ tslib_1.__exportStar(require("./workflow-webhook.errors"), exports);
22
+ tslib_1.__exportStar(require("./workflow-webhook.module"), exports);
23
+ tslib_1.__exportStar(require("./workflow-webhook.provider"), exports);
24
+ tslib_1.__exportStar(require("./workflow-webhook.queries"), exports);
25
+ tslib_1.__exportStar(require("./workflow-webhook.service"), exports);
26
+ tslib_1.__exportStar(require("./workflow-webhook.types"), exports);
27
+ tslib_1.__exportStar(require("./workflow-webhook.validator"), exports);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/index.ts"],"names":[],"mappings":";;;AAAA,uEAA6C;AAC7C,6EAAmD;AACnD,wFAA8D;AAC9D,6EAAmD;AACnD,4EAAkD;AAClD,6EAAmD;AACnD,+EAAqD;AACrD,8EAAoD;AACpD,iFAAuD;AACvD,gFAAsD;AACtD,qFAA2D;AAC3D,oFAA0D;AAC1D,6EAAmD;AACnD,qEAA2C;AAC3C,qEAA2C;AAC3C,4EAAkD;AAClD,2EAAiD;AACjD,oEAA0C;AAC1C,oEAA0C;AAC1C,sEAA4C;AAC5C,qEAA2C;AAC3C,qEAA2C;AAC3C,mEAAyC;AACzC,uEAA6C"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * URL allowlist for webhook endpoints (ADR 18 §3.13).
3
+ *
4
+ * Pure functions: parsing happens once at boot so a malformed pattern fails
5
+ * the application rather than silently allowing or denying everything, and
6
+ * matching is called again on every delivery attempt so tightening the list
7
+ * takes effect on deliveries that are already queued.
8
+ */
9
+ export type WorkflowWebhookUrlScheme = 'http' | 'https';
10
+ export interface ParsedWorkflowWebhookUrlPattern {
11
+ /** Matches the URL's effective port (the scheme default when implicit). */
12
+ readonly port: string;
13
+ readonly scheme: WorkflowWebhookUrlScheme;
14
+ /** The pattern as written, for diagnostics. */
15
+ readonly source: string;
16
+ /**
17
+ * `true` when the host part carries no wildcard. Only an exact host may opt
18
+ * into a loopback or private address.
19
+ */
20
+ readonly hasLiteralHost: boolean;
21
+ readonly hostMatcher: RegExp;
22
+ readonly pathMatcher: RegExp;
23
+ readonly hostname: string;
24
+ }
25
+ export interface WorkflowWebhookUrlPatternParseResult {
26
+ readonly errors: readonly string[];
27
+ readonly patterns: readonly ParsedWorkflowWebhookUrlPattern[];
28
+ }
29
+ export declare function parseWorkflowWebhookUrlPatterns(patterns: readonly string[]): WorkflowWebhookUrlPatternParseResult;
30
+ export declare function parseWorkflowWebhookUrlPattern(pattern: string): ParsedWorkflowWebhookUrlPattern;
31
+ /**
32
+ * Whether `url` may be called. An empty pattern list denies everything: the
33
+ * caller decides whether an unconfigured allowlist means "deny" (the database
34
+ * source) or "not enforced" (the registry source), and conflating the two here
35
+ * would turn a missing configuration into an open door.
36
+ */
37
+ export declare function isWorkflowWebhookUrlAllowed(url: string, patterns: readonly ParsedWorkflowWebhookUrlPattern[]): boolean;
38
+ export declare function isInternalHostname(hostname: string): boolean;
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ /**
3
+ * URL allowlist for webhook endpoints (ADR 18 §3.13).
4
+ *
5
+ * Pure functions: parsing happens once at boot so a malformed pattern fails
6
+ * the application rather than silently allowing or denying everything, and
7
+ * matching is called again on every delivery attempt so tightening the list
8
+ * takes effect on deliveries that are already queued.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.parseWorkflowWebhookUrlPatterns = parseWorkflowWebhookUrlPatterns;
12
+ exports.parseWorkflowWebhookUrlPattern = parseWorkflowWebhookUrlPattern;
13
+ exports.isWorkflowWebhookUrlAllowed = isWorkflowWebhookUrlAllowed;
14
+ exports.isInternalHostname = isInternalHostname;
15
+ const DEFAULT_PORTS = {
16
+ http: '80',
17
+ https: '443',
18
+ };
19
+ const LOOPBACK_HOSTNAMES = [
20
+ 'localhost',
21
+ '127.0.0.1',
22
+ '0.0.0.0',
23
+ '[::1]',
24
+ '[::]',
25
+ ];
26
+ function parseWorkflowWebhookUrlPatterns(patterns) {
27
+ const results = patterns.map((pattern, index) => {
28
+ try {
29
+ return { pattern: parseWorkflowWebhookUrlPattern(pattern) };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ error: `workflowWebhookAllowedUrlPatterns[${index}] ${error instanceof Error ? error.message : 'is invalid'}`,
34
+ };
35
+ }
36
+ });
37
+ return {
38
+ errors: results.flatMap((result) => (result.error ? [result.error] : [])),
39
+ patterns: results.flatMap((result) => result.pattern ? [result.pattern] : []),
40
+ };
41
+ }
42
+ function parseWorkflowWebhookUrlPattern(pattern) {
43
+ const trimmed = pattern.trim();
44
+ if (!trimmed) {
45
+ throw new Error('is empty');
46
+ }
47
+ // A bare "*" means any public https host and any path. Internal addresses
48
+ // stay unreachable through it, like every other wildcard host.
49
+ const normalized = trimmed === '*' ? 'https://**/*' : trimmed;
50
+ const schemeMatch = /^([A-Za-z][A-Za-z0-9+.-]*):\/\//u.exec(normalized);
51
+ const scheme = schemeMatch ? schemeMatch[1].toLowerCase() : 'https';
52
+ if (scheme !== 'http' && scheme !== 'https') {
53
+ throw new Error(`"${pattern}" must use http:// or https://`);
54
+ }
55
+ const remainder = schemeMatch
56
+ ? normalized.slice(schemeMatch[0].length)
57
+ : normalized;
58
+ const slashIndex = remainder.indexOf('/');
59
+ const authority = slashIndex === -1 ? remainder : remainder.slice(0, slashIndex);
60
+ const path = slashIndex === -1 ? '/*' : remainder.slice(slashIndex);
61
+ if (!authority) {
62
+ throw new Error(`"${pattern}" is missing a host`);
63
+ }
64
+ if (authority.includes('@')) {
65
+ throw new Error(`"${pattern}" must not carry credentials`);
66
+ }
67
+ const portMatch = /:([0-9*]+)$/u.exec(authority);
68
+ const hostname = (portMatch ? authority.slice(0, -portMatch[0].length) : authority).toLowerCase();
69
+ const port = portMatch ? portMatch[1] : DEFAULT_PORTS[scheme];
70
+ if (!hostname) {
71
+ throw new Error(`"${pattern}" is missing a host`);
72
+ }
73
+ if (!/^[A-Za-z0-9*.\-[\]:]+$/u.test(hostname)) {
74
+ throw new Error(`"${pattern}" has an invalid host`);
75
+ }
76
+ return {
77
+ hasLiteralHost: !hostname.includes('*'),
78
+ hostMatcher: buildHostMatcher(hostname, pattern),
79
+ hostname,
80
+ pathMatcher: buildPathMatcher(path),
81
+ port,
82
+ scheme,
83
+ source: pattern,
84
+ };
85
+ }
86
+ /**
87
+ * Whether `url` may be called. An empty pattern list denies everything: the
88
+ * caller decides whether an unconfigured allowlist means "deny" (the database
89
+ * source) or "not enforced" (the registry source), and conflating the two here
90
+ * would turn a missing configuration into an open door.
91
+ */
92
+ function isWorkflowWebhookUrlAllowed(url, patterns) {
93
+ const parsed = parseUrl(url);
94
+ if (!parsed) {
95
+ return false;
96
+ }
97
+ return patterns.some((pattern) => matchesPattern(parsed, pattern));
98
+ }
99
+ function parseUrl(url) {
100
+ const candidate = (() => {
101
+ try {
102
+ return new URL(url);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ })();
108
+ if (!candidate) {
109
+ return null;
110
+ }
111
+ const scheme = candidate.protocol.replace(':', '').toLowerCase();
112
+ if (scheme !== 'http' && scheme !== 'https') {
113
+ return null;
114
+ }
115
+ // Credentials in the URL are never legitimate here and would let an
116
+ // otherwise-allowed host smuggle a different authority past a reader.
117
+ if (candidate.username || candidate.password) {
118
+ return null;
119
+ }
120
+ return {
121
+ hostname: candidate.hostname.toLowerCase(),
122
+ path: `${candidate.pathname}${candidate.search}`,
123
+ port: candidate.port || DEFAULT_PORTS[scheme],
124
+ scheme,
125
+ };
126
+ }
127
+ function matchesPattern(url, pattern) {
128
+ if (url.scheme !== pattern.scheme) {
129
+ return false;
130
+ }
131
+ if (pattern.port !== '*' && url.port !== pattern.port) {
132
+ return false;
133
+ }
134
+ if (!pattern.hostMatcher.test(url.hostname)) {
135
+ return false;
136
+ }
137
+ // A wildcard host must never reach the loopback interface, a private range
138
+ // or a bare IP: those are the addresses an SSRF is after, and a pattern that
139
+ // names them explicitly is the only way to opt in.
140
+ if (!pattern.hasLiteralHost && isInternalHostname(url.hostname)) {
141
+ return false;
142
+ }
143
+ return pattern.pathMatcher.test(url.path);
144
+ }
145
+ function isInternalHostname(hostname) {
146
+ const normalized = hostname.toLowerCase();
147
+ if (LOOPBACK_HOSTNAMES.includes(normalized)) {
148
+ return true;
149
+ }
150
+ if (normalized.endsWith('.localhost')) {
151
+ return true;
152
+ }
153
+ if (normalized.includes(':')) {
154
+ const groups = expandIpv6(normalized.replace(/[[\]]/gu, ''));
155
+ // Not a parseable IPv6 literal: refuse to call it public.
156
+ if (!groups) {
157
+ return true;
158
+ }
159
+ const embedded = readEmbeddedIpv4(groups);
160
+ // ::ffff:127.0.0.1, ::127.0.0.1 and 64:ff9b::127.0.0.1 all reach an IPv4
161
+ // address, so judge the address they carry rather than the wrapper.
162
+ if (embedded) {
163
+ return isInternalHostname(embedded);
164
+ }
165
+ const [first] = groups;
166
+ return (groups.every((group) => group === 0) ||
167
+ (groups.slice(0, 7).every((group) => group === 0) && groups[7] === 1) ||
168
+ // Unique-local fc00::/7, link-local fe80::/10, deprecated site-local
169
+ // fec0::/10 and multicast ff00::/8.
170
+ (first & 0xfe00) === 0xfc00 ||
171
+ (first & 0xffc0) === 0xfe80 ||
172
+ (first & 0xffc0) === 0xfec0 ||
173
+ (first & 0xff00) === 0xff00);
174
+ }
175
+ const octets = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/u.exec(normalized);
176
+ if (!octets) {
177
+ return false;
178
+ }
179
+ const [first, second] = octets.slice(1).map((value) => Number(value));
180
+ const third = Number(octets[3]);
181
+ return (first === 0 ||
182
+ first === 10 ||
183
+ first === 127 ||
184
+ (first === 100 && second >= 64 && second <= 127) ||
185
+ (first === 169 && second === 254) ||
186
+ (first === 172 && second >= 16 && second <= 31) ||
187
+ (first === 192 && second === 0 && third === 0) ||
188
+ // TEST-NET-1/2/3 (192.0.2/24, 198.51.100/24, 203.0.113/24).
189
+ (first === 192 && second === 0 && third === 2) ||
190
+ (first === 198 && second === 51 && third === 100) ||
191
+ (first === 203 && second === 0 && third === 113) ||
192
+ (first === 192 && second === 168) ||
193
+ (first === 198 && (second === 18 || second === 19)) ||
194
+ // Multicast (224/4), reserved (240/4) and broadcast are never a webhook.
195
+ first >= 224);
196
+ }
197
+ /** Eight 16-bit groups, or `null` when the literal is not valid IPv6. */
198
+ function expandIpv6(literal) {
199
+ const dottedTail = /^(.*:)(\d{1,3}(?:\.\d{1,3}){3})$/u.exec(literal);
200
+ const tailGroups = dottedTail ? ipv4ToIpv6Groups(dottedTail[2]) : null;
201
+ if (dottedTail && !tailGroups) {
202
+ return null;
203
+ }
204
+ const hexLiteral = dottedTail && tailGroups ? `${dottedTail[1]}${tailGroups}` : literal;
205
+ if ((hexLiteral.match(/::/gu) ?? []).length > 1) {
206
+ return null;
207
+ }
208
+ const [head, tail] = hexLiteral.includes('::')
209
+ ? hexLiteral.split('::')
210
+ : [hexLiteral, null];
211
+ const headGroups = head ? head.split(':') : [];
212
+ const trailingGroups = tail ? tail.split(':') : [];
213
+ const missing = 8 - headGroups.length - trailingGroups.length;
214
+ if ((tail === null && missing !== 0) || missing < 0) {
215
+ return null;
216
+ }
217
+ const groups = [
218
+ ...headGroups,
219
+ ...Array.from({ length: tail === null ? 0 : missing }, () => '0'),
220
+ ...trailingGroups,
221
+ ];
222
+ return groups.every((group) => /^[0-9a-f]{1,4}$/u.test(group))
223
+ ? groups.map((group) => Number.parseInt(group, 16))
224
+ : null;
225
+ }
226
+ function ipv4ToIpv6Groups(ipv4) {
227
+ const octets = ipv4.split('.').map((octet) => Number(octet));
228
+ if (octets.some((octet) => octet > 255)) {
229
+ return null;
230
+ }
231
+ return [
232
+ ((octets[0] << 8) | octets[1]).toString(16),
233
+ ((octets[2] << 8) | octets[3]).toString(16),
234
+ ].join(':');
235
+ }
236
+ /**
237
+ * The IPv4 address an IPv6 literal carries in its low 32 bits, for the
238
+ * prefixes that route to it: IPv4-mapped ::ffff:0:0/96, SIIT
239
+ * ::ffff:0:0:0/96, IPv4-compatible ::/96 and NAT64 64:ff9b::/96.
240
+ */
241
+ function readEmbeddedIpv4(groups) {
242
+ const prefix = groups.slice(0, 6);
243
+ const zeroes = (count) => prefix.slice(0, count).every((group) => group === 0);
244
+ const carriesIpv4 = (zeroes(5) && prefix[5] === 0xffff) ||
245
+ (zeroes(4) && prefix[4] === 0xffff && prefix[5] === 0) ||
246
+ // ::/96 minus :: and ::1, which are judged as IPv6 themselves.
247
+ (zeroes(6) && (groups[6] !== 0 || groups[7] > 1)) ||
248
+ (prefix[0] === 0x64 &&
249
+ prefix[1] === 0xff9b &&
250
+ prefix.slice(2).every((group) => group === 0));
251
+ if (!carriesIpv4) {
252
+ return null;
253
+ }
254
+ return [
255
+ groups[6] >> 8,
256
+ groups[6] & 0xff,
257
+ groups[7] >> 8,
258
+ groups[7] & 0xff,
259
+ ].join('.');
260
+ }
261
+ function buildHostMatcher(hostname, pattern) {
262
+ const labels = hostname.split('.');
263
+ // "**" on its own is the any-host wildcard, which the bare "*" pattern
264
+ // normalizes to; every other use is a subdomain prefix.
265
+ if (labels.length === 1 && labels[0] === '**') {
266
+ return /^[a-z0-9.-]+$/u;
267
+ }
268
+ const parts = labels.map((label, index) => {
269
+ if (label === '**') {
270
+ if (index !== 0) {
271
+ throw new Error(`"${pattern}" may only use ** as the first host label`);
272
+ }
273
+ // Zero or more labels, so **.example.com also matches example.com.
274
+ return '(?:[a-z0-9-]+\\.)*';
275
+ }
276
+ if (label === '*') {
277
+ return `[a-z0-9-]+${index === labels.length - 1 ? '' : '\\.'}`;
278
+ }
279
+ if (label.includes('*')) {
280
+ throw new Error(`"${pattern}" may only use * as a whole host label, not part of one`);
281
+ }
282
+ return `${escapeRegExp(label)}${index === labels.length - 1 ? '' : '\\.'}`;
283
+ });
284
+ return new RegExp(`^${parts.join('')}$`, 'u');
285
+ }
286
+ function buildPathMatcher(path) {
287
+ const escaped = path
288
+ .split('*')
289
+ .map((segment) => escapeRegExp(segment))
290
+ .join('.*');
291
+ return new RegExp(`^${escaped}$`, 'u');
292
+ }
293
+ function escapeRegExp(value) {
294
+ return value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
295
+ }
296
+ //# sourceMappingURL=workflow-webhook-allowlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-webhook-allowlist.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-allowlist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { OnApplicationBootstrap } from '@nestjs/common';
2
+ import { EntityManager, Repository } from 'typeorm';
3
+ import { WorkflowWebhookEndpointEntity } from './workflow-webhook-endpoint.entity';
4
+ import { BPMResolvedWorkflowWebhookOptions } from './workflow-webhook-options';
5
+ import { BPMWorkflowWebhookEndpoint, BPMWorkflowWebhookEndpointSource } from './workflow-webhook.types';
6
+ /**
7
+ * Endpoints maintained by a BPM administrator (ADR 18 §3.13), read straight
8
+ * from `workflow_webhook_endpoints` on every lookup so a change applies to
9
+ * the next attempt without a restart or a cache to invalidate.
10
+ *
11
+ * A disabled row is still returned, flagged `disabled` (and `deprecated`, so
12
+ * the designer stops offering it): a delivery must be able to tell "switched
13
+ * off" from "never existed".
14
+ */
15
+ export declare class DatabaseWorkflowWebhookEndpointSource implements BPMWorkflowWebhookEndpointSource, OnApplicationBootstrap {
16
+ private readonly endpointRepository;
17
+ readonly kind: "DATABASE";
18
+ private readonly logger;
19
+ private readonly cipher;
20
+ constructor(endpointRepository: Repository<WorkflowWebhookEndpointEntity>, options?: BPMResolvedWorkflowWebhookOptions);
21
+ /**
22
+ * A wrong key still boots (any 32 bytes parse), and would otherwise only
23
+ * show up as every database delivery failing to build its request. One
24
+ * stored value is decrypted at boot so the mistake is logged at once; the
25
+ * log names the problem, never a value.
26
+ */
27
+ onApplicationBootstrap(): Promise<void>;
28
+ get(key: string, version: number, manager?: EntityManager): Promise<BPMWorkflowWebhookEndpoint | null>;
29
+ list(): Promise<readonly BPMWorkflowWebhookEndpoint[]>;
30
+ toEndpoint(row: WorkflowWebhookEndpointEntity): BPMWorkflowWebhookEndpoint;
31
+ private readHeaders;
32
+ private decrypt;
33
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var DatabaseWorkflowWebhookEndpointSource_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DatabaseWorkflowWebhookEndpointSource = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const typeorm_1 = require("@nestjs/typeorm");
8
+ const typeorm_2 = require("typeorm");
9
+ const workflow_webhook_endpoint_entity_1 = require("./workflow-webhook-endpoint.entity");
10
+ const workflow_webhook_options_1 = require("./workflow-webhook-options");
11
+ const workflow_webhook_secret_cipher_1 = require("./workflow-webhook-secret-cipher");
12
+ /**
13
+ * Endpoints maintained by a BPM administrator (ADR 18 §3.13), read straight
14
+ * from `workflow_webhook_endpoints` on every lookup so a change applies to
15
+ * the next attempt without a restart or a cache to invalidate.
16
+ *
17
+ * A disabled row is still returned, flagged `disabled` (and `deprecated`, so
18
+ * the designer stops offering it): a delivery must be able to tell "switched
19
+ * off" from "never existed".
20
+ */
21
+ let DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource_1 = class DatabaseWorkflowWebhookEndpointSource {
22
+ constructor(endpointRepository, options = workflow_webhook_options_1.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS) {
23
+ this.endpointRepository = endpointRepository;
24
+ this.kind = 'DATABASE';
25
+ this.logger = new common_1.Logger(DatabaseWorkflowWebhookEndpointSource_1.name);
26
+ this.cipher = options.secretEncryptionKey
27
+ ? new workflow_webhook_secret_cipher_1.WorkflowWebhookSecretCipher(options.secretEncryptionKey)
28
+ : null;
29
+ }
30
+ /**
31
+ * A wrong key still boots (any 32 bytes parse), and would otherwise only
32
+ * show up as every database delivery failing to build its request. One
33
+ * stored value is decrypted at boot so the mistake is logged at once; the
34
+ * log names the problem, never a value.
35
+ */
36
+ async onApplicationBootstrap() {
37
+ if (!this.cipher) {
38
+ return;
39
+ }
40
+ const sample = await this.endpointRepository
41
+ .createQueryBuilder('endpoint')
42
+ .where('endpoint.encryptedHeaders IS NOT NULL OR endpoint.encryptedSigningSecret IS NOT NULL')
43
+ .getOne()
44
+ .catch(() => null);
45
+ const envelope = sample?.encryptedSigningSecret ?? sample?.encryptedHeaders ?? null;
46
+ if (!envelope) {
47
+ return;
48
+ }
49
+ try {
50
+ this.cipher.decrypt(envelope);
51
+ }
52
+ catch {
53
+ this.logger.error('workflowWebhookSecretEncryptionKey cannot decrypt the stored webhook endpoint secrets; database endpoint deliveries will fail until the original key is restored');
54
+ }
55
+ }
56
+ async get(key, version, manager) {
57
+ const repository = manager?.getRepository(workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointEntity) ??
58
+ this.endpointRepository;
59
+ const row = await repository.findOne({ where: { key, version } });
60
+ return row ? this.toEndpoint(row) : null;
61
+ }
62
+ async list() {
63
+ const rows = await this.endpointRepository.find({
64
+ order: { key: 'ASC', version: 'ASC' },
65
+ });
66
+ return rows.map((row) => this.toEndpoint(row));
67
+ }
68
+ toEndpoint(row) {
69
+ return {
70
+ // Decrypted per attempt, so a rotated secret or edited header applies
71
+ // to deliveries that are already queued.
72
+ buildRequest: async () => ({
73
+ headers: this.readHeaders(row.encryptedHeaders),
74
+ method: readMethod(row.method),
75
+ ...(row.encryptedSigningSecret
76
+ ? { signingSecret: this.decrypt(row.encryptedSigningSecret) }
77
+ : {}),
78
+ ...(row.timeoutMs ? { timeoutMs: row.timeoutMs } : {}),
79
+ url: row.url,
80
+ }),
81
+ descriptor: {
82
+ deprecated: row.deprecated || !row.isActive,
83
+ ...(row.description ? { description: row.description } : {}),
84
+ disabled: !row.isActive,
85
+ key: row.key,
86
+ label: row.label,
87
+ parameters: row.parameters.map((parameter) => ({
88
+ ...(parameter.description
89
+ ? { description: parameter.description }
90
+ : {}),
91
+ key: parameter.key,
92
+ label: parameter.label,
93
+ required: parameter.required,
94
+ type: parameter.type,
95
+ })),
96
+ version: row.version,
97
+ },
98
+ };
99
+ }
100
+ readHeaders(envelope) {
101
+ if (!envelope) {
102
+ return {};
103
+ }
104
+ const parsed = JSON.parse(this.decrypt(envelope));
105
+ return typeof parsed === 'object' && parsed !== null
106
+ ? Object.fromEntries(Object.entries(parsed).filter((entry) => typeof entry[1] === 'string'))
107
+ : {};
108
+ }
109
+ decrypt(envelope) {
110
+ if (!this.cipher) {
111
+ // Unreachable through BPM's own wiring: without a key the options
112
+ // resolution drops this source, so its rows are not looked up at all.
113
+ throw new Error('Webhook secret encryption key is not configured');
114
+ }
115
+ return this.cipher.decrypt(envelope);
116
+ }
117
+ };
118
+ exports.DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource;
119
+ exports.DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource_1 = tslib_1.__decorate([
120
+ (0, common_1.Injectable)(),
121
+ tslib_1.__param(0, (0, typeorm_1.InjectRepository)(workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointEntity)),
122
+ tslib_1.__param(1, (0, common_1.Optional)()),
123
+ tslib_1.__param(1, (0, common_1.Inject)(workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS)),
124
+ tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository, Object])
125
+ ], DatabaseWorkflowWebhookEndpointSource);
126
+ function readMethod(value) {
127
+ return value === 'PUT' || value === 'PATCH' ? value : 'POST';
128
+ }
129
+ //# sourceMappingURL=workflow-webhook-database-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-webhook-database-source.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-database-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common';
2
+ import { WorkflowWebhookDeliveryService } from './workflow-webhook-delivery.service';
3
+ import { WorkflowWebhookService } from './workflow-webhook.service';
4
+ /**
5
+ * The fallback that retries failed attempts, releases rows the immediate kick
6
+ * missed, and reclaims rows a crashed worker left in progress. `SKIP LOCKED`
7
+ * in the claim lets several API instances run it at once.
8
+ */
9
+ export declare class WorkflowWebhookDeliverySchedulerService implements OnApplicationBootstrap, OnApplicationShutdown {
10
+ private readonly deliveryService;
11
+ private readonly webhookService;
12
+ private readonly logger;
13
+ private timer;
14
+ private scanning;
15
+ constructor(deliveryService: WorkflowWebhookDeliveryService, webhookService: WorkflowWebhookService);
16
+ onApplicationBootstrap(): Promise<void>;
17
+ onApplicationShutdown(): void;
18
+ /**
19
+ * Unset means "on when there is anything to deliver to": a host with no
20
+ * endpoints gets no idle timer, and one with endpoints never silently loses
21
+ * its retries.
22
+ */
23
+ isEnabled(): Promise<boolean>;
24
+ scan(): Promise<void>;
25
+ }