gwd_backend_firefox/
lib.rs1pub 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 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}