Skip to content

Commit ee462a5

Browse files
committed
safe traversal: add support for translations
1 parent 8fc888e commit ee462a5

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
@@ -27,34 +27,36 @@ use nix::fcntl::{OFlag, openat};
2727
use nix::sys::stat::{FileStat, Mode, fstatat};
2828
use nix::unistd::{UnlinkatFlags, unlinkat};
2929

30+
use crate::translate;
31+
3032
// Custom error types for better error reporting
3133
#[derive(thiserror::Error, Debug)]
3234
pub enum SafeTraversalError {
33-
#[error("path contains null byte")]
35+
#[error("{}", translate!("safe-traversal-error-path-contains-null"))]
3436
PathContainsNull,
3537

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

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

50-
#[error("failed to read directory '{path}': {source}")]
52+
#[error("{}", translate!("safe-traversal-error-read-dir-failed", "path" => path, "source" => source))]
5153
ReadDirFailed {
5254
path: String,
5355
#[source]
5456
source: io::Error,
5557
},
5658

57-
#[error("failed to unlink '{path}': {source}")]
59+
#[error("{}", translate!("safe-traversal-error-unlink-failed", "path" => path, "source" => source))]
5860
UnlinkFailed {
5961
path: String,
6062
#[source]
@@ -65,9 +67,10 @@ pub enum SafeTraversalError {
6567
impl From<SafeTraversalError> for io::Error {
6668
fn from(err: SafeTraversalError) -> Self {
6769
match err {
68-
SafeTraversalError::PathContainsNull => {
69-
io::Error::new(io::ErrorKind::InvalidInput, "path contains null byte")
70-
}
70+
SafeTraversalError::PathContainsNull => io::Error::new(
71+
io::ErrorKind::InvalidInput,
72+
translate!("safe-traversal-error-path-contains-null"),
73+
),
7174
SafeTraversalError::OpenFailed { source, .. } => source,
7275
SafeTraversalError::StatFailed { source, .. } => source,
7376
SafeTraversalError::ReadDirFailed { source, .. } => source,
@@ -168,7 +171,7 @@ impl DirFd {
168171
/// Get raw stat data for this directory
169172
pub fn fstat(&self) -> io::Result<FileStat> {
170173
let stat = nix::sys::stat::fstat(&self.fd).map_err(|e| SafeTraversalError::StatFailed {
171-
path: "<current directory>".to_string(),
174+
path: translate!("safe-traversal-current-directory"),
172175
source: io::Error::from_raw_os_error(e as i32),
173176
})?;
174177

@@ -179,7 +182,7 @@ impl DirFd {
179182
pub fn read_dir(&self) -> io::Result<Vec<OsString>> {
180183
read_dir_entries(&self.fd).map_err(|e| {
181184
SafeTraversalError::ReadDirFailed {
182-
path: "<directory>".to_string(),
185+
path: translate!("safe-traversal-directory"),
183186
source: e,
184187
}
185188
.into()
@@ -211,7 +214,7 @@ impl DirFd {
211214
if fd < 0 {
212215
return Err(io::Error::new(
213216
io::ErrorKind::InvalidInput,
214-
"invalid file descriptor",
217+
translate!("safe-traversal-error-invalid-fd"),
215218
));
216219
}
217220
// SAFETY: We've verified fd >= 0, and the caller is transferring ownership

0 commit comments

Comments
 (0)