ssh/
util.rs

1use crate::error::SshResult;
2use rand::rngs::OsRng;
3use rand::Rng;
4
5#[cfg(feature = "scp")]
6use crate::error::SshError;
7#[cfg(feature = "scp")]
8use std::{
9    path::Path,
10    str::FromStr,
11    time::{SystemTime, UNIX_EPOCH},
12};
13
14#[cfg(feature = "scp")]
15pub(crate) fn sys_time_to_secs(time: SystemTime) -> SshResult<u64> {
16    Ok(time.duration_since(UNIX_EPOCH)?.as_secs())
17}
18
19// a random cookie
20pub(crate) fn cookie() -> Vec<u8> {
21    let cookie: [u8; 16] = OsRng.gen();
22    cookie.to_vec()
23}
24
25pub(crate) fn vec_u8_to_string(v: Vec<u8>, pat: &str) -> SshResult<Vec<String>> {
26    let result = String::from_utf8(v)?;
27    let r: Vec<&str> = result.split(pat).collect();
28    let mut vec = vec![];
29    for x in r {
30        vec.push(x.to_owned())
31    }
32    Ok(vec)
33}
34
35#[cfg(feature = "scp")]
36pub(crate) fn check_path(path: &Path) -> SshResult<()> {
37    if path.to_str().is_none() {
38        return Err(SshError::InvalidScpFilePath);
39    }
40    Ok(())
41}
42
43#[cfg(feature = "scp")]
44pub(crate) fn file_time(v: Vec<u8>) -> SshResult<(i64, i64)> {
45    let mut t = vec![];
46    for x in v {
47        if x == b'T' || x == 32 || x == 10 {
48            continue;
49        }
50        t.push(x)
51    }
52    let a = t.len() / 2;
53    let ct = String::from_utf8(t[..(a - 1)].to_vec())?;
54    let ut = String::from_utf8(t[a..(t.len() - 1)].to_vec())?;
55    Ok((i64::from_str(&ct)?, i64::from_str(&ut)?))
56}