1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
use std::path::Path;
#[cfg(any(windows, test))]
use base64::Engine;
pub(crate) fn shell_single_quote(value: &str) -> String {
format!("'{}'", value.replace('\'', "'\"'\"'"))
}
pub(crate) fn hook_command(hook_path: &Path, action: Option<&str>) -> String {
let path = hook_path.display().to_string();
#[cfg(windows)]
{
let mut command = format!(
"powershell -NoProfile -ExecutionPolicy Bypass -File {}",
windows_command_quote(&path)
);
if let Some(action) = action {
command.push(' ');
command.push_str(action);
}
command
}
#[cfg(not(windows))]
{
let mut command = format!("bash {}", shell_single_quote(&path));
if let Some(action) = action {
command.push(' ');
command.push_str(action);
}
command
}
}
#[cfg(any(windows, test))]
pub(crate) fn powershell_encoded_hook_command(hook_path: &Path, action: &str) -> String {
let path = hook_path.display().to_string().replace('\'', "''");
let script = format!("& '{path}' {action}");
let encoded_script = script
.encode_utf16()
.flat_map(u16::to_le_bytes)
.collect::<Vec<_>>();
let encoded = base64::engine::general_purpose::STANDARD.encode(encoded_script);
format!("powershell -NoProfile -ExecutionPolicy Bypass -EncodedCommand {encoded}")
}
pub(crate) fn legacy_bash_hook_command(hook_path: &Path, action: Option<&str>) -> String {
let mut command = format!(
"bash {}",
shell_single_quote(&hook_path.display().to_string())
);
if let Some(action) = action {
command.push(' ');
command.push_str(action);
}
command
}
#[cfg(windows)]
fn windows_command_quote(value: &str) -> String {
format!("\"{}\"", value.replace('"', "\\\""))
}
|