@nacre.work/api 0.5.8 → 0.6.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/adapters.d.ts +1 -1
- package/dist/adapters.d.ts.map +1 -1
- package/dist/adapters.js +44 -0
- package/dist/adapters.js.map +1 -1
- package/dist/auth.d.ts +60 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +59 -1
- package/dist/auth.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +27 -10
- package/dist/main.js.map +1 -1
- package/dist/oauth-store.d.ts +94 -22
- package/dist/oauth-store.d.ts.map +1 -1
- package/dist/oauth-store.js +153 -23
- package/dist/oauth-store.js.map +1 -1
- package/dist/server.d.ts +9 -9
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +98 -19
- package/dist/server.js.map +1 -1
- package/dist/verification.d.ts +33 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +38 -0
- package/dist/verification.js.map +1 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { createApi } from './server.js';
|
|
2
2
|
export { authenticate, findTenantOverride, rejectTenantOverride } from './auth.js';
|
|
3
|
+
export { postgresVerification } from './verification.js';
|
|
4
|
+
export { PostgresDelegations, PostgresOAuthAuthorizations, PostgresOAuthClients, PostgresOAuthConsents, PostgresOAuthRefreshTokens, } from './oauth-store.js';
|
|
3
5
|
export { Problem, badRequest, forbidden, internal, notFound, unauthorized } from './errors.js';
|
|
4
6
|
export { HttpEmbedder, NacreIngest, NacreSearchService, PostgresAudit, PostgresAuditReader, PostgresDocuments, PostgresGrants, PostgresJobs, PostgresLayers, PostgresWorkspaces, PostgresReferenceQueries, PostgresReindex, } from './adapters.js';
|
|
5
7
|
export { PostgresGroups, PostgresUsers, generatePassword, looksLikeEmail } from './principals.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAiCvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAElF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,GAChB,MAAM,eAAe,CAAA;AAStB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEjG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErE,OAAO,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,GACT,MAAM,mBAAmB,CAAA;AAE1B,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,+CAA+C;AAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAiCvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAElF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAA;AAYzB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,GAChB,MAAM,eAAe,CAAA;AAStB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEjG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErE,OAAO,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,GACT,MAAM,mBAAmB,CAAA;AAE1B,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,+CAA+C;AAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/main.js
CHANGED
|
@@ -7,7 +7,8 @@ import { PostgresOAuthAuthorizations, PostgresOAuthClients, PostgresOAuthConsent
|
|
|
7
7
|
import { rerankerFor } from './rerank.js';
|
|
8
8
|
import { RateLimiter } from './limits.js';
|
|
9
9
|
import { PostgresGroups, PostgresUsers } from './principals.js';
|
|
10
|
-
import { PostgresServiceAccounts
|
|
10
|
+
import { PostgresServiceAccounts } from './service-keys.js';
|
|
11
|
+
import { postgresVerification } from './verification.js';
|
|
11
12
|
import { createApi } from './server.js';
|
|
12
13
|
/**
|
|
13
14
|
* The REST API process.
|
|
@@ -185,7 +186,10 @@ async function main() {
|
|
|
185
186
|
algorithms: [jwt.algorithm],
|
|
186
187
|
issuer: config.jwtIssuer,
|
|
187
188
|
audience: config.jwtAudience,
|
|
188
|
-
|
|
189
|
+
// Both database-backed ports, from the one function that knows what a
|
|
190
|
+
// Postgres verifier is. See verification.ts — this used to be assembled
|
|
191
|
+
// by hand in three processes.
|
|
192
|
+
...postgresVerification(pool, APP_ROLE),
|
|
189
193
|
},
|
|
190
194
|
metrics: registry,
|
|
191
195
|
resourceMetadata: protectedResourceMetadata({
|
|
@@ -286,27 +290,40 @@ async function main() {
|
|
|
286
290
|
refreshTtlSeconds: config.refreshTokenTtl,
|
|
287
291
|
accessTtlSeconds: config.accessTokenTtl,
|
|
288
292
|
/**
|
|
289
|
-
* A token for
|
|
293
|
+
* A token for whatever the connection acts as.
|
|
290
294
|
*
|
|
291
|
-
* `principal_type: 'service_account'` and `sub` is the
|
|
292
|
-
* claims a service account key resolves to, so
|
|
293
|
-
* treats this exactly as it treats one and there is
|
|
294
|
-
* what an agent is. `role` is `member` because a
|
|
295
|
-
* organization-wide role: everything it reaches,
|
|
295
|
+
* For an **agent**: `principal_type: 'service_account'` and `sub` is the
|
|
296
|
+
* account — the same claims a service account key resolves to, so
|
|
297
|
+
* everything downstream treats this exactly as it treats one and there is
|
|
298
|
+
* no second notion of what an agent is. `role` is `member` because a
|
|
299
|
+
* service account has no organization-wide role: everything it reaches,
|
|
300
|
+
* it reaches by grant.
|
|
301
|
+
*
|
|
302
|
+
* For a **delegation**: `principal_type: 'user'` and `sub` is the person,
|
|
303
|
+
* plus `del` naming the connection. The permitted set is deliberately not
|
|
304
|
+
* in here — a token carrying one would keep answering with the access its
|
|
305
|
+
* holder had at consent, and every revocation would wait for it to
|
|
306
|
+
* expire. `role` is carried for shape and is **not** what the request
|
|
307
|
+
* runs as: `authenticate` takes the role from the connection's row, so a
|
|
308
|
+
* demotion applies without waiting for the token to expire.
|
|
296
309
|
*/
|
|
297
310
|
mint: async (approved) => {
|
|
298
311
|
const ttl = config.accessTokenTtl;
|
|
299
312
|
const now = Math.floor(Date.now() / 1000);
|
|
313
|
+
const delegated = approved.subject.actsAs === 'user';
|
|
300
314
|
const accessToken = await new SignJWT({
|
|
301
315
|
org: approved.orgId,
|
|
302
|
-
principal_type: 'service_account',
|
|
316
|
+
principal_type: delegated ? 'user' : 'service_account',
|
|
303
317
|
role: 'member',
|
|
318
|
+
...(delegated ? { del: approved.consentId } : {}),
|
|
304
319
|
})
|
|
305
320
|
.setProtectedHeader({
|
|
306
321
|
alg: jwt.algorithm,
|
|
307
322
|
...(jwt.keyId === undefined ? {} : { kid: jwt.keyId }),
|
|
308
323
|
})
|
|
309
|
-
.setSubject(approved.
|
|
324
|
+
.setSubject(approved.subject.actsAs === 'user'
|
|
325
|
+
? approved.subject.userId
|
|
326
|
+
: approved.subject.serviceAccountId)
|
|
310
327
|
.setIssuer(config.jwtIssuer)
|
|
311
328
|
.setAudience(config.jwtAudience)
|
|
312
329
|
.setIssuedAt(now)
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth-store.d.ts
CHANGED
|
@@ -8,36 +8,85 @@
|
|
|
8
8
|
* the moment it exists, because it names a service account, and every statement
|
|
9
9
|
* against it goes through `withOrg`.
|
|
10
10
|
*/
|
|
11
|
+
import { type OrgRole } from '@nacre.work/core';
|
|
11
12
|
import type { Pool } from 'pg';
|
|
12
|
-
import type { AuthContext } from './auth.js';
|
|
13
|
+
import type { AuthContext, Delegations } from './auth.js';
|
|
13
14
|
export interface RegisteredClient {
|
|
14
15
|
readonly clientId: string;
|
|
15
16
|
readonly clientName: string;
|
|
16
17
|
readonly redirectUris: readonly string[];
|
|
17
18
|
}
|
|
18
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* What a connection acts as.
|
|
21
|
+
*
|
|
22
|
+
* A discriminated union rather than a nullable id, which is migration 0025's
|
|
23
|
+
* argument carried into the code: inferring "this is a delegation" from a null
|
|
24
|
+
* puts a guess on the issuance path, and the two modes mint different tokens.
|
|
25
|
+
*/
|
|
26
|
+
export type ConsentSubject = {
|
|
27
|
+
readonly actsAs: 'service_account';
|
|
28
|
+
readonly serviceAccountId: string;
|
|
29
|
+
}
|
|
30
|
+
/** A delegation. `userId` is the person who approved it — see docs/authz.md. */
|
|
31
|
+
| {
|
|
32
|
+
readonly actsAs: 'user';
|
|
33
|
+
readonly userId: string;
|
|
34
|
+
};
|
|
35
|
+
/** A standing connection: this application, acting as this agent or as a person. */
|
|
19
36
|
export interface Consent {
|
|
20
37
|
readonly id: string;
|
|
21
38
|
readonly clientId: string;
|
|
22
39
|
readonly clientName: string;
|
|
23
|
-
readonly
|
|
24
|
-
|
|
40
|
+
readonly subject: ConsentSubject;
|
|
41
|
+
/** The agent's name, for a connection that has one. */
|
|
42
|
+
readonly serviceAccountName: string | null;
|
|
25
43
|
readonly approvedBy: string;
|
|
44
|
+
/**
|
|
45
|
+
* The layers a delegation was narrowed to at consent, if any.
|
|
46
|
+
*
|
|
47
|
+
* Empty means **no narrowing**, never "narrowed to nothing" — the two are
|
|
48
|
+
* opposite, and the table deliberately cannot express the second.
|
|
49
|
+
*/
|
|
50
|
+
readonly layers: readonly string[];
|
|
26
51
|
readonly createdAt: string;
|
|
27
52
|
readonly lastRefreshedAt: string | null;
|
|
28
53
|
readonly revokedAt: string | null;
|
|
29
54
|
}
|
|
30
|
-
/**
|
|
31
|
-
|
|
55
|
+
/**
|
|
56
|
+
* What a token is minted for.
|
|
57
|
+
*
|
|
58
|
+
* A union rather than a record with two optional halves, so the delegated case
|
|
59
|
+
* **cannot** be constructed without the connection it names. The `del` claim is
|
|
60
|
+
* that connection's id and the authentication path refuses a token whose
|
|
61
|
+
* delegation does not resolve, so a delegated token minted with nothing to
|
|
62
|
+
* point at would be one nobody can ever use — and a type is a cheaper place to
|
|
63
|
+
* learn that than a running deployment.
|
|
64
|
+
*
|
|
65
|
+
* `consentId` is optional on the service-account side only, because 0023 wrote
|
|
66
|
+
* authorization codes before 0024 gave connections a table.
|
|
67
|
+
*/
|
|
68
|
+
export type MintRequest = {
|
|
32
69
|
readonly orgId: string;
|
|
33
|
-
|
|
70
|
+
readonly subject: {
|
|
71
|
+
readonly actsAs: 'service_account';
|
|
72
|
+
readonly serviceAccountId: string;
|
|
73
|
+
};
|
|
34
74
|
readonly consentId?: string;
|
|
35
|
-
|
|
75
|
+
} | {
|
|
76
|
+
readonly orgId: string;
|
|
77
|
+
readonly subject: {
|
|
78
|
+
readonly actsAs: 'user';
|
|
79
|
+
readonly userId: string;
|
|
80
|
+
};
|
|
81
|
+
readonly consentId: string;
|
|
82
|
+
};
|
|
83
|
+
/** A consent that has been given and not yet exchanged. */
|
|
84
|
+
export type PendingAuthorization = MintRequest & {
|
|
36
85
|
readonly clientId: string;
|
|
37
86
|
readonly redirectUri: string;
|
|
38
87
|
readonly codeChallenge: string;
|
|
39
88
|
readonly resource?: string;
|
|
40
|
-
}
|
|
89
|
+
};
|
|
41
90
|
export interface OAuthClients {
|
|
42
91
|
register(name: string, redirectUris: readonly string[], clientId: string): Promise<RegisteredClient>;
|
|
43
92
|
find(clientId: string): Promise<RegisteredClient | undefined>;
|
|
@@ -50,7 +99,13 @@ export interface OAuthConsents {
|
|
|
50
99
|
* full of duplicates is one where ending a connection leaves the others
|
|
51
100
|
* working.
|
|
52
101
|
*/
|
|
53
|
-
record(auth: AuthContext, clientId: string,
|
|
102
|
+
record(auth: AuthContext, clientId: string, subject: ConsentSubject,
|
|
103
|
+
/**
|
|
104
|
+
* The layers a delegation is restricted to. Replaced wholesale on
|
|
105
|
+
* re-approval, because a person reconnecting an application is answering
|
|
106
|
+
* the narrowing question again rather than adding to a previous answer.
|
|
107
|
+
*/
|
|
108
|
+
layers?: readonly string[]): Promise<string>;
|
|
54
109
|
/**
|
|
55
110
|
* Every connection this caller may see.
|
|
56
111
|
*
|
|
@@ -76,12 +131,10 @@ export interface OAuthRefreshTokens {
|
|
|
76
131
|
* a token already spent means two holders have it and there is no way to tell
|
|
77
132
|
* which is genuine, so the whole family is ended rather than the one token.
|
|
78
133
|
*/
|
|
79
|
-
rotate(token: string): Promise<{
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
family: string;
|
|
84
|
-
} | undefined>;
|
|
134
|
+
rotate(token: string): Promise<(MintRequest & {
|
|
135
|
+
readonly consentId: string;
|
|
136
|
+
readonly family: string;
|
|
137
|
+
}) | undefined>;
|
|
85
138
|
}
|
|
86
139
|
export interface OAuthAuthorizations {
|
|
87
140
|
/** Records a consent and returns nothing: the code is the caller's to hand back. */
|
|
@@ -119,7 +172,7 @@ export declare class PostgresOAuthConsents implements OAuthConsents {
|
|
|
119
172
|
private readonly pool;
|
|
120
173
|
private readonly role?;
|
|
121
174
|
constructor(pool: Pool, role?: string | undefined);
|
|
122
|
-
record(auth: AuthContext, clientId: string,
|
|
175
|
+
record(auth: AuthContext, clientId: string, subject: ConsentSubject, layers?: readonly string[]): Promise<string>;
|
|
123
176
|
list(auth: AuthContext): Promise<readonly Consent[]>;
|
|
124
177
|
revoke(auth: AuthContext, id: string): Promise<boolean>;
|
|
125
178
|
}
|
|
@@ -128,11 +181,30 @@ export declare class PostgresOAuthRefreshTokens implements OAuthRefreshTokens {
|
|
|
128
181
|
private readonly role?;
|
|
129
182
|
constructor(pool: Pool, role?: string | undefined);
|
|
130
183
|
issue(orgId: string, consentId: string, token: string, family: string | undefined, expiresAt: Date): Promise<string>;
|
|
131
|
-
rotate(token: string): Promise<{
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
184
|
+
rotate(token: string): Promise<(MintRequest & {
|
|
185
|
+
readonly consentId: string;
|
|
186
|
+
readonly family: string;
|
|
187
|
+
}) | undefined>;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The one read docs/authz.md puts before `resolve` on a delegated request.
|
|
191
|
+
*
|
|
192
|
+
* Its whole job is to be *current*. Everything a JWT can say was true when it
|
|
193
|
+
* was signed; whether this authority may still be exercised changes when an
|
|
194
|
+
* administrator acts, and that question has no answer in a token.
|
|
195
|
+
*
|
|
196
|
+
* One statement, joined by primary key, inside `withOrg` — the organization
|
|
197
|
+
* comes from the token, so unlike a refresh token there is no cross-tenant
|
|
198
|
+
* lookup here and no `app.authenticating` shape to it.
|
|
199
|
+
*/
|
|
200
|
+
export declare class PostgresDelegations implements Delegations {
|
|
201
|
+
private readonly pool;
|
|
202
|
+
private readonly role?;
|
|
203
|
+
constructor(pool: Pool, role?: string | undefined);
|
|
204
|
+
resolve(orgId: string, id: string): Promise<{
|
|
205
|
+
userId: string;
|
|
206
|
+
role: OrgRole;
|
|
207
|
+
layers?: readonly string[];
|
|
136
208
|
} | undefined>;
|
|
137
209
|
}
|
|
138
210
|
//# sourceMappingURL=oauth-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../src/oauth-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../src/oauth-store.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth-store.js
CHANGED
|
@@ -47,11 +47,11 @@ export class PostgresOAuthAuthorizations {
|
|
|
47
47
|
await withOrg(this.pool, auth.orgId, async (client) => {
|
|
48
48
|
await client.query(`INSERT INTO oauth_authorizations
|
|
49
49
|
(org_id, client_id, service_account_id, approved_by, code_hash,
|
|
50
|
-
code_challenge, redirect_uri, resource, expires_at, consent_id)
|
|
51
|
-
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)`, [
|
|
50
|
+
code_challenge, redirect_uri, resource, expires_at, consent_id, acts_as)
|
|
51
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11)`, [
|
|
52
52
|
auth.orgId,
|
|
53
53
|
input.clientId,
|
|
54
|
-
input.serviceAccountId,
|
|
54
|
+
input.subject.actsAs === 'service_account' ? input.subject.serviceAccountId : null,
|
|
55
55
|
auth.principal.id,
|
|
56
56
|
hashCode(input.code),
|
|
57
57
|
input.codeChallenge,
|
|
@@ -59,6 +59,7 @@ export class PostgresOAuthAuthorizations {
|
|
|
59
59
|
input.resource ?? null,
|
|
60
60
|
input.expiresAt,
|
|
61
61
|
input.consentId ?? null,
|
|
62
|
+
input.subject.actsAs,
|
|
62
63
|
]);
|
|
63
64
|
}, this.role === undefined ? {} : { role: this.role });
|
|
64
65
|
}
|
|
@@ -90,17 +91,30 @@ export class PostgresOAuthAuthorizations {
|
|
|
90
91
|
WHERE code_hash = $1
|
|
91
92
|
AND consumed_at IS NULL
|
|
92
93
|
AND expires_at > now()
|
|
93
|
-
RETURNING org_id,
|
|
94
|
+
RETURNING org_id, acts_as, service_account_id, approved_by, client_id,
|
|
95
|
+
redirect_uri, code_challenge, resource, consent_id`, [hashCode(code)]);
|
|
94
96
|
const row = rows[0];
|
|
95
97
|
if (row === undefined)
|
|
96
98
|
return undefined;
|
|
97
|
-
|
|
99
|
+
// The database's CHECK guarantees the pairing, so this reads the
|
|
100
|
+
// discriminator rather than testing the null — the same distinction
|
|
101
|
+
// 0025 draws, kept on this side of the boundary too.
|
|
102
|
+
const common = {
|
|
98
103
|
orgId: row.org_id,
|
|
99
|
-
serviceAccountId: row.service_account_id,
|
|
100
104
|
clientId: row.client_id,
|
|
101
105
|
redirectUri: row.redirect_uri,
|
|
102
106
|
codeChallenge: row.code_challenge,
|
|
103
107
|
...(row.resource === null ? {} : { resource: row.resource }),
|
|
108
|
+
};
|
|
109
|
+
if (row.acts_as === 'user') {
|
|
110
|
+
// `consent_id IS NOT NULL` is in 0025's CHECK for the delegated
|
|
111
|
+
// shape, which is what lets this be a cast rather than a branch that
|
|
112
|
+
// has to decide what a delegation with no connection means.
|
|
113
|
+
return { ...common, subject: { actsAs: 'user', userId: row.approved_by }, consentId: row.consent_id };
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
...common,
|
|
117
|
+
subject: { actsAs: 'service_account', serviceAccountId: row.service_account_id },
|
|
104
118
|
...(row.consent_id === null ? {} : { consentId: row.consent_id }),
|
|
105
119
|
};
|
|
106
120
|
}, this.role === undefined ? {} : { role: this.role });
|
|
@@ -113,18 +127,46 @@ export class PostgresOAuthConsents {
|
|
|
113
127
|
this.pool = pool;
|
|
114
128
|
this.role = role;
|
|
115
129
|
}
|
|
116
|
-
async record(auth, clientId,
|
|
130
|
+
async record(auth, clientId, subject, layers) {
|
|
117
131
|
return withOrg(this.pool, auth.orgId, async (client) => {
|
|
118
132
|
// Approving again reuses the row and clears a previous revocation: the
|
|
119
133
|
// person is deliberately reconnecting an application they had ended,
|
|
120
134
|
// and leaving it marked revoked would show them a connection that says
|
|
121
135
|
// "ended" while the client works.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
136
|
+
//
|
|
137
|
+
// Two conflict targets because there are two unique indexes, and the
|
|
138
|
+
// delegated one is **partial** — `(org_id, client_id, approved_by)
|
|
139
|
+
// WHERE acts_as = 'user'`, since NULLs are distinct and the 0024 index
|
|
140
|
+
// would let a person approve the same application twice. The inference
|
|
141
|
+
// clause has to repeat the index's predicate for Postgres to match it.
|
|
142
|
+
const { rows } = subject.actsAs === 'service_account'
|
|
143
|
+
? await client.query(`INSERT INTO oauth_consents (org_id, client_id, service_account_id, approved_by, acts_as)
|
|
144
|
+
VALUES ($1,$2,$3,$4,'service_account')
|
|
145
|
+
ON CONFLICT (org_id, client_id, service_account_id)
|
|
146
|
+
DO UPDATE SET revoked_at = NULL, approved_by = EXCLUDED.approved_by
|
|
147
|
+
RETURNING id`, [auth.orgId, clientId, subject.serviceAccountId, auth.principal.id])
|
|
148
|
+
: await client.query(`INSERT INTO oauth_consents (org_id, client_id, service_account_id, approved_by, acts_as)
|
|
149
|
+
VALUES ($1,$2,NULL,$3,'user')
|
|
150
|
+
ON CONFLICT (org_id, client_id, approved_by) WHERE acts_as = 'user'
|
|
151
|
+
DO UPDATE SET revoked_at = NULL
|
|
152
|
+
RETURNING id`, [auth.orgId, clientId, subject.userId]);
|
|
153
|
+
const id = rows[0].id;
|
|
154
|
+
if (subject.actsAs === 'user') {
|
|
155
|
+
// Replaced wholesale, in the same transaction as the row it belongs
|
|
156
|
+
// to. A person reconnecting an application is answering the narrowing
|
|
157
|
+
// question again, so merging their new answer into the old one would
|
|
158
|
+
// make a narrowing that can only ever widen — the one direction this
|
|
159
|
+
// whole mechanism is not allowed to move in.
|
|
160
|
+
await client.query('DELETE FROM oauth_consent_layers WHERE org_id = $1 AND consent_id = $2', [
|
|
161
|
+
auth.orgId,
|
|
162
|
+
id,
|
|
163
|
+
]);
|
|
164
|
+
if (layers !== undefined && layers.length > 0) {
|
|
165
|
+
await client.query(`INSERT INTO oauth_consent_layers (org_id, consent_id, layer_id)
|
|
166
|
+
SELECT $1, $2, unnest($3::uuid[])`, [auth.orgId, id, [...layers]]);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return id;
|
|
128
170
|
}, this.role === undefined ? {} : { role: this.role });
|
|
129
171
|
}
|
|
130
172
|
async list(auth) {
|
|
@@ -133,21 +175,31 @@ export class PostgresOAuthConsents {
|
|
|
133
175
|
// an invented gradient: an agent belongs to the organization, so
|
|
134
176
|
// somebody has to be able to end a connection whose approver has left.
|
|
135
177
|
const mine = auth.role === 'org_admin' || auth.role === 'platform_admin' ? '' : ' AND c.approved_by = $2';
|
|
136
|
-
const { rows } = await client.query(
|
|
178
|
+
const { rows } = await client.query(
|
|
179
|
+
// LEFT, because a delegation names no service account. It was an
|
|
180
|
+
// inner join, which would have made every delegation invisible on the
|
|
181
|
+
// one screen that can end it.
|
|
182
|
+
`SELECT c.id, c.client_id, oc.client_name, c.acts_as, c.service_account_id,
|
|
137
183
|
sa.name AS service_account_name, c.approved_by,
|
|
184
|
+
NULLIF(ARRAY_REMOVE(ARRAY_AGG(cl.layer_id), NULL), '{}') AS layers,
|
|
138
185
|
c.created_at::text, c.last_refreshed_at::text, c.revoked_at::text
|
|
139
186
|
FROM oauth_consents c
|
|
140
187
|
JOIN oauth_clients oc ON oc.client_id = c.client_id
|
|
141
|
-
JOIN service_accounts sa ON sa.id = c.service_account_id AND sa.org_id = c.org_id
|
|
188
|
+
LEFT JOIN service_accounts sa ON sa.id = c.service_account_id AND sa.org_id = c.org_id
|
|
189
|
+
LEFT JOIN oauth_consent_layers cl ON cl.consent_id = c.id AND cl.org_id = c.org_id
|
|
142
190
|
WHERE c.org_id = $1${mine}
|
|
191
|
+
GROUP BY c.id, oc.client_name, sa.name
|
|
143
192
|
ORDER BY c.created_at DESC, c.id`, mine === '' ? [auth.orgId] : [auth.orgId, auth.principal.id]);
|
|
144
193
|
return rows.map((r) => ({
|
|
145
194
|
id: r.id,
|
|
146
195
|
clientId: r.client_id,
|
|
147
196
|
clientName: r.client_name,
|
|
148
|
-
|
|
197
|
+
subject: r.acts_as === 'user'
|
|
198
|
+
? { actsAs: 'user', userId: r.approved_by }
|
|
199
|
+
: { actsAs: 'service_account', serviceAccountId: r.service_account_id },
|
|
149
200
|
serviceAccountName: r.service_account_name,
|
|
150
201
|
approvedBy: r.approved_by,
|
|
202
|
+
layers: r.layers ?? [],
|
|
151
203
|
createdAt: r.created_at,
|
|
152
204
|
lastRefreshedAt: r.last_refreshed_at,
|
|
153
205
|
revokedAt: r.revoked_at,
|
|
@@ -205,10 +257,23 @@ export class PostgresOAuthRefreshTokens {
|
|
|
205
257
|
if (found === undefined)
|
|
206
258
|
return undefined;
|
|
207
259
|
return withOrg(this.pool, found, async (client) => {
|
|
208
|
-
const { rows } = await client.query(
|
|
209
|
-
|
|
260
|
+
const { rows } = await client.query(
|
|
261
|
+
// The user is joined for the delegated case only, and it is a LEFT
|
|
262
|
+
// join so a service-account connection is unaffected by it. What it
|
|
263
|
+
// answers is the same question the authentication path asks on every
|
|
264
|
+
// request: may this authority still be exercised. Asking it here too
|
|
265
|
+
// is not belt and braces — a renewal that succeeded while the person
|
|
266
|
+
// was disabled would hand the application a fresh token for every one
|
|
267
|
+
// of the next fourteen days, each of which 401s.
|
|
268
|
+
`SELECT t.id, t.consent_id, t.family_id, t.used_at,
|
|
269
|
+
t.expires_at <= now() AS expired,
|
|
270
|
+
c.revoked_at IS NOT NULL AS revoked,
|
|
271
|
+
c.acts_as, c.service_account_id, c.approved_by,
|
|
272
|
+
(c.acts_as = 'user'
|
|
273
|
+
AND (u.id IS NULL OR u.disabled_at IS NOT NULL OR u.role = 'platform_admin')) AS suspended
|
|
210
274
|
FROM oauth_refresh_tokens t
|
|
211
275
|
JOIN oauth_consents c ON c.id = t.consent_id
|
|
276
|
+
LEFT JOIN users u ON u.id = c.approved_by AND u.org_id = c.org_id
|
|
212
277
|
WHERE t.token_hash = $1
|
|
213
278
|
FOR UPDATE OF t`, [hashCode(token)]);
|
|
214
279
|
const row = rows[0];
|
|
@@ -225,7 +290,15 @@ export class PostgresOAuthRefreshTokens {
|
|
|
225
290
|
]);
|
|
226
291
|
return undefined;
|
|
227
292
|
}
|
|
228
|
-
if (row.expired || row.
|
|
293
|
+
if (row.expired || row.revoked)
|
|
294
|
+
return undefined;
|
|
295
|
+
// Suspended, and the token is deliberately **not** spent. Disabling a
|
|
296
|
+
// person is reversible — docs/authz.md is explicit that the grant
|
|
297
|
+
// survives it — so burning their applications' refresh tokens on the
|
|
298
|
+
// way past would make re-enabling them a reconnection rather than a
|
|
299
|
+
// restoration. The application retries, and the day it is allowed to,
|
|
300
|
+
// the same token works.
|
|
301
|
+
if (row.suspended)
|
|
229
302
|
return undefined;
|
|
230
303
|
// Spent, in the statement that reads it: two concurrent exchanges race
|
|
231
304
|
// for one row and exactly one wins.
|
|
@@ -236,11 +309,68 @@ export class PostgresOAuthRefreshTokens {
|
|
|
236
309
|
found,
|
|
237
310
|
row.consent_id,
|
|
238
311
|
]);
|
|
312
|
+
const base = { orgId: found, consentId: row.consent_id, family: row.family_id };
|
|
313
|
+
return row.acts_as === 'user'
|
|
314
|
+
? { ...base, subject: { actsAs: 'user', userId: row.approved_by } }
|
|
315
|
+
: { ...base, subject: { actsAs: 'service_account', serviceAccountId: row.service_account_id } };
|
|
316
|
+
}, this.role === undefined ? {} : { role: this.role });
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* The one read docs/authz.md puts before `resolve` on a delegated request.
|
|
321
|
+
*
|
|
322
|
+
* Its whole job is to be *current*. Everything a JWT can say was true when it
|
|
323
|
+
* was signed; whether this authority may still be exercised changes when an
|
|
324
|
+
* administrator acts, and that question has no answer in a token.
|
|
325
|
+
*
|
|
326
|
+
* One statement, joined by primary key, inside `withOrg` — the organization
|
|
327
|
+
* comes from the token, so unlike a refresh token there is no cross-tenant
|
|
328
|
+
* lookup here and no `app.authenticating` shape to it.
|
|
329
|
+
*/
|
|
330
|
+
export class PostgresDelegations {
|
|
331
|
+
pool;
|
|
332
|
+
role;
|
|
333
|
+
constructor(pool, role) {
|
|
334
|
+
this.pool = pool;
|
|
335
|
+
this.role = role;
|
|
336
|
+
}
|
|
337
|
+
async resolve(orgId, id) {
|
|
338
|
+
return withOrg(this.pool, orgId, async (client) => {
|
|
339
|
+
// Every refusal is expressed as "no row" rather than as a flag the
|
|
340
|
+
// caller then interprets. A revoked connection, a disabled user and a
|
|
341
|
+
// platform_admin are three different facts and one answer, and putting
|
|
342
|
+
// that in the predicate means there is no branch above it where two of
|
|
343
|
+
// them could drift apart.
|
|
344
|
+
//
|
|
345
|
+
// `acts_as = 'user'` is part of it: a service-account connection has a
|
|
346
|
+
// row here too, and resolving one as its approver would hand an
|
|
347
|
+
// application the person's own reach instead of the agent's.
|
|
348
|
+
const { rows } = await client.query(`SELECT c.approved_by AS user_id,
|
|
349
|
+
u.role,
|
|
350
|
+
NULLIF(ARRAY_REMOVE(ARRAY_AGG(l.layer_id), NULL), '{}') AS layers
|
|
351
|
+
FROM oauth_consents c
|
|
352
|
+
JOIN users u
|
|
353
|
+
ON u.id = c.approved_by AND u.org_id = c.org_id
|
|
354
|
+
LEFT JOIN oauth_consent_layers l
|
|
355
|
+
ON l.consent_id = c.id AND l.org_id = c.org_id
|
|
356
|
+
WHERE c.org_id = $1
|
|
357
|
+
AND c.id = $2
|
|
358
|
+
AND c.acts_as = 'user'
|
|
359
|
+
AND c.revoked_at IS NULL
|
|
360
|
+
AND u.disabled_at IS NULL
|
|
361
|
+
AND u.role <> 'platform_admin'
|
|
362
|
+
GROUP BY c.approved_by, u.role`, [orgId, id]);
|
|
363
|
+
const row = rows[0];
|
|
364
|
+
if (row === undefined)
|
|
365
|
+
return undefined;
|
|
366
|
+
// No rows in the join table means **no narrowing**, never "narrowed to
|
|
367
|
+
// nothing". `ARRAY_REMOVE`/`NULLIF` above collapse the LEFT JOIN's one
|
|
368
|
+
// null row to null rather than to `[null]`, so an unnarrowed delegation
|
|
369
|
+
// does not arrive here as a narrowing nobody can satisfy.
|
|
239
370
|
return {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
family: row.family_id,
|
|
371
|
+
userId: row.user_id,
|
|
372
|
+
role: row.role,
|
|
373
|
+
...(row.layers === null ? {} : { layers: row.layers }),
|
|
244
374
|
};
|
|
245
375
|
}, this.role === undefined ? {} : { role: this.role });
|
|
246
376
|
}
|