openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
249 lines (248 loc) • 8.42 kB
JavaScript
import { c as isRecord } from "./utils-CCC-BEJH.js";
import { i as hasLegacyFlatAllowPrivateNetworkAlias, s as migrateLegacyFlatAllowPrivateNetworkAlias } from "./ssrf-policy-sZLyyYht.js";
import "./ssrf-runtime-BOGN5pUi.js";
import "./record-shared-BXlUig5f.js";
//#region extensions/matrix/src/doctor-contract.ts
function hasLegacyMatrixRoomAllowAlias(value) {
const room = isRecord(value) ? value : null;
return Boolean(room && typeof room.allow === "boolean");
}
function hasLegacyMatrixRoomMapAllowAliases(value) {
const rooms = isRecord(value) ? value : null;
return Boolean(rooms && Object.values(rooms).some((room) => hasLegacyMatrixRoomAllowAlias(room)));
}
function hasLegacyMatrixAccountRoomAllowAliases(value) {
const accounts = isRecord(value) ? value : null;
if (!accounts) return false;
return Object.values(accounts).some((account) => {
if (!isRecord(account)) return false;
return hasLegacyMatrixRoomMapAllowAliases(account.groups) || hasLegacyMatrixRoomMapAllowAliases(account.rooms);
});
}
function hasLegacyMatrixAccountPrivateNetworkAliases(value) {
const accounts = isRecord(value) ? value : null;
if (!accounts) return false;
return Object.values(accounts).some((account) => hasLegacyFlatAllowPrivateNetworkAlias(isRecord(account) ? account : {}));
}
function hasLegacyTrustedDmPolicy(value) {
const root = isRecord(value) ? value : null;
if (!root) return false;
return (isRecord(root.dm) ? root.dm : null)?.policy === "trusted";
}
function hasLegacyMatrixAccountTrustedDmPolicies(value) {
const accounts = isRecord(value) ? value : null;
if (!accounts) return false;
return Object.values(accounts).some((account) => hasLegacyTrustedDmPolicy(account));
}
function migrateLegacyTrustedDmPolicy(params) {
const dm = isRecord(params.entry.dm) ? params.entry.dm : null;
if (!dm || dm.policy !== "trusted") return {
entry: params.entry,
changed: false
};
const allowFromRaw = dm.allowFrom;
const allowFromEntries = Array.isArray(allowFromRaw) ? allowFromRaw.filter((entry) => typeof entry === "string" && entry.trim().length > 0).length : 0;
const nextPolicy = allowFromEntries > 0 ? "allowlist" : "pairing";
const nextDm = {
...dm,
policy: nextPolicy
};
params.changes.push(`Migrated ${params.pathPrefix}.dm.policy "trusted" → "${nextPolicy}" (legacy alias removed; ${allowFromEntries > 0 ? `preserved ${allowFromEntries} ${params.pathPrefix}.dm.allowFrom ${allowFromEntries === 1 ? "entry" : "entries"}` : "no allowFrom entries present, defaulting to pairing for safety"}).`);
return {
entry: {
...params.entry,
dm: nextDm
},
changed: true
};
}
function normalizeMatrixRoomAllowAliases(params) {
let changed = false;
const nextRooms = { ...params.rooms };
for (const [roomId, roomValue] of Object.entries(params.rooms)) {
const room = isRecord(roomValue) ? roomValue : null;
if (!room || typeof room.allow !== "boolean") continue;
const nextRoom = { ...room };
if (typeof nextRoom.enabled !== "boolean") nextRoom.enabled = room.allow;
delete nextRoom.allow;
nextRooms[roomId] = nextRoom;
changed = true;
params.changes.push(`Moved ${params.pathPrefix}.${roomId}.allow → ${params.pathPrefix}.${roomId}.enabled (${String(nextRoom.enabled)}).`);
}
return {
rooms: nextRooms,
changed
};
}
const legacyConfigRules = [
{
path: ["channels", "matrix"],
message: "channels.matrix.allowPrivateNetwork is legacy; use channels.matrix.network.dangerouslyAllowPrivateNetwork instead. Run \"openclaw doctor --fix\".",
match: (value) => hasLegacyFlatAllowPrivateNetworkAlias(isRecord(value) ? value : {})
},
{
path: [
"channels",
"matrix",
"accounts"
],
message: "channels.matrix.accounts.<id>.allowPrivateNetwork is legacy; use channels.matrix.accounts.<id>.network.dangerouslyAllowPrivateNetwork instead. Run \"openclaw doctor --fix\".",
match: hasLegacyMatrixAccountPrivateNetworkAliases
},
{
path: [
"channels",
"matrix",
"groups"
],
message: "channels.matrix.groups.<room>.allow is legacy; use channels.matrix.groups.<room>.enabled instead. Run \"openclaw doctor --fix\".",
match: hasLegacyMatrixRoomMapAllowAliases
},
{
path: [
"channels",
"matrix",
"rooms"
],
message: "channels.matrix.rooms.<room>.allow is legacy; use channels.matrix.rooms.<room>.enabled instead. Run \"openclaw doctor --fix\".",
match: hasLegacyMatrixRoomMapAllowAliases
},
{
path: [
"channels",
"matrix",
"accounts"
],
message: "channels.matrix.accounts.<id>.{groups,rooms}.<room>.allow is legacy; use channels.matrix.accounts.<id>.{groups,rooms}.<room>.enabled instead. Run \"openclaw doctor --fix\".",
match: hasLegacyMatrixAccountRoomAllowAliases
},
{
path: ["channels", "matrix"],
message: "channels.matrix.dm.policy \"trusted\" is legacy; use \"allowlist\" (with allowFrom entries) or \"pairing\" instead. Run \"openclaw doctor --fix\".",
match: hasLegacyTrustedDmPolicy
},
{
path: [
"channels",
"matrix",
"accounts"
],
message: "channels.matrix.accounts.<id>.dm.policy \"trusted\" is legacy; use \"allowlist\" (with allowFrom entries) or \"pairing\" instead. Run \"openclaw doctor --fix\".",
match: hasLegacyMatrixAccountTrustedDmPolicies
}
];
function normalizeCompatibilityConfig({ cfg }) {
const channels = isRecord(cfg.channels) ? cfg.channels : null;
const matrix = isRecord(channels?.matrix) ? channels.matrix : null;
if (!matrix) return {
config: cfg,
changes: []
};
const changes = [];
let updatedMatrix = matrix;
let changed = false;
const topLevelPrivateNetwork = migrateLegacyFlatAllowPrivateNetworkAlias({
entry: updatedMatrix,
pathPrefix: "channels.matrix",
changes
});
updatedMatrix = topLevelPrivateNetwork.entry;
changed = changed || topLevelPrivateNetwork.changed;
const topLevelTrustedDmPolicy = migrateLegacyTrustedDmPolicy({
entry: updatedMatrix,
pathPrefix: "channels.matrix",
changes
});
updatedMatrix = topLevelTrustedDmPolicy.entry;
changed = changed || topLevelTrustedDmPolicy.changed;
const normalizeTopLevelRoomScope = (key) => {
const rooms = isRecord(updatedMatrix[key]) ? updatedMatrix[key] : null;
if (!rooms) return;
const normalized = normalizeMatrixRoomAllowAliases({
rooms,
pathPrefix: `channels.matrix.${key}`,
changes
});
if (normalized.changed) {
updatedMatrix = {
...updatedMatrix,
[key]: normalized.rooms
};
changed = true;
}
};
normalizeTopLevelRoomScope("groups");
normalizeTopLevelRoomScope("rooms");
const accounts = isRecord(updatedMatrix.accounts) ? updatedMatrix.accounts : null;
if (accounts) {
let accountsChanged = false;
const nextAccounts = { ...accounts };
for (const [accountId, accountValue] of Object.entries(accounts)) {
const account = isRecord(accountValue) ? accountValue : null;
if (!account) continue;
let nextAccount = account;
let accountChanged = false;
const privateNetworkMigration = migrateLegacyFlatAllowPrivateNetworkAlias({
entry: nextAccount,
pathPrefix: `channels.matrix.accounts.${accountId}`,
changes
});
if (privateNetworkMigration.changed) {
nextAccount = privateNetworkMigration.entry;
accountChanged = true;
}
const accountTrustedDmPolicy = migrateLegacyTrustedDmPolicy({
entry: nextAccount,
pathPrefix: `channels.matrix.accounts.${accountId}`,
changes
});
if (accountTrustedDmPolicy.changed) {
nextAccount = accountTrustedDmPolicy.entry;
accountChanged = true;
}
for (const key of ["groups", "rooms"]) {
const rooms = isRecord(nextAccount[key]) ? nextAccount[key] : null;
if (!rooms) continue;
const normalized = normalizeMatrixRoomAllowAliases({
rooms,
pathPrefix: `channels.matrix.accounts.${accountId}.${key}`,
changes
});
if (normalized.changed) {
nextAccount = {
...nextAccount,
[key]: normalized.rooms
};
accountChanged = true;
}
}
if (accountChanged) {
nextAccounts[accountId] = nextAccount;
accountsChanged = true;
}
}
if (accountsChanged) {
updatedMatrix = {
...updatedMatrix,
accounts: nextAccounts
};
changed = true;
}
}
if (!changed) return {
config: cfg,
changes: []
};
return {
config: {
...cfg,
channels: {
...cfg.channels,
matrix: updatedMatrix
}
},
changes
};
}
//#endregion
export { normalizeCompatibilityConfig as n, legacyConfigRules as t };