fix: serve MindSpace public assets as same-origin relative URLs
Rewrite absolute tkmind asset download links to /api/... at delivery time and strip base tags that violate public page CSP, so images load on any host. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -26,15 +26,31 @@ export function verifyPublicAssetToken(assetId, token, secret) {
|
||||
);
|
||||
}
|
||||
|
||||
export function appendPublicAssetTokens(html, secret) {
|
||||
const source = String(html ?? '');
|
||||
if (!source || !source.includes('/api/mindspace/v1/assets/')) return source;
|
||||
return source.replace(
|
||||
/((?:https?:\/\/[^"'<>\\\s]+)?\/api\/mindspace\/v1\/assets\/([a-z0-9-]+)\/download)(\?[^"'<>\\\s)]*)?/gi,
|
||||
(value, base, assetId, query = '') => {
|
||||
if (/(?:\?|&|&)public_token=/.test(query)) return value;
|
||||
const separator = query ? (query.includes('&') ? '&' : '&') : '?';
|
||||
return `${base}${query}${separator}public_token=${publicAssetToken(assetId, secret)}`;
|
||||
},
|
||||
);
|
||||
const PUBLIC_ASSET_DOWNLOAD_PATTERN =
|
||||
/((?:https?:\/\/[^"'<>\\\s]+)?\/api\/mindspace\/v1\/assets\/([a-z0-9-]+)\/download)(\?[^"'<>\\\s)]*)?/gi;
|
||||
|
||||
export function stripPublicHtmlBaseTag(html) {
|
||||
return String(html ?? '').replace(/<base\b[^>]*>/gi, '');
|
||||
}
|
||||
|
||||
export function normalizePublicAssetReferences(html) {
|
||||
const source = String(html ?? '');
|
||||
if (!source.includes('/api/mindspace/v1/assets/')) return source;
|
||||
return source.replace(PUBLIC_ASSET_DOWNLOAD_PATTERN, (_value, _base, assetId, query = '') => {
|
||||
return `/api/mindspace/v1/assets/${assetId}/download${query ?? ''}`;
|
||||
});
|
||||
}
|
||||
|
||||
export function appendPublicAssetTokens(html, secret) {
|
||||
const source = normalizePublicAssetReferences(html);
|
||||
if (!source || !source.includes('/api/mindspace/v1/assets/')) return source;
|
||||
return source.replace(PUBLIC_ASSET_DOWNLOAD_PATTERN, (value, _base, assetId, query = '') => {
|
||||
if (/(?:\?|&|&)public_token=/.test(query)) return value;
|
||||
const separator = query ? (query.includes('&') ? '&' : '&') : '?';
|
||||
return `/api/mindspace/v1/assets/${assetId}/download${query}${separator}public_token=${publicAssetToken(assetId, secret)}`;
|
||||
});
|
||||
}
|
||||
|
||||
export function preparePublicHtmlAssetDelivery(html, secret) {
|
||||
return appendPublicAssetTokens(stripPublicHtmlBaseTag(html), secret);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user