Skip to content

Commit 673d319

Browse files
authored
fix(ic-http-certification): fix handling of uncertified query parameters (#403)
1 parent cee84f5 commit 673d319

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

dfx.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"dfx": "0.23.0",
2+
"dfx": "0.24.3",
33
"output_env_file": ".env",
44
"version": 1,
55
"networks": {

packages/ic-http-certification/src/hash/request_hash.rs

+23-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn request_hash<'a>(
1818

1919
let filtered_query = request
2020
.get_query()?
21-
.map(|query| get_filtered_query(&query, request_certification));
21+
.and_then(|query| get_filtered_query(&query, request_certification));
2222
if let Some(query_hash) = filtered_query {
2323
filtered_headers.push((":ic-cert-query".into(), Value::String(query_hash)))
2424
}
@@ -59,7 +59,10 @@ fn get_filtered_headers(
5959
.collect()
6060
}
6161

62-
fn get_filtered_query(query: &str, request_certification: &DefaultRequestCertification) -> String {
62+
fn get_filtered_query(
63+
query: &str,
64+
request_certification: &DefaultRequestCertification,
65+
) -> Option<String> {
6366
let filtered_query_string = query
6467
.split('&')
6568
.filter(|query_fragment| {
@@ -77,10 +80,12 @@ fn get_filtered_query(query: &str, request_certification: &DefaultRequestCertifi
7780
})
7881
.unwrap_or(false)
7982
})
80-
.collect::<Vec<&str>>()
81-
.join("&");
83+
.collect::<Vec<_>>();
84+
if filtered_query_string.is_empty() {
85+
return None;
86+
}
8287

83-
filtered_query_string
88+
Some(filtered_query_string.join("&"))
8489
}
8590

8691
#[cfg(test)]
@@ -100,6 +105,19 @@ mod tests {
100105
assert_eq!(result, expected_hash.as_slice());
101106
}
102107

108+
#[test]
109+
fn request_hash_with_uncertified_query() {
110+
let request_certification = DefaultRequestCertification::new(vec!["host"], vec![]);
111+
let request = create_request("https://ic0.app?q=search");
112+
let expected_hash =
113+
hex::decode("10796453466efb3e333891136b8a5931269f77e40ead9d437fcee94a02fa833c")
114+
.unwrap();
115+
116+
let result = request_hash(&request, &request_certification).unwrap();
117+
118+
assert_eq!(result, expected_hash.as_slice());
119+
}
120+
103121
#[test]
104122
fn request_hash_with_query() {
105123
let request_certification =

packages/ic-http-certification/src/utils/response_header.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use serde::Serialize;
6464
/// (CERTIFICATE_EXPRESSION_HEADER_NAME.to_string(), cel_expr.to_string()),
6565
/// (
6666
/// CERTIFICATE_HEADER_NAME.to_string(),
67-
/// "certificate=:AQID:, tree=:2dn3gwJJaHR0cF9leHBygwJMZXhhbXBsZS5qc29ugwJDPCQ+gwJYIFJ2k+R/YYbgGPADidRdRwDurH06HXACVHlTIVrv1q4WgwJYIPZhxTCrVVSCuQKpNIckLOog7Q9SpfZ/0AODejmxpJ7egwJYIM7zUx3VibIaHEUF14Kx813l3Xlilg43Y5uGaABAA/i9ggNA:, expr_path=:2dn3g2lodHRwX2V4cHJsZXhhbXBsZS5qc29uYzwkPg==:, version=2".to_string(),
67+
/// "certificate=:AQID:, tree=:2dn3gwJJaHR0cF9leHBygwJMZXhhbXBsZS5qc29ugwJDPCQ+gwJYIFJ2k+R/YYbgGPADidRdRwDurH06HXACVHlTIVrv1q4WgwJYIGvHTtoVXrGXb4aD1BvH+OW26d0CtLUdA43LP+42N6xpgwJYIM7zUx3VibIaHEUF14Kx813l3Xlilg43Y5uGaABAA/i9ggNA:, expr_path=:2dn3g2lodHRwX2V4cHJsZXhhbXBsZS5qc29uYzwkPg==:, version=2".to_string(),
6868
/// ),
6969
/// ]
7070
/// );

0 commit comments

Comments
 (0)