Skip to content

Commit 13625ce

Browse files
authored
add glob pattern support for known_hosts (#15508)
### What does this PR try to resolve? This PR implements glob pattern match for known_hosts file. Hosts written with `*` and `?` now matches correctly. ### Tests Tests are added accordingly. ### Miscs This is my first time submitting PR, sorry if there's anything that's off although I've read the contributor guide.
2 parents 056f5f4 + e68d951 commit 13625ce

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/cargo/sources/git/known_hosts.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
//! and revoked markers. See "FIXME" comments littered in this file.
2424
2525
use crate::util::context::{Definition, GlobalContext, Value};
26+
use crate::util::restricted_names::is_glob_pattern;
2627
use crate::CargoResult;
2728
use base64::engine::general_purpose::STANDARD;
2829
use base64::engine::general_purpose::STANDARD_NO_PAD;
@@ -588,7 +589,19 @@ impl KnownHost {
588589
}
589590
for pattern in self.patterns.split(',') {
590591
let pattern = pattern.to_lowercase();
591-
// FIXME: support * and ? wildcards
592+
let is_glob = is_glob_pattern(&pattern);
593+
594+
if is_glob {
595+
match glob::Pattern::new(&pattern) {
596+
Ok(glob) => match_found |= glob.matches(&host),
597+
Err(e) => {
598+
tracing::warn!(
599+
"failed to interpret hostname `{pattern}` as glob pattern: {e}"
600+
)
601+
}
602+
}
603+
}
604+
592605
if let Some(pattern) = pattern.strip_prefix('!') {
593606
if pattern == host {
594607
return false;
@@ -696,13 +709,16 @@ mod tests {
696709
|1|QxzZoTXIWLhUsuHAXjuDMIV3FjQ=|M6NCOIkjiWdCWqkh5+Q+/uFLGjs= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIHgN3O21U4LWtP5OzjTzPnUnSDmCNDvyvlaj6Hi65JC eric@host
697710
# Negation isn't terribly useful without globs.
698711
neg.example.com,!neg.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOXfUnaAHTlo1Qi//rNk26OcmHikmkns1Z6WW/UuuS3K eric@host
712+
# Glob patterns
713+
*.asterisk.glob.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO6/wm8Z5aVL2cDyALY6zE7KVW0s64utWTUmbAvvSKlI eric@host
714+
test?.question.glob.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKceiey2vuK/WB/kLsiGa85xw897JzvGGaHmkAZbVHf3 eric@host
699715
"#;
700716

701717
#[test]
702718
fn known_hosts_parse() {
703719
let kh_path = Path::new("/home/abc/.known_hosts");
704720
let khs = load_hostfile_contents(kh_path, COMMON_CONTENTS);
705-
assert_eq!(khs.len(), 12);
721+
assert_eq!(khs.len(), 14);
706722
match &khs[0].location {
707723
KnownHostLocation::File { path, lineno } => {
708724
assert_eq!(path, kh_path);
@@ -740,6 +756,12 @@ mod tests {
740756
assert!(khs[10].host_matches("hashed.example.com"));
741757
assert!(!khs[10].host_matches("example.com"));
742758
assert!(!khs[11].host_matches("neg.example.com"));
759+
760+
// Glob patterns
761+
assert!(khs[12].host_matches("matches.asterisk.glob.example.com"));
762+
assert!(!khs[12].host_matches("matches.not.glob.example.com"));
763+
assert!(khs[13].host_matches("test3.question.glob.example.com"));
764+
assert!(!khs[13].host_matches("test120.question.glob.example.com"));
743765
}
744766

745767
#[test]

0 commit comments

Comments
 (0)