gwd_backend_firefox/
lib.rs

1pub mod errors;
2
3use crate::errors::LZ4Error;
4use dirs;
5use glob::glob;
6use godwit_daemon::config;
7use godwit_daemon::core::{Backend, BackendArgs, Registrar};
8use godwit_daemon::errors::TraceError;
9use godwit_daemon::export_backend;
10use lz4::block::decompress;
11use serde_json::{self, Value};
12use std::fs::File;
13use std::io::{prelude::*, Seek, SeekFrom};
14use std::str;
15
16fn parse_jsonlz4(lz4file: &mut File) -> Result<Value, LZ4Error> {
17    // Skip 8 bytes for jsonlz4 type
18    lz4file.seek(SeekFrom::Start(8))?;
19
20    let mut sizebuffer = [0; 4];
21    lz4file.read(&mut sizebuffer)?;
22    let size = u32::from_le_bytes(sizebuffer);
23
24    let mut lz4buffer = Vec::new();
25    lz4file.read_to_end(&mut lz4buffer)?;
26
27    let json_str = decompress(&lz4buffer, Some(size as i32))?;
28
29    let parsed: Value = serde_json::from_str(str::from_utf8(&json_str)?)?;
30    Ok(parsed)
31}
32
33pub fn trace(refresh: bool) -> Result<(), TraceError> {
34    let mozilla_profile_path = dirs::home_dir().unwrap().as_path().join(".mozilla/firefox");
35
36    for lz4path in glob(&format!(
37        "{}{}",
38        mozilla_profile_path
39            .to_str()
40            .expect("Path couldn't be converted to string."),
41        "/*.default*/sessionstore-backups/*.*lz4*"
42    ))? {
43        let lz4path = lz4path?;
44        let mut lz4file = File::open(&lz4path)?;
45        let parsed_json = parse_jsonlz4(&mut lz4file)?;
46
47        if refresh {
48            config::purge_base_file("Firefox", &lz4path)?;
49        }
50
51        config::update_patches("Firefox", &lz4path, parsed_json)?;
52    }
53    Ok(())
54}
55
56pub struct Firefox;
57
58impl Backend for Firefox {
59    fn trace(&self, _args: BackendArgs) -> Result<(), TraceError> {
60        trace(_args.refresh)
61    }
62}
63
64export_backend!(register);
65
66extern "C" fn register(registrar: &mut dyn Registrar) {
67    registrar.register_backend("Firefox", Box::new(Firefox));
68}