improvement: log bad database errors automatically

This commit is contained in:
timokoesters 2020-06-11 10:03:08 +02:00
parent 2368a90584
commit 56d4742201
No known key found for this signature in database
GPG key ID: 24DA7517711A2BA4
13 changed files with 278 additions and 208 deletions

View file

@ -362,17 +362,14 @@ pub fn get_pushrules_all_route(
"PushRules event not found.",
))?
.deserialize()
.map_err(|_| Error::BadRequest(
ErrorKind::NotFound,
"PushRules event in db is invalid.",
))?
.map_err(|_| Error::BadRequest(ErrorKind::NotFound, "PushRules event in db is invalid."))?
{
Ok(get_pushrules_all::Response {
global: pushrules.content.global,
}
.into())
} else {
Err(Error::BadDatabase("Pushrules event has wrong content."))
Err(Error::bad_database("Pushrules event has wrong content."))
}
}
@ -507,15 +504,17 @@ pub fn set_displayname_route(
db.rooms
.room_state(&room_id)?
.get(&(EventType::RoomMember, user_id.to_string()))
.ok_or(Error::BadDatabase(
"Tried to send displayname update for user not in the room.",
))?
.ok_or_else(|| {
Error::bad_database(
"Tried to send displayname update for user not in the room.",
)
})?
.content
.clone(),
)
.map_err(|_| Error::BadDatabase("Database contains invalid PDU."))?
.map_err(|_| Error::bad_database("Database contains invalid PDU."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Database contains invalid PDU."))?
.map_err(|_| Error::bad_database("Database contains invalid PDU."))?
})
.expect("event is valid, we just created it"),
None,
@ -596,15 +595,17 @@ pub fn set_avatar_url_route(
db.rooms
.room_state(&room_id)?
.get(&(EventType::RoomMember, user_id.to_string()))
.ok_or(Error::BadDatabase(
"Tried to send avatar url update for user not in the room.",
))?
.ok_or_else(|| {
Error::bad_database(
"Tried to send avatar url update for user not in the room.",
)
})?
.content
.clone(),
)
.map_err(|_| Error::BadDatabase("Database contains invalid PDU."))?
.map_err(|_| Error::bad_database("Database contains invalid PDU."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Database contains invalid PDU."))?
.map_err(|_| Error::bad_database("Database contains invalid PDU."))?
})
.expect("event is valid, we just created it"),
None,
@ -744,9 +745,12 @@ pub fn get_keys_route(
for result in db.users.all_device_keys(&user_id.clone()) {
let (device_id, mut keys) = result?;
let metadata = db.users.get_device_metadata(user_id, &device_id)?.ok_or(
Error::BadDatabase("all_device_keys contained nonexistent device."),
)?;
let metadata = db
.users
.get_device_metadata(user_id, &device_id)?
.ok_or_else(|| {
Error::bad_database("all_device_keys contained nonexistent device.")
})?;
keys.unsigned = Some(keys::UnsignedDeviceInfo {
device_display_name: metadata.display_name,
@ -912,7 +916,7 @@ pub fn create_room_route(
let user_id = body.user_id.as_ref().expect("user is authenticated");
let room_id = RoomId::new(db.globals.server_name())
.map_err(|_| Error::BadDatabase("Server name is invalid."))?;
.map_err(|_| Error::bad_database("Server name is invalid."))?;
let alias = body
.room_alias_name
@ -1281,9 +1285,9 @@ pub fn join_room_by_id_route(
let mut event = serde_json::from_value::<EventJson<member::MemberEventContent>>(
pdu.content.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid member event in db."))?
.map_err(|_| Error::bad_database("Invalid member event in db."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in db."))?;
.map_err(|_| Error::bad_database("Invalid member event in db."))?;
event.membership = member::MembershipState::Join;
event.displayname = db.users.displayname(&user_id)?;
event.avatar_url = db.users.avatar_url(&user_id)?;
@ -1356,9 +1360,9 @@ pub fn leave_room_route(
.content
.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?
.map_err(|_| Error::bad_database("Invalid member event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?;
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
event.membership = member::MembershipState::Leave;
@ -1396,9 +1400,9 @@ pub fn kick_user_route(
.content
.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?
.map_err(|_| Error::bad_database("Invalid member event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?;
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
event.membership = ruma::events::room::member::MembershipState::Leave;
// TODO: reason
@ -1442,9 +1446,9 @@ pub fn ban_user_route(
let mut event = serde_json::from_value::<EventJson<member::MemberEventContent>>(
event.content.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?
.map_err(|_| Error::bad_database("Invalid member event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?;
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
event.membership = ruma::events::room::member::MembershipState::Ban;
Ok(event)
},
@ -1484,9 +1488,9 @@ pub fn unban_user_route(
.content
.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?
.map_err(|_| Error::bad_database("Invalid member event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?;
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
event.membership = ruma::events::room::member::MembershipState::Leave;
@ -1646,18 +1650,18 @@ pub async fn get_public_rooms_filtered_route(
Ok(serde_json::from_value::<
EventJson<ruma::events::room::canonical_alias::CanonicalAliasEventContent>,
>(s.content.clone())
.map_err(|_| Error::BadDatabase("Invalid canonical alias event in database."))?
.map_err(|_| Error::bad_database("Invalid canonical alias event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid canonical alias event in database."))?
.map_err(|_| Error::bad_database("Invalid canonical alias event in database."))?
.alias)
})?,
name: state.get(&(EventType::RoomName, "".to_owned())).map_or(Ok::<_, Error>(None), |s| {
Ok(serde_json::from_value::<EventJson<ruma::events::room::name::NameEventContent>>(
s.content.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid room name event in database."))?
.map_err(|_| Error::bad_database("Invalid room name event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid room name event in database."))?
.map_err(|_| Error::bad_database("Invalid room name event in database."))?
.name()
.map(|n| n.to_owned()))
})?,
@ -1667,36 +1671,36 @@ pub async fn get_public_rooms_filtered_route(
Ok(Some(serde_json::from_value::<
EventJson<ruma::events::room::topic::TopicEventContent>,
>(s.content.clone())
.map_err(|_| Error::BadDatabase("Invalid room topic event in database."))?
.map_err(|_| Error::bad_database("Invalid room topic event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid room topic event in database."))?
.map_err(|_| Error::bad_database("Invalid room topic event in database."))?
.topic))
})?,
world_readable: state.get(&(EventType::RoomHistoryVisibility, "".to_owned())).map_or(Ok::<_, Error>(false), |s| {
Ok(serde_json::from_value::<
EventJson<ruma::events::room::history_visibility::HistoryVisibilityEventContent>,
>(s.content.clone())
.map_err(|_| Error::BadDatabase("Invalid room history visibility event in database."))?
.map_err(|_| Error::bad_database("Invalid room history visibility event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid room history visibility event in database."))?
.map_err(|_| Error::bad_database("Invalid room history visibility event in database."))?
.history_visibility == history_visibility::HistoryVisibility::WorldReadable)
})?,
guest_can_join: state.get(&(EventType::RoomGuestAccess, "".to_owned())).map_or(Ok::<_, Error>(false), |s| {
Ok(serde_json::from_value::<
EventJson<ruma::events::room::guest_access::GuestAccessEventContent>,
>(s.content.clone())
.map_err(|_| Error::BadDatabase("Invalid room guest access event in database."))?
.map_err(|_| Error::bad_database("Invalid room guest access event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid room guest access event in database."))?
.map_err(|_| Error::bad_database("Invalid room guest access event in database."))?
.guest_access == guest_access::GuestAccess::CanJoin)
})?,
avatar_url: state.get(&(EventType::RoomAvatar, "".to_owned())).map_or( Ok::<_, Error>(None),|s| {
Ok(Some(serde_json::from_value::<
EventJson<ruma::events::room::avatar::AvatarEventContent>,
>(s.content.clone())
.map_err(|_| Error::BadDatabase("Invalid room avatar event in database."))?
.map_err(|_| Error::bad_database("Invalid room avatar event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid room avatar event in database."))?
.map_err(|_| Error::bad_database("Invalid room avatar event in database."))?
.url))
})?,
};
@ -1986,7 +1990,7 @@ pub fn get_state_events_for_key_route(
Ok(get_state_events_for_key::Response {
content: serde_json::value::to_raw_value(&event.content)
.map_err(|_| Error::BadDatabase("Invalid event content in database"))?,
.map_err(|_| Error::bad_database("Invalid event content in database"))?,
}
.into())
}
@ -2021,7 +2025,7 @@ pub fn get_state_events_for_empty_key_route(
Ok(get_state_events_for_empty_key::Response {
content: serde_json::value::to_raw_value(event)
.map_err(|_| Error::BadDatabase("Invalid event content in database"))?,
.map_err(|_| Error::bad_database("Invalid event content in database"))?,
}
.into())
}
@ -2064,9 +2068,9 @@ pub fn sync_route(
let content = serde_json::from_value::<
EventJson<ruma::events::room::member::MemberEventContent>,
>(pdu.content.clone())
.map_err(|_| Error::BadDatabase("Invalid PDU in database."))?
.map_err(|_| Error::bad_database("Invalid PDU in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid PDU in database."))?;
.map_err(|_| Error::bad_database("Invalid PDU in database."))?;
if content.membership == ruma::events::room::member::MembershipState::Join {
joined_since_last_sync = true;
// Both send_member_count and joined_since_last_sync are set. There's nothing more
@ -2099,9 +2103,9 @@ pub fn sync_route(
let content = serde_json::from_value::<
EventJson<ruma::events::room::member::MemberEventContent>,
>(pdu.content.clone())
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?
.map_err(|_| Error::bad_database("Invalid member event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?;
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
if let Some(state_key) = &pdu.state_key {
let current_content = serde_json::from_value::<
@ -2109,15 +2113,19 @@ pub fn sync_route(
>(
state
.get(&(EventType::RoomMember, state_key.clone()))
.ok_or(Error::BadDatabase(
"A user that joined once has no member event anymore.",
))?
.ok_or_else(|| {
Error::bad_database(
"A user that joined once has no member event anymore.",
)
})?
.content
.clone(),
)
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?
.map_err(|_| Error::bad_database("Invalid member event in database."))?
.deserialize()
.map_err(|_| Error::BadDatabase("Invalid member event in database."))?;
.map_err(|_| {
Error::bad_database("Invalid member event in database.")
})?;
// The membership was and still is invite or join
if matches!(
@ -2192,7 +2200,7 @@ pub fn sync_route(
Ok(Some(
db.rooms
.get_pdu_count(&e.event_id)?
.ok_or(Error::BadDatabase("Can't find count from event in db."))?
.ok_or_else(|| Error::bad_database("Can't find count from event in db."))?
.to_string(),
))
})?;
@ -2355,7 +2363,7 @@ pub fn sync_route(
.map(|edu| {
let mut edu = edu?
.deserialize()
.map_err(|_| Error::BadDatabase("EDU in database is invalid."))?;
.map_err(|_| Error::bad_database("EDU in database is invalid."))?;
if let Some(timestamp) = edu.content.last_active_ago {
let last_active_ago =
js_int::UInt::try_from(utils::millis_since_unix_epoch())
@ -2444,7 +2452,7 @@ pub fn get_context_route(
Ok::<_, Error>(Some(
db.rooms
.get_pdu_count(&e.event_id)?
.ok_or(Error::BadDatabase("Can't find count from event in db."))?
.ok_or_else(|| Error::bad_database("Can't find count from event in db."))?
.to_string(),
))
})?;
@ -2470,7 +2478,7 @@ pub fn get_context_route(
Ok::<_, Error>(Some(
db.rooms
.get_pdu_count(&e.event_id)?
.ok_or(Error::BadDatabase("Can't find count from event in db."))?
.ok_or_else(|| Error::bad_database("Can't find count from event in db."))?
.to_string(),
))
})?;
@ -2534,7 +2542,7 @@ pub fn get_message_events_route(
Ok(Some(
db.rooms
.get_pdu_count(&e.event_id)?
.ok_or(Error::BadDatabase("Can't find count from event in db."))?
.ok_or_else(|| Error::bad_database("Can't find count from event in db."))?
.to_string(),
))
})?;
@ -2569,7 +2577,7 @@ pub fn get_message_events_route(
Ok(Some(
db.rooms
.get_pdu_count(&e.event_id)?
.ok_or(Error::BadDatabase("Can't find count from event in db."))?
.ok_or_else(|| Error::bad_database("Can't find count from event in db."))?
.to_string(),
))
})?;