Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/scripts/test/locate-pinned-sdk.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
pin=598f0a2a490eb83dd31c06c024a0cefa8e049628
pin=a7d7fd0f2face027e3810ed67e80f6341fcf68b6
cargo metadata --locked --offline --format-version 1 > "$RUNNER_TEMP/qualification-metadata.json"
manifest=$(jq -er --arg source "git+https://github.com/IABTechLab/edgezero.git?rev=$pin#$pin" '
[.packages[] | select(.name == "edgezero-cli")]
Expand Down
16 changes: 8 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,12 @@ jsonschema-macros-core = "=0.58.6"
testing_logger = "0.1"
clap = { version = "4", features = ["derive"] }
chrono = { version = "0.4", default-features = false, features = ["clock", "serde"] }
edgezero-adapter-axum = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-axum", rev = "598f0a2a490eb83dd31c06c024a0cefa8e049628", default-features = false }
edgezero-adapter-cloudflare = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-cloudflare", rev = "598f0a2a490eb83dd31c06c024a0cefa8e049628", default-features = false }
edgezero-adapter-fastly = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-fastly", rev = "598f0a2a490eb83dd31c06c024a0cefa8e049628", default-features = false }
edgezero-adapter-spin = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-spin", rev = "598f0a2a490eb83dd31c06c024a0cefa8e049628", default-features = false }
edgezero-cli = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-cli", rev = "598f0a2a490eb83dd31c06c024a0cefa8e049628", default-features = false }
edgezero-core = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-core", rev = "598f0a2a490eb83dd31c06c024a0cefa8e049628", default-features = false }
edgezero-adapter-axum = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-axum", rev = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6", default-features = false }
Comment thread
aram356 marked this conversation as resolved.
Resolved
edgezero-adapter-cloudflare = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-cloudflare", rev = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6", default-features = false }
edgezero-adapter-fastly = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-fastly", rev = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6", default-features = false }
edgezero-adapter-spin = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-adapter-spin", rev = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6", default-features = false }
edgezero-cli = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-cli", rev = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6", default-features = false }
edgezero-core = { git = "https://github.com/IABTechLab/edgezero.git", package = "edgezero-core", rev = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6", default-features = false }
fastly = "=0.13.1"
flate2 = { version = "1", default-features = false, features = ["rust_backend"] }
# GVL-archive build gate: brotli-11 compressed-bundle pass in
Expand Down
2 changes: 1 addition & 1 deletion crates/auctioneer-adapter-axum/src/resource_profile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use sha2::{Digest as _, Sha256};
use std::io::{self, Write as _};

const MAX_OUTPUT_BYTES: usize = 0x8000;
const EDGEZERO_PIN: &str = "598f0a2a490eb83dd31c06c024a0cefa8e049628";
const EDGEZERO_PIN: &str = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6";

// Exhaustive destructuring makes new runtime terms a compile error here. The
// original fields retain their owning types, including every integer width.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ mod tests {
assert_eq!(cases.len(), 14_usize);
let digest = "a".repeat(64_usize);
let identity = json!({"auctioneer_commit":"a".repeat(40_usize),
"edgezero_pin":"598f0a2a490eb83dd31c06c024a0cefa8e049628",
"edgezero_pin":"a7d7fd0f2face027e3810ed67e80f6341fcf68b6",
"artifact_sha256":digest,"source_sha256":digest,
"build_features":["spin","auctioneer-config-data/test-harness-override"],
"target":"wasm32-wasip2","runtime_version":{"major":3_u32,"minor":0_u32,"patch":0_u32},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub mod sdk;
#[cfg(test)]
mod recovery;

const SDK_PIN: &str = "598f0a2a490eb83dd31c06c024a0cefa8e049628";
const SDK_PIN: &str = "a7d7fd0f2face027e3810ed67e80f6341fcf68b6";
const OVERRIDE_FEATURE: &str = "auctioneer-config-data/test-harness-override";

#[derive(Deserialize)]
Expand Down Expand Up @@ -686,7 +686,7 @@ mod tests {

fn identity() -> Value {
json!({"auctioneer_commit":"a".repeat(40_usize),
"edgezero_pin":"598f0a2a490eb83dd31c06c024a0cefa8e049628",
"edgezero_pin":"a7d7fd0f2face027e3810ed67e80f6341fcf68b6",
"artifact_sha256":"a".repeat(64_usize),"source_sha256":"a".repeat(64_usize),
"build_features":["spin","auctioneer-config-data/test-harness-override"],"target":"wasm32-wasip2",
"runtime_version":{"major":3_usize,"minor":0_usize,"patch":0_usize},"harness_sha256":"a".repeat(64_usize),
Expand Down
2 changes: 1 addition & 1 deletion crates/auctioneer-cli/tests/qualification_harness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ mod tests {
}).collect();
assert_eq!(cases.len(), 14);
let digest = "a".repeat(64);
let identity = json!({"auctioneer_commit":"a".repeat(40),"edgezero_pin":"598f0a2a490eb83dd31c06c024a0cefa8e049628",
let identity = json!({"auctioneer_commit":"a".repeat(40),"edgezero_pin":"a7d7fd0f2face027e3810ed67e80f6341fcf68b6",
"artifact_sha256":digest,"source_sha256":digest,"build_features":["spin","auctioneer-config-data/test-harness-override"],
"target":"wasm32-wasip2","runtime_version":{"major":3_i32,"minor":0_i32,"patch":0_i32},"harness_sha256":digest,
"fixtures_sha256":digest,"reference_data_sha256":digest,"baked_config_sha256":digest,"fixture_metadata_sha256":digest});
Expand Down
31 changes: 28 additions & 3 deletions crates/auctioneer-core/src/handlers/cookie_sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use crate::{
handlers::{
aux_egress::with_aux_egress_preserving_body,
egress_deadline::EgressDeadline,
sync_http::{self, BidderSyncStatus, SyncDebugStatus, SyncUrl},
sync_http::{self, BidderSyncStatus, ResponseBuildError, SyncDebugStatus, SyncUrl},
usersync_keys::{self, KeyringResult},
},
host_primitives::{clock_handle, rng_handle},
Expand Down Expand Up @@ -349,7 +349,7 @@ async fn respond_with_registry(
None,
sync_http::response_body_cap(),
)
.unwrap_or_else(|_| bad("response limit exceeded"));
.unwrap_or_else(response_build_error);
}
}
let Ok(filter_value) = request.filter_settings_value() else {
Expand Down Expand Up @@ -531,7 +531,7 @@ fn chosen_response(
debug_enabled.then_some(debug.as_slice()),
sync_http::response_body_cap(),
)
.unwrap_or_else(|_| bad("response limit exceeded"))
.unwrap_or_else(response_build_error)
}

pub(crate) fn push_selected_url(
Expand All @@ -550,6 +550,14 @@ pub(crate) fn push_selected_url(
Ok(())
}

fn response_build_error(error: ResponseBuildError) -> Response {
let status = match error {
ResponseBuildError::BodyLimit | ResponseBuildError::HeaderLimit => StatusCode::BAD_REQUEST,
ResponseBuildError::Serialization => StatusCode::INTERNAL_SERVER_ERROR,
};
sync_http::cookie_sync_error(status, "response limit exceeded")
}

fn bad(message: &'static str) -> Response {
sync_http::cookie_sync_error(StatusCode::BAD_REQUEST, message)
}
Expand Down Expand Up @@ -645,6 +653,23 @@ pub(super) mod tests {
use std::cell::Cell;
use std::future::ready;

#[test]
fn response_build_failures_distinguish_server_failure_from_resource_limits() {
for (error, status) in [
(ResponseBuildError::BodyLimit, StatusCode::BAD_REQUEST),
(ResponseBuildError::HeaderLimit, StatusCode::BAD_REQUEST),
(
ResponseBuildError::Serialization,
StatusCode::INTERNAL_SERVER_ERROR,
),
] {
let response = response_build_error(error);
assert_eq!(response.status(), status, "{error:?}");
assert_eq!(body(&response), b"response limit exceeded\n");
assert!(!response.headers().contains_key("set-cookie"));
}
}

pub(in crate::handlers) async fn wire_response(
request: &CookieSyncWire,
headers: &HeaderMap,
Expand Down
46 changes: 42 additions & 4 deletions crates/auctioneer-core/src/handlers/setuid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ use crate::{
host_primitives::clock_handle,
usersync::{
catalog::{Candidate, Catalog},
cookie::{CookieWriteOptions, HostCookie, MAX_SET_COOKIE_FIELD_BYTES, read_cookie},
cookie::{
CookieWriteError, CookieWriteOptions, HostCookie, MAX_SET_COOKIE_FIELD_BYTES,
read_cookie,
},
evict::{CookieWriteDecision, FamilyPriorities, prepare_cookie_transaction},
limits::CookieLimits,
wire::{ParsedQuery, parse_setuid_query},
Expand Down Expand Up @@ -257,7 +260,7 @@ async fn respond_with_registry(
.and_then(|value| value.to_str().ok()),
hard_cap_bytes: MAX_SET_COOKIE_FIELD_BYTES,
};
let Ok(write) = prepare_cookie_transaction(
let write = match prepare_cookie_transaction(
&cookie,
candidate.family,
&priorities,
Expand All @@ -266,12 +269,26 @@ async fn respond_with_registry(
&limits,
host.host_cookie.max_cookie_size_bytes,
&keys,
) else {
return bad("cookie resource limit exceeded");
) {
Ok(write) => write,
Err(error) => return cookie_write_error(error),
};
write_response(write, format, &candidate)
}

fn cookie_write_error(error: CookieWriteError) -> Response {
let status = match error {
CookieWriteError::Allocation => StatusCode::INTERNAL_SERVER_ERROR,
CookieWriteError::HardLimit
| CookieWriteError::InvalidAttributes
| CookieWriteError::ExpiryOverflow
| CookieWriteError::CodecLimit
| CookieWriteError::OptedOut
| CookieWriteError::InvalidPriorities => StatusCode::BAD_REQUEST,
};
sync_http::setuid_error(status, "cookie resource limit exceeded")
}

fn privacy_refusal(
parsed: &ParsedQuery,
candidate: &Candidate<'_>,
Expand Down Expand Up @@ -455,6 +472,27 @@ pub(super) mod tests {
response.body().as_bytes().unwrap()
}

#[test]
fn cookie_write_failures_distinguish_allocation_from_cookie_limits() {
for (error, status) in [
(
CookieWriteError::Allocation,
StatusCode::INTERNAL_SERVER_ERROR,
),
(CookieWriteError::HardLimit, StatusCode::BAD_REQUEST),
(CookieWriteError::InvalidAttributes, StatusCode::BAD_REQUEST),
(CookieWriteError::ExpiryOverflow, StatusCode::BAD_REQUEST),
(CookieWriteError::CodecLimit, StatusCode::BAD_REQUEST),
(CookieWriteError::OptedOut, StatusCode::BAD_REQUEST),
(CookieWriteError::InvalidPriorities, StatusCode::BAD_REQUEST),
] {
let response = cookie_write_error(error);
assert_eq!(response.status(), status, "{error:?}");
assert_eq!(body(&response), b"cookie resource limit exceeded");
assert!(!response.headers().contains_key("set-cookie"));
}
}

#[test]
fn unconfigured_service_refuses_before_registry_or_signing_keys() {
let host = HostConfig::default();
Expand Down
Loading
Loading