forked from mirrors/relay
Require publicKey, check actor's public key for agreement
This commit is contained in:
parent
a7b4a81197
commit
489a5ff023
4 changed files with 10 additions and 16 deletions
|
@ -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)]
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
16
src/inbox.rs
16
src/inbox.rs
|
@ -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
|
||||||
|
|
|
@ -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) => (),
|
||||||
|
|
Loading…
Reference in a new issue