mirror of
https://github.com/sassanix/Warracker.git
synced 2025-12-31 18:49:39 -06:00
126 lines
3.6 KiB
JavaScript
126 lines
3.6 KiB
JavaScript
/**
|
|
* Utility functions for secure file handling
|
|
*/
|
|
|
|
/**
|
|
* Converts a file path to a secure API endpoint path
|
|
* @param {string} path - The file path to convert
|
|
* @returns {string} The secure API endpoint path
|
|
*/
|
|
function secureFilePath(path) {
|
|
if (!path) return '';
|
|
|
|
if (path.startsWith('uploads/')) {
|
|
return '/api/secure-file/' + path.substring(8);
|
|
}
|
|
|
|
if (path.startsWith('/uploads/')) {
|
|
return '/api/secure-file/' + path.substring(9);
|
|
}
|
|
|
|
return path;
|
|
}
|
|
|
|
/**
|
|
* Opens a file in a new tab with proper authentication
|
|
* @param {string} path - The file path to open
|
|
*/
|
|
function openSecureFile(path) {
|
|
if (!path) return;
|
|
|
|
const securePath = secureFilePath(path);
|
|
console.log('Opening file:', securePath);
|
|
|
|
// Try to get the token from different sources
|
|
const token = localStorage.getItem('auth_token');
|
|
|
|
if (!token) {
|
|
console.error('No authentication token available');
|
|
alert('You must be logged in to access files');
|
|
return;
|
|
}
|
|
|
|
// Create a link with target="_blank" and click it programmatically
|
|
const link = document.createElement('a');
|
|
link.href = securePath;
|
|
link.target = '_blank';
|
|
|
|
// Add a click event listener to inject the token
|
|
link.addEventListener('click', function(e) {
|
|
// Prevent the default navigation
|
|
e.preventDefault();
|
|
|
|
// Make a fetch request with the Authorization header
|
|
fetch(securePath, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`
|
|
}
|
|
})
|
|
.then(response => {
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
}
|
|
return response.blob();
|
|
})
|
|
.then(blob => {
|
|
// Create a URL for the blob and open it in a new window
|
|
const url = URL.createObjectURL(blob);
|
|
window.open(url, '_blank');
|
|
})
|
|
.catch(error => {
|
|
console.error('Error opening file:', error);
|
|
alert('Error opening file. Please try again or check if you are logged in.');
|
|
});
|
|
});
|
|
|
|
// Trigger the click event
|
|
document.body.appendChild(link);
|
|
link.click();
|
|
document.body.removeChild(link);
|
|
}
|
|
|
|
/**
|
|
* Downloads a file using the secure file endpoint
|
|
* @param {string} path - The file path to download
|
|
* @param {string} filename - The name to save the file as
|
|
*/
|
|
function downloadSecureFile(path, filename) {
|
|
if (!path) return;
|
|
|
|
const securePath = secureFilePath(path);
|
|
const token = localStorage.getItem('auth_token');
|
|
|
|
if (!token) {
|
|
console.error('No authentication token available');
|
|
alert('You must be logged in to download files');
|
|
return;
|
|
}
|
|
|
|
fetch(securePath, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`
|
|
}
|
|
})
|
|
.then(response => {
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
}
|
|
return response.blob();
|
|
})
|
|
.then(blob => {
|
|
const url = window.URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.style.display = 'none';
|
|
a.href = url;
|
|
a.download = filename || path.split('/').pop();
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
window.URL.revokeObjectURL(url);
|
|
})
|
|
.catch(error => {
|
|
console.error('Error downloading file:', error);
|
|
alert('Error downloading file. Please try again or check if you are logged in.');
|
|
});
|
|
}
|