pub struct MimeValidator { /* private fields */ }Expand description
MIME type validator using magic number detection
This validator uses file signatures (magic numbers) to determine the actual file type, providing security against forged Content-Type headers.
Implementations§
Source§impl MimeValidator
impl MimeValidator
Sourcepub const fn new() -> Self
pub const fn new() -> Self
Creates a new MIME validator
§Examples
use acton_htmx::storage::validation::MimeValidator;
let validator = MimeValidator::new();Sourcepub const fn permissive() -> Self
pub const fn permissive() -> Self
Creates a validator in permissive mode
In permissive mode, if the magic number cannot be detected, the validator falls back to checking the Content-Type header. This is useful for file types without clear magic numbers.
Warning: Permissive mode is less secure. Use only when necessary.
§Examples
use acton_htmx::storage::validation::MimeValidator;
let validator = MimeValidator::permissive();Sourcepub fn detect_mime(&self, file: &UploadedFile) -> Option<&'static str>
pub fn detect_mime(&self, file: &UploadedFile) -> Option<&'static str>
Detects the actual MIME type from file content
Uses magic number detection to determine the file type.
Returns None if the file type cannot be determined.
§Examples
use acton_htmx::storage::{UploadedFile, validation::MimeValidator};
let file = UploadedFile::new(
"test.jpg",
"application/octet-stream",
vec![0xFF, 0xD8, 0xFF], // JPEG magic bytes
);
let validator = MimeValidator::new();
let detected = validator.detect_mime(&file);
assert_eq!(detected, Some("image/jpeg"));Sourcepub fn validate_against_magic(
&self,
file: &UploadedFile,
allowed_types: &[&str],
) -> StorageResult<()>
pub fn validate_against_magic( &self, file: &UploadedFile, allowed_types: &[&str], ) -> StorageResult<()>
Validates file against allowed MIME types using magic number detection
This is the most secure validation method as it checks the actual file content rather than trusting the Content-Type header.
§Errors
Returns StorageError::InvalidMimeType if:
- The detected type is not in
allowed_types - In strict mode: The file type cannot be detected
§Examples
use acton_htmx::storage::{UploadedFile, validation::MimeValidator};
let file = UploadedFile::new(
"photo.png",
"image/png",
vec![0x89, 0x50, 0x4E, 0x47], // PNG magic bytes
);
let validator = MimeValidator::new();
validator.validate_against_magic(&file, &["image/png", "image/jpeg"])?;Sourcepub fn validate_header_matches_content(
&self,
file: &UploadedFile,
) -> StorageResult<()>
pub fn validate_header_matches_content( &self, file: &UploadedFile, ) -> StorageResult<()>
Validates that the Content-Type header matches the detected type
This ensures that the client-provided Content-Type header is accurate. Useful for detecting mismatches that might indicate malicious uploads.
§Errors
Returns StorageError::InvalidMimeType if the header doesn’t match detected type
§Examples
use acton_htmx::storage::{UploadedFile, validation::MimeValidator};
// Honest upload - header matches content
let honest = UploadedFile::new(
"photo.jpg",
"image/jpeg",
vec![0xFF, 0xD8, 0xFF], // JPEG magic bytes
);
let validator = MimeValidator::new();
validator.validate_header_matches_content(&honest)?;
// Dishonest upload - header lies about content
let dishonest = UploadedFile::new(
"malware.jpg", // Claims to be JPEG
"image/jpeg",
b"#!/bin/sh\nrm -rf /".to_vec(), // But it's a shell script!
);
assert!(validator.validate_header_matches_content(&dishonest).is_err());Sourcepub fn is_image(&self, file: &UploadedFile) -> bool
pub fn is_image(&self, file: &UploadedFile) -> bool
Checks if the file is an image
§Examples
use acton_htmx::storage::{UploadedFile, validation::MimeValidator};
let image = UploadedFile::new(
"photo.png",
"image/png",
vec![0x89, 0x50, 0x4E, 0x47], // PNG magic bytes
);
let validator = MimeValidator::new();
assert!(validator.is_image(&image));
let text = UploadedFile::new(
"doc.txt",
"text/plain",
b"Hello, world!".to_vec(),
);
assert!(!validator.is_image(&text));Sourcepub fn is_video(&self, file: &UploadedFile) -> bool
pub fn is_video(&self, file: &UploadedFile) -> bool
Checks if the file is a video
§Examples
use acton_htmx::storage::{UploadedFile, validation::MimeValidator};
let video = UploadedFile::new(
"clip.mp4",
"video/mp4",
vec![0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70], // MP4 magic
);
let validator = MimeValidator::new();
assert!(validator.is_video(&video));Sourcepub fn is_document(&self, file: &UploadedFile) -> bool
pub fn is_document(&self, file: &UploadedFile) -> bool
Checks if the file is a document (PDF, Office, etc.)
§Examples
use acton_htmx::storage::{UploadedFile, validation::MimeValidator};
let pdf = UploadedFile::new(
"doc.pdf",
"application/pdf",
vec![0x25, 0x50, 0x44, 0x46], // PDF magic bytes
);
let validator = MimeValidator::new();
assert!(validator.is_document(&pdf));Trait Implementations§
Source§impl Clone for MimeValidator
impl Clone for MimeValidator
Source§fn clone(&self) -> MimeValidator
fn clone(&self) -> MimeValidator
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for MimeValidator
impl Debug for MimeValidator
Source§impl Default for MimeValidator
impl Default for MimeValidator
Source§fn default() -> MimeValidator
fn default() -> MimeValidator
Auto Trait Implementations§
impl Freeze for MimeValidator
impl RefUnwindSafe for MimeValidator
impl Send for MimeValidator
impl Sync for MimeValidator
impl Unpin for MimeValidator
impl UnwindSafe for MimeValidator
Blanket Implementations§
Source§impl<T> ActonMessage for T
impl<T> ActonMessage for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().