mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-25 04:01:20 +00:00
* refactor(matrix): retire pre-2026.4 legacy crypto and flat-storage migrations * refactor(cli): drop pre-tsdown daemon-cli dist compat shim from the build * refactor(diffs): remove deprecated image*/format tool params and output aliases * refactor(ui): drop pre-gateway-scoped localStorage readers and legacy theme map * refactor: remove assorted pre-2026.4 compat shims and deprecated aliases * fix(discord): map legacy thread-binding fields in the doctor JSON import * fix(msteams): keep bot read fallback for legacy imported conversation rows * test(msteams): cover legacy bot-only imported conversation references * fix(ui): keep channel-prefixed session key display fallback * chore: refresh native i18n inventory and build-docker step count * chore(matrix): drop now-unused migration-config module * chore: re-pin plugin SDK public export budget after compat removals * chore: refresh native i18n inventory after rebase * chore: re-pin plugin SDK callable budget and refresh i18n inventory after rebase
77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
// Matrix plugin module implements storage paths behavior.
|
|
import crypto from "node:crypto";
|
|
import path from "node:path";
|
|
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
|
|
import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
|
|
export function sanitizeMatrixPathSegment(value: string): string {
|
|
const cleaned = normalizeLowercaseStringOrEmpty(value)
|
|
.replace(/[^a-z0-9._-]+/g, "_")
|
|
.replace(/^_+|_+$/g, "");
|
|
return cleaned || "unknown";
|
|
}
|
|
|
|
export function resolveMatrixHomeserverKey(homeserver: string): string {
|
|
try {
|
|
const url = new URL(homeserver);
|
|
if (url.host) {
|
|
return sanitizeMatrixPathSegment(url.host);
|
|
}
|
|
} catch {
|
|
// fall through
|
|
}
|
|
return sanitizeMatrixPathSegment(homeserver);
|
|
}
|
|
|
|
export function hashMatrixAccessToken(accessToken: string): string {
|
|
return crypto.createHash("sha256").update(accessToken).digest("hex").slice(0, 16);
|
|
}
|
|
|
|
export function resolveMatrixCredentialsFilename(accountId?: string | null): string {
|
|
const normalized = normalizeAccountId(accountId);
|
|
return normalized === DEFAULT_ACCOUNT_ID ? "credentials.json" : `credentials-${normalized}.json`;
|
|
}
|
|
|
|
export function resolveMatrixCredentialsDir(stateDir: string): string {
|
|
return path.join(stateDir, "credentials", "matrix");
|
|
}
|
|
|
|
export function resolveMatrixCredentialsPath(params: {
|
|
stateDir: string;
|
|
accountId?: string | null;
|
|
}): string {
|
|
return path.join(
|
|
resolveMatrixCredentialsDir(params.stateDir),
|
|
resolveMatrixCredentialsFilename(params.accountId),
|
|
);
|
|
}
|
|
|
|
export function resolveMatrixAccountStorageRoot(params: {
|
|
stateDir: string;
|
|
homeserver: string;
|
|
userId: string;
|
|
accessToken: string;
|
|
accountId?: string | null;
|
|
}): {
|
|
rootDir: string;
|
|
accountKey: string;
|
|
tokenHash: string;
|
|
} {
|
|
const accountKey = sanitizeMatrixPathSegment(params.accountId ?? DEFAULT_ACCOUNT_ID);
|
|
const userKey = sanitizeMatrixPathSegment(params.userId);
|
|
const serverKey = resolveMatrixHomeserverKey(params.homeserver);
|
|
const tokenHash = hashMatrixAccessToken(params.accessToken);
|
|
return {
|
|
rootDir: path.join(
|
|
params.stateDir,
|
|
"matrix",
|
|
"accounts",
|
|
accountKey,
|
|
`${serverKey}__${userKey}`,
|
|
tokenHash,
|
|
),
|
|
accountKey,
|
|
tokenHash,
|
|
};
|
|
}
|