diff --git a/extensions/matrix/src/matrix/client/create-client.test.ts b/extensions/matrix/src/matrix/client/create-client.test.ts index 4a2b28105a3..108ab0ce489 100644 --- a/extensions/matrix/src/matrix/client/create-client.test.ts +++ b/extensions/matrix/src/matrix/client/create-client.test.ts @@ -86,6 +86,61 @@ describe("createMatrixClient", () => { }); }); + it("derives ssrfPolicy from allowPrivateNetwork when no explicit policy is provided", async () => { + await createMatrixClient({ + homeserver: "https://matrix.example.org", + userId: "@bot:example.org", + accessToken: "tok", + persistStorage: false, + allowPrivateNetwork: true, + }); + + expect(MatrixClientMock).toHaveBeenCalledWith( + "https://matrix.example.org", + "tok", + expect.objectContaining({ + ssrfPolicy: { allowPrivateNetwork: true }, + }), + ); + }); + + it("prefers explicit ssrfPolicy over allowPrivateNetwork", async () => { + const explicitPolicy = { allowPrivateNetwork: true, customField: "test" }; + await createMatrixClient({ + homeserver: "https://matrix.example.org", + userId: "@bot:example.org", + accessToken: "tok", + persistStorage: false, + allowPrivateNetwork: false, + ssrfPolicy: explicitPolicy as never, + }); + + expect(MatrixClientMock).toHaveBeenCalledWith( + "https://matrix.example.org", + "tok", + expect.objectContaining({ + ssrfPolicy: explicitPolicy, + }), + ); + }); + + it("leaves ssrfPolicy undefined when allowPrivateNetwork is falsy and no explicit policy", async () => { + await createMatrixClient({ + homeserver: "https://matrix.example.org", + userId: "@bot:example.org", + accessToken: "tok", + persistStorage: false, + }); + + expect(MatrixClientMock).toHaveBeenCalledWith( + "https://matrix.example.org", + "tok", + expect.objectContaining({ + ssrfPolicy: undefined, + }), + ); + }); + it("skips persistent storage wiring when persistence is disabled", async () => { await createMatrixClient({ homeserver: "https://matrix.example.org", diff --git a/extensions/matrix/src/matrix/client/create-client.ts b/extensions/matrix/src/matrix/client/create-client.ts index c543308bd82..de872c55b9c 100644 --- a/extensions/matrix/src/matrix/client/create-client.ts +++ b/extensions/matrix/src/matrix/client/create-client.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import type { PinnedDispatcherPolicy } from "openclaw/plugin-sdk/ssrf-dispatcher"; +import { ssrfPolicyFromDangerouslyAllowPrivateNetwork } from "openclaw/plugin-sdk/ssrf-policy"; import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime"; import type { SsrFPolicy } from "../../runtime-api.js"; import type { MatrixClient } from "../sdk.js"; @@ -95,7 +96,8 @@ export async function createMatrixClient(params: { idbSnapshotPath: storagePaths?.idbSnapshotPath, cryptoDatabasePrefix, autoBootstrapCrypto: params.autoBootstrapCrypto, - ssrfPolicy: params.ssrfPolicy, + ssrfPolicy: + params.ssrfPolicy ?? ssrfPolicyFromDangerouslyAllowPrivateNetwork(params.allowPrivateNetwork), dispatcherPolicy: params.dispatcherPolicy, }); }