Support (created) and (expires) pseudoheaders in HTTP signatures

This commit is contained in:
silverpill 2022-09-12 20:08:13 +00:00
parent 43eda37322
commit 458ca3fc3d

View file

@ -82,26 +82,32 @@ fn parse_http_signature(
.ok_or(VerificationError::ParseError("signature is missing"))? .ok_or(VerificationError::ParseError("signature is missing"))?
.to_owned(); .to_owned();
let mut message = format!( let mut message_parts = vec![];
"(request-target): {} {}",
request_method.as_str().to_lowercase(),
request_uri,
);
for header in headers_parameter.split(' ') { for header in headers_parameter.split(' ') {
if header == "(request-target)" { let message_part = if header == "(request-target)" {
continue; format!(
} "(request-target): {} {}",
let header_value = request_headers.get(header) request_method.as_str().to_lowercase(),
.ok_or(VerificationError::HeaderError("missing header"))? request_uri,
.to_str() )
.map_err(|_| VerificationError::HeaderError("invalid header value"))?; } else if header == "(created)" {
let message_part = format!( let created = signature_parameters.get("created")
"\n{}: {}", .ok_or(VerificationError::ParseError("created parameter is missing"))?;
header, format!("(created): {}", created)
header_value, } else if header == "(expires)" {
); let expires = signature_parameters.get("expires")
message.push_str(&message_part); .ok_or(VerificationError::ParseError("expires parameter is missing"))?;
} format!("(expires): {}", expires)
} else {
let header_value = request_headers.get(header)
.ok_or(VerificationError::HeaderError("missing header"))?
.to_str()
.map_err(|_| VerificationError::HeaderError("invalid header value"))?;
format!("{}: {}", header, header_value)
};
message_parts.push(message_part);
};
let message = message_parts.join("\n");
let signature_data = SignatureData { let signature_data = SignatureData {
key_id, key_id,