Require publicKey, check actor's public key for agreement

This commit is contained in:
asonix 2020-03-17 15:52:26 -05:00
parent a7b4a81197
commit 489a5ff023
4 changed files with 10 additions and 16 deletions

View file

@ -82,8 +82,7 @@ pub struct AcceptedActors {
pub endpoints: Endpoints, pub endpoints: Endpoints,
#[serde(skip_serializing_if = "Option::is_none")] pub public_key: PublicKey,
pub public_key: Option<PublicKey>,
} }
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]

View file

@ -59,9 +59,6 @@ pub enum MyError {
#[error("URI is missing domain field")] #[error("URI is missing domain field")]
Domain, Domain,
#[error("Public key is missing")]
MissingKey,
} }
impl ResponseError for MyError { impl ResponseError for MyError {

View file

@ -27,7 +27,14 @@ pub async fn inbox(
) -> Result<HttpResponse, MyError> { ) -> Result<HttpResponse, MyError> {
let input = input.into_inner(); let input = input.into_inner();
if input.actor.as_str() != verified.key_id() { let actor = fetch_actor(
state.clone().into_inner(),
client.clone().into_inner(),
&input.actor,
)
.await?;
if actor.public_key.id.as_str() != verified.key_id() {
error!( error!(
"Request payload and requestor disagree on actor, {} != {}", "Request payload and requestor disagree on actor, {} != {}",
input.actor, input.actor,
@ -36,13 +43,6 @@ pub async fn inbox(
return Err(MyError::BadActor); return Err(MyError::BadActor);
} }
let actor = fetch_actor(
state.clone().into_inner(),
client.clone().into_inner(),
&input.actor,
)
.await?;
match input.kind { match input.kind {
ValidTypes::Announce | ValidTypes::Create => { ValidTypes::Announce | ValidTypes::Create => {
handle_relay(state, client, input, actor).await handle_relay(state, client, input, actor).await

View file

@ -50,10 +50,8 @@ async fn verify(
debug!("Fetching actor"); debug!("Fetching actor");
let actor = fetch_actor(state, client, &key_id.parse()?).await?; let actor = fetch_actor(state, client, &key_id.parse()?).await?;
let public_key = actor.public_key.ok_or(MyError::MissingKey)?;
debug!("Parsing public key"); debug!("Parsing public key");
let public_key = RSAPublicKey::from_pem_pkcs8(&public_key.public_key_pem)?; let public_key = RSAPublicKey::from_pem_pkcs8(&actor.public_key.public_key_pem)?;
match algorithm { match algorithm {
Some(Algorithm::Hs2019) => (), Some(Algorithm::Hs2019) => (),