Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions actix-files/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unreleased

- `PathBufWrap` & `UriSegmentError` made public.
- Minimum supported Rust version (MSRV) is now 1.75.

## 0.6.6
Expand Down
1 change: 1 addition & 0 deletions actix-files/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ impl ResponseError for FilesError {
}
}

/// Error which can occur with parsing/validating a request-uri path
#[derive(Debug, PartialEq, Eq, Display)]
#[non_exhaustive]
pub enum UriSegmentError {
Expand Down
5 changes: 2 additions & 3 deletions actix-files/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,12 @@ mod range;
mod service;

pub use self::{
chunked::ChunkedReadFile, directory::Directory, files::Files, named::NamedFile,
range::HttpRange, service::FilesService,
chunked::ChunkedReadFile, directory::Directory, error::UriSegmentError, files::Files,
named::NamedFile, path_buf::PathBufWrap, range::HttpRange, service::FilesService,
};
use self::{
directory::{directory_listing, DirectoryRenderer},
error::FilesError,
path_buf::PathBufWrap,
};

type HttpService = BoxService<ServiceRequest, ServiceResponse, Error>;
Expand Down
14 changes: 13 additions & 1 deletion actix-files/src/path_buf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ use actix_web::{dev::Payload, FromRequest, HttpRequest};

use crate::error::UriSegmentError;

/// Secure Path Traversal Guard
///
/// This struct parses a request-uri [`PathBuf`](std::path::PathBuf)
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct PathBufWrap(PathBuf);
pub struct PathBufWrap(PathBuf);

impl FromStr for PathBufWrap {
type Err = UriSegmentError;
Expand All @@ -20,6 +23,15 @@ impl FromStr for PathBufWrap {
}

impl PathBufWrap {
/// Parse a safe path from a supplied [`HttpRequest`](actix_web::HttpRequest),
/// given the choice of allowing hiddden files to be considered valid segments.
///
/// Path traversal is guarded by this method.
#[inline]
pub fn parse_req(req: &HttpRequest, hidden_files: bool) -> Result<Self, UriSegmentError> {
Self::parse_path(req.match_info().unprocessed(), hidden_files)
}

/// Parse a path, giving the choice of allowing hidden files to be considered valid segments.
///
/// Path traversal is guarded by this method.
Expand Down
Loading