blob: 47b343dd3de90f065c2edc6641c0756f9c735a7a (
plain)
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
|
use std::io;
use std::path::Path;
use neon::prelude::{Context, FunctionContext};
use neon::result::JsResult;
use neon::types::{JsString, JsValue, Value};
use talpid_types::ErrorExt;
#[derive(thiserror::Error, Debug)]
enum Error {
/// Failed to open the provided file
#[error("Failed to open named pipe")]
OpenPipe(#[source] io::Error),
/// Failed to check pipe ownership (GetSecurityInfo)
#[error("Failed to check named pipe ownership (GetSecurityInfo failed)")]
CheckPermissions(#[source] io::Error),
}
pub fn pipe_is_admin_owned(mut cx: FunctionContext<'_>) -> JsResult<'_, JsValue> {
let link_path = cx.argument::<JsString>(0)?.value(&mut cx);
match pipe_is_admin_owned_inner(link_path) {
Ok(is_admin_owned) => Ok(cx.boolean(is_admin_owned).as_value(&mut cx)),
Err(err) => cx.throw_error(err.display_chain()),
}
}
fn pipe_is_admin_owned_inner<P: AsRef<Path>>(path: P) -> Result<bool, Error> {
let client = std::fs::File::options()
.read(true)
.open(path)
.map_err(Error::OpenPipe)?;
talpid_windows::fs::is_admin_owned(client).map_err(Error::CheckPermissions)
}
|