@hadoku/jobplatform-worker 2.32.17 → 2.32.19

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.js CHANGED
@@ -533,7 +533,7 @@ const SetApplicationStatusSchema = z.object({
533
533
  // kept, so a bare transition never wipes the runner's screenshots.
534
534
  error: z.string().optional(),
535
535
  evidence: z.record(z.string(), z.unknown()).optional(),
536
- /** Act as this registry display name. SERVICE or ADMIN only. */
536
+ /** Act as this registry display name. Admin, or a named service caller, only (mayActOnBehalf). */
537
537
  ownerName: z.string().optional()
538
538
  }).openapi("SetApplicationStatus");
539
539
  const AnswerSchema = z.object({
@@ -1197,6 +1197,12 @@ async function resolveOwnerName(db, edge, serviceKey, name, now = Date.now()) {
1197
1197
  }
1198
1198
  return result;
1199
1199
  }
1200
+ const ON_BEHALF_REFUSAL = "Only admin, or a service caller named in ON_BEHALF_CALLER_USER_IDS, may act on behalf of a named owner.";
1201
+ function mayActOnBehalf(auth, callerId, allowed) {
1202
+ if (tierAtLeast(auth, "admin")) return true;
1203
+ if (!tierAtLeast(auth, "service") || !callerId) return false;
1204
+ return (allowed ?? "").split(",").map((id) => id.trim()).filter(Boolean).includes(callerId);
1205
+ }
1200
1206
  class NoIdentityError extends Error {
1201
1207
  constructor() {
1202
1208
  super(
@@ -1212,7 +1218,7 @@ function resolveUserId(c) {
1212
1218
  }
1213
1219
  const ownerNameQuery = z.object({
1214
1220
  ownerName: z.string().optional().openapi({
1215
- description: "Act as this registry display name. SERVICE or ADMIN callers only — this is how the PC-side runner reaches the owner's rows while authenticating as itself. Resolved against the key registry; never stored."
1221
+ description: "Act as this registry display name. Admin, or a service caller named in ON_BEHALF_CALLER_USER_IDS, only — this is how the PC-side runner reaches the owner's rows while authenticating as itself. Resolved against the key registry; never stored."
1216
1222
  })
1217
1223
  });
1218
1224
  function asRoleLevel(v) {
@@ -1270,14 +1276,14 @@ async function effectiveUserId(c, ownerName) {
1270
1276
  };
1271
1277
  }
1272
1278
  if (!named || !named.trim()) return { userId: callerId, onBehalfOf: null };
1273
- if (!tierAtLeast(c.get("authContext"), "service")) {
1279
+ if (!mayActOnBehalf(c.get("authContext"), callerId, c.env.ON_BEHALF_CALLER_USER_IDS)) {
1274
1280
  return {
1275
1281
  error: {
1276
1282
  status: 403,
1277
1283
  body: {
1278
1284
  success: false,
1279
1285
  error: "Forbidden",
1280
- message: "Only a service or admin caller may act on behalf of a named owner."
1286
+ message: ON_BEHALF_REFUSAL
1281
1287
  }
1282
1288
  }
1283
1289
  };
@@ -2567,15 +2573,9 @@ async function requireIdentity(c, next) {
2567
2573
  }
2568
2574
  const owner = c.req.query("ownerName")?.trim();
2569
2575
  if (owner) {
2570
- if (!tierAtLeast(c.get("authContext"), "service")) {
2571
- return c.json(
2572
- {
2573
- success: false,
2574
- error: "Forbidden",
2575
- message: "Only a service or admin caller may act on behalf of a named owner."
2576
- },
2577
- 403
2578
- );
2576
+ const callerId = c.req.header("X-User-Id")?.trim();
2577
+ if (!mayActOnBehalf(c.get("authContext"), callerId, c.env.ON_BEHALF_CALLER_USER_IDS)) {
2578
+ return c.json({ success: false, error: "Forbidden", message: ON_BEHALF_REFUSAL }, 403);
2579
2579
  }
2580
2580
  const resolved = await resolveOwnerName(
2581
2581
  c.env.JOB_PLATFORM_DB,
@@ -3097,7 +3097,7 @@ function registerFeedRoute(app2) {
3097
3097
  content: { "application/json": { schema: ErrorResponseSchema } }
3098
3098
  },
3099
3099
  403: {
3100
- description: "Only a service or admin caller may name an owner",
3100
+ description: "Only admin, or a service caller named in ON_BEHALF_CALLER_USER_IDS, may name an owner",
3101
3101
  content: { "application/json": { schema: IdentityErrorResponseSchema } }
3102
3102
  },
3103
3103
  404: {
@@ -1,4 +1,5 @@
1
1
  import type { D1Database } from '@cloudflare/workers-types';
2
+ import { type HadokuAuthContext } from '@wolffm/worker-utils';
2
3
  import { type EdgeIdentityBinding, type IdentityResult } from '@wolffm/worker-utils/identity';
3
4
  /**
4
5
  * How long a resolved owner name is trusted before edge-router is asked again.
@@ -25,4 +26,17 @@ export declare const OWNER_NAME_TTL_MS: number;
25
26
  * that is a deployment fault and must keep reporting NO_REGISTRY.
26
27
  */
27
28
  export declare function resolveOwnerName(db: D1Database, edge: EdgeIdentityBinding | undefined, serviceKey: string, name: string, now?: number): Promise<IdentityResult>;
29
+ /**
30
+ * Whether this caller may act for a named owner (`ownerName`): admin, or a
31
+ * service caller whose registry userId is in `ON_BEHALF_CALLER_USER_IDS`.
32
+ *
33
+ * Service tier alone used to be enough, and service tier is every service key
34
+ * in the fleet plus every person holding a service grant, so any of them could
35
+ * read and rewrite anyone's jobs, applications, answers and profiles. One
36
+ * caller sends it (the scraper's apply queue); the list names that one. The
37
+ * userId is compared whole: it is the edge-injected identity, never a name.
38
+ */
39
+ /** What a caller that may not act for a named owner is told. */
40
+ export declare const ON_BEHALF_REFUSAL = "Only admin, or a service caller named in ON_BEHALF_CALLER_USER_IDS, may act on behalf of a named owner.";
41
+ export declare function mayActOnBehalf(auth: HadokuAuthContext, callerId: string | null | undefined, allowed: string | undefined): boolean;
28
42
  //# sourceMappingURL=ownerName.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ownerName.d.ts","sourceRoot":"","sources":["../src/ownerName.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAGN,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QAAc,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,mBAAmB,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAmB,GACtB,OAAO,CAAC,cAAc,CAAC,CAwBzB"}
1
+ {"version":3,"file":"ownerName.d.ts","sourceRoot":"","sources":["../src/ownerName.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAGN,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QAAc,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,mBAAmB,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAmB,GACtB,OAAO,CAAC,cAAc,CAAC,CAwBzB;AAED;;;;;;;;;GASG;AACH,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,4GAC4E,CAAC;AAE3G,wBAAgB,cAAc,CAC7B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,OAAO,EAAE,MAAM,GAAG,SAAS,GACzB,OAAO,CAQT"}
@@ -1 +1 @@
1
- {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/feed.ts"],"names":[],"mappings":"AAUA,OAAO,EASN,KAAK,OAAO,EACZ,MAAM,aAAa,CAAC;AA8KrB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkmBpD"}
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/feed.ts"],"names":[],"mappings":"AAUA,OAAO,EASN,KAAK,OAAO,EACZ,MAAM,aAAa,CAAC;AA8KrB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAmmBpD"}
@@ -83,10 +83,11 @@ export declare function isEffectiveUserError(v: EffectiveUser): v is {
83
83
  * The runner drained its own service-owned queue for a day while the owner's
84
84
  * dashboard showed nothing, which is what this exists to fix.
85
85
  *
86
- * SERVICE OR ADMIN ONLY, and that gate is the whole security of it. A
87
- * friend-tier caller is a signed-in human in a browser; letting one pass
88
- * `ownerName=SomeoneElse` would turn every per-user route into a way to read and
89
- * mutate another person's queue. Friend gets 403 — not a 404, because the row
86
+ * ADMIN, OR A SERVICE CALLER NAMED IN ON_BEHALF_CALLER_USER_IDS
87
+ * (ownerName.ts `mayActOnBehalf`), and that gate is the whole security of it:
88
+ * whoever may pass `ownerName=SomeoneElse` can read and mutate another person's
89
+ * queue. Service tier alone is every service key in the fleet and every person
90
+ * with a service grant, so it used to be exactly that hole. Anyone else gets 403 — not a 404, because the row
90
91
  * they are reaching for is real and refusing to say so would be misleading
91
92
  * about their OWN permissions rather than about someone else's data.
92
93
  *
@@ -101,7 +102,7 @@ export declare function isEffectiveUserError(v: EffectiveUser): v is {
101
102
  * perfectly valid application that simply belongs to the wrong person. It cost
102
103
  * a debugging round on 2026-09-07 and would have cost another one every time.
103
104
  * Reading both here rather than per-route means no future route can reintroduce
104
- * it. Accepting the query adds no privilege: the service-or-admin gate below
105
+ * it. Accepting the query adds no privilege: the on-behalf gate below
105
106
  * and the resolve-never-trust rule apply to the value whatever carried it.
106
107
  *
107
108
  * IT IS CALLED `ownerName`, NOT `owner`, AND THAT IS LOAD-BEARING. The field
@@ -125,6 +126,7 @@ export declare function effectiveUserId(c: {
125
126
  EDGE?: Fetcher;
126
127
  HADOKU_SERVICE_KEY?: string;
127
128
  JOB_PLATFORM_DB: D1Database;
129
+ ON_BEHALF_CALLER_USER_IDS?: string;
128
130
  };
129
131
  }, ownerName: string | undefined): Promise<EffectiveUser>;
130
132
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/shared.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/routes/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAA+B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAwB3F,UAAU,YAAY;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QACV,WAAW,EAAE,iBAAiB,CAAC;QAC/B;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACF;AA4oBD,eAAO,MAAM,aAAa,oCAAM,CAAC"}
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/routes/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAwB9E,UAAU,YAAY;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QACV,WAAW,EAAE,iBAAiB,CAAC;QAC/B;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACF;AAsoBD,eAAO,MAAM,aAAa,oCAAM,CAAC"}
package/dist/types.d.ts CHANGED
@@ -35,6 +35,12 @@ export interface AppEnv {
35
35
  * because names can be renamed. Unset means mail routes refuse (503).
36
36
  */
37
37
  MAILFEED_OWNER_USER_ID?: string;
38
+ /**
39
+ * Registry userIds, comma-separated, of the service callers that may name an
40
+ * owner other than themselves (`ownerName`). Admin always may. Unset or empty
41
+ * = admin only. hadoku_site sets it to the scraper's apply queue.
42
+ */
43
+ ON_BEHALF_CALLER_USER_IDS?: string;
38
44
  /**
39
45
  * Cloudflare service binding to the resume-api worker, declared in
40
46
  * hadoku_site wrangler.toml as [[services]] binding="RESUME" service="resume-api".
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,WAAW,MAAM;IAKtB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAM1B,8EAA8E;IAC9E,eAAe,EAAE,UAAU,CAAC;IAM5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAM1B;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAMhC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAMjB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,WAAW,MAAM;IAKtB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAM1B,8EAA8E;IAC9E,eAAe,EAAE,UAAU,CAAC;IAM5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAM1B;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAMnC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAMjB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CACf"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hadoku/jobplatform-worker",
3
- "version": "2.32.17",
4
- "gitHead": "29eb4c3f0fc1c7c7b3e22b4f26df10ff9a5b3c47",
3
+ "version": "2.32.19",
4
+ "gitHead": "55e3ce56119624d7e82d24dc165704cc9140bf98",
5
5
  "description": "Job listings aggregation and tracking dashboard - Worker package",
6
6
  "license": "MIT",
7
7
  "type": "module",