fix: validate nextcloud talk numeric flags · openclaw/openclaw@46f023d
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
File tree
extensions/nextcloud-talk/src
| Original file line number | Diff line number | Diff line change |
|---|
@@ -107,6 +107,19 @@ describe("probeNextcloudTalkBotResponseFeature", () => {
|
107 | 107 | }); |
108 | 108 | }); |
109 | 109 | |
| 110 | +it("does not treat negative feature masks as having every feature", async () => { |
| 111 | +mockBotAdmin(-1); |
| 112 | + |
| 113 | +await expect(probeNextcloudTalkBotResponseFeature({ account: account() })).resolves.toEqual({ |
| 114 | +ok: false, |
| 115 | +code: "missing_response_feature", |
| 116 | +botId: "7", |
| 117 | +botName: "OpenClaw", |
| 118 | +message: |
| 119 | +'Nextcloud Talk bot "OpenClaw" (7) is missing the response feature; outbound replies will fail. Run ./occ talk:bot:state --feature webhook --feature response --feature reaction 7 1 or reinstall the bot with --feature response.', |
| 120 | +}); |
| 121 | +}); |
| 122 | + |
110 | 123 | it("reports malformed bot admin JSON with a stable channel error", async () => { |
111 | 124 | hoisted.fetchWithSsrFGuard.mockResolvedValueOnce({ |
112 | 125 | response: new Response("{ nope", { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -47,12 +47,12 @@ function normalizeUrlForMatch(value: string | undefined): string {
|
47 | 47 | } |
48 | 48 | |
49 | 49 | function coerceFeatureMask(value: unknown): number | undefined { |
50 | | -if (typeof value === "number" && Number.isFinite(value)) { |
| 50 | +if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) { |
51 | 51 | return value; |
52 | 52 | } |
53 | 53 | if (typeof value === "string" && /^[+-]?\d+$/.test(value.trim())) { |
54 | 54 | const parsed = Number(value.trim()); |
55 | | -return Number.isSafeInteger(parsed) ? parsed : undefined; |
| 55 | +return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : undefined; |
56 | 56 | } |
57 | 57 | return undefined; |
58 | 58 | } |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -103,6 +103,36 @@ describe("nextcloud talk room info", () => {
|
103 | 103 | ).resolves.toBeUndefined(); |
104 | 104 | }); |
105 | 105 | |
| 106 | +it("does not classify negative room types as group rooms", async () => { |
| 107 | +fetchWithSsrFGuard.mockResolvedValue({ |
| 108 | +response: { |
| 109 | +ok: true, |
| 110 | +json: async () => ({ |
| 111 | +ocs: { |
| 112 | +data: { |
| 113 | +type: -1, |
| 114 | +}, |
| 115 | +}, |
| 116 | +}), |
| 117 | +}, |
| 118 | +release: vi.fn(async () => {}), |
| 119 | +}); |
| 120 | + |
| 121 | +await expect( |
| 122 | +resolveNextcloudTalkRoomKind({ |
| 123 | +account: { |
| 124 | +accountId: "acct-negative", |
| 125 | +baseUrl: "https://nc.example.com", |
| 126 | +config: { |
| 127 | +apiUser: "bot", |
| 128 | +apiPassword: "secret", |
| 129 | +}, |
| 130 | +} as never, |
| 131 | +roomToken: "room-negative", |
| 132 | +}), |
| 133 | +).resolves.toBeUndefined(); |
| 134 | +}); |
| 135 | + |
106 | 136 | it("reads the api password from a file and logs non-ok room info responses", async () => { |
107 | 137 | const release = vi.fn(async () => {}); |
108 | 138 | const log = vi.fn(); |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -24,12 +24,12 @@ function resolveRoomCacheKey(params: { accountId: string; roomToken: string }) {
|
24 | 24 | } |
25 | 25 | |
26 | 26 | function coerceRoomType(value: unknown): number | undefined { |
27 | | -if (typeof value === "number" && Number.isFinite(value)) { |
| 27 | +if (typeof value === "number" && Number.isSafeInteger(value) && value > 0) { |
28 | 28 | return value; |
29 | 29 | } |
30 | 30 | if (typeof value === "string" && /^[+-]?\d+$/.test(value.trim())) { |
31 | 31 | const parsed = Number(value.trim()); |
32 | | -return Number.isSafeInteger(parsed) ? parsed : undefined; |
| 32 | +return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined; |
33 | 33 | } |
34 | 34 | return undefined; |
35 | 35 | } |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。