@microsoft/teams.apps 2.0.0-preview.9 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +1 -1
  2. package/dist/app.d.ts +5 -4
  3. package/dist/app.embed.js +2 -2
  4. package/dist/app.js +15 -8
  5. package/dist/app.oauth.d.ts +3 -2
  6. package/dist/app.oauth.js +5 -3
  7. package/dist/app.process.js +16 -3
  8. package/dist/app.routing.d.ts +8 -4
  9. package/dist/app.routing.js +2 -1
  10. package/dist/contexts/activity-signin.d.ts +1 -1
  11. package/dist/contexts/activity.d.ts +16 -7
  12. package/dist/contexts/activity.js +11 -14
  13. package/dist/middleware/index.d.ts +2 -2
  14. package/dist/middleware/index.js +6 -5
  15. package/dist/middleware/jwt-validation-middleware.js +6 -6
  16. package/dist/middleware/strip-mentions-text.d.ts +1 -1
  17. package/dist/middleware/strip-mentions-text.js +1 -1
  18. package/dist/middleware/with-remote-function-jwt-validation.d.ts +16 -0
  19. package/dist/middleware/with-remote-function-jwt-validation.js +47 -0
  20. package/dist/plugins/http/plugin.d.ts +3 -3
  21. package/dist/plugins/http/plugin.js +2 -2
  22. package/dist/plugins/http/stream.d.ts +6 -4
  23. package/dist/plugins/http/stream.js +51 -20
  24. package/dist/router/index.d.ts +1 -0
  25. package/dist/router/index.js +18 -0
  26. package/dist/router/route.d.ts +9 -0
  27. package/dist/router/route.js +3 -0
  28. package/dist/router/router.d.ts +29 -0
  29. package/dist/router/router.js +101 -0
  30. package/dist/routes/activity.d.ts +2 -2
  31. package/dist/routes/conversation-update.d.ts +2 -2
  32. package/dist/routes/event.d.ts +2 -2
  33. package/dist/routes/index.d.ts +7 -6
  34. package/dist/routes/index.js +4 -4
  35. package/dist/routes/install.d.ts +2 -2
  36. package/dist/routes/invoke/index.d.ts +2 -2
  37. package/dist/routes/message-delete.d.ts +2 -2
  38. package/dist/routes/message-update.d.ts +2 -2
  39. package/dist/types/app-events.d.ts +1 -1
  40. package/dist/types/app-routing.d.ts +11 -0
  41. package/dist/types/app-routing.js +3 -0
  42. package/dist/types/plugin/plugin-start-event.d.ts +1 -1
  43. package/dist/types/plugin/plugin.d.ts +2 -2
  44. package/dist/types/route-handler.d.ts +1 -1
  45. package/dist/types/streamer.d.ts +5 -0
  46. package/package.json +5 -5
  47. package/dist/middleware/entra-token-validator.d.ts +0 -75
  48. package/dist/middleware/entra-token-validator.js +0 -169
  49. package/dist/middleware/with-client-auth.d.ts +0 -13
  50. package/dist/middleware/with-client-auth.js +0 -45
  51. package/dist/router.d.ts +0 -34
  52. package/dist/router.js +0 -91
@@ -15,10 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./activity"), exports);
18
+ __exportStar(require("./conversation-update"), exports);
19
+ __exportStar(require("./event"), exports);
18
20
  __exportStar(require("./install"), exports);
19
21
  __exportStar(require("./invoke"), exports);
20
- __exportStar(require("./conversation-update"), exports);
21
- __exportStar(require("./message-update"), exports);
22
22
  __exportStar(require("./message-delete"), exports);
23
- __exportStar(require("./event"), exports);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkEsNkNBQTJCO0FBQzNCLDRDQUEwQjtBQUMxQiwyQ0FBeUI7QUFDekIsd0RBQXNDO0FBQ3RDLG1EQUFpQztBQUNqQyxtREFBaUM7QUFDakMsMENBQXdCIn0=
23
+ __exportStar(require("./message-update"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsNkNBQTJCO0FBQzNCLHdEQUFzQztBQUN0QywwQ0FBd0I7QUFDeEIsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QixtREFBaUM7QUFDakMsbURBQWlDIn0=
@@ -1,8 +1,8 @@
1
1
  import { InstallUpdateActivity } from '@microsoft/teams.api';
2
2
  import { IActivityContext } from '../contexts';
3
3
  import { RouteHandler } from '../types';
4
- export type InstallActivityRoutes = {
4
+ export type InstallActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
5
5
  [K in InstallUpdateActivity['action'] as `install.${K}`]?: RouteHandler<IActivityContext<Extract<InstallUpdateActivity, {
6
6
  action: K;
7
- }>>, void>;
7
+ }>, TExtraCtx>, void>;
8
8
  };
@@ -4,10 +4,10 @@ import { RouteHandler } from '../../types';
4
4
  import { FileConsentActivityRoutes } from './file-consent';
5
5
  import { MessageExtensionSubmitActivityRoutes } from './message-extension-submit';
6
6
  import { MessageSubmitActivityRoutes } from './message-submit';
7
- export type InvokeActivityRoutes = {
7
+ export type InvokeActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
8
8
  [K in InvokeActivity['name'] as InvokeAliases[K]]?: RouteHandler<IActivityContext<Extract<InvokeActivity, {
9
9
  name: K;
10
- }>>, InvokeResponse<K> | InvokeResponse<K>['body']>;
10
+ }>, TExtraCtx>, InvokeResponse<K> | InvokeResponse<K>['body']>;
11
11
  } & FileConsentActivityRoutes & MessageExtensionSubmitActivityRoutes & MessageSubmitActivityRoutes;
12
12
  type InvokeAliases = {
13
13
  'config/fetch': 'config.open';
@@ -1,6 +1,6 @@
1
1
  import { IMessageDeleteActivity } from '@microsoft/teams.api';
2
2
  import { IActivityContext } from '../contexts';
3
3
  import { RouteHandler } from '../types';
4
- export type MessageDeleteActivityRoutes = {
5
- [K in IMessageDeleteActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageDeleteActivity>, void>;
4
+ export type MessageDeleteActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
5
+ [K in IMessageDeleteActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageDeleteActivity, TExtraCtx>, void>;
6
6
  };
@@ -1,6 +1,6 @@
1
1
  import { IMessageUpdateActivity } from '@microsoft/teams.api';
2
2
  import { IActivityContext } from '../contexts';
3
3
  import { RouteHandler } from '../types';
4
- export type MessageUpdateActivityRoutes = {
5
- [K in IMessageUpdateActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageUpdateActivity>, void>;
4
+ export type MessageUpdateActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
5
+ [K in IMessageUpdateActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageUpdateActivity, TExtraCtx>, void>;
6
6
  };
@@ -4,7 +4,7 @@ import { UnionToIntersection } from './union-to-intersection';
4
4
  /**
5
5
  * Extracts the events from a plugin if it extends PluginWithEvents
6
6
  */
7
- export type PluginEvents<T> = T extends IPlugin<infer Events> ? Events : {};
7
+ export type PluginEvents<T> = T extends IPlugin<any, infer Events> ? Events : {};
8
8
  type MergePluginEventMaps<TPlugins> = UnionToIntersection<TPlugins extends readonly unknown[] ? PluginEvents<TPlugins[number]> : PluginEvents<TPlugins>>;
9
9
  /**
10
10
  * Combines two sets of event types:
@@ -0,0 +1,11 @@
1
+ import { IPlugin } from './plugin';
2
+ import { UnionToIntersection } from './union-to-intersection';
3
+ import type { App } from '../app';
4
+ import type { IRoutes } from '../routes';
5
+ /**
6
+ * Extracts the events from a plugin if it extends PluginWithEvents
7
+ */
8
+ export type PluginAdditionalContext<T> = UnionToIntersection<T extends IPlugin<infer Ctx, any> ? Ctx : {}> extends infer R ? R extends Record<string, any> ? R : {} : {};
9
+ type AppPlugin<TApp extends App> = TApp extends App<infer TPlugin> ? TPlugin : never;
10
+ export type AppRoutingHandler<Name extends keyof IRoutes, TApp extends App<any>> = Exclude<IRoutes<PluginAdditionalContext<AppPlugin<TApp>>>[Name], undefined>;
11
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXJvdXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvYXBwLXJvdXRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -7,5 +7,5 @@ export interface IPluginStartEvent {
7
7
  * the port given to the
8
8
  * `app.start()` method
9
9
  */
10
- readonly port: number;
10
+ readonly port: number | string;
11
11
  }
@@ -21,7 +21,7 @@ export type OnErrorPluginEvent = (event: IErrorEvent) => void;
21
21
  * receives an activity
22
22
  */
23
23
  export type OnActivityPluginEvent = (event: IActivityEvent) => void;
24
- export interface IPlugin<TEvents extends {} = {}> {
24
+ export interface IPlugin<TActivityContext extends {} = {}, TEvents extends {} = {}> {
25
25
  /**
26
26
  * The event types that this plugin can emit. This is just a type, but we need it
27
27
  * for the type system to pick it up. You don't actually need to assign this to
@@ -53,7 +53,7 @@ export interface IPlugin<TEvents extends {} = {}> {
53
53
  * called by the `App`
54
54
  * when an activity is received
55
55
  */
56
- onActivity?(event: IPluginActivityEvent): void | Promise<void>;
56
+ onActivity?(event: IPluginActivityEvent): void | TActivityContext | Promise<void | TActivityContext>;
57
57
  /**
58
58
  * called by the `App`
59
59
  * when an activity is sent
@@ -1,2 +1,2 @@
1
1
  import { IActivityContext } from '../contexts';
2
- export type RouteHandler<In extends IActivityContext<any>, Out = void> = (ctx: In) => Out | Promise<Out>;
2
+ export type RouteHandler<In extends IActivityContext<any, any>, Out = void> = (ctx: In) => Out | Promise<Out>;
@@ -24,6 +24,11 @@ export interface IStreamer {
24
24
  * @param activity the activity to send
25
25
  */
26
26
  emit(activity: Partial<IMessageActivity | ITypingActivity> | string): void;
27
+ /**
28
+ * send status updates before emitting (ex. "Thinking...")
29
+ * @param text the status text to send
30
+ */
31
+ update(text: string): void;
27
32
  /**
28
33
  * close the stream
29
34
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/teams.apps",
3
- "version": "2.0.0-preview.9",
3
+ "version": "2.0.1",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -46,12 +46,12 @@
46
46
  "reflect-metadata": "^0.2.2"
47
47
  },
48
48
  "peerDependencies": {
49
- "@microsoft/teams.api": "2.0.0-preview.9",
50
- "@microsoft/teams.common": "2.0.0-preview.9",
51
- "@microsoft/teams.graph": "2.0.0-preview.9"
49
+ "@microsoft/teams.api": "2.0.1",
50
+ "@microsoft/teams.common": "2.0.1",
51
+ "@microsoft/teams.graph": "2.0.1"
52
52
  },
53
53
  "devDependencies": {
54
- "@microsoft/teams.config": "2.0.0-preview.9",
54
+ "@microsoft/teams.config": "2.0.1",
55
55
  "@types/cors": "^2.8.17",
56
56
  "@types/express": "^5.0.0",
57
57
  "@types/jest": "^29.5.12",
@@ -1,75 +0,0 @@
1
- import jwt, { type JwtPayload } from 'jsonwebtoken';
2
- import jwksClient, { JwksClient } from 'jwks-rsa';
3
- import { ILogger } from '@microsoft/teams.common';
4
- /**
5
- * Entra token validator parameters
6
- */
7
- type EntraTokenValidatorParams = {
8
- /**
9
- * App tenant ID. Used to find public keys to validate token signature, and to validate issuer for single-tenant apps.
10
- * This can be 'common', 'organization', or 'consumers' for a multi-tenant app, or a specific tenant ID for a single-tenant app.
11
- */
12
- tenantId: string;
13
- /** App client ID. Used to validate token audience. */
14
- clientId: string;
15
- options?: {
16
- /**
17
- * For multi-tenant apps that only allows sign-in from specific tenants, this is the list of allowed tenant IDs.
18
- * If empty or not provided, any tenant is considered valid.
19
- * This is ignored for single-tenant apps.
20
- */
21
- allowedTenantIds?: string[];
22
- };
23
- };
24
- export declare const getJwksClient: (options: jwksClient.Options) => JwksClient;
25
- /**
26
- * And Entra token validator that can validate access tokens issued by Microsoft Entra for app specific use.
27
- */
28
- export declare class EntraTokenValidator {
29
- readonly tenantId: string;
30
- readonly clientId: string;
31
- readonly validIssuerTenantIds: string[];
32
- private keyClient;
33
- constructor({ tenantId, clientId, options }: EntraTokenValidatorParams);
34
- /**
35
- * Validates a JWT access token
36
- * @param {ILogger} logger The logger to use.
37
- * @param {string} rawAccessToken The access token as a string.
38
- * @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
39
- * @returns {Promise<jwt.Jwt | null>} The validated token if the signature is valid and the claims are valid.
40
- */
41
- validateAccessToken(logger: ILogger, rawAccessToken: string, requiredScope?: string): Promise<jwt.Jwt | null>;
42
- getTokenPayload(token: jwt.Jwt): JwtPayload | null;
43
- /**
44
- * Validates the token claims: that it's valid for the intended purpose, it's not expired, it has the right audience & issuer,
45
- * it's issued for the requisite scope.
46
- * @param {ILogger} logger The logger to use.
47
- * @param {jwt.Jwt} token The token to validate.
48
- * @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
49
- * @returns {boolean} True if the claims validation passed.
50
- */
51
- private validateAccessTokenClaims;
52
- /**
53
- * Decodes an access token without verifying if the signature is valid.
54
- * @param {ILogger} logger The logger to use.
55
- * @param {string} rawAccessToken the raw access token.
56
- * @returns {jwt.JWT | null} A decoded token if the raw access token is well formed.
57
- */
58
- private decodeToken;
59
- /**
60
- * Gets the public key from the key identifier in a token header
61
- * @param {ILogger} logger The logger to use.
62
- * @param {jwt.JwtHeader} header the token header
63
- * @returns {Promise<string | undefined>} the public key corresponding to the header key identifier, if available
64
- */
65
- private getPublicKey;
66
- /**
67
- * Decodes the access token and verifies it against the public key
68
- * @param {ILogger} logger The logger to use.
69
- * @param {string} rawAccessToken the raw access token.
70
- * @param {string} publicKey the public key to verify signature against.
71
- * @returns {Promise<jwt.JWT | null>} A decoded token if the raw token is well formed and the signature is valid.
72
- */
73
- private validateTokenSignature;
74
- }
75
- export {};
@@ -1,169 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EntraTokenValidator = exports.getJwksClient = void 0;
7
- const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
- const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
9
- const getJwksClient = (options) => (0, jwks_rsa_1.default)(options);
10
- exports.getJwksClient = getJwksClient;
11
- /**
12
- * And Entra token validator that can validate access tokens issued by Microsoft Entra for app specific use.
13
- */
14
- class EntraTokenValidator {
15
- tenantId;
16
- clientId;
17
- validIssuerTenantIds;
18
- keyClient;
19
- constructor({ tenantId, clientId, options }) {
20
- this.tenantId = tenantId;
21
- this.clientId = clientId;
22
- // single-tenant applications only allow tokens issued by this app's tenant
23
- // multi tenant applications allow tokens issued by any tenant, unless the
24
- // allowedTenantIds option is provided to limit the set of allowed issuers.
25
- const isMultiTenant = ['common', 'organizations', 'consumers'].some((val) => tenantId === val);
26
- this.validIssuerTenantIds = isMultiTenant ? options?.allowedTenantIds ?? [] : [this.tenantId];
27
- this.keyClient = (0, exports.getJwksClient)({
28
- jwksUri: `https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`,
29
- });
30
- }
31
- /**
32
- * Validates a JWT access token
33
- * @param {ILogger} logger The logger to use.
34
- * @param {string} rawAccessToken The access token as a string.
35
- * @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
36
- * @returns {Promise<jwt.Jwt | null>} The validated token if the signature is valid and the claims are valid.
37
- */
38
- async validateAccessToken(logger, rawAccessToken, requiredScope) {
39
- if (!rawAccessToken) {
40
- logger.error('No token provided');
41
- return null;
42
- }
43
- const token = this.decodeToken(logger, rawAccessToken);
44
- if (!token) {
45
- logger.error('Failed to decode the access token');
46
- return null;
47
- }
48
- const publicKey = await this.getPublicKey(logger, token.header);
49
- if (!publicKey) {
50
- logger.error(`Failed to find public key for the key identifier "${token.header.kid}"`);
51
- return null;
52
- }
53
- const validatedToken = this.validateTokenSignature(logger, rawAccessToken, publicKey);
54
- if (!validatedToken) {
55
- logger.error('Failed to validate the token signature');
56
- return null;
57
- }
58
- if (!this.validateAccessTokenClaims(logger, validatedToken, requiredScope)) {
59
- logger.error('Failed to validate the access token claims');
60
- return null;
61
- }
62
- return validatedToken;
63
- }
64
- getTokenPayload(token) {
65
- return token.payload instanceof Object ? token.payload : null;
66
- }
67
- /**
68
- * Validates the token claims: that it's valid for the intended purpose, it's not expired, it has the right audience & issuer,
69
- * it's issued for the requisite scope.
70
- * @param {ILogger} logger The logger to use.
71
- * @param {jwt.Jwt} token The token to validate.
72
- * @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
73
- * @returns {boolean} True if the claims validation passed.
74
- */
75
- validateAccessTokenClaims(logger, token, requiredScope) {
76
- const payload = this.getTokenPayload(token);
77
- if (!payload) {
78
- logger.error('Invalid token payload.');
79
- return false;
80
- }
81
- // validate iat (issued at) and exp (expiration) fields.
82
- // these are expressed as number of seconds since Unix epoch.
83
- const now = Math.round(new Date().getTime() / 1000.0);
84
- const checkTimestamp = payload.iat && payload.iat <= now && payload.exp && payload.exp >= now;
85
- if (!checkTimestamp) {
86
- logger.error('The token is expired or not yet valid.');
87
- return false;
88
- }
89
- // validate audience
90
- const checkAudience = payload.aud === this.clientId || payload.aud === `api://${this.clientId}`;
91
- if (!checkAudience) {
92
- logger.error('The token is not issued for the expected audience.');
93
- return false;
94
- }
95
- const tokenIssuer = payload.iss;
96
- if (!tokenIssuer) {
97
- logger.error('Invalid token issuer.');
98
- return false;
99
- }
100
- // validate token issuer
101
- // - if this is a single-tenant application, validate that the token is issued by the expected tenant
102
- // - if this is a multi-tenant application that only allows sign-in from specific tenants, validate that
103
- // the token is issued by one of those
104
- // - if this is a multi-tenant that does not limit sign-in to specific tenants, any issuer is considered valid.
105
- const checkIssuer = !this.validIssuerTenantIds.length ||
106
- this.validIssuerTenantIds.some((tenantId) => tokenIssuer.startsWith(`https://login.microsoftonline.com/${tenantId}/`));
107
- if (!checkIssuer) {
108
- logger.error(`The token is issued by unexpected tenant: ${payload.iss}`);
109
- return false;
110
- }
111
- // validate that the token is issued for the required scope
112
- const checkRequiredScope = !requiredScope || payload.scp?.includes(requiredScope);
113
- if (!checkRequiredScope) {
114
- logger.error(`The token is not issued for the required scope: ${requiredScope}`);
115
- return false;
116
- }
117
- // all checks passed
118
- return true;
119
- }
120
- /**
121
- * Decodes an access token without verifying if the signature is valid.
122
- * @param {ILogger} logger The logger to use.
123
- * @param {string} rawAccessToken the raw access token.
124
- * @returns {jwt.JWT | null} A decoded token if the raw access token is well formed.
125
- */
126
- decodeToken(logger, rawAccessToken) {
127
- try {
128
- return jsonwebtoken_1.default.decode(rawAccessToken, { complete: true });
129
- }
130
- catch (error) {
131
- logger.error(error);
132
- return null;
133
- }
134
- }
135
- /**
136
- * Gets the public key from the key identifier in a token header
137
- * @param {ILogger} logger The logger to use.
138
- * @param {jwt.JwtHeader} header the token header
139
- * @returns {Promise<string | undefined>} the public key corresponding to the header key identifier, if available
140
- */
141
- async getPublicKey(logger, header) {
142
- try {
143
- const signingKey = await this.keyClient.getSigningKey(header.kid);
144
- return signingKey.getPublicKey() ?? null;
145
- }
146
- catch (error) {
147
- logger.error(error);
148
- return null;
149
- }
150
- }
151
- /**
152
- * Decodes the access token and verifies it against the public key
153
- * @param {ILogger} logger The logger to use.
154
- * @param {string} rawAccessToken the raw access token.
155
- * @param {string} publicKey the public key to verify signature against.
156
- * @returns {Promise<jwt.JWT | null>} A decoded token if the raw token is well formed and the signature is valid.
157
- */
158
- validateTokenSignature(logger, rawAccessToken, publicKey) {
159
- try {
160
- return jsonwebtoken_1.default.verify(rawAccessToken, publicKey, { complete: true });
161
- }
162
- catch (error) {
163
- logger.error(error);
164
- return null;
165
- }
166
- }
167
- }
168
- exports.EntraTokenValidator = EntraTokenValidator;
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cmEtdG9rZW4tdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvZW50cmEtdG9rZW4tdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFvRDtBQUNwRCx3REFBa0Q7QUF5QjNDLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBMkIsRUFBYyxFQUFFLENBQUMsSUFBQSxrQkFBVSxFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQWpGLFFBQUEsYUFBYSxpQkFBb0U7QUFFOUY7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtJQUNyQixRQUFRLENBQVM7SUFDakIsUUFBUSxDQUFTO0lBQ2pCLG9CQUFvQixDQUFXO0lBQ2hDLFNBQVMsQ0FBYTtJQUU5QixZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQTZCO1FBQ3BFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUEscUJBQWEsRUFBQztZQUM3QixPQUFPLEVBQUUscUNBQXFDLFFBQVEsc0JBQXNCO1NBQzdFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFL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
@@ -1,13 +0,0 @@
1
- import express from 'express';
2
- import { Credentials } from '@microsoft/teams.api';
3
- import { ILogger } from '@microsoft/teams.common';
4
- import { IClientContext } from '../contexts';
5
- import { EntraTokenValidator } from './entra-token-validator';
6
- export type WithClientAuthParams = Partial<Credentials> & {
7
- entraTokenValidator?: Pick<EntraTokenValidator, 'validateAccessToken' | 'getTokenPayload'>;
8
- readonly logger: ILogger;
9
- };
10
- export type ClientAuthRequest = express.Request & {
11
- context?: IClientContext;
12
- };
13
- export declare function withClientAuth(params: WithClientAuthParams): (req: ClientAuthRequest, res: express.Response, next: express.NextFunction) => Promise<void>;
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.withClientAuth = withClientAuth;
4
- function withClientAuth(params) {
5
- const entraTokenValidator = params.entraTokenValidator;
6
- const log = params.logger;
7
- return async (req, res, next) => {
8
- const appSessionId = req.header('X-Teams-App-Session-Id');
9
- const pageId = req.header('X-Teams-Page-Id');
10
- const authorization = req.header('Authorization')?.split(' ');
11
- const authToken = authorization?.length === 2 && authorization[0].toLowerCase() === 'bearer'
12
- ? authorization[1]
13
- : '';
14
- const validatedToken = !entraTokenValidator
15
- ? null
16
- : await entraTokenValidator.validateAccessToken(log, authToken);
17
- const tokenPayload = validatedToken && entraTokenValidator?.getTokenPayload(validatedToken);
18
- if (!pageId ||
19
- !appSessionId ||
20
- !validatedToken ||
21
- !entraTokenValidator ||
22
- !tokenPayload) {
23
- log.debug('unauthorized');
24
- res.status(401).send('unauthorized');
25
- return;
26
- }
27
- req.context = {
28
- appId: tokenPayload?.['appId'],
29
- appSessionId,
30
- authToken,
31
- channelId: req.header('X-Teams-Channel-Id'),
32
- chatId: req.header('X-Teams-Chat-Id'),
33
- meetingId: req.header('X-Teams-Meeting-Id'),
34
- messageId: req.header('X-Teams-Message-Id'),
35
- pageId,
36
- subPageId: req.header('X-Teams-Sub-Page-Id'),
37
- teamId: req.header('X-Teams-Team-Id'),
38
- tenantId: tokenPayload['tid'],
39
- userId: tokenPayload['oid'],
40
- userName: tokenPayload['name'],
41
- };
42
- next();
43
- };
44
- }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jbGllbnQtYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3dpdGgtY2xpZW50LWF1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQkEsd0NBcURDO0FBckRELFNBQWdCLGNBQWMsQ0FBQyxNQUE0QjtJQUN6RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztJQUN2RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRTFCLE9BQU8sS0FBSyxFQUNWLEdBQXNCLEVBQ3RCLEdBQXFCLEVBQ3JCLElBQTBCLEVBQzFCLEVBQUU7UUFDRixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUNiLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO1lBQ3hFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCxNQUFNLGNBQWMsR0FBRyxDQUFDLG1CQUFtQjtZQUN6QyxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FDaEIsY0FBYyxJQUFJLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6RSxJQUNFLENBQUMsTUFBTTtZQUNQLENBQUMsWUFBWTtZQUNiLENBQUMsY0FBYztZQUNmLENBQUMsbUJBQW1CO1lBQ3BCLENBQUMsWUFBWSxFQUNiLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsR0FBRyxDQUFDLE9BQU8sR0FBRztZQUNaLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDOUIsWUFBWTtZQUNaLFNBQVM7WUFDVCxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxNQUFNO1lBQ04sU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7WUFDckMsUUFBUSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDN0IsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDM0IsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUM7U0FDL0IsQ0FBQztRQUVGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
package/dist/router.d.ts DELETED
@@ -1,34 +0,0 @@
1
- import { Activity } from '@microsoft/teams.api';
2
- import { IActivityContext } from './contexts';
3
- import { IRoutes } from './routes';
4
- import { RouteHandler } from './types';
5
- type Route<Name extends keyof IRoutes = keyof IRoutes> = {
6
- readonly name?: Name;
7
- readonly select: (activity: Activity) => boolean;
8
- readonly callback: IRoutes[Name];
9
- };
10
- export declare class Router {
11
- protected readonly routes: Route[];
12
- /**
13
- * select routes that match the inbound activity
14
- * @param activity the inbound activity
15
- */
16
- select(activity: Activity): RouteHandler<IActivityContext<Activity>, any>[];
17
- /**
18
- * register a new route
19
- * @param route the route to register
20
- */
21
- register<Name extends keyof IRoutes>(route: Route<Name>): this;
22
- /**
23
- * register a middleware
24
- * @param callback the callback to invoke
25
- */
26
- use(callback: RouteHandler<IActivityContext, any>): this;
27
- /**
28
- * register an activity route
29
- * @param event event to subscribe to
30
- * @param callback the callback to invoke
31
- */
32
- on<Name extends keyof IRoutes>(event: Name, callback: Exclude<IRoutes[Name], undefined>): this;
33
- }
34
- export {};
package/dist/router.js DELETED
@@ -1,91 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Router = void 0;
4
- const routes_1 = require("./routes");
5
- class Router {
6
- routes = [];
7
- /**
8
- * select routes that match the inbound activity
9
- * @param activity the inbound activity
10
- */
11
- select(activity) {
12
- return this.routes
13
- .filter((r) => r.select(activity))
14
- .map((r) => r.callback);
15
- }
16
- /**
17
- * register a new route
18
- * @param route the route to register
19
- */
20
- register(route) {
21
- this.routes.push(route);
22
- return this;
23
- }
24
- /**
25
- * register a middleware
26
- * @param callback the callback to invoke
27
- */
28
- use(callback) {
29
- this.register({
30
- select: () => true,
31
- callback,
32
- });
33
- return this;
34
- }
35
- /**
36
- * register an activity route
37
- * @param event event to subscribe to
38
- * @param callback the callback to invoke
39
- */
40
- on(event, callback) {
41
- this.register({
42
- name: event,
43
- select: (activity) => {
44
- if (event === 'activity') {
45
- return true;
46
- }
47
- if (event === activity.type) {
48
- return true;
49
- }
50
- if (activity.type === 'conversationUpdate') {
51
- return event === activity.channelData?.eventType;
52
- }
53
- if (activity.type === 'installationUpdate') {
54
- return event === `install.${activity.action}`;
55
- }
56
- if (activity.type === 'messageDelete') {
57
- return event === activity.channelData?.eventType;
58
- }
59
- if (activity.type === 'messageUpdate') {
60
- return event === activity.channelData?.eventType;
61
- }
62
- if (activity.type === 'event') {
63
- return event === routes_1.EVENT_ALIASES[activity.name];
64
- }
65
- if (activity.type === 'invoke') {
66
- if (event === routes_1.INVOKE_ALIASES[activity.name]) {
67
- return true;
68
- }
69
- if (activity.name === 'fileConsent/invoke') {
70
- return event === `file.consent.${activity.value.action}`;
71
- }
72
- if (activity.name === 'composeExtension/submitAction') {
73
- return event === `message.ext.${activity.value.botMessagePreviewAction}`;
74
- }
75
- if (activity.name === 'message/submitAction') {
76
- return event === `message.submit.${activity.value.actionName}`;
77
- }
78
- }
79
- // custom routes
80
- if (event === 'mention' && activity.entities?.some((e) => e.type === 'mention')) {
81
- return (activity.entities?.find((e) => e.type === 'mention' && e.mentioned.id === activity.recipient.id) !== undefined);
82
- }
83
- return false;
84
- },
85
- callback,
86
- });
87
- return this;
88
- }
89
- }
90
- exports.Router = Router;
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxxQ0FBa0U7QUFTbEUsTUFBYSxNQUFNO0lBQ0UsTUFBTSxHQUFZLEVBQUUsQ0FBQztJQUV4Qzs7O09BR0c7SUFDSCxNQUFNLENBQUMsUUFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTTthQUNmLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUErQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBNkIsS0FBa0I7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLFFBQTZDO1FBQy9DLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtZQUNsQixRQUFRO1NBQ1QsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBNkIsS0FBVyxFQUFFLFFBQTJDO1FBQ3JGLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQixJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxJQUFJLEtBQUssS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxDQUFD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