diff --git a/src/infra/node-pairing-authz.test.ts b/src/infra/node-pairing-authz.test.ts index 83eaebec435c..ef956f775763 100644 --- a/src/infra/node-pairing-authz.test.ts +++ b/src/infra/node-pairing-authz.test.ts @@ -10,6 +10,13 @@ describe("resolveNodePairApprovalScopes", () => { ]); }); + it("requires operator.admin for browser.proxy commands", () => { + expect(resolveNodePairApprovalScopes(["browser.proxy"])).toEqual([ + "operator.pairing", + "operator.admin", + ]); + }); + it("requires operator.write for non-exec commands", () => { expect(resolveNodePairApprovalScopes(["canvas.present"])).toEqual([ "operator.pairing", diff --git a/src/infra/node-pairing-authz.ts b/src/infra/node-pairing-authz.ts index 8ed0a023a9ec..f8fbc2b5a117 100644 --- a/src/infra/node-pairing-authz.ts +++ b/src/infra/node-pairing-authz.ts @@ -1,5 +1,5 @@ // Maps node pairing command declarations to required operator scopes. -import { NODE_SYSTEM_RUN_COMMANDS } from "./node-commands.js"; +import { NODE_BROWSER_PROXY_COMMAND, NODE_SYSTEM_RUN_COMMANDS } from "./node-commands.js"; /** Operator scopes required to approve a pending node pairing surface. */ export type NodeApprovalScope = "operator.pairing" | "operator.write" | "operator.admin"; @@ -8,13 +8,15 @@ const OPERATOR_PAIRING_SCOPE: NodeApprovalScope = "operator.pairing"; const OPERATOR_WRITE_SCOPE: NodeApprovalScope = "operator.write"; const OPERATOR_ADMIN_SCOPE: NodeApprovalScope = "operator.admin"; +const ADMIN_APPROVAL_COMMANDS = [...NODE_SYSTEM_RUN_COMMANDS, NODE_BROWSER_PROXY_COMMAND]; + /** Map declared node commands to the least operator scopes needed for approval. */ export function resolveNodePairApprovalScopes(commands: unknown): NodeApprovalScope[] { const normalized = Array.isArray(commands) ? commands.filter((command): command is string => typeof command === "string") : []; if ( - normalized.some((command) => NODE_SYSTEM_RUN_COMMANDS.some((allowed) => allowed === command)) + normalized.some((command) => ADMIN_APPROVAL_COMMANDS.some((allowed) => allowed === command)) ) { return [OPERATOR_PAIRING_SCOPE, OPERATOR_ADMIN_SCOPE]; }