@bigfootai/sdk 1.8.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,8 +1,42 @@
1
- import { type AuthCheckResult, type AuthRefreshProviderResponse, type Calendar, type ConnectedProvider, type ConnectedProviderRegistration, type Credential, type Email, type EmailFilter, type ExecuteFunctionProviderRequest, type ExecuteFunctionProviderResponse, type ExecuteQueryProviderRequest, type ExecuteQueryProviderResponse, type ExternalNote, type ExternalObjectWithUrl, type ExternalTagReferenceRequest, type InsightFilter, type LinkSubscriptionProviderRequest, type LinkSubscriptionProviderResponse, type ResolveFunctionInputsProviderRequest, type ResolveFunctionInputsProviderResponse, type StandardSyncResponse, type SyncCalendarProviderRequest, type SyncExternalIdLinksProviderRequest, type SyncTableMetadataProviderRequest, type SyncTableProviderRequest, type Table, type Tag, type TagInsightResponse, type Transcription, type TranscriptionFilter, type UpsertNotesProviderRequest, type UpsertTableProviderRequest } from '@bigfootai/bigfoot-types';
1
+ import { type AuthCheckResult, type AuthRefreshProviderResponse, type Calendar, type ConnectedProvider, type ConnectedProviderRegistration, type Credential, type Email, type EmailFilter, type ExecuteFunctionProviderRequest, type ExecuteFunctionProviderResponse, type ExecuteQueryProviderRequest, type ExecuteQueryProviderResponse, type ExternalNote, type ExternalObjectWithUrl, type ExternalTagReferenceRequest, type InsightFilter, type LinkSubscriptionProviderRequest, type LinkSubscriptionProviderResponse, type Message, type ResolveFunctionInputsProviderRequest, type ResolveFunctionInputsProviderResponse, type StandardSyncResponse, type SyncCalendarProviderRequest, type SyncExternalIdLinksProviderRequest, type SyncTableMetadataProviderRequest, type SyncTableProviderRequest, type Table, type Tag, type TagInsightResponse, type TagType, type Transcription, type TranscriptionFilter, type UpsertMessageProviderRequest, type UpsertNotesProviderRequest, type UpsertTableProviderRequest } from '@bigfootai/bigfoot-types';
2
2
  import { type Express } from 'express';
3
3
  import { CredentialsExpiredError, ValidationError } from './errors.js';
4
+ /**
5
+ * Redaction paths applied to every log record. Each sensitive field name is
6
+ * matched at the top level and up to two levels of nesting, which covers the
7
+ * shapes actually logged (`{ credential }`, `{ connectedProvider: { credential } }`,
8
+ * `{ req: { headers } }`). The whole `credential` object is redacted rather
9
+ * than its individual fields, so a credential shape that gains a new token
10
+ * field later is still covered.
11
+ */
12
+ export declare const LOG_REDACT_PATHS: string[];
4
13
  export declare const logger: import("pino").Logger<never, boolean>;
5
14
  export type Logger = typeof logger;
15
+ /**
16
+ * Drops the query string from a request URL. Used for logging: the OAuth
17
+ * callback carries the authorization code and state there.
18
+ */
19
+ export declare const stripQueryString: (url: string | undefined) => string | undefined;
20
+ /**
21
+ * Serializes a request for logging, replacing pino's default request
22
+ * serializer.
23
+ *
24
+ * The default emits the full URL and every request header, both of which carry
25
+ * credentials in this service: the OAuth callback receives the authorization
26
+ * code and `state` on its query string, and the platform authenticates with an
27
+ * `Authorization: Bearer` header. This emits only what is needed to trace a
28
+ * request — correlation id, method, and path — so no credential is ever handed
29
+ * to the logger in the first place.
30
+ */
31
+ export declare const serializeRequestForLog: (req: {
32
+ id?: unknown;
33
+ method?: string;
34
+ url?: string;
35
+ }) => {
36
+ id: unknown;
37
+ method: string;
38
+ url: string;
39
+ };
6
40
  export type AuthConnectResult = {
7
41
  type: 'redirect';
8
42
  url: string;
@@ -148,6 +182,62 @@ interface UpsertMethods {
148
182
  * @param request The request to upsert the data.
149
183
  */
150
184
  notes(logger: Logger, credential: Credential, request: UpsertNotesProviderRequest): Promise<ExternalNote[]>;
185
+ /**
186
+ * Deliver a message through the provider, for example posting to a Slack
187
+ * channel or DM. The platform calls this when a user approves a message
188
+ * recommendation for a provider application whose `externalStorage` is true.
189
+ * `request.message.to.externalId` names the destination in the provider's
190
+ * terms; `bodyDocument` is the ProseMirror JSON and `bodyHtml` the HTML body.
191
+ *
192
+ * @returns The message as stored by the provider. The platform copies
193
+ * `externalId` and `uri` from the result onto its own record.
194
+ */
195
+ message(logger: Logger, credential: Credential, request: UpsertMessageProviderRequest): Promise<Message>;
196
+ }
197
+ /** A person the platform wants notified. `credential` identifies which connected account to reach them through. */
198
+ export interface WebhookPersonRecipient {
199
+ _id: string;
200
+ email: string | null;
201
+ credential: Pick<Credential, 'email' | 'instanceId' | 'instanceUrl' | 'profile'>;
202
+ }
203
+ /** A tag (channel, topic, account) with an external id link into the provider. */
204
+ export interface WebhookTagRecipient {
205
+ _id: string;
206
+ alias: string;
207
+ email: string | null;
208
+ externalId: string;
209
+ tagType: TagType;
210
+ tagSubType?: string | null;
211
+ url?: string | null;
212
+ credential: Pick<Credential, 'instanceId'>;
213
+ }
214
+ /**
215
+ * Payload of `POST /webhook`, sent by the platform's notification agent to
216
+ * every provider application that declares a matching `webhookSubscriptions`
217
+ * type. `message.htmlContent` is the notification body.
218
+ */
219
+ export interface ProviderWebhookRequest {
220
+ type: 'notification' | 'record_change';
221
+ thread: {
222
+ _id: string;
223
+ subject?: string | null;
224
+ };
225
+ message: {
226
+ _id: string;
227
+ htmlContent?: string | null;
228
+ };
229
+ peopleRecipients: WebhookPersonRecipient[];
230
+ tagRecipients: WebhookTagRecipient[];
231
+ }
232
+ interface WebhookMethods {
233
+ /**
234
+ * Receive a platform notification and fan it out inside the provider
235
+ * (DM the people, post to the linked channels). Called for provider
236
+ * applications with `webhookSubscriptions: [{ type: 'notification' }]`.
237
+ * Return once delivery has been attempted; failures should be logged and
238
+ * thrown so the platform can record them.
239
+ */
240
+ notification(logger: Logger, request: ProviderWebhookRequest): Promise<void>;
151
241
  }
152
242
  interface TagMethods {
153
243
  /**
@@ -200,7 +290,7 @@ interface QueryMethods {
200
290
  */
201
291
  execute(logger: Logger, credential: Credential, request: ExecuteQueryProviderRequest): Promise<ExecuteQueryProviderResponse>;
202
292
  }
203
- interface StartServerOptions {
293
+ export interface StartServerOptions {
204
294
  auth?: Partial<AuthMethods>;
205
295
  function?: Partial<FunctionMethods>;
206
296
  link?: Partial<LinkMethods>;
@@ -208,6 +298,16 @@ interface StartServerOptions {
208
298
  sync?: Partial<SyncMethods>;
209
299
  tag?: Partial<TagMethods>;
210
300
  upsert?: Partial<UpsertMethods>;
301
+ webhook?: Partial<WebhookMethods>;
302
+ /**
303
+ * Mount provider-owned routes on the Express app before the SDK's body
304
+ * parsers and platform-key middleware run. Use it for routers that verify
305
+ * their own request signatures over the raw body and are called by a third
306
+ * party rather than the platform, such as Slack Bolt's `ExpressReceiver`
307
+ * router. Anything mounted here is reachable without the platform key, so
308
+ * mount only routes that authenticate callers themselves.
309
+ */
310
+ mount?: (app: Express) => void;
211
311
  }
212
312
  export declare function createApp(options: StartServerOptions): Express;
213
313
  export declare function startServer(options: StartServerOptions): Promise<Express>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,7 +5,79 @@ import { pino } from 'pino';
5
5
  import { pinoHttp } from 'pino-http';
6
6
  import { CredentialsExpiredError, ValidationError, errorHandler } from './errors.js';
7
7
  import { getConnectionErrorHtml } from './html.js';
8
- export const logger = pino({});
8
+ import { createPlatformAuthMiddleware, resolvePlatformKey } from './platform-auth.js';
9
+ /**
10
+ * Field names whose values must never appear in log output in clear text.
11
+ *
12
+ * This is defence in depth, not the primary control. The primary control is
13
+ * that no log statement in this SDK passes a credential to the logger in the
14
+ * first place, and that the HTTP request serializer emits only method and
15
+ * path. Redaction is the backstop: if a future log statement — here or in a
16
+ * provider built on this SDK — ever includes one of these fields, pino masks
17
+ * the value before it reaches the log store rather than relying on every
18
+ * author to remember.
19
+ */
20
+ const SENSITIVE_FIELD_NAMES = [
21
+ 'access_token',
22
+ 'accessToken',
23
+ 'api_key',
24
+ 'apiKey',
25
+ 'authorization',
26
+ 'client_secret',
27
+ 'clientSecret',
28
+ 'cookie',
29
+ 'id_token',
30
+ 'idToken',
31
+ 'password',
32
+ 'refresh_token',
33
+ 'refreshToken',
34
+ 'secret',
35
+ 'token',
36
+ ];
37
+ /**
38
+ * Redaction paths applied to every log record. Each sensitive field name is
39
+ * matched at the top level and up to two levels of nesting, which covers the
40
+ * shapes actually logged (`{ credential }`, `{ connectedProvider: { credential } }`,
41
+ * `{ req: { headers } }`). The whole `credential` object is redacted rather
42
+ * than its individual fields, so a credential shape that gains a new token
43
+ * field later is still covered.
44
+ */
45
+ export const LOG_REDACT_PATHS = [
46
+ ...SENSITIVE_FIELD_NAMES,
47
+ ...SENSITIVE_FIELD_NAMES.map((field) => `*.${field}`),
48
+ ...SENSITIVE_FIELD_NAMES.map((field) => `*.*.${field}`),
49
+ 'credential',
50
+ '*.credential',
51
+ 'req.headers.authorization',
52
+ 'req.headers.cookie',
53
+ ];
54
+ export const logger = pino({
55
+ redact: {
56
+ censor: '[Redacted]',
57
+ paths: LOG_REDACT_PATHS,
58
+ },
59
+ });
60
+ /**
61
+ * Drops the query string from a request URL. Used for logging: the OAuth
62
+ * callback carries the authorization code and state there.
63
+ */
64
+ export const stripQueryString = (url) => url?.split('?')[0];
65
+ /**
66
+ * Serializes a request for logging, replacing pino's default request
67
+ * serializer.
68
+ *
69
+ * The default emits the full URL and every request header, both of which carry
70
+ * credentials in this service: the OAuth callback receives the authorization
71
+ * code and `state` on its query string, and the platform authenticates with an
72
+ * `Authorization: Bearer` header. This emits only what is needed to trace a
73
+ * request — correlation id, method, and path — so no credential is ever handed
74
+ * to the logger in the first place.
75
+ */
76
+ export const serializeRequestForLog = (req) => ({
77
+ id: req.id,
78
+ method: req.method,
79
+ url: stripQueryString(req.url),
80
+ });
9
81
  export function createApp(options) {
10
82
  const app = express();
11
83
  // Expose static files, for provider images, etc.
@@ -16,11 +88,18 @@ export function createApp(options) {
16
88
  autoLogging: {
17
89
  ignore: (req) => {
18
90
  // Ignore logging for health checks
19
- return req.url === '/api/v1/hello';
91
+ return stripQueryString(req.url) === '/api/v1/hello';
20
92
  },
21
93
  },
22
94
  logger: logger,
95
+ serializers: {
96
+ req: serializeRequestForLog,
97
+ },
23
98
  }));
99
+ // Provider-owned routers that verify their own signatures need the raw
100
+ // body, so they are mounted before the SDK's parsers and before the
101
+ // platform-key middleware. See `StartServerOptions.mount`.
102
+ options.mount?.(app);
24
103
  app.use(express.json({
25
104
  limit: '50mb',
26
105
  }));
@@ -28,6 +107,13 @@ export function createApp(options) {
28
107
  extended: true,
29
108
  limit: '50mb',
30
109
  }));
110
+ // Authenticate the platform before any handler acts on the credentials in a
111
+ // request body. Mounted after the body parsers so rejected requests are still
112
+ // logged, and after `express.static` so provider icons stay public.
113
+ const platformKey = resolvePlatformKey(logger);
114
+ if (platformKey) {
115
+ app.use(createPlatformAuthMiddleware(platformKey));
116
+ }
31
117
  app.get('/api/v1/hello', (req, res) => {
32
118
  res.send('You look nice today :)');
33
119
  });
@@ -264,6 +350,36 @@ export function createApp(options) {
264
350
  }
265
351
  res.send(await options.upsert.notes(req.log, body.connectedProvider.credential, body));
266
352
  });
353
+ app.post('/upsert/message', async (req, res) => {
354
+ if (!req.body) {
355
+ throw new ValidationError('A body must be provided in the request');
356
+ }
357
+ const body = req.body;
358
+ if (!body.connectedProvider || !body.connectedProvider.credential) {
359
+ throw new ValidationError('body.connectedProvider.credential must not be null');
360
+ }
361
+ if (!body.message) {
362
+ throw new ValidationError('body.message must be provided in the request');
363
+ }
364
+ if (!options.upsert?.message) {
365
+ throw new ValidationError('This provider does not support sending messages');
366
+ }
367
+ res.send(await options.upsert.message(req.log, body.connectedProvider.credential, body));
368
+ });
369
+ app.post('/webhook', async (req, res) => {
370
+ if (!req.body) {
371
+ throw new ValidationError('A body must be provided in the request');
372
+ }
373
+ const body = req.body;
374
+ if (body.type !== 'notification' && body.type !== 'record_change') {
375
+ throw new ValidationError('body.type must be "notification" or "record_change"');
376
+ }
377
+ if (!options.webhook?.notification) {
378
+ throw new ValidationError('This provider does not accept webhooks');
379
+ }
380
+ await options.webhook.notification(req.log, body);
381
+ res.status(204).end();
382
+ });
267
383
  app.post('/install/function/inputs', async (req, res) => {
268
384
  if (!req.body) {
269
385
  throw new ValidationError('A body must be provided in the request');
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import supertest from 'supertest';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import { createApp } from './index.js';
4
+ import { ALLOW_UNAUTHENTICATED_VAR } from './platform-auth.js';
5
+ // These tests exercise handler behaviour, not the platform authentication
6
+ // layer, so they run with the check disabled. Coverage for the check itself
7
+ // lives in platform-auth.test.ts.
8
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = 'true';
4
9
  function makeConnectedProvider() {
5
10
  return {
6
11
  application: 'calendar',
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,SAAS,qBAAqB;IAC7B,OAAO;QACN,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,oBAAoB;QAClC,UAAU,EAAE;YACX,WAAW,EAAE,mBAAmB;YAChC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YACjC,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,EAAE;SACX;QACD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,QAAQ,EAAE,QAAQ;KAClB,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,EAAE;gBACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW;oBAC7C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACzB,CAAC;aACD;SACD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;aACnC,IAAI,CAAC,aAAa,CAAC;aACnB,IAAI,CAAC,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,CAAC;aACpD,MAAM,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,EAAE;gBACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW;oBAC7C,OAAO;wBACN,OAAO,EAAE,mDAAmD;wBAC5D,MAAM,EAAE,gBAAgB;qBACxB,CAAC;gBACH,CAAC;aACD;SACD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;aACnC,IAAI,CAAC,aAAa,CAAC;aACnB,IAAI,CAAC,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,CAAC;aACpD,MAAM,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE;gBACP,OAAO,EAAE,mDAAmD;gBAC5D,MAAM,EAAE,gBAAgB;aACxB;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,EAAE;gBACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW;oBAC7C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACzB,CAAC;aACD;SACD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9G,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,EAAE;gBACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW;oBAC7C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACzB,CAAC;aACD;SACD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;aACnC,IAAI,CAAC,aAAa,CAAC;aACnB,IAAI,CAAC,EAAE,iBAAiB,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC;aAC/F,MAAM,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;aACnC,IAAI,CAAC,aAAa,CAAC;aACnB,IAAI,CAAC,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,CAAC;aACpD,MAAM,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAClF,IAAI,mBAAuC,CAAC;QAC5C,IAAI,mBAAuC,CAAC;QAE5C,MAAM,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,EAAE;gBACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU;oBAC3C,mBAAmB,GAAG,WAAW,CAAC;oBAClC,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC;oBAC7C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACzB,CAAC;aACD;SACD,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE1G,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,EAAE;gBACL,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW;oBACxC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;oBACvE,OAAO;wBACN,YAAY;wBACZ,UAAU,EAAE;4BACX,WAAW,EAAE,KAAK;4BAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;4BACjC,KAAK,EAAE,kBAAkB;4BACzB,OAAO,EAAE,EAAE;yBACX;wBACD,YAAY,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE;qBAC7D,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW;oBAC7C,OAAO;wBACN,OAAO,EAAE,yBAAyB;wBAClC,MAAM,EAAE,gBAAgB;qBACxB,CAAC;gBACH,CAAC;aACD;SACD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;aACnC,GAAG,CAAC,gBAAgB,CAAC;aACrB,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;aACjD,MAAM,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC/D,8DAA8D;QAC9D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logging-redaction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-redaction.test.d.ts","sourceRoot":"","sources":["../src/logging-redaction.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { pino } from 'pino';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { LOG_REDACT_PATHS, serializeRequestForLog, stripQueryString } from './index.js';
4
+ /**
5
+ * Evidence for ASVS 7.1.1 / CASA 6.5.1: credentials must not reach the log
6
+ * store. Two independent controls are asserted here.
7
+ *
8
+ * 1. Avoidance — the request serializer never hands the URL query string or
9
+ * the request headers to the logger, so authorization codes and bearer
10
+ * tokens are not logged even in principle.
11
+ * 2. Redaction — every log record passes through pino's redaction paths, so a
12
+ * credential included by some future log statement is masked rather than
13
+ * written in clear text.
14
+ */
15
+ /** Captures log output using the same configuration the SDK logger runs with. */
16
+ const captureLogOutput = (log) => {
17
+ const chunks = [];
18
+ const logger = pino({
19
+ redact: { censor: '[Redacted]', paths: LOG_REDACT_PATHS },
20
+ serializers: { req: serializeRequestForLog },
21
+ }, { write: (chunk) => chunks.push(chunk) });
22
+ log(logger);
23
+ return chunks.join('');
24
+ };
25
+ describe('stripQueryString', () => {
26
+ it('removes the query string, where the OAuth authorization code travels', () => {
27
+ expect(stripQueryString('/auth/callback?code=4/0AY0e-g7&state=abc.calendar')).toBe('/auth/callback');
28
+ });
29
+ it('leaves a URL with no query string untouched', () => {
30
+ expect(stripQueryString('/sync/email')).toBe('/sync/email');
31
+ });
32
+ });
33
+ describe('serializeRequestForLog', () => {
34
+ it('emits only correlation id, method and path', () => {
35
+ expect(serializeRequestForLog({
36
+ id: 7,
37
+ method: 'GET',
38
+ url: '/auth/callback?code=4/0AY0e-g7&state=abc.calendar',
39
+ })).toEqual({ id: 7, method: 'GET', url: '/auth/callback' });
40
+ });
41
+ // The default pino serializer includes a `headers` object. Ours must not,
42
+ // because the platform authenticates with an Authorization header.
43
+ it('does not carry request headers through to the log record', () => {
44
+ const serialized = serializeRequestForLog({ id: 1, method: 'POST', url: '/sync/email' });
45
+ expect(serialized).not.toHaveProperty('headers');
46
+ });
47
+ });
48
+ describe('log redaction', () => {
49
+ it('masks OAuth tokens at the top level and when nested', () => {
50
+ const output = captureLogOutput((logger) => logger.info({
51
+ accessToken: 'ya29.a0AfH6SMB-top-level',
52
+ connectedProvider: { credential: { accessToken: 'ya29.a0AfH6SMB-nested', refreshToken: '1//04-nested' } },
53
+ settings: { apiKey: 'bigfoot-api-key-value' },
54
+ }, 'credential handling'));
55
+ expect(output).not.toContain('ya29.a0AfH6SMB-top-level');
56
+ expect(output).not.toContain('ya29.a0AfH6SMB-nested');
57
+ expect(output).not.toContain('1//04-nested');
58
+ expect(output).not.toContain('bigfoot-api-key-value');
59
+ expect(output).toContain('[Redacted]');
60
+ });
61
+ it('masks the Authorization header if a request record ever carries one', () => {
62
+ const output = captureLogOutput((logger) => logger.info({ req: { headers: { authorization: 'Bearer platform-key-value' } } }, 'request'));
63
+ expect(output).not.toContain('platform-key-value');
64
+ });
65
+ // The end-to-end shape: an OAuth callback carrying a live authorization code
66
+ // and state, logged exactly as the running service would log it.
67
+ it('writes no authorization code, state, or bearer token for an OAuth callback', () => {
68
+ const output = captureLogOutput((logger) => logger.info({
69
+ req: {
70
+ headers: { authorization: 'Bearer platform-key-value' },
71
+ id: 1,
72
+ method: 'GET',
73
+ url: '/auth/callback?code=4/0AY0e-g7SECRETCODE&state=9f2c1e44-1b3a-4c7d-9e10-abc.calendar',
74
+ },
75
+ }, 'request completed'));
76
+ expect(output).not.toContain('4/0AY0e-g7SECRETCODE');
77
+ expect(output).not.toContain('9f2c1e44-1b3a-4c7d-9e10');
78
+ expect(output).not.toContain('platform-key-value');
79
+ expect(output).toContain('"url":"/auth/callback"');
80
+ });
81
+ });
82
+ //# sourceMappingURL=logging-redaction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-redaction.test.js","sourceRoot":"","sources":["../src/logging-redaction.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mount.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.test.d.ts","sourceRoot":"","sources":["../src/mount.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import express from 'express';
2
+ import supertest from 'supertest';
3
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
+ import { createApp } from './index.js';
5
+ import { ALLOW_UNAUTHENTICATED_VAR, BIGFOOT_API_KEY_VAR } from './platform-auth.js';
6
+ // Runs with the platform key ENABLED to prove that mounted routes are reachable
7
+ // without it while SDK routes still require it.
8
+ const originalKey = process.env[BIGFOOT_API_KEY_VAR];
9
+ const originalAllow = process.env[ALLOW_UNAUTHENTICATED_VAR];
10
+ beforeAll(() => {
11
+ process.env[BIGFOOT_API_KEY_VAR] = 'platform-key';
12
+ delete process.env[ALLOW_UNAUTHENTICATED_VAR];
13
+ });
14
+ afterAll(() => {
15
+ if (originalKey === undefined)
16
+ delete process.env[BIGFOOT_API_KEY_VAR];
17
+ else
18
+ process.env[BIGFOOT_API_KEY_VAR] = originalKey;
19
+ if (originalAllow === undefined)
20
+ delete process.env[ALLOW_UNAUTHENTICATED_VAR];
21
+ else
22
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = originalAllow;
23
+ });
24
+ describe('StartServerOptions.mount', () => {
25
+ it('mounts provider routes before body parsing and before the platform-key check', async () => {
26
+ const seen = {};
27
+ const router = express.Router();
28
+ // Simulates a receiver that verifies a signature over the raw body: it
29
+ // must observe an unconsumed stream, so express.json must not have run yet.
30
+ router.post('/slack/events', (req, res) => {
31
+ let raw = '';
32
+ req.on('data', (chunk) => {
33
+ raw += chunk.toString();
34
+ });
35
+ req.on('end', () => {
36
+ seen.rawBodyLength = raw.length;
37
+ seen.parsedBody = req.body;
38
+ res.status(200).send('ok');
39
+ });
40
+ });
41
+ const app = createApp({
42
+ mount: (expressApp) => {
43
+ expressApp.use(router);
44
+ },
45
+ upsert: { message: async () => ({}) },
46
+ });
47
+ await supertest(app)
48
+ .post('/slack/events')
49
+ .set('Content-Type', 'application/json')
50
+ .send('{"type":"event"}')
51
+ .expect(200);
52
+ expect(seen.rawBodyLength).toBe('{"type":"event"}'.length);
53
+ expect(seen.parsedBody).toBeUndefined();
54
+ // SDK routes remain protected by the platform key.
55
+ await supertest(app).post('/upsert/message').send({}).expect(401);
56
+ await supertest(app).post('/upsert/message').set('Authorization', 'Bearer platform-key').send({}).expect(400);
57
+ });
58
+ });
59
+ //# sourceMappingURL=mount.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.test.js","sourceRoot":"","sources":["../src/mount.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { RequestHandler } from 'express';
2
+ import type { Logger } from './index.js';
3
+ /**
4
+ * Environment variable holding the shared key for this provider. It is the
5
+ * `apiKey` of the platform's `bigfoot-<provider>` token record, issued to the
6
+ * provider at registration, and it authenticates both directions of the
7
+ * platform ↔ provider channel:
8
+ *
9
+ * - **Outbound** — the provider sends it as an `apiKey` header when calling the
10
+ * platform (e.g. posting obtained credentials back), which the platform
11
+ * resolves with `findOneByApiKey`.
12
+ * - **Inbound** — the platform sends the same value as
13
+ * `Authorization: Bearer <token>` on every call to the provider, read from
14
+ * that record with `findOneByName`. This module verifies it.
15
+ *
16
+ * Because one secret serves both directions, rotating it means updating the
17
+ * platform's token record and the provider's configuration together.
18
+ */
19
+ export declare const BIGFOOT_API_KEY_VAR = "BIGFOOT_API_KEY";
20
+ /**
21
+ * Escape hatch for local development and automated tests. Deliberately verbose
22
+ * and easy to grep for: an unauthenticated provider is a security defect in any
23
+ * deployed environment, so switching the check off has to be a conscious and
24
+ * visible act rather than an accident of configuration.
25
+ */
26
+ export declare const ALLOW_UNAUTHENTICATED_VAR = "ALLOW_UNAUTHENTICATED_PROVIDER_REQUESTS";
27
+ /**
28
+ * Routes that must remain reachable without the platform key:
29
+ *
30
+ * - `/api/v1/hello` is the load balancer health check.
31
+ * - `/auth/connect` and `/auth/callback` are the browser-facing steps of the
32
+ * OAuth flow. The user's own browser follows the first and the OAuth provider
33
+ * itself invokes the second, so neither can carry a platform credential.
34
+ * `/auth/callback` is safe to leave open because it can do nothing without a
35
+ * provider-issued authorization code bound to a `state` value that resolves
36
+ * to a pending connection record on the platform.
37
+ *
38
+ * Static assets (provider icons) are served by `express.static`, which is
39
+ * mounted ahead of this middleware, so they stay public without being listed.
40
+ */
41
+ export declare const PUBLIC_PATHS: ReadonlySet<string>;
42
+ /**
43
+ * Compares two secrets without leaking their contents through timing.
44
+ *
45
+ * Both sides are hashed first so the comparison always runs over equal-length
46
+ * buffers: `timingSafeEqual` throws when lengths differ, and comparing lengths
47
+ * up front would leak the expected key's length.
48
+ */
49
+ export declare const secretsMatch: (presented: string, expected: string) => boolean;
50
+ /** Extracts the token from an `Authorization: Bearer <token>` header. */
51
+ export declare const getBearerToken: (header: string | undefined) => string;
52
+ /**
53
+ * Resolves the expected platform key from the environment.
54
+ *
55
+ * Fails closed: without a key, and without an explicit opt-out, the process
56
+ * refuses to start rather than serving provider endpoints anonymously. A loud
57
+ * failure at deploy time is far preferable to a silent authentication gap.
58
+ *
59
+ * @returns the expected key, or `null` when the check is explicitly disabled.
60
+ */
61
+ export declare const resolvePlatformKey: (logger: Logger) => string | null;
62
+ /**
63
+ * Rejects any request to a non-public route that does not present the platform
64
+ * key, before it reaches a handler that would act on the credentials in its
65
+ * body.
66
+ */
67
+ export declare const createPlatformAuthMiddleware: (expectedKey: string) => RequestHandler;
68
+ //# sourceMappingURL=platform-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth.d.ts","sourceRoot":"","sources":["../src/platform-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,4CAA4C,CAAC;AAEnF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAAiE,CAAC;AAE/G;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,cAAe,MAAM,YAAY,MAAM,KAAG,OASlE,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,cAAc,WAAY,MAAM,GAAG,SAAS,KAAG,MAW3D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,WAAY,MAAM,KAAG,MAAM,GAAG,IAiB5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,gBAAiB,MAAM,KAAG,cAqBlE,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { createHash, timingSafeEqual } from 'node:crypto';
2
+ /**
3
+ * Environment variable holding the shared key for this provider. It is the
4
+ * `apiKey` of the platform's `bigfoot-<provider>` token record, issued to the
5
+ * provider at registration, and it authenticates both directions of the
6
+ * platform ↔ provider channel:
7
+ *
8
+ * - **Outbound** — the provider sends it as an `apiKey` header when calling the
9
+ * platform (e.g. posting obtained credentials back), which the platform
10
+ * resolves with `findOneByApiKey`.
11
+ * - **Inbound** — the platform sends the same value as
12
+ * `Authorization: Bearer <token>` on every call to the provider, read from
13
+ * that record with `findOneByName`. This module verifies it.
14
+ *
15
+ * Because one secret serves both directions, rotating it means updating the
16
+ * platform's token record and the provider's configuration together.
17
+ */
18
+ export const BIGFOOT_API_KEY_VAR = 'BIGFOOT_API_KEY';
19
+ /**
20
+ * Escape hatch for local development and automated tests. Deliberately verbose
21
+ * and easy to grep for: an unauthenticated provider is a security defect in any
22
+ * deployed environment, so switching the check off has to be a conscious and
23
+ * visible act rather than an accident of configuration.
24
+ */
25
+ export const ALLOW_UNAUTHENTICATED_VAR = 'ALLOW_UNAUTHENTICATED_PROVIDER_REQUESTS';
26
+ /**
27
+ * Routes that must remain reachable without the platform key:
28
+ *
29
+ * - `/api/v1/hello` is the load balancer health check.
30
+ * - `/auth/connect` and `/auth/callback` are the browser-facing steps of the
31
+ * OAuth flow. The user's own browser follows the first and the OAuth provider
32
+ * itself invokes the second, so neither can carry a platform credential.
33
+ * `/auth/callback` is safe to leave open because it can do nothing without a
34
+ * provider-issued authorization code bound to a `state` value that resolves
35
+ * to a pending connection record on the platform.
36
+ *
37
+ * Static assets (provider icons) are served by `express.static`, which is
38
+ * mounted ahead of this middleware, so they stay public without being listed.
39
+ */
40
+ export const PUBLIC_PATHS = new Set(['/api/v1/hello', '/auth/callback', '/auth/connect']);
41
+ /**
42
+ * Compares two secrets without leaking their contents through timing.
43
+ *
44
+ * Both sides are hashed first so the comparison always runs over equal-length
45
+ * buffers: `timingSafeEqual` throws when lengths differ, and comparing lengths
46
+ * up front would leak the expected key's length.
47
+ */
48
+ export const secretsMatch = (presented, expected) => {
49
+ if (presented.length === 0 || expected.length === 0) {
50
+ return false;
51
+ }
52
+ return timingSafeEqual(createHash('sha256').update(presented).digest(), createHash('sha256').update(expected).digest());
53
+ };
54
+ /** Extracts the token from an `Authorization: Bearer <token>` header. */
55
+ export const getBearerToken = (header) => {
56
+ if (!header) {
57
+ return '';
58
+ }
59
+ const parts = header.trim().split(/\s+/);
60
+ if (parts.length !== 2 || parts[0].toLowerCase() !== 'bearer') {
61
+ return '';
62
+ }
63
+ return parts[1];
64
+ };
65
+ /**
66
+ * Resolves the expected platform key from the environment.
67
+ *
68
+ * Fails closed: without a key, and without an explicit opt-out, the process
69
+ * refuses to start rather than serving provider endpoints anonymously. A loud
70
+ * failure at deploy time is far preferable to a silent authentication gap.
71
+ *
72
+ * @returns the expected key, or `null` when the check is explicitly disabled.
73
+ */
74
+ export const resolvePlatformKey = (logger) => {
75
+ const key = process.env[BIGFOOT_API_KEY_VAR]?.trim();
76
+ if (key) {
77
+ return key;
78
+ }
79
+ if (process.env[ALLOW_UNAUTHENTICATED_VAR] === 'true') {
80
+ logger.warn({ variable: ALLOW_UNAUTHENTICATED_VAR }, 'Provider endpoints are UNAUTHENTICATED. This is intended for local development only and must never be set in a deployed environment.');
81
+ return null;
82
+ }
83
+ throw new Error(`${BIGFOOT_API_KEY_VAR} must be set so provider endpoints can authenticate calls from the platform. Its value must match the platform's "bigfoot-<provider>" token record. Set ${ALLOW_UNAUTHENTICATED_VAR}=true only for local development or tests.`);
84
+ };
85
+ /**
86
+ * Rejects any request to a non-public route that does not present the platform
87
+ * key, before it reaches a handler that would act on the credentials in its
88
+ * body.
89
+ */
90
+ export const createPlatformAuthMiddleware = (expectedKey) => {
91
+ return (req, res, next) => {
92
+ if (PUBLIC_PATHS.has(req.path)) {
93
+ next();
94
+ return;
95
+ }
96
+ if (!secretsMatch(getBearerToken(req.get('authorization')), expectedKey)) {
97
+ // Path only — never the presented value, which is credential material.
98
+ req.log?.warn({ path: req.path }, 'Rejected a provider request with a missing or invalid platform key');
99
+ res.status(401).contentType('application/problem+json').json({
100
+ status: 401,
101
+ title: 'Unauthorized',
102
+ type: 'https://getnoded.ai/unauthorized',
103
+ });
104
+ return;
105
+ }
106
+ next();
107
+ };
108
+ };
109
+ //# sourceMappingURL=platform-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth.js","sourceRoot":"","sources":["../src/platform-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=platform-auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth.test.d.ts","sourceRoot":"","sources":["../src/platform-auth.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ import supertest from 'supertest';
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { createApp, logger } from './index.js';
4
+ import { ALLOW_UNAUTHENTICATED_VAR, BIGFOOT_API_KEY_VAR, getBearerToken, resolvePlatformKey, secretsMatch, } from './platform-auth.js';
5
+ const PLATFORM_KEY = 'platform-key-value';
6
+ const clearAuthEnv = () => {
7
+ delete process.env[BIGFOOT_API_KEY_VAR];
8
+ delete process.env[ALLOW_UNAUTHENTICATED_VAR];
9
+ };
10
+ beforeEach(() => {
11
+ clearAuthEnv();
12
+ });
13
+ afterEach(() => {
14
+ clearAuthEnv();
15
+ });
16
+ /** Builds an app with enough handlers to exercise both public and protected routes. */
17
+ const buildApp = () => createApp({
18
+ auth: {
19
+ async callback() {
20
+ return { connectionId: 'connection-id', credential: { email: 'user@example.com' } };
21
+ },
22
+ async check() {
23
+ return { status: 'ok' };
24
+ },
25
+ async connect() {
26
+ return { type: 'redirect', url: 'https://accounts.google.com/o/oauth2/v2/auth' };
27
+ },
28
+ async refresh() {
29
+ return { credential: { accessToken: 'refreshed' } };
30
+ },
31
+ },
32
+ });
33
+ const connectedProviderBody = {
34
+ connectedProvider: {
35
+ application: 'calendar',
36
+ credential: { accessToken: 'token', email: 'user@example.com' },
37
+ provider: 'google',
38
+ },
39
+ };
40
+ describe('getBearerToken', () => {
41
+ it('extracts the token from a well-formed header', () => {
42
+ expect(getBearerToken('Bearer abc123')).toBe('abc123');
43
+ });
44
+ it('accepts any casing of the scheme, as RFC 7235 requires', () => {
45
+ expect(getBearerToken('bearer abc123')).toBe('abc123');
46
+ expect(getBearerToken('BEARER abc123')).toBe('abc123');
47
+ });
48
+ it('returns empty for headers it cannot parse', () => {
49
+ expect(getBearerToken(undefined)).toBe('');
50
+ expect(getBearerToken('')).toBe('');
51
+ expect(getBearerToken('abc123')).toBe('');
52
+ expect(getBearerToken('Basic abc123')).toBe('');
53
+ expect(getBearerToken('Bearer')).toBe('');
54
+ expect(getBearerToken('Bearer a b')).toBe('');
55
+ });
56
+ });
57
+ describe('secretsMatch', () => {
58
+ it('matches identical secrets', () => {
59
+ expect(secretsMatch('same-value', 'same-value')).toBe(true);
60
+ });
61
+ it('rejects different secrets, including ones of differing length', () => {
62
+ expect(secretsMatch('a-value', 'another-value')).toBe(false);
63
+ expect(secretsMatch('short', 'a-much-longer-value')).toBe(false);
64
+ });
65
+ // An empty presented value must never satisfy an empty expected value.
66
+ it('rejects empty values on either side', () => {
67
+ expect(secretsMatch('', '')).toBe(false);
68
+ expect(secretsMatch('', 'expected')).toBe(false);
69
+ expect(secretsMatch('presented', '')).toBe(false);
70
+ });
71
+ });
72
+ describe('resolvePlatformKey', () => {
73
+ it('returns the configured key', () => {
74
+ process.env[BIGFOOT_API_KEY_VAR] = PLATFORM_KEY;
75
+ expect(resolvePlatformKey(logger)).toBe(PLATFORM_KEY);
76
+ });
77
+ // Fail closed: starting without a key would serve provider endpoints anonymously.
78
+ it('throws when no key is configured and the check is not explicitly disabled', () => {
79
+ expect(() => resolvePlatformKey(logger)).toThrow(/BIGFOOT_API_KEY must be set/);
80
+ });
81
+ it('throws when the key is set but blank', () => {
82
+ process.env[BIGFOOT_API_KEY_VAR] = ' ';
83
+ expect(() => resolvePlatformKey(logger)).toThrow(/BIGFOOT_API_KEY must be set/);
84
+ });
85
+ it('warns loudly when the check is explicitly disabled', () => {
86
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = 'true';
87
+ const warn = vi.spyOn(logger, 'warn').mockImplementation(() => undefined);
88
+ expect(resolvePlatformKey(logger)).toBeNull();
89
+ expect(warn).toHaveBeenCalledWith(expect.anything(), expect.stringContaining('UNAUTHENTICATED'));
90
+ warn.mockRestore();
91
+ });
92
+ // Only the exact string enables the opt-out, so a stray value cannot disable auth.
93
+ it('does not treat other values as an opt-out', () => {
94
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = 'false';
95
+ expect(() => resolvePlatformKey(logger)).toThrow();
96
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = '1';
97
+ expect(() => resolvePlatformKey(logger)).toThrow();
98
+ });
99
+ });
100
+ describe('platform authentication middleware', () => {
101
+ beforeEach(() => {
102
+ process.env[BIGFOOT_API_KEY_VAR] = PLATFORM_KEY;
103
+ });
104
+ it('rejects a protected route with no credential', async () => {
105
+ const response = await supertest(buildApp()).post('/auth/check').send(connectedProviderBody).expect(401);
106
+ expect(response.body.title).toBe('Unauthorized');
107
+ });
108
+ it('rejects a protected route with the wrong key', async () => {
109
+ await supertest(buildApp())
110
+ .post('/auth/check')
111
+ .set('Authorization', 'Bearer not-the-platform-key')
112
+ .send(connectedProviderBody)
113
+ .expect(401);
114
+ });
115
+ it('allows a protected route with the correct key', async () => {
116
+ const response = await supertest(buildApp())
117
+ .post('/auth/check')
118
+ .set('Authorization', `Bearer ${PLATFORM_KEY}`)
119
+ .send(connectedProviderBody)
120
+ .expect(200);
121
+ expect(response.body).toEqual({ result: { status: 'ok' } });
122
+ });
123
+ it('protects sync and link routes, which act on credentials in the body', async () => {
124
+ const app = buildApp();
125
+ await supertest(app).post('/sync/email').send(connectedProviderBody).expect(401);
126
+ await supertest(app).post('/drive/link').send(connectedProviderBody).expect(401);
127
+ await supertest(app).post('/auth/refresh').send(connectedProviderBody).expect(401);
128
+ });
129
+ // The health check and the two browser-facing OAuth steps cannot carry a
130
+ // platform credential, so they stay reachable without one.
131
+ it('leaves the health check public', async () => {
132
+ await supertest(buildApp()).get('/api/v1/hello').expect(200);
133
+ });
134
+ it('leaves the OAuth connect redirect public', async () => {
135
+ await supertest(buildApp()).get('/auth/connect?application=calendar&connectionId=abc').expect(302);
136
+ });
137
+ it('does not require the key when the check is explicitly disabled', async () => {
138
+ delete process.env[BIGFOOT_API_KEY_VAR];
139
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = 'true';
140
+ await supertest(buildApp()).post('/auth/check').send(connectedProviderBody).expect(200);
141
+ });
142
+ });
143
+ //# sourceMappingURL=platform-auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth.test.js","sourceRoot":"","sources":["../src/platform-auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=upsert-message.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert-message.test.d.ts","sourceRoot":"","sources":["../src/upsert-message.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import supertest from 'supertest';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { createApp } from './index.js';
4
+ import { ALLOW_UNAUTHENTICATED_VAR } from './platform-auth.js';
5
+ // Handler behaviour only; the platform-key check is covered in platform-auth.test.ts
6
+ // and the mount ordering in mount.test.ts.
7
+ process.env[ALLOW_UNAUTHENTICATED_VAR] = 'true';
8
+ function makeConnectedProvider() {
9
+ return {
10
+ application: 'platform',
11
+ connectionId: 'test-connection-id',
12
+ credential: {
13
+ accessToken: 'xoxb-test',
14
+ dateExpiry: 0,
15
+ email: 'test@example.com',
16
+ instanceId: 'T123',
17
+ instanceUrl: 'https://acme.slack.com',
18
+ profile: {},
19
+ },
20
+ dateCreated: Date.now(),
21
+ dateUpdated: Date.now(),
22
+ provider: 'slack',
23
+ };
24
+ }
25
+ const message = {
26
+ _id: 'msg-1',
27
+ blockType: 'message',
28
+ bodyHtml: '<p>Hello</p>',
29
+ bodyDocument: '{"type":"doc","content":[]}',
30
+ to: { externalId: 'C123' },
31
+ };
32
+ describe('POST /upsert/message', () => {
33
+ it('passes the credential and request to upsert.message and returns its result', async () => {
34
+ const upsertMessage = vi.fn().mockResolvedValue({
35
+ ...message,
36
+ externalId: '1700000000.000100',
37
+ uri: 'https://acme.slack.com/archives/C123/p1700000000000100',
38
+ });
39
+ const app = createApp({ upsert: { message: upsertMessage } });
40
+ const response = await supertest(app)
41
+ .post('/upsert/message')
42
+ .send({ connectedProvider: makeConnectedProvider(), message })
43
+ .expect(200);
44
+ expect(response.body.externalId).toBe('1700000000.000100');
45
+ expect(upsertMessage).toHaveBeenCalledTimes(1);
46
+ const [, credential, request] = upsertMessage.mock.calls[0];
47
+ expect(credential.accessToken).toBe('xoxb-test');
48
+ expect(request.message.to.externalId).toBe('C123');
49
+ });
50
+ it('returns 400 when the credential is missing', async () => {
51
+ const app = createApp({ upsert: { message: vi.fn() } });
52
+ const response = await supertest(app)
53
+ .post('/upsert/message')
54
+ .send({ connectedProvider: { provider: 'slack' }, message })
55
+ .expect(400);
56
+ expect(response.body.detail).toMatch(/credential/);
57
+ });
58
+ it('returns 400 when the message is missing', async () => {
59
+ const app = createApp({ upsert: { message: vi.fn() } });
60
+ const response = await supertest(app)
61
+ .post('/upsert/message')
62
+ .send({ connectedProvider: makeConnectedProvider() })
63
+ .expect(400);
64
+ expect(response.body.detail).toMatch(/message/);
65
+ });
66
+ it('returns 400 when the provider does not implement message sending', async () => {
67
+ const app = createApp({ upsert: {} });
68
+ const response = await supertest(app)
69
+ .post('/upsert/message')
70
+ .send({ connectedProvider: makeConnectedProvider(), message })
71
+ .expect(400);
72
+ expect(response.body.detail).toMatch(/does not support sending messages/);
73
+ });
74
+ });
75
+ describe('POST /webhook', () => {
76
+ const payload = {
77
+ type: 'notification',
78
+ thread: { _id: 'thread-1', subject: 'Renewal risk' },
79
+ message: { _id: 'm-1', htmlContent: '<p>Acme flagged churn risk.</p>' },
80
+ peopleRecipients: [
81
+ {
82
+ _id: 'tag-p',
83
+ email: 'joan@acme.test',
84
+ credential: { email: 'joan@acme.test', instanceId: 'T123', instanceUrl: 'https://acme.slack.com', profile: {} },
85
+ },
86
+ ],
87
+ tagRecipients: [
88
+ {
89
+ _id: 'tag-c',
90
+ alias: '#acme',
91
+ email: null,
92
+ externalId: 'C123',
93
+ tagType: 'topic',
94
+ credential: { instanceId: 'T123' },
95
+ },
96
+ ],
97
+ };
98
+ it('hands the payload to webhook.notification and answers 204', async () => {
99
+ const notification = vi.fn().mockResolvedValue(undefined);
100
+ const app = createApp({ webhook: { notification } });
101
+ await supertest(app).post('/webhook').send(payload).expect(204);
102
+ expect(notification).toHaveBeenCalledTimes(1);
103
+ expect(notification.mock.calls[0][1].tagRecipients[0].externalId).toBe('C123');
104
+ });
105
+ it('rejects unknown webhook types', async () => {
106
+ const app = createApp({ webhook: { notification: vi.fn() } });
107
+ const response = await supertest(app)
108
+ .post('/webhook')
109
+ .send({ ...payload, type: 'other' })
110
+ .expect(400);
111
+ expect(response.body.detail).toMatch(/body.type/);
112
+ });
113
+ it('returns 400 when the provider does not accept webhooks', async () => {
114
+ const app = createApp({});
115
+ const response = await supertest(app).post('/webhook').send(payload).expect(400);
116
+ expect(response.body.detail).toMatch(/does not accept webhooks/);
117
+ });
118
+ });
119
+ //# sourceMappingURL=upsert-message.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert-message.test.js","sourceRoot":"","sources":["../src/upsert-message.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bigfootai/sdk",
3
3
  "type": "module",
4
- "version": "1.8.0",
4
+ "version": "1.10.0",
5
5
  "files": [
6
6
  "dist",
7
7
  "LICENSE",
@@ -9,7 +9,7 @@
9
9
  ],
10
10
  "main": "dist/index.js",
11
11
  "dependencies": {
12
- "@bigfootai/bigfoot-types": "^5.4.268",
12
+ "@bigfootai/bigfoot-types": "^5.4.296",
13
13
  "body-parser": "^2.2.2",
14
14
  "express": "^5.0.1",
15
15
  "pino": "^9.9.0",