91 lines
3.3 KiB
JavaScript
Raw Normal View History

2024-12-06 19:08:18 +00:00
export class DecryptFile {
async decryptFile(file) {
try {
const password = prompt('This file is password-protected. Please enter the password:');
if (password === null) {
// User cancelled
console.error(`Password prompt cancelled for PDF: ${file.name}`);
this.showErrorBanner(`Operation cancelled for PDF: ${file.name}`, 'You cancelled the decryption process.');
return null; // No file to return
}
if (!password) {
// No password provided
console.error(`No password provided for encrypted PDF: ${file.name}`);
this.showErrorBanner(`No password provided for encrypted PDF: ${file.name}`, 'Please enter a valid password.');
return null; // No file to return
}
const formData = new FormData();
formData.append('fileInput', file);
formData.append('password', password);
// Send decryption request
const response = await fetch('/api/v1/security/remove-password', {
method: 'POST',
body: formData,
});
if (response.ok) {
const decryptedBlob = await response.blob();
this.removeErrorBanner();
return new File([decryptedBlob], file.name, {type: 'application/pdf'});
} else {
const errorText = await response.text();
console.error(`Server error while decrypting: ${errorText}`);
this.showErrorBanner(
'Please try again with the correct password.',
errorText,
`Incorrect password for PDF: ${file.name}`
);
return null; // No file to return
}
} catch (error) {
// Handle network or unexpected errors
console.error(`Failed to decrypt PDF: ${file.name}`, error);
this.showErrorBanner(
`Decryption error for PDF: ${file.name}`,
error.message || 'Unexpected error occurred.',
'There was an error processing the file. Please try again.'
);
return null; // No file to return
}
}
async checkFileEncrypted(file) {
try {
pdfjsLib.GlobalWorkerOptions.workerSrc = './pdfjs-legacy/pdf.worker.mjs';
const arrayBuffer = await file.arrayBuffer(); // Convert file to ArrayBuffer
await pdfjsLib.getDocument({
data: arrayBuffer,
password: '',
}).promise;
return false; // File is not encrypted
} catch (error) {
if (error.name === 'PasswordException') {
return true; // File is encrypted
}
console.error('Error checking encryption:', error);
throw new Error('Failed to determine if the file is encrypted.');
}
}
showErrorBanner(message, stackTrace, error) {
const errorContainer = document.getElementById('errorContainer');
errorContainer.style.display = 'block'; // Display the banner
errorContainer.querySelector('.alert-heading').textContent = error;
errorContainer.querySelector('p').textContent = message;
document.querySelector('#traceContent').textContent = stackTrace;
}
removeErrorBanner() {
const errorContainer = document.getElementById('errorContainer');
errorContainer.style.display = 'none'; // Hide the banner
errorContainer.querySelector('.alert-heading').textContent = '';
errorContainer.querySelector('p').textContent = '';
document.querySelector('#traceContent').textContent = '';
}
}