@rapidmx/mapi-plugin 1.0.0-beta.3 → 1.0.0-beta.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.
- package/README.md +4 -4
- package/dist/lib/BaseMapiEmsmdbRoute.js +211 -36
- package/dist/lib/BaseMapiEmsmdbRoute.js.map +1 -1
- package/dist/lib/MapiSessionManager.js +404 -48
- package/dist/lib/MapiSessionManager.js.map +1 -1
- package/dist/lib/RegexPatternUtils.js +30 -0
- package/dist/lib/RegexPatternUtils.js.map +1 -0
- package/dist/lib/RopDispatcher.js +130 -19
- package/dist/lib/RopDispatcher.js.map +1 -1
- package/dist/lib/codec/AppointmentRecurrence.js +22 -21
- package/dist/lib/codec/AppointmentRecurrence.js.map +1 -1
- package/dist/lib/codec/BufferCursor.js +41 -12
- package/dist/lib/codec/BufferCursor.js.map +1 -1
- package/dist/lib/codec/GlobalObjectId.js +26 -20
- package/dist/lib/codec/GlobalObjectId.js.map +1 -1
- package/dist/lib/codec/MapiTimeZone.js +43 -10
- package/dist/lib/codec/MapiTimeZone.js.map +1 -1
- package/dist/lib/codec/PropertyValue.js +28 -2
- package/dist/lib/codec/PropertyValue.js.map +1 -1
- package/dist/lib/codec/RopBuffer.js +15 -3
- package/dist/lib/codec/RopBuffer.js.map +1 -1
- package/dist/lib/mongo/MapiEmsmdbRouteMongo.js +2 -1
- package/dist/lib/mongo/MapiEmsmdbRouteMongo.js.map +1 -1
- package/dist/lib/nspi/NspiCodec.js +5 -5
- package/dist/lib/nspi/NspiCodec.js.map +1 -1
- package/dist/lib/nspi/NspiGetMatchesHandler.js +14 -14
- package/dist/lib/nspi/NspiGetMatchesHandler.js.map +1 -1
- package/dist/lib/rop/AddressList.js +109 -0
- package/dist/lib/rop/AddressList.js.map +1 -0
- package/dist/lib/rop/CalendarEventTarget.js +7 -4
- package/dist/lib/rop/CalendarEventTarget.js.map +1 -1
- package/dist/lib/rop/ContactTarget.js +2 -6
- package/dist/lib/rop/ContactTarget.js.map +1 -1
- package/dist/lib/rop/ContentsTable.js +60 -0
- package/dist/lib/rop/ContentsTable.js.map +1 -0
- package/dist/lib/rop/ExecuteBudget.js +82 -0
- package/dist/lib/rop/ExecuteBudget.js.map +1 -0
- package/dist/lib/rop/FastTransferStream.js +99 -2
- package/dist/lib/rop/FastTransferStream.js.map +1 -1
- package/dist/lib/rop/FolderTarget.js +13 -6
- package/dist/lib/rop/FolderTarget.js.map +1 -1
- package/dist/lib/rop/HandleDataCache.js +412 -0
- package/dist/lib/rop/HandleDataCache.js.map +1 -0
- package/dist/lib/rop/MeetingMessageClassHandler.js +194 -48
- package/dist/lib/rop/MeetingMessageClassHandler.js.map +1 -1
- package/dist/lib/rop/MessageBodyStream.js +33 -7
- package/dist/lib/rop/MessageBodyStream.js.map +1 -1
- package/dist/lib/rop/MessageTarget.js +17 -4
- package/dist/lib/rop/MessageTarget.js.map +1 -1
- package/dist/lib/rop/NamedPropertyRegistry.js +8 -5
- package/dist/lib/rop/NamedPropertyRegistry.js.map +1 -1
- package/dist/lib/rop/PropertyResolvers.js +3 -1
- package/dist/lib/rop/PropertyResolvers.js.map +1 -1
- package/dist/lib/rop/RepoPaging.js +54 -0
- package/dist/lib/rop/RepoPaging.js.map +1 -0
- package/dist/lib/rop/RestapiRules.js +52 -0
- package/dist/lib/rop/RestapiRules.js.map +1 -0
- package/dist/lib/rop/RopCreateMessageHandler.js +4 -2
- package/dist/lib/rop/RopCreateMessageHandler.js.map +1 -1
- package/dist/lib/rop/RopDeleteFolderHandler.js +112 -77
- package/dist/lib/rop/RopDeleteFolderHandler.js.map +1 -1
- package/dist/lib/rop/RopDeleteMessagesHandler.js +17 -1
- package/dist/lib/rop/RopDeleteMessagesHandler.js.map +1 -1
- package/dist/lib/rop/RopFastTransferSourceCopyPropertiesHandler.js +14 -14
- package/dist/lib/rop/RopFastTransferSourceCopyPropertiesHandler.js.map +1 -1
- package/dist/lib/rop/RopFastTransferSourceCopyToHandler.js +13 -14
- package/dist/lib/rop/RopFastTransferSourceCopyToHandler.js.map +1 -1
- package/dist/lib/rop/RopFastTransferSourceGetBufferHandler.js +33 -32
- package/dist/lib/rop/RopFastTransferSourceGetBufferHandler.js.map +1 -1
- package/dist/lib/rop/RopGetContentsTableHandler.js +17 -38
- package/dist/lib/rop/RopGetContentsTableHandler.js.map +1 -1
- package/dist/lib/rop/RopGetHierarchyTableHandler.js +4 -2
- package/dist/lib/rop/RopGetHierarchyTableHandler.js.map +1 -1
- package/dist/lib/rop/RopGetPropertiesSpecificHandler.js +6 -8
- package/dist/lib/rop/RopGetPropertiesSpecificHandler.js.map +1 -1
- package/dist/lib/rop/RopHandler.js +5 -1
- package/dist/lib/rop/RopHandler.js.map +1 -1
- package/dist/lib/rop/RopLogonHandler.js +5 -2
- package/dist/lib/rop/RopLogonHandler.js.map +1 -1
- package/dist/lib/rop/RopOpenFolderHandler.js +3 -1
- package/dist/lib/rop/RopOpenFolderHandler.js.map +1 -1
- package/dist/lib/rop/RopOpenMessageHandler.js +3 -1
- package/dist/lib/rop/RopOpenMessageHandler.js.map +1 -1
- package/dist/lib/rop/RopOpenStreamHandler.js +11 -8
- package/dist/lib/rop/RopOpenStreamHandler.js.map +1 -1
- package/dist/lib/rop/RopQueryRowsHandler.js +31 -5
- package/dist/lib/rop/RopQueryRowsHandler.js.map +1 -1
- package/dist/lib/rop/RopReadStreamHandler.js +22 -4
- package/dist/lib/rop/RopReadStreamHandler.js.map +1 -1
- package/dist/lib/rop/RopReleaseHandler.js +4 -1
- package/dist/lib/rop/RopReleaseHandler.js.map +1 -1
- package/dist/lib/rop/RopSaveChangesMessageHandler.js +66 -7
- package/dist/lib/rop/RopSaveChangesMessageHandler.js.map +1 -1
- package/dist/lib/rop/RopSetColumnsHandler.js +6 -8
- package/dist/lib/rop/RopSetColumnsHandler.js.map +1 -1
- package/dist/lib/rop/RopSetPropertiesHandler.js +23 -12
- package/dist/lib/rop/RopSetPropertiesHandler.js.map +1 -1
- package/dist/lib/rop/RopSubmitMessageHandler.js +144 -120
- package/dist/lib/rop/RopSubmitMessageHandler.js.map +1 -1
- package/dist/lib/rop/RopWriteStreamHandler.js +37 -10
- package/dist/lib/rop/RopWriteStreamHandler.js.map +1 -1
- package/dist/lib/rop/TaskTarget.js +2 -6
- package/dist/lib/rop/TaskTarget.js.map +1 -1
- package/dist/lib/rop/TransportSend.js +16 -0
- package/dist/lib/rop/TransportSend.js.map +1 -0
- package/dist/lib/sql/MapiEmsmdbRouteSQL.js +2 -1
- package/dist/lib/sql/MapiEmsmdbRouteSQL.js.map +1 -1
- package/dist/types/BaseMapiEmsmdbRoute.d.ts +52 -2
- package/dist/types/MapiSessionManager.d.ts +218 -63
- package/dist/types/RegexPatternUtils.d.ts +14 -0
- package/dist/types/RopDispatcher.d.ts +47 -11
- package/dist/types/codec/BufferCursor.d.ts +14 -0
- package/dist/types/codec/GlobalObjectId.d.ts +9 -5
- package/dist/types/codec/PropertyValue.d.ts +10 -0
- package/dist/types/codec/RopBuffer.d.ts +7 -0
- package/dist/types/mongo/MapiEmsmdbRouteMongo.d.ts +1 -0
- package/dist/types/nspi/NspiGetMatchesHandler.d.ts +2 -0
- package/dist/types/rop/AddressList.d.ts +48 -0
- package/dist/types/rop/CalendarEventTarget.d.ts +7 -3
- package/dist/types/rop/ContactTarget.d.ts +3 -3
- package/dist/types/rop/ContentsTable.d.ts +16 -0
- package/dist/types/rop/ExecuteBudget.d.ts +48 -0
- package/dist/types/rop/FastTransferStream.d.ts +41 -2
- package/dist/types/rop/FolderTarget.d.ts +3 -2
- package/dist/types/rop/HandleDataCache.d.ts +145 -0
- package/dist/types/rop/MeetingMessageClassHandler.d.ts +23 -29
- package/dist/types/rop/MessageBodyStream.d.ts +16 -7
- package/dist/types/rop/MessageTarget.d.ts +10 -3
- package/dist/types/rop/NamedPropertyRegistry.d.ts +6 -2
- package/dist/types/rop/PropertyResolvers.d.ts +1 -1
- package/dist/types/rop/RepoPaging.d.ts +30 -0
- package/dist/types/rop/RestapiRules.d.ts +32 -0
- package/dist/types/rop/RopCreateMessageHandler.d.ts +1 -0
- package/dist/types/rop/RopDeleteFolderHandler.d.ts +36 -21
- package/dist/types/rop/RopDeleteMessagesHandler.d.ts +7 -0
- package/dist/types/rop/RopFastTransferSourceCopyPropertiesHandler.d.ts +1 -0
- package/dist/types/rop/RopFastTransferSourceCopyToHandler.d.ts +1 -0
- package/dist/types/rop/RopFastTransferSourceGetBufferHandler.d.ts +10 -11
- package/dist/types/rop/RopGetContentsTableHandler.d.ts +7 -13
- package/dist/types/rop/RopGetHierarchyTableHandler.d.ts +1 -0
- package/dist/types/rop/RopHandler.d.ts +25 -1
- package/dist/types/rop/RopOpenFolderHandler.d.ts +1 -0
- package/dist/types/rop/RopOpenMessageHandler.d.ts +1 -0
- package/dist/types/rop/RopOpenStreamHandler.d.ts +1 -0
- package/dist/types/rop/RopQueryRowsHandler.d.ts +3 -0
- package/dist/types/rop/RopReadStreamHandler.d.ts +3 -1
- package/dist/types/rop/RopReleaseHandler.d.ts +1 -0
- package/dist/types/rop/RopSaveChangesMessageHandler.d.ts +16 -1
- package/dist/types/rop/RopSubmitMessageHandler.d.ts +33 -23
- package/dist/types/rop/RopWriteStreamHandler.d.ts +18 -8
- package/dist/types/rop/TaskTarget.d.ts +3 -3
- package/dist/types/rop/TransportSend.d.ts +10 -0
- package/dist/types/sql/MapiEmsmdbRouteSQL.d.ts +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/RapidMX/mapi/actions/workflows/build.yml)
|
|
4
4
|
[](https://coveralls.io/github/RapidMX/mapi?branch=main)
|
|
5
|
-
[](https://www.npmjs.com/package/@rapidmx/mapi)
|
|
5
|
+
[](https://www.npmjs.com/package/@rapidmx/mapi-plugin)
|
|
6
6
|
|
|
7
7
|
MAPI over HTTP protocol support for a [`@rapidmx/restapi`](https://github.com/RapidMX/restapi)-based mail
|
|
8
8
|
server — covers the pragmatic subset a real Outlook desktop client (and the "New Outlook"/Monarch client, for
|
|
@@ -31,16 +31,16 @@ out of scope here - E2E is designed so a real Outlook client needs no protocol c
|
|
|
31
31
|
restapi's own specs document encrypted-mail search as unachievable from Outlook, not a gap this package could
|
|
32
32
|
close.
|
|
33
33
|
|
|
34
|
-
A [`@rapidmx/autodiscover`](https://github.com/RapidMX/autodiscover) mount lets real Outlook clients find
|
|
34
|
+
A [`@rapidmx/autodiscover-plugin`](https://github.com/RapidMX/autodiscover) mount lets real Outlook clients find
|
|
35
35
|
this package's endpoints from just an email address.
|
|
36
36
|
|
|
37
37
|
## Usage
|
|
38
38
|
|
|
39
39
|
Mount `MapiEmsmdbRouteMongo`/`SQL` (mailbox/store access) and `MapiNspiRouteMongo`/`SQL` (address book) from
|
|
40
|
-
`@rapidmx/mapi/mongo` or `/sql` at their conventional paths, each with a trivial one-line subclass:
|
|
40
|
+
`@rapidmx/mapi-plugin/mongo` or `/sql` at their conventional paths, each with a trivial one-line subclass:
|
|
41
41
|
|
|
42
42
|
```ts
|
|
43
|
-
import { MapiEmsmdbRouteMongo, MapiNspiRouteMongo } from "@rapidmx/mapi/mongo";
|
|
43
|
+
import { MapiEmsmdbRouteMongo, MapiNspiRouteMongo } from "@rapidmx/mapi-plugin/mongo";
|
|
44
44
|
import { RouteDecorators } from "@rapidrest/service-core";
|
|
45
45
|
const { Route } = RouteDecorators;
|
|
46
46
|
|
|
@@ -16,18 +16,56 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
16
16
|
///////////////////////////////////////////////////////////////////////////////
|
|
17
17
|
import { ApiError, ObjectDecorators } from "@rapidrest/core";
|
|
18
18
|
import { ApiErrorMessages, ApiErrors, RepoUtils, RouteDecorators, } from "@rapidrest/service-core";
|
|
19
|
-
import { BufferReader, BufferWriter } from "./codec/BufferCursor.js";
|
|
19
|
+
import { BufferReader, BufferWriter, DecodeError } from "./codec/BufferCursor.js";
|
|
20
20
|
import { decodeRopBuffer, encodeRopBuffer } from "./codec/RopBuffer.js";
|
|
21
|
-
import { MapiSessionManager } from "./MapiSessionManager.js";
|
|
22
|
-
import { dispatchRops } from "./RopDispatcher.js";
|
|
21
|
+
import { MapiSessionManager, SESSION_LOCK_RENEW_MS, takeReleasedHandleData } from "./MapiSessionManager.js";
|
|
22
|
+
import { dispatchRops, ExecuteBufferTooSmallError, MAX_ROPS_LIST_BYTES } from "./RopDispatcher.js";
|
|
23
|
+
import { handleDataOwners } from "./rop/HandleDataCache.js";
|
|
24
|
+
import { handleDataStoreOf } from "./rop/RopHandler.js";
|
|
23
25
|
import { ScanPipeline } from "@rapidmx/restapi/scan";
|
|
24
|
-
import { RecoverableRepoUtils, resolveCallerMailboxUid } from "@rapidmx/restapi";
|
|
25
|
-
const { Init, Inject, Logger } = ObjectDecorators;
|
|
26
|
+
import { RecoverableRepoUtils, recordAuditLog, resolveCallerMailboxUid } from "@rapidmx/restapi";
|
|
27
|
+
const { Config, Init, Inject, Logger } = ObjectDecorators;
|
|
26
28
|
const { Auth, Post, Request, Response, User: AuthUser } = RouteDecorators;
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
29
|
+
/** `[MS-OXCMAPIHTTP]` `X-ResponseCode` 10, "Context Not Found": the session context named by the `MapiContext`
|
|
30
|
+
* cookie doesn't exist (expired, ended, or not the caller's). The client `Connect`s again. `X-ResponseCode` only takes
|
|
31
|
+
* the spec's small status values; the MAPI HRESULT goes in the body's `ErrorCode` (`ERROR_SESSION_NOT_FOUND`). */
|
|
32
|
+
const RESPONSE_CODE_CONTEXT_NOT_FOUND = 10;
|
|
33
|
+
/** The well-known MAPI HRESULT `MAPI_E_LOGON_FAILED`, reused as the body `ErrorCode` for "no such session -
|
|
34
|
+
* reconnect". Not a claim of exact `[MS-OXCRPC]` return-value-table parity for this specific condition. */
|
|
30
35
|
const ERROR_SESSION_NOT_FOUND = 0x80040111;
|
|
36
|
+
/** `MAPI_E_TOO_BIG`, the body `ErrorCode` when a request would grow the session past `MAX_SESSION_BYTES`. */
|
|
37
|
+
const ERROR_SESSION_TOO_BIG = 0x80040305;
|
|
38
|
+
/** `[MS-OXCMAPIHTTP]` `X-ResponseCode` 15, "Invalid Sequence": the request overlapped another one on the same
|
|
39
|
+
* session context. Sent when the session changed underneath this request (see `MapiSessionManager.save()`). */
|
|
40
|
+
const RESPONSE_CODE_INVALID_SEQUENCE = 15;
|
|
41
|
+
/** `ecBufferTooSmall` ([MS-OXCRPC]), the body `ErrorCode` when the client's `MaxRopOut` can't even hold a
|
|
42
|
+
* `RopBufferTooSmall` carrying the whole request. No ROP has run by then. */
|
|
43
|
+
const ERROR_BUFFER_TOO_SMALL = 0x0000047d;
|
|
44
|
+
/** The largest `RopBufferSize` accepted - the `[MS-OXCRPC]` ROP input buffer limit. */
|
|
45
|
+
export const MAX_ROP_BUFFER_SIZE = 32767;
|
|
46
|
+
/**
|
|
47
|
+
* Decodes an `Execute` request body's `Flags`/`RopBufferSize`/`RopBuffer`/`MaxRopOut` and the ROP buffer framing
|
|
48
|
+
* inside it. Throws a 400 `ApiError` for a malformed body - a `RopBufferSize` over `MAX_ROP_BUFFER_SIZE` or past the
|
|
49
|
+
* end of the body, or a ROP buffer `decodeRopBuffer` rejects - instead of letting a bare `RangeError` surface as a
|
|
50
|
+
* 500. A body that ends before `MaxRopOut` gets the largest response a `RopBuffer` can carry.
|
|
51
|
+
* `AuxiliaryBufferSize`/`AuxiliaryBuffer` are left unread - no auxiliary-payload support in this pragmatic subset.
|
|
52
|
+
*/
|
|
53
|
+
export function decodeExecuteRequest(rawBody) {
|
|
54
|
+
try {
|
|
55
|
+
const reader = new BufferReader(rawBody);
|
|
56
|
+
reader.readUInt32LE(); // Flags - unused by this pragmatic subset (no client ROP-response hints honored)
|
|
57
|
+
const ropBufferSize = reader.readUInt32LE();
|
|
58
|
+
if (ropBufferSize > MAX_ROP_BUFFER_SIZE || ropBufferSize > reader.remaining) {
|
|
59
|
+
throw new RangeError(`Execute: invalid RopBufferSize ${ropBufferSize}.`);
|
|
60
|
+
}
|
|
61
|
+
const ropBuffer = decodeRopBuffer(reader.readBytes(ropBufferSize));
|
|
62
|
+
const maxRopOut = reader.remaining >= 4 ? reader.readUInt32LE() : MAX_ROPS_LIST_BYTES + 2;
|
|
63
|
+
return { ...ropBuffer, maxRopOut };
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new ApiError(ApiErrors.INVALID_REQUEST, 400, ApiErrorMessages.INVALID_REQUEST);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
31
69
|
function firstHeader(req, name) {
|
|
32
70
|
const value = req.headers[name];
|
|
33
71
|
return Array.isArray(value) ? value[0] : value;
|
|
@@ -143,10 +181,10 @@ export class BaseMapiEmsmdbRoute {
|
|
|
143
181
|
await this.handleConnect(req, res, user);
|
|
144
182
|
return;
|
|
145
183
|
case "Execute":
|
|
146
|
-
await this.handleExecute(req, res);
|
|
184
|
+
await this.handleExecute(req, res, user);
|
|
147
185
|
return;
|
|
148
186
|
case "Disconnect":
|
|
149
|
-
await this.handleDisconnect(req, res);
|
|
187
|
+
await this.handleDisconnect(req, res, user);
|
|
150
188
|
return;
|
|
151
189
|
case "NotificationWait":
|
|
152
190
|
// Real, spec-defined request type, deliberately deferred - no push-notification support in
|
|
@@ -188,35 +226,105 @@ export class BaseMapiEmsmdbRoute {
|
|
|
188
226
|
res.status(200).send(body.toBuffer());
|
|
189
227
|
}
|
|
190
228
|
/**
|
|
191
|
-
* `Execute` decodes the outer envelope (`Flags`/`RopBufferSize`/`RopBuffer`/...) and the inner ROP
|
|
192
|
-
* framing (`RopBuffer.ts`), dispatches every contained ROP via `RopDispatcher`, and re-encodes the
|
|
229
|
+
* `Execute` decodes the outer envelope (`Flags`/`RopBufferSize`/`RopBuffer`/`MaxRopOut`/...) and the inner ROP
|
|
230
|
+
* buffer framing (`RopBuffer.ts`), dispatches every contained ROP via `RopDispatcher`, and re-encodes the
|
|
193
231
|
* collected responses - preserving the incoming `handleTable` unchanged (this pragmatic subset never
|
|
194
232
|
* allocates/frees table-wide handle slots at the framing level; individual `RopHandler`s manage their own
|
|
195
233
|
* entries within `session.handles` instead).
|
|
234
|
+
*
|
|
235
|
+
* - **One request at a time per session.** Only the caller's own session (whose mailbox is still the caller's) is
|
|
236
|
+
* locked. The lock is taken before any ROP runs and renewed every `SESSION_LOCK_RENEW_MS` while the request runs,
|
|
237
|
+
* so a slow request keeps it; an overlapping request gets `X-ResponseCode` 15 (Invalid Sequence) without any side
|
|
238
|
+
* effects. The save stays compare-and-set. Each `Execute` also refreshes the session's place in the per-user cap.
|
|
239
|
+
* - **Retries.** While a request with an `X-RequestId` runs, an in-progress marker for that id is kept (renewed with
|
|
240
|
+
* the lock); a retry of it is answered with code 15 instead of running again. Its response then replaces the
|
|
241
|
+
* marker, and a request repeating the last id (a client retrying after a lost response) gets that response again
|
|
242
|
+
* instead of running its ROPs twice. A request that ends without a stored response drops its marker.
|
|
243
|
+
* `MapiSequence` isn't validated - the lock and the replay cache cover what it guards against here.
|
|
244
|
+
* - **Output size.** ROP responses are held to the client's `MaxRopOut`, less the `RopSize` field and handle
|
|
245
|
+
* table, and to what a 16-bit `RopSize` can describe (see `dispatchRops`). Room for a `RopBufferTooSmall` covering
|
|
246
|
+
* the rest of the request is kept free as ROPs run, so a response that doesn't fit is always answered that way (a
|
|
247
|
+
* normal, stored response). Only a `MaxRopOut` too small for a `RopBufferTooSmall` of the whole request answers
|
|
248
|
+
* `ecBufferTooSmall` in the body `ErrorCode`, before any ROP runs, so nothing is stored and a retry changes nothing.
|
|
249
|
+
* - **Released handles.** Once the session is saved, the FastTransfer streams and write-stream chunks of handles
|
|
250
|
+
* the request released are deleted from the shared store; `Disconnect` and session eviction delete a session's
|
|
251
|
+
* whole set.
|
|
252
|
+
* - **Malformed ROPs.** A ROP that can't be decoded answers 400; the ROPs before it already ran, so the session is
|
|
253
|
+
* still saved first.
|
|
196
254
|
*/
|
|
197
|
-
async handleExecute(req, res) {
|
|
255
|
+
async handleExecute(req, res, user) {
|
|
198
256
|
const sessionId = req.cookies["MapiContext"];
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
257
|
+
if (!sessionId) {
|
|
258
|
+
this.sendExecuteFailure(res, RESPONSE_CODE_CONTEXT_NOT_FOUND, ERROR_SESSION_NOT_FOUND);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
// Ownership first: someone else's session (or a mailbox reassigned since Connect) is never locked by this caller.
|
|
262
|
+
const owned = await this.loadOwnSession(req, user);
|
|
263
|
+
if (!owned || (await resolveCallerMailboxUid(this.mailboxRepo, user)) !== owned.mailboxUid) {
|
|
264
|
+
this.sendExecuteFailure(res, RESPONSE_CODE_CONTEXT_NOT_FOUND, ERROR_SESSION_NOT_FOUND);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const lockToken = await this.sessionManager.acquireLock(sessionId);
|
|
268
|
+
if (!lockToken) {
|
|
269
|
+
this.sendExecuteFailure(res, RESPONSE_CODE_INVALID_SEQUENCE, RESPONSE_CODE_INVALID_SEQUENCE);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const running = {};
|
|
273
|
+
// Renewed while the request runs, so a slow Execute never loses its lock (or its in-progress marker) to a retry.
|
|
274
|
+
// Renewals run one after another, and stop once the lock is lost. The marker is only extended while it is still
|
|
275
|
+
// this request's marker, so a renewal landing after the response was stored never turns it back into a marker.
|
|
276
|
+
let renewing = Promise.resolve();
|
|
277
|
+
const renewal = setInterval(() => {
|
|
278
|
+
renewing = renewing.then(async () => {
|
|
279
|
+
const held = await this.sessionManager.renewLock(sessionId, lockToken).catch(() => true);
|
|
280
|
+
if (!held) {
|
|
281
|
+
clearInterval(renewal);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (running.requestId) {
|
|
285
|
+
await this.sessionManager.renewInProgress(sessionId, running.requestId).catch(() => undefined);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}, SESSION_LOCK_RENEW_MS);
|
|
289
|
+
renewal.unref();
|
|
290
|
+
try {
|
|
291
|
+
await this.executeLocked(req, res, user, running);
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
clearInterval(renewal);
|
|
295
|
+
await renewing;
|
|
296
|
+
if (running.requestId) {
|
|
297
|
+
await this.sessionManager.clearInProgress(sessionId, running.requestId).catch(() => undefined);
|
|
298
|
+
}
|
|
299
|
+
await this.sessionManager.releaseLock(sessionId, lockToken);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/** Runs an `Execute` under its session's lock. `running.requestId` is set while this request's in-progress marker is
|
|
303
|
+
* stored, and cleared once its response is stored instead. */
|
|
304
|
+
async executeLocked(req, res, user, running) {
|
|
305
|
+
// Loaded again under the lock: the copy read before locking may already be out of date.
|
|
306
|
+
const session = await this.loadOwnSession(req, user);
|
|
202
307
|
if (!session) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
308
|
+
this.sendExecuteFailure(res, RESPONSE_CODE_CONTEXT_NOT_FOUND, ERROR_SESSION_NOT_FOUND);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const requestId = firstHeader(req, "x-requestid") ?? "";
|
|
312
|
+
const replay = requestId ? await this.sessionManager.storedResponse(session.uid, requestId) : undefined;
|
|
313
|
+
if (replay === "inProgress") {
|
|
314
|
+
// The same request is still running elsewhere (its lock lapsed, or its pod died moments ago).
|
|
315
|
+
this.sendExecuteFailure(res, RESPONSE_CODE_INVALID_SEQUENCE, RESPONSE_CODE_INVALID_SEQUENCE);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (replay) {
|
|
319
|
+
res.status(200).send(replay);
|
|
211
320
|
return;
|
|
212
321
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const { ropsList, handleTable } = decodeRopBuffer(ropBufferBytes);
|
|
322
|
+
if (requestId) {
|
|
323
|
+
await this.sessionManager.markInProgress(session.uid, requestId);
|
|
324
|
+
running.requestId = requestId;
|
|
325
|
+
}
|
|
326
|
+
await this.sessionManager.touch(session).catch(() => undefined);
|
|
327
|
+
const { ropsList, handleTable, maxRopOut } = decodeExecuteRequest(req.rawBody ?? Buffer.alloc(0));
|
|
220
328
|
const context = {
|
|
221
329
|
mailboxUid: session.mailboxUid,
|
|
222
330
|
userUid: session.userUid,
|
|
@@ -237,10 +345,46 @@ export class BaseMapiEmsmdbRoute {
|
|
|
237
345
|
blobStore: this.blobStore,
|
|
238
346
|
scanPipeline: this.scanPipeline,
|
|
239
347
|
mailTransport: this.mailTransport,
|
|
348
|
+
handleData: this.sessionManager.handleDataStore,
|
|
349
|
+
audit: this.auditLogClass
|
|
350
|
+
? (params) => recordAuditLog(this._objectFactory, this.auditLogClass, { config: this.config, req, user, logger: this.logger }, params)
|
|
351
|
+
: undefined,
|
|
240
352
|
};
|
|
241
|
-
|
|
353
|
+
// RopSize (2 bytes) and the echoed handle table share MaxRopOut with the ROP responses. dispatchRops only throws
|
|
354
|
+
// for a request it can't decode (a failing ROP gets a failure response instead).
|
|
355
|
+
const dispatched = await dispatchRops(ropsList, this.ropHandlers, context, {
|
|
356
|
+
maxOutputBytes: maxRopOut - 2 - handleTable.length * 4,
|
|
357
|
+
}).catch((error) => ({ error }));
|
|
358
|
+
const saved = await this.sessionManager.save(session);
|
|
359
|
+
const released = takeReleasedHandleData(session);
|
|
360
|
+
if (saved === "saved") {
|
|
361
|
+
// Streams and write chunks of handles this request released; best effort, they expire anyway.
|
|
362
|
+
const store = handleDataStoreOf(context);
|
|
363
|
+
const owners = handleDataOwners(session.uid, session.userUid);
|
|
364
|
+
await Promise.all(released.map((key) => store.delete(key, owners).catch(() => undefined)));
|
|
365
|
+
}
|
|
366
|
+
if (!Buffer.isBuffer(dispatched) && !(dispatched.error instanceof ExecuteBufferTooSmallError)) {
|
|
367
|
+
throw dispatched.error instanceof DecodeError ? new ApiError(ApiErrors.INVALID_REQUEST, 400, ApiErrorMessages.INVALID_REQUEST) : dispatched.error;
|
|
368
|
+
}
|
|
369
|
+
if (saved !== "saved") {
|
|
370
|
+
// conflict: another request saved first (possible once a lock has expired), so this request's handle
|
|
371
|
+
// changes can't be kept and the client retries. missing: the session ended meanwhile. tooBig: see
|
|
372
|
+
// MAX_SESSION_BYTES.
|
|
373
|
+
const [responseCode, errorCode] = saved === "conflict"
|
|
374
|
+
? [RESPONSE_CODE_INVALID_SEQUENCE, RESPONSE_CODE_INVALID_SEQUENCE]
|
|
375
|
+
: saved === "missing"
|
|
376
|
+
? [RESPONSE_CODE_CONTEXT_NOT_FOUND, ERROR_SESSION_NOT_FOUND]
|
|
377
|
+
: [0, ERROR_SESSION_TOO_BIG];
|
|
378
|
+
this.sendExecuteFailure(res, responseCode, errorCode);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (!Buffer.isBuffer(dispatched)) {
|
|
382
|
+
// [MS-OXCRPC] ecBufferTooSmall: not even a RopBufferTooSmall of the whole request fits, so no ROP ran.
|
|
383
|
+
this.sendExecuteFailure(res, 0, ERROR_BUFFER_TOO_SMALL);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const responseRopsList = dispatched;
|
|
242
387
|
const responseRopBuffer = encodeRopBuffer({ ropsList: responseRopsList, handleTable });
|
|
243
|
-
await this.sessionManager.save(session);
|
|
244
388
|
const body = new BufferWriter();
|
|
245
389
|
body.writeUInt32LE(0); // StatusCode
|
|
246
390
|
body.writeUInt32LE(0); // ErrorCode
|
|
@@ -248,12 +392,39 @@ export class BaseMapiEmsmdbRoute {
|
|
|
248
392
|
body.writeUInt32LE(responseRopBuffer.length);
|
|
249
393
|
body.writeBytes(responseRopBuffer);
|
|
250
394
|
body.writeUInt32LE(0); // AuxiliaryBufferSize
|
|
395
|
+
const responseBody = body.toBuffer();
|
|
396
|
+
if (requestId) {
|
|
397
|
+
await this.sessionManager.storeResponse(session.uid, requestId, responseBody);
|
|
398
|
+
delete running.requestId;
|
|
399
|
+
}
|
|
400
|
+
res.status(200).send(responseBody);
|
|
401
|
+
}
|
|
402
|
+
/** Writes an `Execute` failure body (no ROP buffer) with the given `X-ResponseCode` and `ErrorCode`. */
|
|
403
|
+
sendExecuteFailure(res, responseCode, errorCode) {
|
|
404
|
+
res.setHeader("X-ResponseCode", String(responseCode));
|
|
405
|
+
const body = new BufferWriter();
|
|
406
|
+
body.writeUInt32LE(0); // StatusCode
|
|
407
|
+
body.writeUInt32LE(errorCode); // ErrorCode
|
|
408
|
+
body.writeUInt32LE(0); // Flags
|
|
409
|
+
body.writeUInt32LE(0); // RopBufferSize
|
|
410
|
+
body.writeUInt32LE(0); // AuxiliaryBufferSize
|
|
251
411
|
res.status(200).send(body.toBuffer());
|
|
252
412
|
}
|
|
253
|
-
|
|
413
|
+
/**
|
|
414
|
+
* Loads the session named by the `MapiContext` cookie, but only if the authenticated caller is the user who
|
|
415
|
+
* `Connect`ed it. The cookie value alone is a bearer token for someone else's mailbox otherwise, so a session
|
|
416
|
+
* belonging to another user is treated exactly like one that doesn't exist.
|
|
417
|
+
*/
|
|
418
|
+
async loadOwnSession(req, user) {
|
|
254
419
|
const sessionId = req.cookies["MapiContext"];
|
|
255
|
-
|
|
256
|
-
|
|
420
|
+
const session = sessionId ? await this.sessionManager.load(sessionId) : undefined;
|
|
421
|
+
return session && session.userUid === user.uid ? session : undefined;
|
|
422
|
+
}
|
|
423
|
+
async handleDisconnect(req, res, user) {
|
|
424
|
+
// Another user's session is left alone, with the same success response as for an unknown session.
|
|
425
|
+
const session = await this.loadOwnSession(req, user);
|
|
426
|
+
if (session) {
|
|
427
|
+
await this.sessionManager.destroy(session.uid);
|
|
257
428
|
}
|
|
258
429
|
const body = new BufferWriter();
|
|
259
430
|
body.writeUInt32LE(0); // StatusCode
|
|
@@ -278,6 +449,10 @@ __decorate([
|
|
|
278
449
|
Logger,
|
|
279
450
|
__metadata("design:type", Object)
|
|
280
451
|
], BaseMapiEmsmdbRoute.prototype, "logger", void 0);
|
|
452
|
+
__decorate([
|
|
453
|
+
Config(),
|
|
454
|
+
__metadata("design:type", Object)
|
|
455
|
+
], BaseMapiEmsmdbRoute.prototype, "config", void 0);
|
|
281
456
|
__decorate([
|
|
282
457
|
Init,
|
|
283
458
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseMapiEmsmdbRoute.js","sourceRoot":"","sources":["../../src/BaseMapiEmsmdbRoute.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseMapiEmsmdbRoute.js","sourceRoot":"","sources":["../../src/BaseMapiEmsmdbRoute.ts"],"names":[],"mappings":"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"}
|