@openclaw/nextcloud-talk 2026.8.1-beta.2 → 2026.8.1-beta.3

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/api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-CojgyJSq.js";
1
+ import { t as nextcloudTalkPlugin } from "./channel-gYP-jQPr.js";
2
2
  export { nextcloudTalkPlugin };
@@ -4,7 +4,7 @@ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries
4
4
  import { createAccountListHelpers, describeWebhookAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
5
  import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
6
6
  import { createLoggedPairingApprovalNotifier, createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing";
7
- import { createAllowlistProviderRouteAllowlistWarningCollector, resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
7
+ import { createAllowlistProviderRouteAllowlistWarningCollector, createConditionalWarningCollector, resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
8
8
  import { buildWebhookChannelStatusSummary, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
9
9
  import { FormatCapabilityProfile, convertMarkdownTables, renderMarkdownWithMarkers, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
10
10
  import { createChannelApprovalAuth } from "openclaw/plugin-sdk/approval-auth-runtime";
@@ -12,7 +12,7 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, norm
12
12
  import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue, normalizeAccountId, resolveAccountWithDefaultFallback } from "openclaw/plugin-sdk/account-core";
13
13
  import { isTruthyEnvValue } from "openclaw/plugin-sdk/runtime-env";
14
14
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
15
- import { buildSecretInputSchema, hasConfiguredSecretInput, normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
15
+ import { buildSecretInputSchema, hasConfiguredSecretInput, normalizeResolvedSecretInputString, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
16
16
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
17
17
  import { parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
18
18
  import { readProviderJsonResponse, readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
@@ -40,7 +40,7 @@ import { buildChannelKeyCandidates, normalizeChannelSlug, resolveChannelEntryMat
40
40
  import { pruneMapToMaxSize } from "openclaw/plugin-sdk/collection-runtime";
41
41
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
42
42
  import { createServer } from "node:http";
43
- import { WEBHOOK_RATE_LIMIT_DEFAULTS, createAuthRateLimiter, isRequestBodyLimitError, readRequestBodyWithLimit, requestBodyErrorToText } from "openclaw/plugin-sdk/webhook-ingress";
43
+ import { WEBHOOK_RATE_LIMIT_DEFAULTS, createAuthRateLimiter, isRequestBodyLimitError, readRequestBodyWithLimit, requestBodyErrorToText, resolveRequestClientIp } from "openclaw/plugin-sdk/webhook-ingress";
44
44
  import { isRecord } from "openclaw/plugin-sdk/channel-secret-basic-runtime";
45
45
  import { jsonResult, readStringParam, resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
46
46
  import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, buildOutboundBaseSessionKey, normalizeAccountId as normalizeAccountId$1 } from "openclaw/plugin-sdk/routing";
@@ -97,18 +97,26 @@ function listNextcloudTalkAccountIds(cfg) {
97
97
  debugAccounts("listNextcloudTalkAccountIds", ids);
98
98
  return ids;
99
99
  }
100
- function resolveNextcloudTalkSecret(cfg, opts) {
101
- const resolvedAccountId = opts.accountId ?? resolveDefaultNextcloudTalkAccountId(cfg);
102
- const merged = mergeNextcloudTalkAccountConfig(cfg, resolvedAccountId);
100
+ function resolveNextcloudTalkSecret(accountId, merged) {
101
+ const configuredSecret = resolveSecretInputString({
102
+ value: merged.botSecret,
103
+ path: `channels.nextcloud-talk.accounts.${accountId}.botSecret`,
104
+ mode: "inspect"
105
+ });
106
+ if (configuredSecret.status === "configured_unavailable") return {
107
+ secret: "",
108
+ source: "config",
109
+ status: "configured_unavailable"
110
+ };
103
111
  const envSecret = normalizeOptionalString(process.env.NEXTCLOUD_TALK_BOT_SECRET);
104
- if (envSecret && resolvedAccountId === DEFAULT_ACCOUNT_ID) return {
112
+ if (envSecret && accountId === DEFAULT_ACCOUNT_ID) return {
105
113
  secret: envSecret,
106
114
  source: "env",
107
115
  status: "available"
108
116
  };
109
117
  const botSecretFile = normalizeOptionalString(merged.botSecretFile);
110
118
  if (botSecretFile) {
111
- const result = tryReadSecretFileSync(botSecretFile, "Nextcloud Talk bot secret file", { rejectSymlink: true }, { configPath: `channels.nextcloud-talk.accounts.${resolvedAccountId}.botSecretFile` });
119
+ const result = tryReadSecretFileSync(botSecretFile, "Nextcloud Talk bot secret file", { rejectSymlink: true }, { configPath: `channels.nextcloud-talk.accounts.${accountId}.botSecretFile` });
112
120
  return result.status === "available" ? {
113
121
  secret: result.value,
114
122
  source: "secretFile",
@@ -120,12 +128,8 @@ function resolveNextcloudTalkSecret(cfg, opts) {
120
128
  diagnostic: result.diagnostic
121
129
  };
122
130
  }
123
- const inlineSecret = normalizeResolvedSecretInputString({
124
- value: merged.botSecret,
125
- path: `channels.nextcloud-talk.accounts.${resolvedAccountId}.botSecret`
126
- });
127
- if (inlineSecret) return {
128
- secret: inlineSecret,
131
+ if (configuredSecret.status === "available") return {
132
+ secret: configuredSecret.value,
129
133
  source: "config",
130
134
  status: "available"
131
135
  };
@@ -142,7 +146,7 @@ function resolveNextcloudTalkAccount(params) {
142
146
  const merged = mergeNextcloudTalkAccountConfig(params.cfg, accountId);
143
147
  const accountEnabled = merged.enabled !== false;
144
148
  const enabled = baseEnabled && accountEnabled;
145
- const secretResolution = resolveNextcloudTalkSecret(params.cfg, { accountId });
149
+ const secretResolution = resolveNextcloudTalkSecret(accountId, merged);
146
150
  const apiCredentialResolution = resolveNextcloudTalkApiCredentialsResult({
147
151
  apiUser: merged.apiUser,
148
152
  apiPassword: merged.apiPassword,
@@ -1352,7 +1356,7 @@ function createNextcloudTalkWebhookServer(opts) {
1352
1356
  res.end();
1353
1357
  return;
1354
1358
  }
1355
- const clientIp = req.socket.remoteAddress ?? "unknown";
1359
+ const clientIp = resolveRequestClientIp(req, opts.trustedProxies, opts.allowRealIpFallback) ?? req.socket.remoteAddress ?? "unknown";
1356
1360
  if (!webhookAuthRateLimiter.check(clientIp, WEBHOOK_AUTH_RATE_LIMIT_SCOPE).allowed) {
1357
1361
  res.writeHead(429);
1358
1362
  res.end("Too Many Requests");
@@ -1647,6 +1651,8 @@ async function monitorNextcloudTalkProvider(opts) {
1647
1651
  onError: (error) => {
1648
1652
  logger.error(`[nextcloud-talk:${account.accountId}] webhook error: ${error.message}`);
1649
1653
  },
1654
+ trustedProxies: cfg.gateway?.trustedProxies,
1655
+ allowRealIpFallback: cfg.gateway?.allowRealIpFallback,
1650
1656
  abortSignal: opts.abortSignal
1651
1657
  });
1652
1658
  let stopPromise;
@@ -2192,6 +2198,12 @@ const collectNextcloudTalkSecurityWarnings = createAllowlistProviderRouteAllowli
2192
2198
  groupAllowFromPath: "channels.nextcloud-talk.groupAllowFrom"
2193
2199
  }
2194
2200
  });
2201
+ const collectNextcloudTalkOpenGroupFindings = createConditionalWarningCollector.findings({
2202
+ collectWarnings: collectNextcloudTalkSecurityWarnings,
2203
+ checkId: "channels.nextcloud-talk.groups.open",
2204
+ severity: "critical",
2205
+ title: "Nextcloud Talk security warning"
2206
+ });
2195
2207
  const nextcloudTalkPlugin = createChatChannelPlugin({
2196
2208
  base: {
2197
2209
  id: "nextcloud-talk",
@@ -2288,7 +2300,7 @@ const nextcloudTalkPlugin = createChatChannelPlugin({
2288
2300
  } },
2289
2301
  security: {
2290
2302
  ...nextcloudTalkSecurityAdapter,
2291
- collectWarnings: collectNextcloudTalkSecurityWarnings
2303
+ collectWarnings: collectNextcloudTalkOpenGroupFindings
2292
2304
  },
2293
2305
  outbound: {
2294
2306
  base: {
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-CojgyJSq.js";
1
+ import { t as nextcloudTalkPlugin } from "./channel-gYP-jQPr.js";
2
2
  export { nextcloudTalkPlugin };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/nextcloud-talk",
3
- "version": "2026.8.1-beta.2",
3
+ "version": "2026.8.1-beta.3",
4
4
  "description": "OpenClaw Nextcloud Talk channel plugin for conversations.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "type": "module",
10
10
  "peerDependencies": {
11
- "openclaw": ">=2026.8.1-beta.2"
11
+ "openclaw": ">=2026.8.1-beta.3"
12
12
  },
13
13
  "peerDependenciesMeta": {
14
14
  "openclaw": {
@@ -127,10 +127,10 @@
127
127
  "minHostVersion": ">=2026.4.10"
128
128
  },
129
129
  "compat": {
130
- "pluginApi": ">=2026.8.1-beta.2"
130
+ "pluginApi": ">=2026.8.1-beta.3"
131
131
  },
132
132
  "build": {
133
- "openclawVersion": "2026.8.1-beta.2"
133
+ "openclawVersion": "2026.8.1-beta.3"
134
134
  },
135
135
  "release": {
136
136
  "publishToClawHub": true,