* Validates the structure of a backup object * Supports both v1 (legacy) and v2 (new) backup formats * @param {object} backup * @returns {{valid: boolean, errors: string[], warnings: string[], isLegacy: boolean}}
(backup)
| 51 | * @returns {{valid: boolean, errors: string[], warnings: string[], isLegacy: boolean}} |
| 52 | */ |
| 53 | function validateBackupStructure(backup) { |
| 54 | const errors = []; |
| 55 | const warnings = []; |
| 56 | |
| 57 | if (!backup || typeof backup !== "object") { |
| 58 | errors.push(strings["backup not valid object"]); |
| 59 | return { valid: false, errors, warnings, isLegacy: false }; |
| 60 | } |
| 61 | |
| 62 | // Determine if this is a legacy (v1) backup |
| 63 | const isLegacy = !backup.version; |
| 64 | |
| 65 | if (isLegacy) { |
| 66 | // Legacy backup (v1) - just needs settings or installedPlugins to be valid |
| 67 | const hasData = |
| 68 | backup.settings || backup.keyBindings || backup.installedPlugins; |
| 69 | if (!hasData) { |
| 70 | errors.push(strings["backup no data"]); |
| 71 | } |
| 72 | warnings.push(strings["backup legacy warning"]); |
| 73 | } else { |
| 74 | // Version 2+ backup |
| 75 | if (backup.version >= 2) { |
| 76 | if (!backup.metadata) { |
| 77 | warnings.push(strings["backup missing metadata"]); |
| 78 | } |
| 79 | |
| 80 | // Verify checksum if present |
| 81 | if (backup.checksum) { |
| 82 | try { |
| 83 | const dataToCheck = JSON.stringify({ |
| 84 | settings: backup.settings, |
| 85 | keyBindings: backup.keyBindings, |
| 86 | installedPlugins: backup.installedPlugins, |
| 87 | }); |
| 88 | const expectedChecksum = generateChecksum(dataToCheck); |
| 89 | if (backup.checksum !== expectedChecksum) { |
| 90 | warnings.push(strings["backup checksum mismatch"]); |
| 91 | } |
| 92 | } catch (e) { |
| 93 | warnings.push(strings["backup checksum verify failed"]); |
| 94 | } |
| 95 | } |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | // Validate settings (both versions) |
| 100 | if (backup.settings !== undefined && typeof backup.settings !== "object") { |
| 101 | errors.push(strings["backup invalid settings"]); |
| 102 | } |
| 103 | |
| 104 | // Validate keyBindings (both versions) |
| 105 | if ( |
| 106 | backup.keyBindings !== undefined && |
| 107 | typeof backup.keyBindings !== "object" |
| 108 | ) { |
| 109 | errors.push(strings["backup invalid keybindings"]); |
| 110 | } |
no test coverage detected