aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2022-02-05 20:30:47 +0000
committerAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2022-02-05 20:39:25 +0000
commitdd665a4c7e97a8a7513f38ad9293cd8edbe136df (patch)
tree6eb0e3cee4b1355f68e68e9912b7c15b328f4297
parentmerge from jikstra (diff)
downloadminiserve-dd665a4c7e97a8a7513f38ad9293cd8edbe136df.tar.gz
miniserve-dd665a4c7e97a8a7513f38ad9293cd8edbe136df.zip
update to actix-web v4.0-rc.2
-rw-r--r--Cargo.lock8
-rw-r--r--Cargo.toml8
-rw-r--r--src/config.rs37
-rw-r--r--src/errors.rs9
-rw-r--r--src/listing.rs7
-rw-r--r--src/main.rs8
-rwxr-xr-xtests/data/generate_tls_certs.sh3
-rw-r--r--tests/data/key_pkcs1.pem51
-rw-r--r--tests/data/key_pkcs8.pem (renamed from tests/data/key.pem)0
-rw-r--r--tests/tls.rs14
10 files changed, 95 insertions, 50 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 74cd024..cec1d8f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
diff --git a/Cargo.toml b/Cargo.toml
index f46e0ce..9438e7c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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()?;