Skip to content

Commit d05db65

Browse files
committed
safe traversal: add support for translations
1 parent 07ddde1 commit d05db65

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

src/uucore/locales/en-US.ftl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,13 @@ action-removing = removing
3737
action-creating = creating
3838
action-reading = reading
3939
action-writing = writing
40+
41+
# Safe traversal error messages
42+
safe-traversal-error-path-contains-null = path contains null byte
43+
safe-traversal-error-open-failed = failed to open '{ $path }': { $source }
44+
safe-traversal-error-stat-failed = failed to stat '{ $path }': { $source }
45+
safe-traversal-error-read-dir-failed = failed to read directory '{ $path }': { $source }
46+
safe-traversal-error-unlink-failed = failed to unlink '{ $path }': { $source }
47+
safe-traversal-error-invalid-fd = invalid file descriptor
48+
safe-traversal-current-directory = <current directory>
49+
safe-traversal-directory = <directory>

src/uucore/locales/fr-FR.ftl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,13 @@ action-removing = suppression
3737
action-creating = création
3838
action-reading = lecture
3939
action-writing = écriture
40+
41+
# Messages d'erreur de traversée sécurisée
42+
safe-traversal-error-path-contains-null = le chemin contient un octet null
43+
safe-traversal-error-open-failed = échec de l'ouverture de '{ $path }' : { $source }
44+
safe-traversal-error-stat-failed = échec de l'analyse de '{ $path }' : { $source }
45+
safe-traversal-error-read-dir-failed = échec de la lecture du répertoire '{ $path }' : { $source }
46+
safe-traversal-error-unlink-failed = échec de la suppression de '{ $path }' : { $source }
47+
safe-traversal-error-invalid-fd = descripteur de fichier invalide
48+
safe-traversal-current-directory = <répertoire courant>
49+
safe-traversal-directory = <répertoire>

src/uucore/src/lib/features/safe_traversal.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,36 @@ use nix::fcntl::{OFlag, openat};
2020
use nix::sys::stat::{FileStat, Mode, fstatat};
2121
use nix::unistd::{UnlinkatFlags, unlinkat};
2222

23+
use crate::translate;
24+
2325
// Custom error types for better error reporting
2426
#[derive(thiserror::Error, Debug)]
2527
pub enum SafeTraversalError {
26-
#[error("path contains null byte")]
28+
#[error("{}", translate!("safe-traversal-error-path-contains-null"))]
2729
PathContainsNull,
2830

29-
#[error("failed to open '{path}': {source}")]
31+
#[error("{}", translate!("safe-traversal-error-open-failed", "path" => path, "source" => source))]
3032
OpenFailed {
3133
path: String,
3234
#[source]
3335
source: io::Error,
3436
},
3537

36-
#[error("failed to stat '{path}': {source}")]
38+
#[error("{}", translate!("safe-traversal-error-stat-failed", "path" => path, "source" => source))]
3739
StatFailed {
3840
path: String,
3941
#[source]
4042
source: io::Error,
4143
},
4244

43-
#[error("failed to read directory '{path}': {source}")]
45+
#[error("{}", translate!("safe-traversal-error-read-dir-failed", "path" => path, "source" => source))]
4446
ReadDirFailed {
4547
path: String,
4648
#[source]
4749
source: io::Error,
4850
},
4951

50-
#[error("failed to unlink '{path}': {source}")]
52+
#[error("{}", translate!("safe-traversal-error-unlink-failed", "path" => path, "source" => source))]
5153
UnlinkFailed {
5254
path: String,
5355
#[source]
@@ -58,9 +60,10 @@ pub enum SafeTraversalError {
5860
impl From<SafeTraversalError> for io::Error {
5961
fn from(err: SafeTraversalError) -> Self {
6062
match err {
61-
SafeTraversalError::PathContainsNull => {
62-
io::Error::new(io::ErrorKind::InvalidInput, "path contains null byte")
63-
}
63+
SafeTraversalError::PathContainsNull => io::Error::new(
64+
io::ErrorKind::InvalidInput,
65+
translate!("safe-traversal-error-path-contains-null"),
66+
),
6467
SafeTraversalError::OpenFailed { source, .. } => source,
6568
SafeTraversalError::StatFailed { source, .. } => source,
6669
SafeTraversalError::ReadDirFailed { source, .. } => source,
@@ -165,7 +168,7 @@ impl DirFd {
165168
/// Get raw stat data for this directory
166169
pub fn fstat(&self) -> io::Result<FileStat> {
167170
let stat = nix::sys::stat::fstat(&self.fd).map_err(|e| SafeTraversalError::StatFailed {
168-
path: "<current directory>".to_string(),
171+
path: translate!("safe-traversal-current-directory"),
169172
source: io::Error::from_raw_os_error(e as i32),
170173
})?;
171174

@@ -176,7 +179,7 @@ impl DirFd {
176179
pub fn read_dir(&self) -> io::Result<Vec<OsString>> {
177180
read_dir_entries(&self.fd).map_err(|e| {
178181
SafeTraversalError::ReadDirFailed {
179-
path: "<directory>".to_string(),
182+
path: translate!("safe-traversal-directory"),
180183
source: e,
181184
}
182185
.into()
@@ -209,7 +212,7 @@ impl DirFd {
209212
if fd < 0 {
210213
return Err(io::Error::new(
211214
io::ErrorKind::InvalidInput,
212-
"invalid file descriptor",
215+
translate!("safe-traversal-error-invalid-fd"),
213216
));
214217
}
215218
// SAFETY: We've verified fd >= 0, and the caller is transferring ownership

0 commit comments

Comments
 (0)