1use crate::utils;
2use lz4::block;
3use std::{io::Write, path::Path};
4
5pub fn create_compressed_json_file(compressed_bookmark_path: &Path) -> Result<(), anyhow::Error> {
6 if !compressed_bookmark_path.exists() {
7 let decompressed_bookmark_path = Path::new("test_data/bookmarks_firefox.json");
8 assert!(decompressed_bookmark_path.exists());
9
10 let decompressed_bookmarks = utils::read_file(decompressed_bookmark_path)?;
11 let compressed_bookmarks = compress_bookmarks(&decompressed_bookmarks);
12
13 let mut file = utils::create_file(compressed_bookmark_path)?;
14 file.write_all(&compressed_bookmarks)?;
15 file.flush()?;
16
17 assert!(compressed_bookmark_path.exists());
18 }
19
20 Ok(())
21}
22
23pub fn create_binary_plist_file(binary_bookmark_path: &Path) -> Result<(), anyhow::Error> {
24 if !binary_bookmark_path.exists() {
25 let bookmark_path = Path::new("test_data/bookmarks_safari_xml.plist");
26 let bookmark_file = utils::open_file(bookmark_path)?;
27 let parsed_bookmarks = plist::Value::from_reader_xml(&bookmark_file)?;
28
29 plist::to_file_binary(binary_bookmark_path, &parsed_bookmarks)?;
30
31 assert!(binary_bookmark_path.exists());
32 }
33
34 Ok(())
35}
36
37pub fn compress_bookmarks(decompressed_bookmarks: &[u8]) -> Vec<u8> {
38 let compressed_data = block::compress(decompressed_bookmarks, None, true).unwrap();
39
40 let prefix: &[u8] = b"mozLz40\0";
42 let mut compressed_data_with_header = Vec::with_capacity(prefix.len() + compressed_data.len());
43 compressed_data_with_header.extend_from_slice(prefix);
44 compressed_data_with_header.extend_from_slice(&compressed_data);
45
46 compressed_data_with_header
47}
48
49#[cfg(test)]
50pub mod tests {
51 use super::*;
52 use crate::bookmark_reader::SourceOs;
53 use std::fs::{self, File};
54
55 const PROFILES_INI_LINUX: &str = r#"
56 [Profile2]
57 Name=bene
58 IsRelative=1
59 Path=profile3.username
60
61 [Profile1]
62 Name=bene
63 IsRelative=1
64 Path=profile2.username
65 Default=1
66
67 [Profile0]
68 Name=default
69 IsRelative=1
70 Path=profile1.default
71 "#;
72
73 const PROFILES_INI_MACOS: &str = r#"
74 [Profile2]
75 Name=bene
76 IsRelative=1
77 Path=Profiles/profile3.username
78
79 [Profile1]
80 Name=bene
81 IsRelative=1
82 Path=Profiles/profile2.username
83 Default=1
84
85 [Profile0]
86 Name=default
87 IsRelative=1
88 Path=Profiles/profile1.default
89 "#;
90
91 fn create_chromium_dirs(browser_dir: &Path) {
92 let default_profile_dir = browser_dir.join("Default");
93 let profile_dir = browser_dir.join("Profile 1");
94
95 fs::create_dir_all(&default_profile_dir).unwrap();
96 fs::create_dir_all(&profile_dir).unwrap();
97
98 let default_profile_file = default_profile_dir.join("Bookmarks");
99 let profile_file = profile_dir.join("Bookmarks");
100 File::create(default_profile_file).unwrap();
101 File::create(profile_file).unwrap();
102 }
103
104 fn create_safari_dirs(browser_dir: &Path) {
105 fs::create_dir_all(browser_dir).unwrap();
106 utils::create_file(&browser_dir.join("Bookmarks.plist")).unwrap();
107 }
108
109 fn create_firefox_dirs_linux(browser_dir: &Path) {
110 let profile_dir1 = browser_dir.join("profile1.default/bookmarkbackups");
111 let profile_dir2 = browser_dir.join("profile2.username/bookmarkbackups");
112 fs::create_dir_all(&profile_dir1).unwrap();
113 fs::create_dir_all(&profile_dir2).unwrap();
114 utils::create_file(&profile_dir1.join("bookmarks.jsonlz4")).unwrap();
115 utils::create_file(&profile_dir2.join("bookmarks.jsonlz4")).unwrap();
116 let mut file = utils::create_file(&browser_dir.join("profiles.ini")).unwrap();
117 file.write_all(PROFILES_INI_LINUX.as_bytes()).unwrap();
118 file.flush().unwrap();
119 }
120
121 fn create_firefox_dirs_macos(browser_dir: &Path) {
122 let profile_dir1 = browser_dir.join("Profiles/profile1.default/bookmarkbackups");
123 let profile_dir2 = browser_dir.join("Profiles/profile2.username/bookmarkbackups");
124 fs::create_dir_all(&profile_dir1).unwrap();
125 fs::create_dir_all(&profile_dir2).unwrap();
126 utils::create_file(&profile_dir1.join("bookmarks.jsonlz4")).unwrap();
127 utils::create_file(&profile_dir2.join("bookmarks.jsonlz4")).unwrap();
128 let mut file = utils::create_file(&browser_dir.join("profiles.ini")).unwrap();
129 file.write_all(PROFILES_INI_MACOS.as_bytes()).unwrap();
130 file.flush().unwrap();
131 }
132
133 pub fn create_test_files(home_dir: &Path, source_os: &SourceOs) {
134 match source_os {
135 SourceOs::Linux => {
136 let browser_dir = home_dir.join("snap/firefox/common/.mozilla/firefox");
137 create_firefox_dirs_linux(&browser_dir);
138
139 let browser_dir = home_dir.join(".mozilla/firefox");
140 create_firefox_dirs_linux(&browser_dir);
141
142 let browser_dir = home_dir.join("snap/chromium/common/chromium");
143 create_chromium_dirs(&browser_dir);
144
145 let browser_dir = home_dir.join(".config/google-chrome");
146 create_chromium_dirs(&browser_dir);
147
148 let browser_dir = home_dir.join(".config/microsoft-edge");
149 create_chromium_dirs(&browser_dir);
150 }
151 SourceOs::Macos => {
152 let browser_dir = home_dir.join("Library/Safari");
153 create_safari_dirs(&browser_dir);
154
155 let browser_dir = home_dir.join("Library/Application Support/Firefox");
156 create_firefox_dirs_macos(&browser_dir);
157
158 let browser_dir = home_dir.join("Library/Application Support/Google/Chrome");
159 create_chromium_dirs(&browser_dir);
160 }
161 SourceOs::Windows => {
162 let browser_dir = home_dir.join("AppData\\Local\\Google\\Chrome\\User Data");
163 create_chromium_dirs(&browser_dir);
164
165 let browser_dir = home_dir.join("AppData\\Local\\Microsoft\\Edge\\User Data");
166 create_chromium_dirs(&browser_dir);
167 }
168 }
169 }
170}