use std::cmp::Ordering;
use std::fs;
pub struct Config {
pub authorized_keys_fpath: String,
pub public_key_fpath: String,
}
impl Config {
pub fn new(args: &[String]) -> Result<Config, &'static str> {
match args.len().cmp(&3) {
Ordering::Less => Err("not enough arguments"),
Ordering::Greater => Err("too many arguments"),
Ordering::Equal => Ok(Config {
authorized_keys_fpath: args[1].clone(),
public_key_fpath: args[2].clone(),
}),
}
}
}
pub fn run(config: &Config) -> Result<(), Box<dyn std::error::Error>> {
let authorized_keys_content = fs::read_to_string(&config.authorized_keys_fpath)?;
let authorized_keys = authorized_keys_content.lines().collect::<Vec<_>>();
let public_keys_content = fs::read_to_string(&config.public_key_fpath)?;
let public_keys = public_keys_content.lines().collect::<Vec<_>>();
for &pub_key in authorized_keys.iter() {
println!("{}", pub_key);
}
for pub_key in extract_keys(&authorized_keys, &public_keys) {
println!("{}", pub_key);
}
Ok(())
}
pub fn extract_keys<'a>(public_keys: &Vec<&'a str>, authorized_keys: &Vec<&str>) -> Vec<String> {
let mut keys_to_be_append = Vec::new();
for &line in public_keys {
let pub_key = line.split(" ").collect::<Vec<_>>()[..2].join(" ");
let result = search(pub_key.as_str(), &authorized_keys);
if result.len() == 0 {
// append to authorized_keys file
keys_to_be_append.push(pub_key);
}
}
keys_to_be_append
}
pub fn search<'a>(query: &str, lines: &Vec<&'a str>) -> Vec<&'a str> {
let mut results = Vec::new();
for &line in lines {
if line.contains(query) {
results.push(line);
}
}
results
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_keys() {
let public_keys = vec![
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfzP+l0IwuGDQT4gQHZZtlLHM7XC07sfZ8B2E5weH1ctepgx23WRWULvr2Dzy5cUUYMdxiuUBeq6E5YJ/6vt+uqvFWjFC8n5SwrwdMsXQiZP8t/cqdIETC9yLrhzYYMyUiVZDrRi0HLv6Ssda/sF+mu7YpT971it155vRKmOvYOX1QlgA7v1cSRklel8pJ7gX2oT9NHwVTj38VYNvrEQDrEF3/wYmUndKgMI2BLI+PUjkk8UL/k6CJJT8NFSa0brU8aQsPQBX07C/8U5CgWX20iWEqNoG065BrSMcyulQ2zndmv/PaWDD973rPH0uU+zXioaHXlpUhKCd4ucdhKOLi+2ZOcFVsBt+1fSAyFR8pjF4fGW3XYwxDehkbx5kAoez1ErJhA3bitlIisfc4d8+pTIYnoG134mKqj04OugLWF5a7kU/D8OXFQkJzPW3bLLr6y2hQlssucb5knCtfPw7hc22T4UoEd6/Pgz/veGNgRsBHxGelmNCVbWd014IZgY0="#,
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHc/gCxwO3wAhRYG1YtUfghy+xOCpwxOBNRpERTdcI5Uk/L2wD09mAYt7w6PU9vrdHYP7bIdTy447WxcanVVs+fycUPI2WTaut0DrNwH/d+ahezSj16h1x4AGsoamKxZ7VrtcPeKUu32NiLGIg6/F1/l1F6ISzYSqIPa4xre68SgcSP8o9wDS9Ixh0ZfFnXZGJ4VwG7IyWPj3s1guqUQn2iC7VsuEpA/9ZXR4YkMIm/ZzNxpb4VkXZuyWOGspFZgMoDxGO4wNwT8IuOEb77uSHKNv71nLTw7vuGxvQH1xHsBA/oAd86WYNtyB0BteB4EOlpDy4d4XEp+uSpx5RPV+cnXBImPlBjq5maRuW/3uNs5mlA/GyHuHlGm83HhD7CFhvz9EFyQBojuFGui9B/kGmPgWWA198wt1MRylIM6gSFGDfar+2ZfIa1miyMpziEkN/nD/3XYl0HPz2ppdLpPuZBBKbTSQnrRSkDjV51A7IXMYEY2pn0mbUivSS/6TzBoM="#,
];
let authorized_keys = vec![
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfzP+l0IwuGDQT4gQHZZtlLHM7XC07sfZ8B2E5weH1ctepgx23WRWULvr2Dzy5cUUYMdxiuUBeq6E5YJ/6vt+uqvFWjFC8n5SwrwdMsXQiZP8t/cqdIETC9yLrhzYYMyUiVZDrRi0HLv6Ssda/sF+mu7YpT971it155vRKmOvYOX1QlgA7v1cSRklel8pJ7gX2oT9NHwVTj38VYNvrEQDrEF3/wYmUndKgMI2BLI+PUjkk8UL/k6CJJT8NFSa0brU8aQsPQBX07C/8U5CgWX20iWEqNoG065BrSMcyulQ2zndmv/PaWDD973rPH0uU+zXioaHXlpUhKCd4ucdhKOLi+2ZOcFVsBt+1fSAyFR8pjF4fGW3XYwxDehkbx5kAoez1ErJhA3bitlIisfc4d8+pTIYnoG134mKqj04OugLWF5a7kU/D8OXFQkJzPW3bLLr6y2hQlssucb5knCtfPw7hc22T4UoEd6/Pgz/veGNgRsBHxGelmNCVbWd014IZgY0= polle@pollenjp-pc"#,
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCg+ybUzuO5x6dMjjQe42s7XviyiQGUmB6Tc9Hlkopl0bSjTr4unHLBNlLdSAb85i+9WYvDm+q7bqhGber6c60CtIFGCUrfH6yxXO4weQNTZ5M1CgzhDq9VLwq6cDoRsmJnSmeX4s3tt9ezCTtpITsRwljcpFJQLgfJ3QXkFFAxC/8ClblY7RSmqxCwii+sUDWLDeZG8VcTZAnCGlD7FAO+lLJUhjO15J+vf6dSq82DAU0BTVnOeMkPLxToIxwJMF6tFBPhrneThwaI/i9ibF4FTsCMMq6DW6iZTpGuaSaY98vx3Y1F6JvjAE+7wcTiPyyP3GKxLyqiSwRU5M6+kAyDAZAT4YUks2A7WADk2IVjc0UOrUaJJimXZinhUWWLTA3190VETNtB4Azf4SykB6NL56wdoqUVRg2nf+cb2vEfYuRACJ0bCi3acPGMmE2gZIGwyAoQHL20nasiaxO1buMiSYDXxroM/Y2RC8swuM1L4yqSxCE2csZ/Lue50G/cSM0= polle@pollenjp-pc"#,
];
assert_eq!(
vec![
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHc/gCxwO3wAhRYG1YtUfghy+xOCpwxOBNRpERTdcI5Uk/L2wD09mAYt7w6PU9vrdHYP7bIdTy447WxcanVVs+fycUPI2WTaut0DrNwH/d+ahezSj16h1x4AGsoamKxZ7VrtcPeKUu32NiLGIg6/F1/l1F6ISzYSqIPa4xre68SgcSP8o9wDS9Ixh0ZfFnXZGJ4VwG7IyWPj3s1guqUQn2iC7VsuEpA/9ZXR4YkMIm/ZzNxpb4VkXZuyWOGspFZgMoDxGO4wNwT8IuOEb77uSHKNv71nLTw7vuGxvQH1xHsBA/oAd86WYNtyB0BteB4EOlpDy4d4XEp+uSpx5RPV+cnXBImPlBjq5maRuW/3uNs5mlA/GyHuHlGm83HhD7CFhvz9EFyQBojuFGui9B/kGmPgWWA198wt1MRylIM6gSFGDfar+2ZfIa1miyMpziEkN/nD/3XYl0HPz2ppdLpPuZBBKbTSQnrRSkDjV51A7IXMYEY2pn0mbUivSS/6TzBoM="#,
],
extract_keys(&public_keys, &authorized_keys)
)
}
#[test]
fn test_extract_keys2() {
let public_keys = vec![
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfzP+l0IwuGDQT4gQHZZtlLHM7XC07sfZ8B2E5weH1ctepgx23WRWULvr2Dzy5cUUYMdxiuUBeq6E5YJ/6vt+uqvFWjFC8n5SwrwdMsXQiZP8t/cqdIETC9yLrhzYYMyUiVZDrRi0HLv6Ssda/sF+mu7YpT971it155vRKmOvYOX1QlgA7v1cSRklel8pJ7gX2oT9NHwVTj38VYNvrEQDrEF3/wYmUndKgMI2BLI+PUjkk8UL/k6CJJT8NFSa0brU8aQsPQBX07C/8U5CgWX20iWEqNoG065BrSMcyulQ2zndmv/PaWDD973rPH0uU+zXioaHXlpUhKCd4ucdhKOLi+2ZOcFVsBt+1fSAyFR8pjF4fGW3XYwxDehkbx5kAoez1ErJhA3bitlIisfc4d8+pTIYnoG134mKqj04OugLWF5a7kU/D8OXFQkJzPW3bLLr6y2hQlssucb5knCtfPw7hc22T4UoEd6/Pgz/veGNgRsBHxGelmNCVbWd014IZgY0="#,
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHc/gCxwO3wAhRYG1YtUfghy+xOCpwxOBNRpERTdcI5Uk/L2wD09mAYt7w6PU9vrdHYP7bIdTy447WxcanVVs+fycUPI2WTaut0DrNwH/d+ahezSj16h1x4AGsoamKxZ7VrtcPeKUu32NiLGIg6/F1/l1F6ISzYSqIPa4xre68SgcSP8o9wDS9Ixh0ZfFnXZGJ4VwG7IyWPj3s1guqUQn2iC7VsuEpA/9ZXR4YkMIm/ZzNxpb4VkXZuyWOGspFZgMoDxGO4wNwT8IuOEb77uSHKNv71nLTw7vuGxvQH1xHsBA/oAd86WYNtyB0BteB4EOlpDy4d4XEp+uSpx5RPV+cnXBImPlBjq5maRuW/3uNs5mlA/GyHuHlGm83HhD7CFhvz9EFyQBojuFGui9B/kGmPgWWA198wt1MRylIM6gSFGDfar+2ZfIa1miyMpziEkN/nD/3XYl0HPz2ppdLpPuZBBKbTSQnrRSkDjV51A7IXMYEY2pn0mbUivSS/6TzBoM= polle@pollenjp-pc"#,
];
let authorized_keys = vec![
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfzP+l0IwuGDQT4gQHZZtlLHM7XC07sfZ8B2E5weH1ctepgx23WRWULvr2Dzy5cUUYMdxiuUBeq6E5YJ/6vt+uqvFWjFC8n5SwrwdMsXQiZP8t/cqdIETC9yLrhzYYMyUiVZDrRi0HLv6Ssda/sF+mu7YpT971it155vRKmOvYOX1QlgA7v1cSRklel8pJ7gX2oT9NHwVTj38VYNvrEQDrEF3/wYmUndKgMI2BLI+PUjkk8UL/k6CJJT8NFSa0brU8aQsPQBX07C/8U5CgWX20iWEqNoG065BrSMcyulQ2zndmv/PaWDD973rPH0uU+zXioaHXlpUhKCd4ucdhKOLi+2ZOcFVsBt+1fSAyFR8pjF4fGW3XYwxDehkbx5kAoez1ErJhA3bitlIisfc4d8+pTIYnoG134mKqj04OugLWF5a7kU/D8OXFQkJzPW3bLLr6y2hQlssucb5knCtfPw7hc22T4UoEd6/Pgz/veGNgRsBHxGelmNCVbWd014IZgY0="#,
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCg+ybUzuO5x6dMjjQe42s7XviyiQGUmB6Tc9Hlkopl0bSjTr4unHLBNlLdSAb85i+9WYvDm+q7bqhGber6c60CtIFGCUrfH6yxXO4weQNTZ5M1CgzhDq9VLwq6cDoRsmJnSmeX4s3tt9ezCTtpITsRwljcpFJQLgfJ3QXkFFAxC/8ClblY7RSmqxCwii+sUDWLDeZG8VcTZAnCGlD7FAO+lLJUhjO15J+vf6dSq82DAU0BTVnOeMkPLxToIxwJMF6tFBPhrneThwaI/i9ibF4FTsCMMq6DW6iZTpGuaSaY98vx3Y1F6JvjAE+7wcTiPyyP3GKxLyqiSwRU5M6+kAyDAZAT4YUks2A7WADk2IVjc0UOrUaJJimXZinhUWWLTA3190VETNtB4Azf4SykB6NL56wdoqUVRg2nf+cb2vEfYuRACJ0bCi3acPGMmE2gZIGwyAoQHL20nasiaxO1buMiSYDXxroM/Y2RC8swuM1L4yqSxCE2csZ/Lue50G/cSM0="#,
];
assert_eq!(
vec![
r#"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHc/gCxwO3wAhRYG1YtUfghy+xOCpwxOBNRpERTdcI5Uk/L2wD09mAYt7w6PU9vrdHYP7bIdTy447WxcanVVs+fycUPI2WTaut0DrNwH/d+ahezSj16h1x4AGsoamKxZ7VrtcPeKUu32NiLGIg6/F1/l1F6ISzYSqIPa4xre68SgcSP8o9wDS9Ixh0ZfFnXZGJ4VwG7IyWPj3s1guqUQn2iC7VsuEpA/9ZXR4YkMIm/ZzNxpb4VkXZuyWOGspFZgMoDxGO4wNwT8IuOEb77uSHKNv71nLTw7vuGxvQH1xHsBA/oAd86WYNtyB0BteB4EOlpDy4d4XEp+uSpx5RPV+cnXBImPlBjq5maRuW/3uNs5mlA/GyHuHlGm83HhD7CFhvz9EFyQBojuFGui9B/kGmPgWWA198wt1MRylIM6gSFGDfar+2ZfIa1miyMpziEkN/nD/3XYl0HPz2ppdLpPuZBBKbTSQnrRSkDjV51A7IXMYEY2pn0mbUivSS/6TzBoM="#,
],
extract_keys(&public_keys, &authorized_keys)
)
}
#[test]
fn test_key_search() {
let pub_key =
r#"ssh-rsa AAAABasdofadskfalskjdflashdlajdljaALDSKFLKSJDFLSJFLHSDLFSLKHDFLSDJFLSJFD="#;
let authorized_keys_content = r#"\
ssh-rsa AAAABasdofadskfalskjdflashdlajdljaALDSKFLKSJDFLSJFLHSDLFSLKHDFLSDJFLSJFD= pollenjp@fizz
ssh-rsa AAAABasdofadskfalskjdASLKDFJNLABHHAKDJFKSAHDFLSAJdlfsakjfldsKHDFLSDJFLSF= pollenjp@buzz
"#;
let authorized_keys = authorized_keys_content.lines().collect::<Vec<_>>();
assert_eq!(
vec![
r#"ssh-rsa AAAABasdofadskfalskjdflashdlajdljaALDSKFLKSJDFLSJFLHSDLFSLKHDFLSDJFLSJFD= pollenjp@fizz"#
],
search(pub_key, &authorized_keys)
);
}
}