src/backup/manifest.rs: include signature inside the manifest
This is more flexible, because we can choose what fileds we want to sign.
This commit is contained in:
		@ -4,7 +4,7 @@ use std::path::Path;
 | 
			
		||||
 | 
			
		||||
use serde_json::{json, Value};
 | 
			
		||||
 | 
			
		||||
use crate::backup::{BackupDir, CryptMode};
 | 
			
		||||
use crate::backup::{BackupDir, CryptMode, CryptConfig};
 | 
			
		||||
 | 
			
		||||
pub const MANIFEST_BLOB_NAME: &str = "index.json.blob";
 | 
			
		||||
pub const CLIENT_LOG_BLOB_NAME: &str = "client.log.blob";
 | 
			
		||||
@ -84,8 +84,41 @@ impl BackupManifest {
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn into_json(self) -> Value {
 | 
			
		||||
        json!({
 | 
			
		||||
    pub fn signature(&self, crypt_config: &CryptConfig) -> [u8; 32] {
 | 
			
		||||
 | 
			
		||||
        let mut data = String::new();
 | 
			
		||||
 | 
			
		||||
        data.push_str(self.snapshot.group().backup_type());
 | 
			
		||||
        data.push('\n');
 | 
			
		||||
        data.push_str(self.snapshot.group().backup_id());
 | 
			
		||||
        data.push('\n');
 | 
			
		||||
        data.push_str(&format!("{}", self.snapshot.backup_time().timestamp()));
 | 
			
		||||
        data.push('\n');
 | 
			
		||||
        data.push('\n');
 | 
			
		||||
 | 
			
		||||
        for info in self.files.iter() {
 | 
			
		||||
            data.push_str(&info.filename);
 | 
			
		||||
            data.push('\n');
 | 
			
		||||
            data.push_str(match info.crypt_mode {
 | 
			
		||||
                CryptMode::None => "None",
 | 
			
		||||
                CryptMode::SignOnly => "SignOnly",
 | 
			
		||||
                CryptMode::Encrypt => "Encrypt",
 | 
			
		||||
            });
 | 
			
		||||
            data.push('\n');
 | 
			
		||||
            data.push_str(&format!("{}", info.size));
 | 
			
		||||
            data.push('\n');
 | 
			
		||||
            data.push_str(&proxmox::tools::digest_to_hex(&info.csum));
 | 
			
		||||
            data.push('\n');
 | 
			
		||||
 | 
			
		||||
            data.push('\n');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        crypt_config.compute_auth_tag(data.as_bytes())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn into_json(self, crypt_config: Option<&CryptConfig>) -> Value {
 | 
			
		||||
 | 
			
		||||
        let mut manifest = json!({
 | 
			
		||||
            "backup-type": self.snapshot.group().backup_type(),
 | 
			
		||||
            "backup-id": self.snapshot.group().backup_id(),
 | 
			
		||||
            "backup-time": self.snapshot.backup_time().timestamp(),
 | 
			
		||||
@ -99,7 +132,14 @@ impl BackupManifest {
 | 
			
		||||
                    }));
 | 
			
		||||
                    acc
 | 
			
		||||
                })
 | 
			
		||||
        })
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if let Some(crypt_config) = crypt_config {
 | 
			
		||||
            let sig = self.signature(crypt_config);
 | 
			
		||||
            manifest["signature"] = proxmox::tools::digest_to_hex(&sig).into();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        manifest
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user