diff options
author | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2022-02-05 20:30:47 +0000 |
---|---|---|
committer | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2022-02-05 20:39:25 +0000 |
commit | dd665a4c7e97a8a7513f38ad9293cd8edbe136df (patch) | |
tree | 6eb0e3cee4b1355f68e68e9912b7c15b328f4297 | |
parent | merge from jikstra (diff) | |
download | miniserve-dd665a4c7e97a8a7513f38ad9293cd8edbe136df.tar.gz miniserve-dd665a4c7e97a8a7513f38ad9293cd8edbe136df.zip |
update to actix-web v4.0-rc.2
Diffstat (limited to '')
-rw-r--r-- | Cargo.lock | 8 | ||||
-rw-r--r-- | Cargo.toml | 8 | ||||
-rw-r--r-- | src/config.rs | 37 | ||||
-rw-r--r-- | src/errors.rs | 9 | ||||
-rw-r--r-- | src/listing.rs | 7 | ||||
-rw-r--r-- | src/main.rs | 8 | ||||
-rwxr-xr-x | tests/data/generate_tls_certs.sh | 3 | ||||
-rw-r--r-- | tests/data/key_pkcs1.pem | 51 | ||||
-rw-r--r-- | tests/data/key_pkcs8.pem (renamed from tests/data/key.pem) | 0 | ||||
-rw-r--r-- | tests/tls.rs | 14 |
10 files changed, 95 insertions, 50 deletions
@@ -581,9 +581,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dabb7e2f006497e1da045feaa512acf0686f76b68d94925da2d9422dcb521" +checksum = "678db4c39c013cc68b54d372bce2efc58e30a0337c497c9032fd196802df3bc3" dependencies = [ "clap 3.0.14", ] @@ -644,9 +644,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ "cfg-if", "lazy_static", @@ -17,10 +17,10 @@ codegen-units = 1 panic = 'abort' [dependencies] -actix-web = "4.0.0-beta.15" -actix-files = "0.6.0-beta.11" -actix-multipart = "0.4.0-beta.11" -actix-web-httpauth = "0.6.0-beta.6" +actix-web = "=4.0.0-rc.2" +actix-files = "=0.6.0-beta.16" +actix-multipart = "=0.4.0-beta.13" +actix-web-httpauth = "=0.6.0-beta.7" maud = "0.23" yansi = "0.5" simplelog = "0.11" diff --git a/src/config.rs b/src/config.rs index 9bb6928..ccff7e3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,7 +11,7 @@ use anyhow::{Context, Result}; use http::HeaderMap; #[cfg(feature = "tls")] -use rustls_pemfile::{certs, pkcs8_private_keys}; +use rustls_pemfile as pemfile; use crate::{args::CliArgs, auth::RequiredAuth}; @@ -163,31 +163,22 @@ impl MiniserveConfig { let key_file = &mut BufReader::new( File::open(&tls_key).context(format!("Couldn't access TLS key {:?}", tls_key))?, ); - let cert_chain = match rustls_pemfile::read_one(cert_file) { - Ok(item) => match item { - Some(item) => match item { - rustls_pemfile::Item::X509Certificate(item) => item, - _ => return Err(anyhow!("Certfile is not a X509Certificate")), - }, - None => { - return Err(anyhow!( - "Certfile does not contain any recognized certificates" - )) - } - }, - _ => return Err(anyhow!("Could not read certfile")), - }; - let mut keys = - pkcs8_private_keys(key_file).map_err(|_| anyhow!("Couldn't load private key"))?; + let cert_chain = pemfile::certs(cert_file).context("Reading cert file")?; + let key = pemfile::read_all(key_file) + .context("Reading private key file")? + .into_iter() + .filter_map(|item| match item { + pemfile::Item::RSAKey(key) | pemfile::Item::PKCS8Key(key) => Some(key), + _ => None, + }) + .next() + .ok_or(anyhow!("No supported private key in file"))?; let server_config = rustls::ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .unwrap() + .with_safe_defaults() .with_no_client_auth() .with_single_cert( - vec![rustls::Certificate(cert_chain)], - rustls::PrivateKey(keys.remove(0)), + cert_chain.into_iter().map(rustls::Certificate).collect(), + rustls::PrivateKey(key), )?; Some(server_config) } else { diff --git a/src/errors.rs b/src/errors.rs index 70bad5c..5f55514 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -109,18 +109,19 @@ impl ResponseError for ContextualError { } /// Middleware to convert plain-text error responses to user-friendly web pages -pub fn error_page_middleware<S>( +pub fn error_page_middleware<S, B>( req: ServiceRequest, srv: &S, ) -> impl Future<Output = actix_web::Result<ServiceResponse>> + 'static where - S: Service<ServiceRequest, Response = ServiceResponse, Error = actix_web::Error>, + S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = actix_web::Error>, + B: MessageBody + 'static, S::Future: 'static, { let fut = srv.call(req); async { - let res = fut.await?; + let res = fut.await?.map_into_boxed_body(); if (res.status().is_client_error() || res.status().is_server_error()) && res.headers().get(header::CONTENT_TYPE).map(AsRef::as_ref) @@ -134,7 +135,7 @@ where } } -fn map_error_page<'a>(req: &HttpRequest, head: &mut ResponseHead, body: BoxBody) -> BoxBody { +fn map_error_page(req: &HttpRequest, head: &mut ResponseHead, body: BoxBody) -> BoxBody { let error_msg = match body.try_into_bytes() { Ok(bytes) => bytes, Err(body) => return body, diff --git a/src/listing.rs b/src/listing.rs index 58703c0..9e02598 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -1,4 +1,3 @@ -use actix_web::body::BoxBody; use actix_web::dev::ServiceResponse; use actix_web::web::Query; use actix_web::{HttpMessage, HttpRequest, HttpResponse}; @@ -15,7 +14,8 @@ use crate::archive::ArchiveMethod; use crate::auth::CurrentUser; use crate::errors::{self, ContextualError}; use crate::renderer; -use percent_encode_sets::PATH_SEGMENT; + +use self::percent_encode_sets::PATH_SEGMENT; /// "percent-encode sets" as defined by WHATWG specs: /// https://url.spec.whatwg.org/#percent-encoded-bytes @@ -157,7 +157,6 @@ pub fn directory_listing( let extensions = req.extensions(); let current_user: Option<&CurrentUser> = extensions.get::<CurrentUser>(); - use actix_web::dev::BodyEncoding; let conf = req.app_data::<crate::MiniserveConfig>().unwrap(); let serve_path = req.path(); @@ -358,7 +357,7 @@ pub fn directory_listing( req.clone(), HttpResponse::Ok() .content_type(archive_method.content_type()) - .encoding(archive_method.content_encoding()) + .append_header(archive_method.content_encoding()) .append_header(("Content-Transfer-Encoding", "binary")) .append_header(( "Content-Disposition", diff --git a/src/main.rs b/src/main.rs index 5b239e4..7f1944f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,6 @@ use std::thread; use std::time::Duration; use actix_files::NamedFile; -use actix_web::body::BoxBody; -use actix_web::middleware::Compat; use actix_web::web; use actix_web::{http::header::ContentType, Responder}; use actix_web::{middleware, App, HttpRequest, HttpResponse}; @@ -200,7 +198,9 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { web::scope(inside_config.random_route.as_deref().unwrap_or("")) .wrap(middleware::Condition::new( !inside_config.auth.is_empty(), - Compat::new(HttpAuthentication::basic(auth::handle_auth)), + actix_web::middleware::Compat::new(HttpAuthentication::basic( + auth::handle_auth, + )), )) .configure(|c| configure_app(c, &inside_config)), ) @@ -366,7 +366,7 @@ async fn css() -> impl Responder { let css = include_str!(concat!(env!("OUT_DIR"), "/style.css")); HttpResponse::Ok() .insert_header(ContentType(mime::TEXT_CSS)) - .message_body(BoxBody::new(css)) + .body(css) } // Prints to the console two inverted QrCodes side by side. diff --git a/tests/data/generate_tls_certs.sh b/tests/data/generate_tls_certs.sh index 969a38c..ed23639 100755 --- a/tests/data/generate_tls_certs.sh +++ b/tests/data/generate_tls_certs.sh @@ -1,2 +1,3 @@ #!/usr/bin/env bash -openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 3650 +openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout key_pkcs8.pem -out cert.pem -nodes -days 3650 +openssl rsa -in key_pkcs8.pem -out key_pkcs1.pem diff --git a/tests/data/key_pkcs1.pem b/tests/data/key_pkcs1.pem new file mode 100644 index 0000000..73055c7 --- /dev/null +++ b/tests/data/key_pkcs1.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/tests/data/key.pem b/tests/data/key_pkcs8.pem index 4263815..4263815 100644 --- a/tests/data/key.pem +++ b/tests/data/key_pkcs8.pem diff --git a/tests/tls.rs b/tests/tls.rs index 2464e1f..6aa9460 100644 --- a/tests/tls.rs +++ b/tests/tls.rs @@ -9,13 +9,15 @@ use select::{document::Document, node::Node}; /// Can start the server with TLS and receive encrypted responses. #[rstest] -fn tls_works( - #[with(&[ +#[case(server(&[ "--tls-cert", "tests/data/cert.pem", - "--tls-key", "tests/data/key.pem" - ])] - server: TestServer, -) -> Result<(), Error> { + "--tls-key", "tests/data/key_pkcs8.pem", +]))] +#[case(server(&[ + "--tls-cert", "tests/data/cert.pem", + "--tls-key", "tests/data/key_pkcs1.pem", +]))] +fn tls_works(#[case] server: TestServer) -> Result<(), Error> { let client = ClientBuilder::new() .danger_accept_invalid_certs(true) .build()?; |