-
- Notifications
You must be signed in to change notification settings - Fork 368
Add support for UTF-16 encoded kubeconfig files #1654
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| use std::{ | ||
| collections::HashMap, | ||
| fs, | ||
| fs, io, | ||
| path::{Path, PathBuf}, | ||
| }; | ||
| | ||
| | @@ -351,8 +351,8 @@ | |
| impl Kubeconfig { | ||
| /// Read a Config from an arbitrary location | ||
| pub fn read_from<P: AsRef<Path>>(path: P) -> Result<Kubeconfig, KubeconfigError> { | ||
| let data = fs::read_to_string(&path) | ||
| .map_err(|source| KubeconfigError::ReadConfig(source, path.as_ref().into()))?; | ||
| let data = | ||
| read_path(&path).map_err(|source| KubeconfigError::ReadConfig(source, path.as_ref().into()))?; | ||
| | ||
| // Remap all files we read to absolute paths. | ||
| let mut merged_docs = None; | ||
| | @@ -497,6 +497,33 @@ | |
| }); | ||
| } | ||
| | ||
| fn read_path<P: AsRef<Path>>(path: P) -> io::Result<String> { | ||
| let bytes = fs::read(&path)?; | ||
| match bytes.as_slice() { | ||
| [0xFF, 0xFE, ..] => { | ||
| Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. a comment for these magic numbers would be helpful for a future person 😅 Contributor Author There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would you prefer using Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps also putting a comment to use String::from_utf16le and friends when they become stable | ||
| let utf16_data: Vec<u16> = bytes[2..] | ||
| .chunks(2) | ||
| .map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]])) | ||
| .collect(); | ||
| String::from_utf16(&utf16_data) | ||
| .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-16 LE")) | ||
| } | ||
| [0xFE, 0xFF, ..] => { | ||
| let utf16_data: Vec<u16> = bytes[2..] | ||
| .chunks(2) | ||
| .map(|chunk| u16::from_be_bytes([chunk[0], chunk[1]])) | ||
| .collect(); | ||
| String::from_utf16(&utf16_data) | ||
| .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-16 BE")) | ||
| } | ||
| [0xEF, 0xBB, 0xBF, ..] => String::from_utf8(bytes[3..].to_vec()) | ||
| .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-8 BOM")), | ||
| _ => { | ||
| String::from_utf8(bytes).map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-8")) | ||
| } | ||
| } | ||
| } | ||
| | ||
| fn to_absolute(dir: &Path, file: &str) -> Option<String> { | ||
| let path = Path::new(&file); | ||
| if path.is_relative() { | ||
| | @@ -969,4 +996,21 @@ | |
| json!({"audience": "foo", "other": "bar"}) | ||
| ); | ||
| } | ||
| | ||
| #[tokio::test] | ||
| async fn parse_kubeconfig_encodings() { | ||
| let files = vec![ | ||
| "kubeconfig_utf8.yaml", | ||
| "kubeconfig_utf16le.yaml", | ||
| "kubeconfig_utf16be.yaml", | ||
| ]; | ||
| | ||
| for file_name in files { | ||
| let path = PathBuf::from(format!("{}/src/config/test_data/{}", env!("CARGO_MANIFEST_DIR"), file_name)); | ||
| let cfg = Kubeconfig::read_from(path).unwrap(); | ||
| assert_eq!(cfg.clusters[0].name, "k3d-promstack"); | ||
| assert_eq!(cfg.contexts[0].name, "k3d-promstack"); | ||
| assert_eq!(cfg.auth_infos[0].name, "admin@k3d-k3s-default"); | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| apiVersion: v1 | ||
| clusters: | ||
| - cluster: | ||
| certificate-authority-data: aGVsbG8K | ||
| server: https://0.0.0.0:6443 | ||
| name: k3d-promstack | ||
| contexts: | ||
| - context: | ||
| cluster: k3d-promstack | ||
| user: admin@k3d-promstack | ||
| name: k3d-promstack | ||
| users: | ||
| - name: admin@k3d-k3s-default | ||
| user: | ||
| client-certificate-data: aGVsbG8K | ||
| client-key-data: aGVsbG8K | ||
| current-context: k3d-promstack | ||
| kind: Config | ||
| preferences: {} |
Uh oh!
There was an error while loading. Please reload this page.