@checkfirst/nestjs-outlook 9.0.0 → 9.0.2
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/dist/controllers/calendar.controller.d.ts +1 -0
- package/dist/controllers/calendar.controller.js +57 -44
- package/dist/controllers/calendar.controller.js.map +1 -1
- package/dist/controllers/email.controller.d.ts +1 -0
- package/dist/controllers/email.controller.js +29 -15
- package/dist/controllers/email.controller.js.map +1 -1
- package/dist/enums/event-types.enum.d.ts +2 -1
- package/dist/enums/event-types.enum.js +1 -0
- package/dist/enums/event-types.enum.js.map +1 -1
- package/dist/guards/webhook-client-state.guard.d.ts +25 -1
- package/dist/guards/webhook-client-state.guard.js +42 -15
- package/dist/guards/webhook-client-state.guard.js.map +1 -1
- package/dist/interfaces/config/outlook-config.interface.d.ts +4 -0
- package/dist/repositories/outlook-webhook-subscription.repository.d.ts +1 -0
- package/dist/repositories/outlook-webhook-subscription.repository.js +8 -0
- package/dist/repositories/outlook-webhook-subscription.repository.js.map +1 -1
- package/dist/services/calendar/calendar.service.js +4 -3
- package/dist/services/calendar/calendar.service.js.map +1 -1
- package/dist/services/calendar/lifecycle-event-handler.service.d.ts +1 -3
- package/dist/services/calendar/lifecycle-event-handler.service.js +6 -15
- package/dist/services/calendar/lifecycle-event-handler.service.js.map +1 -1
- package/dist/services/email/email.service.js +11 -4
- package/dist/services/email/email.service.js.map +1 -1
- package/dist/services/subscription/microsoft-subscription.service.d.ts +4 -9
- package/dist/services/subscription/microsoft-subscription.service.js +77 -148
- package/dist/services/subscription/microsoft-subscription.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -9,5 +9,6 @@ export declare class CalendarController {
|
|
|
9
9
|
constructor(calendarService: CalendarService, lifecycleEventHandler: LifecycleEventHandlerService);
|
|
10
10
|
handleCalendarWebhookNotification(validationToken: string, notificationBody: OutlookWebhookNotificationDto, req: Request, res: Response): Promise<void>;
|
|
11
11
|
handleCalendarWebhook(validationToken: string, notificationBody: OutlookWebhookNotificationDto, req: Request, res: Response): Promise<void>;
|
|
12
|
+
private filterAuthorizedItems;
|
|
12
13
|
private processCalendarNotificationBatch;
|
|
13
14
|
}
|
|
@@ -40,33 +40,26 @@ let CalendarController = CalendarController_1 = class CalendarController {
|
|
|
40
40
|
const webhookTraceId = (0, crypto_1.randomUUID)();
|
|
41
41
|
this.logger.log(`[WEBHOOK_RECEIVED] webhookTraceId=${webhookTraceId}, endpoint=notification, notificationCount=${notificationBody.value.length}`);
|
|
42
42
|
this.logger.debug(`Received webhook notification: ${JSON.stringify(notificationBody)}`);
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const { authorized, rejectedCount } = this.filterAuthorizedItems(req, Array.isArray(notificationBody.value) ? notificationBody.value : []);
|
|
44
|
+
if (rejectedCount > 0) {
|
|
45
|
+
this.logger.warn(`[SECURITY] Skipping ${rejectedCount.toString()} rejected webhook item(s), webhookTraceId=${webhookTraceId}`);
|
|
46
|
+
}
|
|
47
|
+
if (authorized.length === 0) {
|
|
48
|
+
res.json({
|
|
49
|
+
success: true,
|
|
50
|
+
message: rejectedCount > 0
|
|
51
|
+
? `Rejected ${rejectedCount.toString()} notification(s) failing security validation`
|
|
52
|
+
: `Received webhook notification with unexpected format`,
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (authorized.length > 2) {
|
|
57
|
+
this.logger.log(`Received batch of ${authorized.length.toString()} notifications, responding with 202 Accepted`);
|
|
45
58
|
res.status(202).json({
|
|
46
59
|
success: true,
|
|
47
60
|
message: 'Notifications accepted for processing',
|
|
48
61
|
});
|
|
49
|
-
|
|
50
|
-
for (const item of notificationBody.value) {
|
|
51
|
-
await this.calendarService.handleOutlookWebhookV2({
|
|
52
|
-
subscriptionId: item.subscriptionId,
|
|
53
|
-
subscriptionExpirationDateTime: item.subscriptionExpirationDateTime,
|
|
54
|
-
changeType: item.changeType,
|
|
55
|
-
resource: item.resource,
|
|
56
|
-
resourceData: item.resourceData,
|
|
57
|
-
clientState: item.clientState,
|
|
58
|
-
tenantId: item.tenantId,
|
|
59
|
-
}, webhookTraceId);
|
|
60
|
-
}
|
|
61
|
-
res.json({
|
|
62
|
-
success: true,
|
|
63
|
-
message: `Notifications accepted for processing`,
|
|
64
|
-
});
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (Array.isArray(notificationBody.value) && notificationBody.value.length > 0) {
|
|
69
|
-
for (const item of notificationBody.value) {
|
|
62
|
+
for (const item of authorized) {
|
|
70
63
|
await this.calendarService.handleOutlookWebhookV2({
|
|
71
64
|
subscriptionId: item.subscriptionId,
|
|
72
65
|
subscriptionExpirationDateTime: item.subscriptionExpirationDateTime,
|
|
@@ -77,16 +70,22 @@ let CalendarController = CalendarController_1 = class CalendarController {
|
|
|
77
70
|
tenantId: item.tenantId,
|
|
78
71
|
}, webhookTraceId);
|
|
79
72
|
}
|
|
80
|
-
res.json({
|
|
81
|
-
success: true,
|
|
82
|
-
message: `Processed ${notificationBody.value.length.toString()} notifications`,
|
|
83
|
-
});
|
|
84
73
|
return;
|
|
85
74
|
}
|
|
86
|
-
|
|
75
|
+
for (const item of authorized) {
|
|
76
|
+
await this.calendarService.handleOutlookWebhookV2({
|
|
77
|
+
subscriptionId: item.subscriptionId,
|
|
78
|
+
subscriptionExpirationDateTime: item.subscriptionExpirationDateTime,
|
|
79
|
+
changeType: item.changeType,
|
|
80
|
+
resource: item.resource,
|
|
81
|
+
resourceData: item.resourceData,
|
|
82
|
+
clientState: item.clientState,
|
|
83
|
+
tenantId: item.tenantId,
|
|
84
|
+
}, webhookTraceId);
|
|
85
|
+
}
|
|
87
86
|
res.json({
|
|
88
87
|
success: true,
|
|
89
|
-
message: `
|
|
88
|
+
message: `Processed ${authorized.length.toString()} notifications`,
|
|
90
89
|
});
|
|
91
90
|
}
|
|
92
91
|
catch (error) {
|
|
@@ -111,30 +110,35 @@ let CalendarController = CalendarController_1 = class CalendarController {
|
|
|
111
110
|
const webhookTraceId = (0, crypto_1.randomUUID)();
|
|
112
111
|
this.logger.log(`[WEBHOOK_RECEIVED] webhookTraceId=${webhookTraceId}, endpoint=webhook, notificationCount=${notificationBody.value.length}`);
|
|
113
112
|
this.logger.debug(`Received webhook notification: ${JSON.stringify(notificationBody)}`);
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
const { authorized, rejectedCount } = this.filterAuthorizedItems(req, Array.isArray(notificationBody.value) ? notificationBody.value : []);
|
|
114
|
+
if (rejectedCount > 0) {
|
|
115
|
+
this.logger.warn(`[SECURITY] Skipping ${rejectedCount.toString()} rejected webhook item(s), webhookTraceId=${webhookTraceId}`);
|
|
116
|
+
}
|
|
117
|
+
if (authorized.length === 0) {
|
|
118
|
+
res.json({
|
|
119
|
+
success: true,
|
|
120
|
+
message: rejectedCount > 0
|
|
121
|
+
? `Rejected ${rejectedCount.toString()} notification(s) failing security validation`
|
|
122
|
+
: `Received webhook notification with unexpected format`,
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (authorized.length > 2) {
|
|
127
|
+
this.logger.log(`Received batch of ${authorized.length.toString()} notifications, responding with 202 Accepted`);
|
|
116
128
|
res.status(202).json({
|
|
117
129
|
success: true,
|
|
118
130
|
message: 'Notifications accepted for processing',
|
|
119
131
|
});
|
|
120
|
-
this.processCalendarNotificationBatch(
|
|
132
|
+
this.processCalendarNotificationBatch(authorized, webhookTraceId).catch((error) => {
|
|
121
133
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
122
134
|
this.logger.error(`Error processing notification batch: ${errorMessage}`);
|
|
123
135
|
});
|
|
124
136
|
return;
|
|
125
137
|
}
|
|
126
|
-
|
|
127
|
-
const results = await this.processCalendarNotificationBatch(notificationBody, webhookTraceId);
|
|
128
|
-
res.json({
|
|
129
|
-
success: true,
|
|
130
|
-
message: `Processed ${results.successCount.toString()} out of ${notificationBody.value.length.toString()} notifications`,
|
|
131
|
-
});
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
this.logger.warn('Received webhook notification with unexpected format');
|
|
138
|
+
const results = await this.processCalendarNotificationBatch(authorized, webhookTraceId);
|
|
135
139
|
res.json({
|
|
136
140
|
success: true,
|
|
137
|
-
message: `
|
|
141
|
+
message: `Processed ${results.successCount.toString()} out of ${authorized.length.toString()} notifications`,
|
|
138
142
|
});
|
|
139
143
|
}
|
|
140
144
|
catch (error) {
|
|
@@ -147,11 +151,20 @@ let CalendarController = CalendarController_1 = class CalendarController {
|
|
|
147
151
|
});
|
|
148
152
|
}
|
|
149
153
|
}
|
|
150
|
-
|
|
154
|
+
filterAuthorizedItems(req, items) {
|
|
155
|
+
const validation = req.webhookValidation;
|
|
156
|
+
if (!validation || validation.valid || validation.invalidItems.length === 0) {
|
|
157
|
+
return { authorized: items, rejectedCount: 0 };
|
|
158
|
+
}
|
|
159
|
+
const invalidIndexes = new Set(validation.invalidItems.map((i) => i.index));
|
|
160
|
+
const authorized = items.filter((_, idx) => !invalidIndexes.has(idx));
|
|
161
|
+
return { authorized, rejectedCount: items.length - authorized.length };
|
|
162
|
+
}
|
|
163
|
+
async processCalendarNotificationBatch(items, webhookTraceId) {
|
|
151
164
|
let successCount = 0;
|
|
152
165
|
let failureCount = 0;
|
|
153
166
|
const processedEvents = new Set();
|
|
154
|
-
for (const item of
|
|
167
|
+
for (const item of items) {
|
|
155
168
|
const validation = (0, webhook_notification_validator_1.validateNotificationItem)(item, webhook_notification_validator_1.WebhookResourceType.CALENDAR, this.logger);
|
|
156
169
|
if (validation.isLifecycleEvent) {
|
|
157
170
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.controller.js","sourceRoot":"","sources":["../../src/controllers/calendar.controller.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"calendar.controller.js","sourceRoot":"","sources":["../../src/controllers/calendar.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,6 @@ export declare class EmailController {
|
|
|
6
6
|
private readonly logger;
|
|
7
7
|
constructor(emailService: EmailService);
|
|
8
8
|
handleEmailWebhook(validationToken: string, notificationBody: OutlookWebhookNotificationDto, req: Request, res: Response): Promise<void>;
|
|
9
|
+
private filterAuthorizedItems;
|
|
9
10
|
private processEmailNotificationBatch;
|
|
10
11
|
}
|
|
@@ -35,30 +35,35 @@ let EmailController = EmailController_1 = class EmailController {
|
|
|
35
35
|
}
|
|
36
36
|
try {
|
|
37
37
|
this.logger.debug(`Received email webhook notification: ${JSON.stringify(notificationBody)}`);
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const { authorized, rejectedCount } = this.filterAuthorizedItems(req, Array.isArray(notificationBody.value) ? notificationBody.value : []);
|
|
39
|
+
if (rejectedCount > 0) {
|
|
40
|
+
this.logger.warn(`[SECURITY] Skipping ${rejectedCount.toString()} rejected email webhook item(s)`);
|
|
41
|
+
}
|
|
42
|
+
if (authorized.length === 0) {
|
|
43
|
+
res.json({
|
|
44
|
+
success: true,
|
|
45
|
+
message: rejectedCount > 0
|
|
46
|
+
? `Rejected ${rejectedCount.toString()} email notification(s) failing security validation`
|
|
47
|
+
: `Received email webhook notification with unexpected format`,
|
|
48
|
+
});
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (authorized.length > 2) {
|
|
52
|
+
this.logger.log(`Received batch of ${authorized.length.toString()} email notifications, responding with 202 Accepted`);
|
|
40
53
|
res.status(202).json({
|
|
41
54
|
success: true,
|
|
42
55
|
message: 'Email notifications accepted for processing',
|
|
43
56
|
});
|
|
44
|
-
this.processEmailNotificationBatch(
|
|
57
|
+
this.processEmailNotificationBatch(authorized).catch((error) => {
|
|
45
58
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
46
59
|
this.logger.error(`Error processing email notification batch: ${errorMessage}`);
|
|
47
60
|
});
|
|
48
61
|
return;
|
|
49
62
|
}
|
|
50
|
-
|
|
51
|
-
const results = await this.processEmailNotificationBatch(notificationBody);
|
|
52
|
-
res.json({
|
|
53
|
-
success: true,
|
|
54
|
-
message: `Processed ${results.successCount.toString()} out of ${notificationBody.value.length.toString()} email notifications`,
|
|
55
|
-
});
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
this.logger.warn('Received email webhook notification with unexpected format');
|
|
63
|
+
const results = await this.processEmailNotificationBatch(authorized);
|
|
59
64
|
res.json({
|
|
60
65
|
success: true,
|
|
61
|
-
message: `
|
|
66
|
+
message: `Processed ${results.successCount.toString()} out of ${authorized.length.toString()} email notifications`,
|
|
62
67
|
});
|
|
63
68
|
}
|
|
64
69
|
catch (error) {
|
|
@@ -71,11 +76,20 @@ let EmailController = EmailController_1 = class EmailController {
|
|
|
71
76
|
});
|
|
72
77
|
}
|
|
73
78
|
}
|
|
74
|
-
|
|
79
|
+
filterAuthorizedItems(req, items) {
|
|
80
|
+
const validation = req.webhookValidation;
|
|
81
|
+
if (!validation || validation.valid || validation.invalidItems.length === 0) {
|
|
82
|
+
return { authorized: items, rejectedCount: 0 };
|
|
83
|
+
}
|
|
84
|
+
const invalidIndexes = new Set(validation.invalidItems.map((i) => i.index));
|
|
85
|
+
const authorized = items.filter((_, idx) => !invalidIndexes.has(idx));
|
|
86
|
+
return { authorized, rejectedCount: items.length - authorized.length };
|
|
87
|
+
}
|
|
88
|
+
async processEmailNotificationBatch(items) {
|
|
75
89
|
let successCount = 0;
|
|
76
90
|
let failureCount = 0;
|
|
77
91
|
const processedMessages = new Set();
|
|
78
|
-
for (const item of
|
|
92
|
+
for (const item of items) {
|
|
79
93
|
const validation = (0, webhook_notification_validator_1.validateNotificationItem)(item, webhook_notification_validator_1.WebhookResourceType.EMAIL, this.logger);
|
|
80
94
|
if (!validation.isValid || validation.shouldSkip) {
|
|
81
95
|
failureCount++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.controller.js","sourceRoot":"","sources":["../../src/controllers/email.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAkH;AAClH,6CAA0E;AAE1E,mEAA+D;AAE/D,8FAAwF;AACxF,4FAA4H;AAC5H,
|
|
1
|
+
{"version":3,"file":"email.controller.js","sourceRoot":"","sources":["../../src/controllers/email.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,5 +17,6 @@ export declare enum OutlookEventTypes {
|
|
|
17
17
|
SUBSCRIPTION_AUTH_FAILED = "outlook.subscription.auth_failed",
|
|
18
18
|
SUBSCRIPTION_CREATION_FAILED = "outlook.subscription.creation_failed",
|
|
19
19
|
HEALTH_CHECK_COMPLETED = "outlook.cron.health_check.completed",
|
|
20
|
-
RETRY_FAILED_SUBSCRIPTIONS_COMPLETED = "outlook.cron.retry_failed_subscriptions.completed"
|
|
20
|
+
RETRY_FAILED_SUBSCRIPTIONS_COMPLETED = "outlook.cron.retry_failed_subscriptions.completed",
|
|
21
|
+
WEBHOOK_REJECTED = "outlook.webhook.rejected"
|
|
21
22
|
}
|
|
@@ -22,5 +22,6 @@ var OutlookEventTypes;
|
|
|
22
22
|
OutlookEventTypes["SUBSCRIPTION_CREATION_FAILED"] = "outlook.subscription.creation_failed";
|
|
23
23
|
OutlookEventTypes["HEALTH_CHECK_COMPLETED"] = "outlook.cron.health_check.completed";
|
|
24
24
|
OutlookEventTypes["RETRY_FAILED_SUBSCRIPTIONS_COMPLETED"] = "outlook.cron.retry_failed_subscriptions.completed";
|
|
25
|
+
OutlookEventTypes["WEBHOOK_REJECTED"] = "outlook.webhook.rejected";
|
|
25
26
|
})(OutlookEventTypes || (exports.OutlookEventTypes = OutlookEventTypes = {}));
|
|
26
27
|
//# sourceMappingURL=event-types.enum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-types.enum.js","sourceRoot":"","sources":["../../src/enums/event-types.enum.ts"],"names":[],"mappings":";;;AAGA,IAAY,
|
|
1
|
+
{"version":3,"file":"event-types.enum.js","sourceRoot":"","sources":["../../src/enums/event-types.enum.ts"],"names":[],"mappings":";;;AAGA,IAAY,iBAuCX;AAvCD,WAAY,iBAAiB;IAE3B,6EAAwD,CAAA;IACxD,6FAAwE,CAAA;IAGxE,4DAAuC,CAAA;IACvC,4DAAuC,CAAA;IACvC,4DAAuC,CAAA;IAEvC,sEAAiD,CAAA;IAGjD,2EAAsD,CAAA;IAGtD,8DAAyC,CAAA;IACzC,4DAAuC,CAAA;IACvC,4DAAuC,CAAA;IAGvC,sGAAiF,CAAA;IACjF,8FAAyE,CAAA;IACzE,kEAA6C,CAAA;IAG7C,8EAAyD,CAAA;IACzD,8FAAyE,CAAA;IACzE,kFAA6D,CAAA;IAG7D,0FAAqE,CAAA;IAGrE,mFAA8D,CAAA;IAC9D,+GAA0F,CAAA;IAG1F,kEAA6C,CAAA;AAC/C,CAAC,EAvCW,iBAAiB,iCAAjB,iBAAiB,QAuC5B"}
|
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
3
|
+
import { Request } from 'express';
|
|
2
4
|
import { OutlookWebhookSubscriptionRepository } from '../repositories/outlook-webhook-subscription.repository';
|
|
5
|
+
export type WebhookRejectionReason = 'missing_subscription_id' | 'unknown_subscription' | 'missing_stored_client_state' | 'client_state_mismatch';
|
|
6
|
+
export interface WebhookValidationItem {
|
|
7
|
+
index: number;
|
|
8
|
+
valid: boolean;
|
|
9
|
+
reason?: WebhookRejectionReason;
|
|
10
|
+
subscriptionId?: string;
|
|
11
|
+
userId?: number | null;
|
|
12
|
+
}
|
|
13
|
+
export interface WebhookValidationResult {
|
|
14
|
+
valid: boolean;
|
|
15
|
+
invalidItems: WebhookValidationItem[];
|
|
16
|
+
}
|
|
17
|
+
export type RequestWithWebhookValidation = Request & {
|
|
18
|
+
webhookValidation?: WebhookValidationResult;
|
|
19
|
+
};
|
|
20
|
+
export interface WebhookRejectedEvent {
|
|
21
|
+
subscriptionId: string;
|
|
22
|
+
userId: number | null;
|
|
23
|
+
reason: WebhookRejectionReason;
|
|
24
|
+
endpoint: string;
|
|
25
|
+
}
|
|
3
26
|
export declare class WebhookClientStateGuard implements CanActivate {
|
|
4
27
|
private readonly webhookSubscriptionRepository;
|
|
28
|
+
private readonly eventEmitter;
|
|
5
29
|
private readonly logger;
|
|
6
|
-
constructor(webhookSubscriptionRepository: OutlookWebhookSubscriptionRepository);
|
|
30
|
+
constructor(webhookSubscriptionRepository: OutlookWebhookSubscriptionRepository, eventEmitter: EventEmitter2);
|
|
7
31
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
8
32
|
}
|
|
@@ -12,13 +12,17 @@ var WebhookClientStateGuard_1;
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.WebhookClientStateGuard = void 0;
|
|
14
14
|
const common_1 = require("@nestjs/common");
|
|
15
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
15
16
|
const outlook_webhook_subscription_repository_1 = require("../repositories/outlook-webhook-subscription.repository");
|
|
17
|
+
const event_types_enum_1 = require("../enums/event-types.enum");
|
|
16
18
|
let WebhookClientStateGuard = WebhookClientStateGuard_1 = class WebhookClientStateGuard {
|
|
17
|
-
constructor(webhookSubscriptionRepository) {
|
|
19
|
+
constructor(webhookSubscriptionRepository, eventEmitter) {
|
|
18
20
|
this.webhookSubscriptionRepository = webhookSubscriptionRepository;
|
|
21
|
+
this.eventEmitter = eventEmitter;
|
|
19
22
|
this.logger = new common_1.Logger(WebhookClientStateGuard_1.name);
|
|
20
23
|
}
|
|
21
24
|
async canActivate(context) {
|
|
25
|
+
var _a, _b, _c;
|
|
22
26
|
const request = context.switchToHttp().getRequest();
|
|
23
27
|
const validationToken = request.query.validationToken;
|
|
24
28
|
if (validationToken) {
|
|
@@ -30,39 +34,61 @@ let WebhookClientStateGuard = WebhookClientStateGuard_1 = class WebhookClientSta
|
|
|
30
34
|
this.logger.debug('No notification items to validate');
|
|
31
35
|
return true;
|
|
32
36
|
}
|
|
37
|
+
const endpoint = request.path;
|
|
33
38
|
const validationResults = await Promise.all(body.value.map(async (item, index) => {
|
|
34
39
|
var _a;
|
|
35
40
|
const { subscriptionId, clientState } = item;
|
|
36
41
|
if (!subscriptionId) {
|
|
37
42
|
this.logger.warn(`[SECURITY] Notification item ${index} missing subscriptionId`);
|
|
38
|
-
return { index, valid: false, reason: 'missing_subscription_id' };
|
|
43
|
+
return { index, valid: false, reason: 'missing_subscription_id', userId: null };
|
|
39
44
|
}
|
|
40
45
|
const subscription = await this.webhookSubscriptionRepository.findBySubscriptionId(subscriptionId);
|
|
41
46
|
if (!subscription) {
|
|
42
47
|
this.logger.warn(`[SECURITY] Unknown subscription ID: ${subscriptionId}. ` +
|
|
43
48
|
`Possible replay attack or stale subscription.`);
|
|
44
|
-
return { index, valid: false, reason: 'unknown_subscription' };
|
|
49
|
+
return { index, valid: false, reason: 'unknown_subscription', subscriptionId, userId: null };
|
|
45
50
|
}
|
|
46
|
-
if (subscription.clientState
|
|
51
|
+
if (!subscription.clientState) {
|
|
52
|
+
this.logger.warn(`[SECURITY] Subscription ${subscriptionId} has no stored clientState; ` +
|
|
53
|
+
`notification cannot be verified. Rejecting as unverifiable.`);
|
|
54
|
+
return {
|
|
55
|
+
index,
|
|
56
|
+
valid: false,
|
|
57
|
+
reason: 'missing_stored_client_state',
|
|
58
|
+
subscriptionId,
|
|
59
|
+
userId: subscription.userId,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (clientState !== subscription.clientState) {
|
|
47
63
|
this.logger.warn(`[SECURITY] ClientState mismatch for subscription ${subscriptionId}. ` +
|
|
48
64
|
`Expected prefix: user_${subscription.userId}_*, received: ${(_a = clientState === null || clientState === void 0 ? void 0 : clientState.substring(0, 20)) !== null && _a !== void 0 ? _a : 'null'}...`);
|
|
49
|
-
return {
|
|
65
|
+
return {
|
|
66
|
+
index,
|
|
67
|
+
valid: false,
|
|
68
|
+
reason: 'client_state_mismatch',
|
|
69
|
+
subscriptionId,
|
|
70
|
+
userId: subscription.userId,
|
|
71
|
+
};
|
|
50
72
|
}
|
|
51
|
-
return { index, valid: true };
|
|
73
|
+
return { index, valid: true, subscriptionId, userId: subscription.userId };
|
|
52
74
|
}));
|
|
53
75
|
const invalidItems = validationResults.filter((r) => !r.valid);
|
|
54
76
|
if (invalidItems.length > 0) {
|
|
55
77
|
this.logger.warn(`[SECURITY] Rejecting webhook: ${invalidItems.length}/${body.value.length} items failed validation. ` +
|
|
56
|
-
`Reasons: ${invalidItems.map((i) => `item[${i.index}]:${i.reason}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
78
|
+
`Reasons: ${invalidItems.map((i) => { var _a; return `item[${i.index}]:${(_a = i.reason) !== null && _a !== void 0 ? _a : 'unknown'}`; }).join(', ')}`);
|
|
79
|
+
for (const item of invalidItems) {
|
|
80
|
+
const payload = {
|
|
81
|
+
subscriptionId: (_a = item.subscriptionId) !== null && _a !== void 0 ? _a : 'unknown',
|
|
82
|
+
userId: (_b = item.userId) !== null && _b !== void 0 ? _b : null,
|
|
83
|
+
reason: (_c = item.reason) !== null && _c !== void 0 ? _c : 'unknown_subscription',
|
|
84
|
+
endpoint,
|
|
85
|
+
};
|
|
86
|
+
this.eventEmitter.emit(event_types_enum_1.OutlookEventTypes.WEBHOOK_REJECTED, payload);
|
|
87
|
+
}
|
|
88
|
+
request.webhookValidation = { valid: false, invalidItems };
|
|
61
89
|
return true;
|
|
62
90
|
}
|
|
63
|
-
request.webhookValidation = {
|
|
64
|
-
valid: true,
|
|
65
|
-
};
|
|
91
|
+
request.webhookValidation = { valid: true, invalidItems: [] };
|
|
66
92
|
this.logger.debug(`ClientState validated for ${body.value.length} notification item(s)`);
|
|
67
93
|
return true;
|
|
68
94
|
}
|
|
@@ -70,6 +96,7 @@ let WebhookClientStateGuard = WebhookClientStateGuard_1 = class WebhookClientSta
|
|
|
70
96
|
exports.WebhookClientStateGuard = WebhookClientStateGuard;
|
|
71
97
|
exports.WebhookClientStateGuard = WebhookClientStateGuard = WebhookClientStateGuard_1 = __decorate([
|
|
72
98
|
(0, common_1.Injectable)(),
|
|
73
|
-
__metadata("design:paramtypes", [outlook_webhook_subscription_repository_1.OutlookWebhookSubscriptionRepository
|
|
99
|
+
__metadata("design:paramtypes", [outlook_webhook_subscription_repository_1.OutlookWebhookSubscriptionRepository,
|
|
100
|
+
event_emitter_1.EventEmitter2])
|
|
74
101
|
], WebhookClientStateGuard);
|
|
75
102
|
//# sourceMappingURL=webhook-client-state.guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-client-state.guard.js","sourceRoot":"","sources":["../../src/guards/webhook-client-state.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAKwB;
|
|
1
|
+
{"version":3,"file":"webhook-client-state.guard.js","sourceRoot":"","sources":["../../src/guards/webhook-client-state.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,9 @@ export interface MicrosoftOutlookStateConfig {
|
|
|
6
6
|
required?: boolean;
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
|
+
export interface SubscriptionHealthConfig {
|
|
10
|
+
staleNotificationThresholdHours?: number;
|
|
11
|
+
}
|
|
9
12
|
export interface MicrosoftOutlookConfig {
|
|
10
13
|
clientId: string;
|
|
11
14
|
clientSecret: string;
|
|
@@ -15,4 +18,5 @@ export interface MicrosoftOutlookConfig {
|
|
|
15
18
|
calendarWebhookPath?: string;
|
|
16
19
|
state?: MicrosoftOutlookStateConfig;
|
|
17
20
|
revocationEmitFlagTtlMs?: number;
|
|
21
|
+
subscription?: SubscriptionHealthConfig;
|
|
18
22
|
}
|
|
@@ -18,4 +18,5 @@ export declare class OutlookWebhookSubscriptionRepository {
|
|
|
18
18
|
updateLastNotificationAt(subscriptionId: string): Promise<void>;
|
|
19
19
|
findStaleSubscriptions(staleThresholdHours: number): Promise<OutlookWebhookSubscription[]>;
|
|
20
20
|
count(options: Parameters<Repository<OutlookWebhookSubscription>['count']>[0]): Promise<number>;
|
|
21
|
+
findExpiringSoon(threshold: Date): Promise<OutlookWebhookSubscription[]>;
|
|
21
22
|
}
|
|
@@ -142,6 +142,14 @@ let OutlookWebhookSubscriptionRepository = class OutlookWebhookSubscriptionRepos
|
|
|
142
142
|
async count(options) {
|
|
143
143
|
return await this.repository.count(options);
|
|
144
144
|
}
|
|
145
|
+
async findExpiringSoon(threshold) {
|
|
146
|
+
return this.repository.find({
|
|
147
|
+
where: {
|
|
148
|
+
isActive: true,
|
|
149
|
+
expirationDateTime: (0, typeorm_2.LessThanOrEqual)(threshold),
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
145
153
|
};
|
|
146
154
|
exports.OutlookWebhookSubscriptionRepository = OutlookWebhookSubscriptionRepository;
|
|
147
155
|
exports.OutlookWebhookSubscriptionRepository = OutlookWebhookSubscriptionRepository = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outlook-webhook-subscription.repository.js","sourceRoot":"","sources":["../../src/repositories/outlook-webhook-subscription.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,
|
|
1
|
+
{"version":3,"file":"outlook-webhook-subscription.repository.js","sourceRoot":"","sources":["../../src/repositories/outlook-webhook-subscription.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -992,9 +992,10 @@ let CalendarService = CalendarService_1 = class CalendarService {
|
|
|
992
992
|
this.logger.warn(`Unknown subscription ID: ${subscriptionId || "unknown"}`);
|
|
993
993
|
return { success: false, message: "Unknown subscription" };
|
|
994
994
|
}
|
|
995
|
-
if (subscription.clientState
|
|
996
|
-
|
|
997
|
-
|
|
995
|
+
if (!subscription.clientState || clientState !== subscription.clientState) {
|
|
996
|
+
this.logger.warn(subscription.clientState
|
|
997
|
+
? "Client state mismatch"
|
|
998
|
+
: "Subscription has no stored clientState; cannot verify notification");
|
|
998
999
|
return { success: false, message: "Client state mismatch" };
|
|
999
1000
|
}
|
|
1000
1001
|
const internalUserId = subscription.userId;
|