diff --git a/frontend/templates/dropbox_callback.html b/frontend/templates/dropbox_callback.html index e59c6e40..5b07f0b8 100644 --- a/frontend/templates/dropbox_callback.html +++ b/frontend/templates/dropbox_callback.html @@ -318,6 +318,12 @@ DROPBOX_FOLDER=${folderPath || '/Documents/Uploads'}`; } // ── Folder browser ──────────────────────────────────────────────── + function escapeHtml(str) { + const div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + } + function initFolderBrowser(accessToken, integrationId) { const folderSelector = document.getElementById('folder-selector'); if (!folderSelector || !integrationId) return; @@ -344,9 +350,9 @@ DROPBOX_FOLDER=${folderPath || '/Documents/Uploads'}`; .then(data => { if (data.folders && data.folders.length > 0) { folderList.innerHTML = data.folders.map(f => - `` ).join(''); @@ -363,7 +369,7 @@ DROPBOX_FOLDER=${folderPath || '/Documents/Uploads'}`; updateBreadcrumb(path); }) .catch(err => { - folderList.innerHTML = `
Failed to load folders: ${err.message}
`; + folderList.innerHTML = `
Failed to load folders: ${escapeHtml(err.message)}
`; }); } @@ -374,7 +380,7 @@ DROPBOX_FOLDER=${folderPath || '/Documents/Uploads'}`; for (const part of parts) { accumulated += '/' + part; html += `/`; - html += ``; + html += ``; } breadcrumb.innerHTML = html; breadcrumb.querySelectorAll('.folder-nav-btn').forEach(btn => { diff --git a/frontend/templates/onedrive_callback.html b/frontend/templates/onedrive_callback.html index 306f0ec4..72b98cd7 100644 --- a/frontend/templates/onedrive_callback.html +++ b/frontend/templates/onedrive_callback.html @@ -330,6 +330,12 @@ ONEDRIVE_FOLDER_PATH=${folderPath || 'Documents/Uploads'}`; } // ── Folder browser ──────────────────────────────────────────────── + function escapeHtml(str) { + const div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + } + function initFolderBrowser(accessToken, integrationId) { const folderSelector = document.getElementById('folder-selector'); if (!folderSelector || !integrationId || !accessToken) return; @@ -354,9 +360,9 @@ ONEDRIVE_FOLDER_PATH=${folderPath || 'Documents/Uploads'}`; .then(data => { if (data.folders && data.folders.length > 0) { folderList.innerHTML = data.folders.map(f => - `` ).join(''); @@ -373,7 +379,7 @@ ONEDRIVE_FOLDER_PATH=${folderPath || 'Documents/Uploads'}`; updateBreadcrumb(path); }) .catch(err => { - folderList.innerHTML = `
Failed to load folders: ${err.message}
`; + folderList.innerHTML = `
Failed to load folders: ${escapeHtml(err.message)}
`; }); } @@ -384,7 +390,7 @@ ONEDRIVE_FOLDER_PATH=${folderPath || 'Documents/Uploads'}`; for (const part of parts) { accumulated += '/' + part; html += `/`; - html += ``; + html += ``; } breadcrumb.innerHTML = html; breadcrumb.querySelectorAll('.folder-nav-btn').forEach(btn => {