ghidra-version-manager 0.7.1

Ghidra Version Manager
use crate::cache::CacheEntry;
use crate::prefs_backup::backup_restorer::BackupRestorer;
use crate::prefs_backup::gvm_config::GvmConfig;
use anyhow::Context;
use std::io::{Cursor, Write};
use zip::write::SimpleFileOptions;
use zip::{CompressionMethod, ZipWriter};

pub struct BackupGenerator {
    pub backup_data: Vec<u8>,
}

impl BackupGenerator {
    pub fn from_cached_version(cache_entry: &CacheEntry, tag: &str) -> anyhow::Result<Self> {
        let home = std::env::home_dir().context("Couldn't determine home directory")?;

        let name = cache_entry.path.file_name().unwrap();
        let pref_path = home
            .join("./.config/ghidra/")
            .join(name)
            .join("./preferences");
        let prefs_data = std::fs::read(&pref_path).context("Failed to read ghidra prefs")?;

        let mut zip_out = Cursor::new(Vec::new());
        let options = SimpleFileOptions::default().compression_method(CompressionMethod::Deflated);
        let mut zip = ZipWriter::new(&mut zip_out);
        zip.start_file("prefs", options)?;
        zip.write_all(&prefs_data)?;

        zip.start_file("gvm_config.toml", options)?;
        zip.write_all(
            toml::to_string(&GvmConfig {
                version: 0,
                tag: tag.to_string(),
            })?
            .as_bytes(),
        )?;

        zip.finish()?;

        Ok(Self {
            backup_data: zip_out.into_inner(),
        })
    }

    pub fn restorer(self) -> BackupRestorer {
        BackupRestorer {
            backup_data: self.backup_data,
        }
    }
}