forked from mirrors/relay
Handle errors a bit better
This commit is contained in:
parent
6d34077010
commit
27a9030be1
3 changed files with 35 additions and 9 deletions
|
@ -35,7 +35,7 @@ pub struct AnyExistingObject {
|
||||||
ext: HashMap<String, serde_json::Value>,
|
ext: HashMap<String, serde_json::Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
|
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, serde::Deserialize, serde::Serialize)]
|
||||||
#[serde(rename_all = "PascalCase")]
|
#[serde(rename_all = "PascalCase")]
|
||||||
pub enum ValidTypes {
|
pub enum ValidTypes {
|
||||||
Announce,
|
Announce,
|
||||||
|
|
19
src/error.rs
19
src/error.rs
|
@ -35,6 +35,9 @@ pub enum MyError {
|
||||||
#[error("Couldn't decode base64")]
|
#[error("Couldn't decode base64")]
|
||||||
Base64(#[from] base64::DecodeError),
|
Base64(#[from] base64::DecodeError),
|
||||||
|
|
||||||
|
#[error("Actor ({0}), or Actor's server, is not subscribed")]
|
||||||
|
NotSubscribed(String),
|
||||||
|
|
||||||
#[error("Actor is blocked, {0}")]
|
#[error("Actor is blocked, {0}")]
|
||||||
Blocked(String),
|
Blocked(String),
|
||||||
|
|
||||||
|
@ -77,13 +80,23 @@ pub enum MyError {
|
||||||
|
|
||||||
impl ResponseError for MyError {
|
impl ResponseError for MyError {
|
||||||
fn status_code(&self) -> StatusCode {
|
fn status_code(&self) -> StatusCode {
|
||||||
StatusCode::INTERNAL_SERVER_ERROR
|
match self {
|
||||||
|
MyError::Blocked(_)
|
||||||
|
| MyError::Whitelist(_)
|
||||||
|
| MyError::WrongActor(_)
|
||||||
|
| MyError::BadActor(_, _) => StatusCode::FORBIDDEN,
|
||||||
|
MyError::Duplicate => StatusCode::ACCEPTED,
|
||||||
|
MyError::Kind(_) => StatusCode::BAD_REQUEST,
|
||||||
|
_ => StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn error_response(&self) -> HttpResponse {
|
fn error_response(&self) -> HttpResponse {
|
||||||
HttpResponse::InternalServerError()
|
HttpResponse::build(self.status_code())
|
||||||
.header("Content-Type", "application/activity+json")
|
.header("Content-Type", "application/activity+json")
|
||||||
.json(serde_json::json!({}))
|
.json(serde_json::json!({
|
||||||
|
"error": self.to_string(),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
23
src/inbox.rs
23
src/inbox.rs
|
@ -14,6 +14,13 @@ use activitystreams::{
|
||||||
use actix_web::{web, HttpResponse};
|
use actix_web::{web, HttpResponse};
|
||||||
use futures::join;
|
use futures::join;
|
||||||
use http_signature_normalization_actix::middleware::SignatureVerified;
|
use http_signature_normalization_actix::middleware::SignatureVerified;
|
||||||
|
use log::error;
|
||||||
|
|
||||||
|
fn public() -> XsdAnyUri {
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
.parse()
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn inbox(
|
pub async fn inbox(
|
||||||
db: web::Data<Db>,
|
db: web::Data<Db>,
|
||||||
|
@ -26,8 +33,11 @@ pub async fn inbox(
|
||||||
|
|
||||||
let actor = client.fetch_actor(&input.actor).await?;
|
let actor = client.fetch_actor(&input.actor).await?;
|
||||||
|
|
||||||
let (is_blocked, is_whitelisted) =
|
let (is_blocked, is_whitelisted, is_listener) = join!(
|
||||||
join!(state.is_blocked(&actor.id), state.is_whitelisted(&actor.id),);
|
state.is_blocked(&actor.id),
|
||||||
|
state.is_whitelisted(&actor.id),
|
||||||
|
state.is_listener(&actor.id)
|
||||||
|
);
|
||||||
|
|
||||||
if is_blocked {
|
if is_blocked {
|
||||||
return Err(MyError::Blocked(actor.id.to_string()));
|
return Err(MyError::Blocked(actor.id.to_string()));
|
||||||
|
@ -37,8 +47,12 @@ pub async fn inbox(
|
||||||
return Err(MyError::Whitelist(actor.id.to_string()));
|
return Err(MyError::Whitelist(actor.id.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if input.kind != ValidTypes::Follow && !is_listener {
|
||||||
|
return Err(MyError::NotSubscribed(actor.id.to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
if actor.public_key.id.as_str() != verified.key_id() {
|
if actor.public_key.id.as_str() != verified.key_id() {
|
||||||
log::error!("Bad actor, more info: {:?}", input);
|
error!("Bad actor, more info: {:?}", input);
|
||||||
return Err(MyError::BadActor(
|
return Err(MyError::BadActor(
|
||||||
actor.public_key.id.to_string(),
|
actor.public_key.id.to_string(),
|
||||||
verified.key_id().to_owned(),
|
verified.key_id().to_owned(),
|
||||||
|
@ -72,8 +86,7 @@ async fn handle_undo(
|
||||||
|
|
||||||
let my_id: XsdAnyUri = state.generate_url(UrlKind::Actor).parse()?;
|
let my_id: XsdAnyUri = state.generate_url(UrlKind::Actor).parse()?;
|
||||||
|
|
||||||
if !input.object.child_object_is(&my_id) {
|
if !input.object.child_object_is(&my_id) && !input.object.child_object_is(&public()) {
|
||||||
log::error!("Wrong actor, more info: {:?}", input);
|
|
||||||
return Err(MyError::WrongActor(input.object.id().to_string()));
|
return Err(MyError::WrongActor(input.object.id().to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue