diff --git a/actix-cors/CHANGES.md b/actix-cors/CHANGES.md index 3140cc45b..31a23cb71 100644 --- a/actix-cors/CHANGES.md +++ b/actix-cors/CHANGES.md @@ -2,7 +2,6 @@ ## Unreleased - 2022-xx-xx -- Rename `Cors::{allow_private_network_access => allow_local_network_access}()` and its unstable flag (`draft-private-network-access` => `draft-local-network-access`). - Minimum supported Rust version (MSRV) is now 1.60. ## 0.6.4 - 2022-10-28 diff --git a/actix-cors/Cargo.toml b/actix-cors/Cargo.toml index 8aba2a231..a347f9787 100644 --- a/actix-cors/Cargo.toml +++ b/actix-cors/Cargo.toml @@ -18,7 +18,7 @@ rustdoc-args = ["--cfg", "docsrs"] all-features = true [features] -draft-local-network-access = [] +draft-private-network-access = [] [dependencies] actix-utils = "3" diff --git a/actix-cors/src/builder.rs b/actix-cors/src/builder.rs index 2b224d538..51c89223c 100644 --- a/actix-cors/src/builder.rs +++ b/actix-cors/src/builder.rs @@ -101,8 +101,8 @@ impl Cors { preflight: true, send_wildcard: false, supports_credentials: true, - #[cfg(feature = "draft-local-network-access")] - allow_local_network_access: false, + #[cfg(feature = "draft-private-network-access")] + allow_private_network_access: false, vary_header: true, block_on_origin_mismatch: true, }; @@ -422,18 +422,18 @@ impl Cors { /// Allow private network access. /// - /// If true, injects the `Access-Control-Allow-Local-Network: true` header in responses if the - /// request contained the `Access-Control-Request-Local-Network: true` header. + /// If true, injects the `Access-Control-Allow-Private-Network: true` header in responses if the + /// request contained the `Access-Control-Request-Private-Network: true` header. /// - /// For more information on this behavior, see the draft [Local Network Access] spec. + /// For more information on this behavior, see the draft [Private Network Access] spec. /// /// Defaults to `false`. /// - /// [Private Network Access]: https://wicg.github.io/local-network-access - #[cfg(feature = "draft-local-network-access")] - pub fn allow_local_network_access(mut self) -> Cors { + /// [Private Network Access]: https://wicg.github.io/private-network-access + #[cfg(feature = "draft-private-network-access")] + pub fn allow_private_network_access(mut self) -> Cors { if let Some(cors) = cors(&mut self.inner, &self.error) { - cors.allow_local_network_access = true; + cors.allow_private_network_access = true; } self @@ -513,8 +513,8 @@ impl Default for Cors { preflight: true, send_wildcard: false, supports_credentials: false, - #[cfg(feature = "draft-local-network-access")] - allow_local_network_access: false, + #[cfg(feature = "draft-private-network-access")] + allow_private_network_access: false, vary_header: true, block_on_origin_mismatch: true, }; diff --git a/actix-cors/src/inner.rs b/actix-cors/src/inner.rs index 1da38c603..f5ab671cb 100644 --- a/actix-cors/src/inner.rs +++ b/actix-cors/src/inner.rs @@ -64,8 +64,8 @@ pub(crate) struct Inner { pub(crate) preflight: bool, pub(crate) send_wildcard: bool, pub(crate) supports_credentials: bool, - #[cfg(feature = "draft-local-network-access")] - pub(crate) allow_local_network_access: bool, + #[cfg(feature = "draft-private-network-access")] + pub(crate) allow_private_network_access: bool, pub(crate) vary_header: bool, pub(crate) block_on_origin_mismatch: bool, } @@ -222,19 +222,19 @@ pub(crate) fn add_vary_header(headers: &mut HeaderMap) { val.extend(hdr.as_bytes()); val.extend(b", Origin, Access-Control-Request-Method, Access-Control-Request-Headers"); - #[cfg(feature = "draft-local-network-access")] - val.extend(b", Access-Control-Allow-Local-Network"); + #[cfg(feature = "draft-private-network-access")] + val.extend(b", Access-Control-Allow-Private-Network"); val.try_into().unwrap() } - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] None => HeaderValue::from_static( "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, \ - Access-Control-Allow-Local-Network", + Access-Control-Allow-Private-Network", ), - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] None => HeaderValue::from_static( "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", ), diff --git a/actix-cors/src/lib.rs b/actix-cors/src/lib.rs index 622502841..e915aad9a 100644 --- a/actix-cors/src/lib.rs +++ b/actix-cors/src/lib.rs @@ -7,8 +7,8 @@ //! This CORS middleware automatically handles `OPTIONS` preflight requests. //! //! # Crate Features -//! - `draft-local-network-access`: ⚠️ Unstable. Adds opt-in support for the [Local Network Access] -//! spec extensions. This feature is unstable since it will follow any breaking changes in the +//! - `draft-private-network-access`: ⚠️ Unstable. Adds opt-in support for the [Private Network +//! Access] spec extensions. This feature is unstable since it will follow breaking changes in the //! draft spec until it is finalized. //! //! # Example @@ -46,7 +46,7 @@ //! } //! ``` //! -//! [Local Network Access]: https://wicg.github.io/local-network-access +//! [Private Network Access]: https://wicg.github.io/private-network-access #![forbid(unsafe_code)] #![deny(rust_2018_idioms, nonstandard_style)] diff --git a/actix-cors/src/middleware.rs b/actix-cors/src/middleware.rs index 3a6c0fa28..dce066274 100644 --- a/actix-cors/src/middleware.rs +++ b/actix-cors/src/middleware.rs @@ -93,14 +93,14 @@ impl CorsMiddleware { res.insert_header((header::ACCESS_CONTROL_ALLOW_HEADERS, headers.clone())); } - #[cfg(feature = "draft-local-network-access")] - if inner.allow_local_network_access + #[cfg(feature = "draft-private-network-access")] + if inner.allow_private_network_access && req .headers() - .contains_key("access-control-request-local-network") + .contains_key("access-control-request-private-network") { res.insert_header(( - header::HeaderName::from_static("access-control-allow-local-network"), + header::HeaderName::from_static("access-control-allow-private-network"), HeaderValue::from_static("true"), )); } @@ -173,15 +173,15 @@ impl CorsMiddleware { ); } - #[cfg(feature = "draft-local-network-access")] - if inner.allow_local_network_access + #[cfg(feature = "draft-private-network-access")] + if inner.allow_private_network_access && res .request() .headers() - .contains_key("access-control-request-local-network") + .contains_key("access-control-request-private-network") { res.headers_mut().insert( - header::HeaderName::from_static("access-control-allow-local-network"), + header::HeaderName::from_static("access-control-allow-private-network"), HeaderValue::from_static("true"), ); } diff --git a/actix-cors/tests/tests.rs b/actix-cors/tests/tests.rs index 755384136..e08c76678 100644 --- a/actix-cors/tests/tests.rs +++ b/actix-cors/tests/tests.rs @@ -264,15 +264,15 @@ async fn test_response() { .get(header::ACCESS_CONTROL_ALLOW_ORIGIN) .map(HeaderValue::as_bytes) ); - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] assert_eq!( resp.headers().get(header::VARY).map(HeaderValue::as_bytes), Some(&b"Origin, Access-Control-Request-Method, Access-Control-Request-Headers"[..]), ); - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] assert_eq!( resp.headers().get(header::VARY).map(HeaderValue::as_bytes), - Some(&b"Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Local-Network"[..]), + Some(&b"Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Private-Network"[..]), ); #[allow(clippy::needless_collect)] @@ -317,7 +317,7 @@ async fn test_response() { .method(Method::OPTIONS) .to_srv_request(); let resp = test::call_service(&cors, req).await; - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] assert_eq!( resp.headers() .get(header::VARY) @@ -325,10 +325,10 @@ async fn test_response() { .unwrap(), b"Accept, Origin, Access-Control-Request-Method, Access-Control-Request-Headers", ); - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] assert_eq!( resp.headers().get(header::VARY).map(HeaderValue::as_bytes).unwrap(), - b"Accept, Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Local-Network", + b"Accept, Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Private-Network", ); let cors = Cors::default() @@ -478,7 +478,7 @@ async fn vary_header_on_all_handled_responses() { assert!(resp .headers() .contains_key(header::ACCESS_CONTROL_ALLOW_METHODS)); - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] assert_eq!( resp.headers() .get(header::VARY) @@ -487,14 +487,14 @@ async fn vary_header_on_all_handled_responses() { .unwrap(), "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", ); - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] assert_eq!( resp.headers() .get(header::VARY) .expect("response should have Vary header") .to_str() .unwrap(), - "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Local-Network", + "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Private-Network", ); // follow-up regular request @@ -504,7 +504,7 @@ async fn vary_header_on_all_handled_responses() { .to_srv_request(); let resp = test::call_service(&cors, req).await; assert_eq!(resp.status(), StatusCode::OK); - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] assert_eq!( resp.headers() .get(header::VARY) @@ -513,14 +513,14 @@ async fn vary_header_on_all_handled_responses() { .unwrap(), "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", ); - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] assert_eq!( resp.headers() .get(header::VARY) .expect("response should have Vary header") .to_str() .unwrap(), - "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Local-Network", + "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Private-Network", ); let cors = Cors::default() @@ -536,7 +536,7 @@ async fn vary_header_on_all_handled_responses() { .to_srv_request(); let resp = test::call_service(&cors, req).await; assert_eq!(resp.status(), StatusCode::BAD_REQUEST); - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] assert_eq!( resp.headers() .get(header::VARY) @@ -545,21 +545,21 @@ async fn vary_header_on_all_handled_responses() { .unwrap(), "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", ); - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] assert_eq!( resp.headers() .get(header::VARY) .expect("response should have Vary header") .to_str() .unwrap(), - "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Local-Network", + "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Private-Network", ); // regular request no origin let req = TestRequest::default().method(Method::PUT).to_srv_request(); let resp = test::call_service(&cors, req).await; assert_eq!(resp.status(), StatusCode::OK); - #[cfg(not(feature = "draft-local-network-access"))] + #[cfg(not(feature = "draft-private-network-access"))] assert_eq!( resp.headers() .get(header::VARY) @@ -568,14 +568,14 @@ async fn vary_header_on_all_handled_responses() { .unwrap(), "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", ); - #[cfg(feature = "draft-local-network-access")] + #[cfg(feature = "draft-private-network-access")] assert_eq!( resp.headers() .get(header::VARY) .expect("response should have Vary header") .to_str() .unwrap(), - "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Local-Network", + "Origin, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Private-Network", ); } @@ -634,12 +634,12 @@ async fn expose_all_request_header_values() { assert!(cd_hdr.contains("access-control-allow-origin")); } -#[cfg(feature = "draft-local-network-access")] +#[cfg(feature = "draft-private-network-access")] #[actix_web::test] async fn private_network_access() { let cors = Cors::permissive() .allowed_origin("https://public.site") - .allow_local_network_access() + .allow_private_network_access() .new_transform(fn_service(|req: ServiceRequest| async move { let res = req.into_response( HttpResponse::Ok() @@ -664,11 +664,11 @@ async fn private_network_access() { .insert_header((header::ORIGIN, "https://public.site")) .insert_header((header::ACCESS_CONTROL_REQUEST_METHOD, "POST")) .insert_header((header::ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) - .insert_header(("Access-Control-Request-Local-Network", "true")) + .insert_header(("Access-Control-Request-Private-Network", "true")) .to_srv_request(); let res = test::call_service(&cors, req).await; assert!(res.headers().contains_key("access-control-allow-origin")); assert!(res .headers() - .contains_key("access-control-allow-local-network")); + .contains_key("access-control-allow-private-network")); }