config_items/
net.rs

1use serde::{Serialize, Deserialize};
2use log::*;
3
4use crate::get_proxy_password_var;
5
6/// Proxy configuration
7#[derive(Serialize, Deserialize, Debug, Clone)]
8pub struct Proxy {
9    pub url: String,
10    pub port: i32,
11    pub user: Option<String>,
12    pub password: Option<String>,
13}
14
15impl Proxy {
16    fn get_env_var(name:&str) -> Option<String> {
17        match std::env::var(name) {
18            Ok(pp) => Some(pp),
19            Err(_) => None
20        }
21    }
22    fn get_user_var() -> &'static str {
23        let os = std::env::consts::OS;
24        if os == "windows" {
25            "USERNAME"
26        } else {
27            "USER"
28        }
29    }
30    /// Obtain deduced user
31    pub fn get_user(&self) -> Option<String> {
32        if let Some(user) = &self.user {
33            Some(user.to_owned())
34        } else if let Some(euser) = Proxy::get_env_var(Proxy::get_user_var()) {
35            Some(euser)
36        } else {
37            None
38        }
39    }
40    /// Obtain deduced password
41    pub fn get_password(&self) -> Option<String> {
42        if let Some(pass) = &self.password {
43            Some(pass.to_owned())
44        } else if let Some(epass) = Proxy::get_env_var(&get_proxy_password_var()) {
45            Some(epass)
46        } else {
47            None
48        }
49    }
50    /// Obtain the resulting proxy url
51    pub fn get_url(&self) -> String {
52        let mut url = self.url.to_owned();
53        if let Some(user) = self.get_user() {
54            if let Some(pass) = self.get_password() {
55                let parts:Vec<&str> = url.split("://").collect();
56                let def_proto = format!("http://");
57                let mut proto = def_proto.as_str();
58                let host = if parts.len() == 1 {
59                    &url
60                } else {
61                    proto = parts[0];
62                    parts[1]
63                };
64                url = format!("{}{}:{}@{}:{}",
65                                proto,
66                                user,
67                                pass,
68                                host,
69                                self.port);
70            }
71            debug!("proxy url [{url}]");
72        }
73        url
74    }
75}
76
77/// Networking configuration
78#[derive(Serialize, Deserialize, Debug, Clone)]
79pub struct Network {
80    pub proxy: Option<Proxy>,
81    pub skip_ssl_validation: Option<bool>,
82}
83
84impl Network {
85    /// Obtain resulting SSL validation action to take
86    pub fn skip_ssl_validation(&self) -> bool {
87        if let Some(ssv) = self.skip_ssl_validation {
88            ssv
89        } else {
90            false
91        }
92    }
93}