feat(auth): enforce tamper-proof cloud saves and remove local export/import (fixes #4)

This commit is contained in:
Antigravity committed 2026-09-22 11:18:31 +00:00
1 parent 198d1dcf98
commit 9f905569a5
4 files changed
+40 -175

No files matched your search

+19 -26
View File
@@ -1532,13 +1532,7 @@ window.GameEngine = class GameEngine {
});
}
// Export / Import Save File Handlers
const btnExportSave = document.getElementById('btn-export-save');
const btnExportSaveProfile = document.getElementById('btn-export-save-profile');
const btnImportSave = document.getElementById('btn-import-save');
const btnImportSaveProfile = document.getElementById('btn-import-save-profile');
const inputImportSave = document.getElementById('input-import-save');
// Export / Import Save File Handlers (Safely bound with optional chaining)
const handleExportSave = () => {
this.saveUserData();
if (window.PvZAuth && window.PvZAuth.exportSaveFile) {
@@ -1546,9 +1540,10 @@ window.GameEngine = class GameEngine {
}
};
if (btnExportSave) btnExportSave.addEventListener('click', handleExportSave);
if (btnExportSaveProfile) btnExportSaveProfile.addEventListener('click', handleExportSave);
document.getElementById('btn-export-save')?.addEventListener('click', handleExportSave);
document.getElementById('btn-export-save-profile')?.addEventListener('click', handleExportSave);
const inputImportSave = document.getElementById('input-import-save');
const handleTriggerImport = () => {
if (inputImportSave) {
inputImportSave.value = '';
@@ -1556,25 +1551,23 @@ window.GameEngine = class GameEngine {
}
};
if (btnImportSave) btnImportSave.addEventListener('click', handleTriggerImport);
if (btnImportSaveProfile) btnImportSaveProfile.addEventListener('click', handleTriggerImport);
document.getElementById('btn-import-save')?.addEventListener('click', handleTriggerImport);
document.getElementById('btn-import-save-profile')?.addEventListener('click', handleTriggerImport);
if (inputImportSave) {
inputImportSave.addEventListener('change', async (e) => {
const file = e.target.files && e.target.files[0];
if (!file) return;
if (window.PvZAuth && window.PvZAuth.importSaveFile) {
const res = await window.PvZAuth.importSaveFile(file);
if (res && res.success) {
this.loadUserData();
this.updateProfileUI();
this.updateRecordDisplay();
this.updateShopUI();
}
inputImportSave?.addEventListener('change', async (e) => {
const file = e.target.files && e.target.files[0];
if (!file) return;
if (window.PvZAuth && window.PvZAuth.importSaveFile) {
const res = await window.PvZAuth.importSaveFile(file);
if (res && res.success) {
this.loadUserData();
this.updateProfileUI();
this.updateRecordDisplay();
this.updateShopUI();
}
inputImportSave.value = '';
});
}
}
if (inputImportSave) inputImportSave.value = '';
});
// Active Sessions event listeners
const btnRefreshSessions = document.getElementById('btn-refresh-sessions');