vls_proxy/util/
rpc_cookie.rs

1use anyhow::Result;
2use std::path::PathBuf;
3
4/// Get the rpc username and password from the provided arguments.
5pub fn get_rpc_credentials(
6    rpc_username: Option<String>,
7    rpc_password: Option<String>,
8    rpc_cookie: Option<PathBuf>,
9) -> Result<(String, String)> {
10    match (rpc_username, rpc_password, rpc_cookie) {
11        (Some(user), Some(password), None) => Ok((user, password)),
12        (_, _, Some(cookie)) => {
13            let contents = match std::fs::read_to_string(cookie) {
14                Ok(contents) => contents,
15                Err(e) => {
16                    eprintln!("Error reading rpc cookie file: {}", e);
17                    std::process::exit(1);
18                }
19            };
20            let mut split = contents.splitn(2, ":");
21            let user = split
22                .next()
23                .ok_or(anyhow::anyhow!("rpc_cookie file must contain a username and password"))?;
24            let password = split
25                .next()
26                .ok_or(anyhow::anyhow!("rpc_cookie file must contain a username and password"))?;
27
28            Ok((user.to_string(), password.to_string()))
29        }
30        _ => {
31            anyhow::bail!("rpc_username and rpc_password must be set, or rpc_cookie must be set");
32        }
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    use std::io::Write;
40    use tempfile::NamedTempFile;
41
42    #[test]
43    fn test_rpc_username_password() {
44        let rpc_username = Some("user".to_string());
45        let rpc_password = Some("password".to_string());
46        let rpc_cookie = None;
47        assert_eq!(
48            get_rpc_credentials(rpc_username, rpc_password, rpc_cookie).unwrap(),
49            ("user".to_string(), "password".to_string())
50        );
51
52        let mut temp_file = NamedTempFile::new().unwrap();
53        write!(temp_file, "user:password").unwrap();
54        let rpc_cookie = Some(temp_file.path().to_path_buf());
55        let rpc_username = None;
56        let rpc_password = None;
57        assert_eq!(
58            get_rpc_credentials(rpc_username, rpc_password, rpc_cookie).unwrap(),
59            ("user".to_string(), "password".to_string())
60        );
61
62        let rpc_username = Some("user".to_string());
63        let rpc_password = None;
64        let rpc_cookie = None;
65        assert!(get_rpc_credentials(rpc_username, rpc_password, rpc_cookie).is_err());
66
67        let rpc_username = None;
68        let rpc_password = Some("password".to_string());
69        let rpc_cookie = None;
70        assert!(get_rpc_credentials(rpc_username, rpc_password, rpc_cookie).is_err());
71
72        let rpc_username = None;
73        let rpc_password = None;
74        let rpc_cookie = None;
75        assert!(get_rpc_credentials(rpc_username, rpc_password, rpc_cookie).is_err());
76    }
77}