Skip to content

Commit 09ae8fe

Browse files
committed
add glob pattern support for known_hosts
1 parent a154422 commit 09ae8fe

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,13 +23,15 @@
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;
2930
use base64::Engine as _;
3031
use git2::cert::{Cert, SshHostKeyType};
3132
use git2::CertificateCheckStatus;
3233
use hmac::Mac;
34+
use regex::Regex;
3335
use std::collections::HashSet;
3436
use std::fmt::{Display, Write};
3537
use std::path::{Path, PathBuf};
@@ -588,7 +590,18 @@ impl KnownHost {
588590
}
589591
for pattern in self.patterns.split(',') {
590592
let pattern = pattern.to_lowercase();
591-
// FIXME: support * and ? wildcards
593+
let is_glob = is_glob_pattern(&pattern);
594+
595+
if is_glob {
596+
let regex_pattern =
597+
regex::escape(&pattern.replace("*", ",,,,").replace("?", ";;;;"))
598+
.replace(",,,,", ".*")
599+
.replace(";;;;", ".");
600+
if let Ok(regex) = Regex::new(&regex_pattern) {
601+
match_found |= regex.is_match(&host);
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)