1import { createOxlintRuleHarness } from "../test/utils.ts";
2const state = createOxlintRuleHarness("t3code/no-rpc-permission-bypass", {
3 filename: "fixture.ts",
4});
5state.invalid("blocks direct session calls", "session.client[tag](input);");
6state.invalid("blocks extracting the raw client", 'const raw = session["client"];');
7state.invalid(
8 "blocks replacing the permission guard",
9 'import { RpcPermissionGuard as Guard } from "../rpc/client.ts";',
10);
11state.invalid(
12 "blocks namespace guard access",
13 'import * as Rpc from "../rpc/client.ts"; const guard = Rpc.RpcPermissionGuard;',
14);
15state.invalid("blocks raw protocol imports", 'import { makeClient } from "../rpc/protocol.ts";');
16state.valid(
17 "allows typed requests",
18 'import { request } from "../rpc/client.ts"; request(method, input);',
19);
20const rpc = createOxlintRuleHarness("t3code/no-rpc-permission-bypass", {
21 filename: "fixture.ts",
22 ruleOptions: [{ allowRawClientAccess: true }],
23});
24rpc.valid("allows the transport boundary", "session.client[tag](input);");
25
26const app = createOxlintRuleHarness("t3code/no-rpc-permission-bypass", {
27 filename: "fixture.ts",
28});
29app.invalid(
30 "blocks guard imports through the barrel",
31 'import { RpcPermissionGuard as Guard } from "@t3tools/client-runtime/rpc";',
32);
33app.invalid(
34 "blocks explicit index imports",
35 'import { RpcPermissionGuard } from "@t3tools/client-runtime/rpc/index.ts";',
36);
37app.invalid(
38 "blocks raw session access in subscription callbacks",
39 "subscribeDynamic(tag, session => session.client[method](input));",
40);
41app.invalid(
42 "blocks raw client destructuring",
43 "const { client: raw } = session; raw[method](input);",
44);
45app.valid(
46 "allows public typed RPC helpers",
47 'import { request, runStream } from "@t3tools/client-runtime/rpc";',
48);
49
50rpc.invalid(
51 "raw client allowance does not permit installing the guard",
52 'import { RpcPermissionGuard } from "@t3tools/client-runtime/rpc";',
53);
54const boundary = createOxlintRuleHarness("t3code/no-rpc-permission-bypass", {
55 filename: "fixture.ts",
56 ruleOptions: [{ allowGuardInstallation: true }],
57});
58boundary.valid(
59 "permits guard installation when configured",
60 'import { RpcPermissionGuard } from "@t3tools/client-runtime/rpc"; RpcPermissionGuard.of({ authorize });',
61);
62boundary.invalid(
63 "guard installation allowance does not permit raw clients",
64 "session.client[tag](input);",
65);
66boundary.invalid(
67 "guard installation allowance does not permit raw protocol imports",
68 'import { makeWsRpcProtocolClient } from "../rpc/protocol.ts";',
69);