feat: `basic-auth` cargo feature (#221)
Diff
Cargo.toml | 6 ++++--
docs/content/building-from-source.md | 2 ++
src/handler.rs | 9 +++++++--
src/lib.rs | 4 ++++
src/server.rs | 3 +++
src/settings/cli.rs | 1 +
src/settings/mod.rs | 4 ++++
7 files changed, 25 insertions(+), 4 deletions(-)
@@ -39,7 +39,7 @@ doc = false
[features]
default = ["compression", "http2", "directory-listing"]
default = ["compression", "http2", "directory-listing", "basic-auth"]
http2 = ["tokio-rustls", "rustls-pemfile"]
@@ -50,11 +50,13 @@ compression-gzip = ["async-compression/deflate"]
compression-zstd = ["async-compression/zstd"]
directory-listing = ["humansize", "chrono"]
basic-auth = ["bcrypt"]
[dependencies]
anyhow = "1.0"
async-compression = { version = "0.3", default-features = false, optional = true, features = ["brotli", "deflate", "gzip", "zstd", "tokio"] }
bcrypt = "0.14"
bcrypt = { version = "0.14", optional = true }
bytes = "1.4"
form_urlencoded = "1.1"
futures-util = { version = "0.3", default-features = false, features = ["sink"] }
@@ -40,6 +40,8 @@ Feature | Description
[**Directory Listing**](./features/directory-listing.md) |
[**Basic Authorization**](./features/basic-authentication.md) |
### Disable all default features
@@ -7,14 +7,17 @@
use headers::HeaderValue;
use hyper::{header::WWW_AUTHENTICATE, Body, Request, Response, StatusCode};
use hyper::{Body, Request, Response, StatusCode};
use std::{future::Future, net::IpAddr, net::SocketAddr, path::PathBuf, sync::Arc};
#[cfg(feature = "compression")]
use crate::compression;
#[cfg(feature = "basic-auth")]
use {crate::basic_auth, hyper::header::WWW_AUTHENTICATE};
use crate::{
basic_auth, control_headers, cors, custom_headers, error_page,
control_headers, cors, custom_headers, error_page,
exts::http::MethodExt,
fallback_page, redirects, rewrites, security_headers,
settings::Advanced,
@@ -56,6 +59,7 @@ pub struct RequestHandlerOpts {
pub page_fallback: Vec<u8>,
#[cfg(feature = "basic-auth")]
pub basic_auth: String,
pub log_remote_address: bool,
@@ -156,6 +160,7 @@ impl RequestHandler {
};
}
#[cfg(feature = "basic-auth")]
if !self.opts.basic_auth.is_empty() {
if let Some((user_id, password)) = self.opts.basic_auth.split_once(':') {
@@ -86,6 +86,8 @@
#![deny(missing_docs)]
@@ -102,6 +104,8 @@ extern crate anyhow;
extern crate serde;
#[cfg(feature = "basic-auth")]
#[cfg_attr(docsrs, doc(cfg(feature = "basic-auth")))]
pub mod basic_auth;
#[cfg(feature = "compression")]
#[cfg_attr(docsrs, doc(cfg(feature = "compression")))]
@@ -223,8 +223,10 @@ impl Server {
general.cors_expose_headers.trim(),
);
#[cfg(feature = "basic-auth")]
let basic_auth = general.basic_auth.trim().to_owned();
#[cfg(feature = "basic-auth")]
tracing::info!(
"basic authentication: enabled={}",
!general.basic_auth.is_empty()
@@ -267,6 +269,7 @@ impl Server {
page404: page404.clone(),
page50x: page50x.clone(),
page_fallback,
#[cfg(feature = "basic-auth")]
basic_auth,
log_remote_address,
redirect_trailing_slash,
@@ -329,6 +329,7 @@ pub struct General {
pub cache_control_headers: bool,
#[cfg(feature = "basic-auth")]
#[arg(long, default_value = "", env = "SERVER_BASIC_AUTH")]
pub basic_auth: String,
@@ -113,7 +113,9 @@ impl Settings {
#[cfg(feature = "directory-listing")]
let mut directory_listing_format = opts.directory_listing_format;
#[cfg(feature = "basic-auth")]
let mut basic_auth = opts.basic_auth;
let mut fd = opts.fd;
let mut threads_multiplier = opts.threads_multiplier;
let mut max_blocking_threads = opts.max_blocking_threads;
@@ -238,6 +240,7 @@ impl Settings {
if let Some(v) = general.directory_listing_format {
directory_listing_format = v
}
#[cfg(feature = "basic-auth")]
if let Some(ref v) = general.basic_auth {
basic_auth = v.to_owned()
}
@@ -404,6 +407,7 @@ impl Settings {
directory_listing_order,
#[cfg(feature = "directory-listing")]
directory_listing_format,
#[cfg(feature = "basic-auth")]
basic_auth,
fd,
threads_multiplier,