@ -4,7 +4,9 @@ use std::{
time ::{ Duration , SystemTime } ,
time ::{ Duration , SystemTime } ,
} ;
} ;
use crate ::{ utils , ConduitResult , Database , Error , Ruma } ;
use crate ::{
database ::media ::FileMeta , pdu ::PduBuilder , utils , ConduitResult , Database , Error , Ruma ,
} ;
use keys ::{ upload_signatures , upload_signing_keys } ;
use keys ::{ upload_signatures , upload_signing_keys } ;
use log ::warn ;
use log ::warn ;
@ -230,7 +232,7 @@ pub fn register_route(
Ok ( register ::Response {
Ok ( register ::Response {
access_token : Some ( token ) ,
access_token : Some ( token ) ,
user_id ,
user_id ,
device_id : Some ( device_id .into ( ) ),
device_id : Some ( device_id ),
}
}
. into ( ) )
. into ( ) )
}
}
@ -257,11 +259,22 @@ pub fn login_route(
if let ( login ::UserInfo ::MatrixId ( username ) , login ::LoginInfo ::Password { password } ) =
if let ( login ::UserInfo ::MatrixId ( username ) , login ::LoginInfo ::Password { password } ) =
( body . user . clone ( ) , body . login_info . clone ( ) )
( body . user . clone ( ) , body . login_info . clone ( ) )
{
{
let user_id = UserId ::parse_with_server_name ( username , db . globals . server_name ( ) ) . map_err ( | _ | Error ::BadRequest ( ErrorKind ::InvalidUsername , "Username is invalid." ) ) ? ;
let user_id = UserId ::parse_with_server_name ( username , db . globals . server_name ( ) )
let hash = db . users . password_hash ( & user_id ) ? . ok_or ( Error ::BadRequest ( ErrorKind ::Forbidden , "Wrong username or password." ) ) ? ;
. map_err ( | _ | Error ::BadRequest (
ErrorKind ::InvalidUsername ,
"Username is invalid."
) ) ? ;
let hash = db . users . password_hash ( & user_id ) ?
. ok_or ( Error ::BadRequest (
ErrorKind ::Forbidden ,
"Wrong username or password."
) ) ? ;
if hash . is_empty ( ) {
if hash . is_empty ( ) {
return Err ( Error ::BadRequest ( ErrorKind ::UserDeactivated , "The user has been deactivated" ) ) ;
return Err ( Error ::BadRequest (
ErrorKind ::UserDeactivated ,
"The user has been deactivated"
) ) ;
}
}
let hash_matches =
let hash_matches =
@ -298,7 +311,7 @@ pub fn login_route(
user_id ,
user_id ,
access_token : token ,
access_token : token ,
home_server : Some ( db . globals . server_name ( ) . to_owned ( ) ) ,
home_server : Some ( db . globals . server_name ( ) . to_owned ( ) ) ,
device_id : device_id . into ( ) ,
device_id ,
well_known : None ,
well_known : None ,
}
}
. into ( ) )
. into ( ) )
@ -464,13 +477,15 @@ pub fn deactivate_route(
} ;
} ;
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomMember ,
None ,
content : serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
Some ( sender_id . to_string ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( sender_id . to_string ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
}
}
@ -649,10 +664,11 @@ pub fn set_displayname_route(
for room_id in db . rooms . rooms_joined ( & sender_id ) {
for room_id in db . rooms . rooms_joined ( & sender_id ) {
let room_id = room_id ? ;
let room_id = room_id ? ;
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( ruma ::events ::room ::member ::MemberEventContent {
event_type : EventType ::RoomMember ,
content : serde_json ::to_value ( ruma ::events ::room ::member ::MemberEventContent {
displayname : body . displayname . clone ( ) ,
displayname : body . displayname . clone ( ) ,
.. serde_json ::from_value ::< Raw < _ > > (
.. serde_json ::from_value ::< Raw < _ > > (
db . rooms
db . rooms
@ -665,14 +681,15 @@ pub fn set_displayname_route(
. content
. content
. clone ( ) ,
. clone ( ) ,
)
)
. map_err ( | _ | Error ::bad_database ( "Database contains invalid PDU." ) ) ?
. expect ( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Database contains invalid PDU." ) ) ?
. map_err ( | _ | Error ::bad_database ( "Database contains invalid PDU." ) ) ?
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( sender_id . to_string ( ) ) ,
state_key : Some ( sender_id . to_string ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -745,10 +762,11 @@ pub fn set_avatar_url_route(
for room_id in db . rooms . rooms_joined ( & sender_id ) {
for room_id in db . rooms . rooms_joined ( & sender_id ) {
let room_id = room_id ? ;
let room_id = room_id ? ;
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( ruma ::events ::room ::member ::MemberEventContent {
event_type : EventType ::RoomMember ,
content : serde_json ::to_value ( ruma ::events ::room ::member ::MemberEventContent {
avatar_url : body . avatar_url . clone ( ) ,
avatar_url : body . avatar_url . clone ( ) ,
.. serde_json ::from_value ::< Raw < _ > > (
.. serde_json ::from_value ::< Raw < _ > > (
db . rooms
db . rooms
@ -761,14 +779,15 @@ pub fn set_avatar_url_route(
. content
. content
. clone ( ) ,
. clone ( ) ,
)
)
. map_err ( | _ | Error ::bad_database ( "Database contains invalid PDU." ) ) ?
. expect ( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Database contains invalid PDU." ) ) ?
. map_err ( | _ | Error ::bad_database ( "Database contains invalid PDU." ) ) ?
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( sender_id . to_string ( ) ) ,
state_key : Some ( sender_id . to_string ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1281,22 +1300,25 @@ pub fn create_room_route(
// 1. The room create event
// 1. The room create event
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomCreate ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( content ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomCreate ,
None ,
content : serde_json ::to_value ( content ) . expect ( "event is valid, we just created it" ) ,
Some ( "" . to_owned ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( "" . to_owned ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
// 2. Let the room creator join
// 2. Let the room creator join
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( member ::MemberEventContent {
event_type : EventType ::RoomMember ,
content : serde_json ::to_value ( member ::MemberEventContent {
membership : member ::MembershipState ::Join ,
membership : member ::MembershipState ::Join ,
displayname : db . users . displayname ( & sender_id ) ? ,
displayname : db . users . displayname ( & sender_id ) ? ,
avatar_url : db . users . avatar_url ( & sender_id ) ? ,
avatar_url : db . users . avatar_url ( & sender_id ) ? ,
@ -1304,9 +1326,10 @@ pub fn create_room_route(
third_party_invite : None ,
third_party_invite : None ,
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( sender_id . to_string ( ) ) ,
state_key : Some ( sender_id . to_string ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1346,23 +1369,26 @@ pub fn create_room_route(
. expect ( "event is valid, we just created it" )
. expect ( "event is valid, we just created it" )
} ;
} ;
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomPowerLevels ,
sender : sender_id . clone ( ) ,
power_levels_content ,
event_type : EventType ::RoomPowerLevels ,
None ,
content : power_levels_content ,
Some ( "" . to_owned ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( "" . to_owned ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
// 4. Events set by preset
// 4. Events set by preset
// 4.1 Join Rules
// 4.1 Join Rules
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomJoinRules ,
sender : sender_id . clone ( ) ,
match preset {
event_type : EventType ::RoomJoinRules ,
content : match preset {
create_room ::RoomPreset ::PublicChat = > serde_json ::to_value (
create_room ::RoomPreset ::PublicChat = > serde_json ::to_value (
join_rules ::JoinRulesEventContent ::new ( join_rules ::JoinRule ::Public ) ,
join_rules ::JoinRulesEventContent ::new ( join_rules ::JoinRule ::Public ) ,
)
)
@ -1373,45 +1399,52 @@ pub fn create_room_route(
) )
) )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
} ,
} ,
None ,
unsigned : None ,
Some ( "" . to_owned ( ) ) ,
state_key : Some ( "" . to_owned ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
// 4.2 History Visibility
// 4.2 History Visibility
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomHistoryVisibility ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( history_visibility ::HistoryVisibilityEventContent ::new (
event_type : EventType ::RoomHistoryVisibility ,
content : serde_json ::to_value ( history_visibility ::HistoryVisibilityEventContent ::new (
history_visibility ::HistoryVisibility ::Shared ,
history_visibility ::HistoryVisibility ::Shared ,
) )
) )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( "" . to_owned ( ) ) ,
state_key : Some ( "" . to_owned ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
// 4.3 Guest Access
// 4.3 Guest Access
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomGuestAccess ,
sender : sender_id . clone ( ) ,
match preset {
event_type : EventType ::RoomGuestAccess ,
create_room ::RoomPreset ::PublicChat = > serde_json ::to_value (
content : match preset {
guest_access ::GuestAccessEventContent ::new ( guest_access ::GuestAccess ::Forbidden ) ,
create_room ::RoomPreset ::PublicChat = > {
)
serde_json ::to_value ( guest_access ::GuestAccessEventContent ::new (
. expect ( "event is valid, we just created it" ) ,
guest_access ::GuestAccess ::Forbidden ,
) )
. expect ( "event is valid, we just created it" )
}
_ = > serde_json ::to_value ( guest_access ::GuestAccessEventContent ::new (
_ = > serde_json ::to_value ( guest_access ::GuestAccessEventContent ::new (
guest_access ::GuestAccess ::CanJoin ,
guest_access ::GuestAccess ::CanJoin ,
) )
) )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
} ,
} ,
None ,
unsigned : None ,
Some ( "" . to_owned ( ) ) ,
state_key : Some ( "" . to_owned ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1428,15 +1461,17 @@ pub fn create_room_route(
}
}
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
event_type . clone ( ) ,
sender : sender_id . clone ( ) ,
serde_json ::from_str ( content . get ( ) ) . map_err ( | _ | {
event_type : event_type . clone ( ) ,
content : serde_json ::from_str ( content . get ( ) ) . map_err ( | _ | {
Error ::BadRequest ( ErrorKind ::BadJson , "Invalid initial_state content." )
Error ::BadRequest ( ErrorKind ::BadJson , "Invalid initial_state content." )
} ) ? ,
} ) ? ,
None ,
unsigned : None ,
state_key . clone ( ) ,
state_key : state_key . clone ( ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
}
}
@ -1444,33 +1479,38 @@ pub fn create_room_route(
// 6. Events implied by name and topic
// 6. Events implied by name and topic
if let Some ( name ) = & body . name {
if let Some ( name ) = & body . name {
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomName ,
sender : sender_id . clone ( ) ,
serde_json ::to_value (
event_type : EventType ::RoomName ,
name ::NameEventContent ::new ( name . clone ( ) )
content : serde_json ::to_value (
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::InvalidParam , "Name is invalid." ) ) ? ,
name ::NameEventContent ::new ( name . clone ( ) ) . map_err ( | _ | {
Error ::BadRequest ( ErrorKind ::InvalidParam , "Name is invalid." )
} ) ? ,
)
)
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( "" . to_owned ( ) ) ,
state_key : Some ( "" . to_owned ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
}
}
if let Some ( topic ) = & body . topic {
if let Some ( topic ) = & body . topic {
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomTopic ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( topic ::TopicEventContent {
event_type : EventType ::RoomTopic ,
content : serde_json ::to_value ( topic ::TopicEventContent {
topic : topic . clone ( ) ,
topic : topic . clone ( ) ,
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( "" . to_owned ( ) ) ,
state_key : Some ( "" . to_owned ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
}
}
@ -1478,10 +1518,11 @@ pub fn create_room_route(
// 7. Events implied by invite (and TODO: invite_3pid)
// 7. Events implied by invite (and TODO: invite_3pid)
for user in & body . invite {
for user in & body . invite {
db . rooms . append_pdu (
db . rooms . append_pdu (
room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( member ::MemberEventContent {
event_type : EventType ::RoomMember ,
content : serde_json ::to_value ( member ::MemberEventContent {
membership : member ::MembershipState ::Invite ,
membership : member ::MembershipState ::Invite ,
displayname : db . users . displayname ( & user ) ? ,
displayname : db . users . displayname ( & user ) ? ,
avatar_url : db . users . avatar_url ( & user ) ? ,
avatar_url : db . users . avatar_url ( & user ) ? ,
@ -1489,9 +1530,10 @@ pub fn create_room_route(
third_party_invite : None ,
third_party_invite : None ,
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( user . to_string ( ) ) ,
state_key : Some ( user . to_string ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
}
}
@ -1539,16 +1581,18 @@ pub fn redact_event_route(
let sender_id = body . sender_id . as_ref ( ) . expect ( "user is authenticated" ) ;
let sender_id = body . sender_id . as_ref ( ) . expect ( "user is authenticated" ) ;
let event_id = db . rooms . append_pdu (
let event_id = db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomRedaction ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( redaction ::RedactionEventContent {
event_type : EventType ::RoomRedaction ,
content : serde_json ::to_value ( redaction ::RedactionEventContent {
reason : body . reason . clone ( ) ,
reason : body . reason . clone ( ) ,
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
None ,
state_key : None ,
Some ( body . event_id . clone ( ) ) ,
redacts : Some ( body . event_id . clone ( ) ) ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1634,13 +1678,15 @@ pub fn join_room_by_id_route(
} ;
} ;
db . rooms . append_pdu (
db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomMember ,
None ,
content : serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
Some ( sender_id . to_string ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( sender_id . to_string ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1702,23 +1748,24 @@ pub fn leave_room_route(
ErrorKind ::BadState ,
ErrorKind ::BadState ,
"Cannot leave a room you are not a member of." ,
"Cannot leave a room you are not a member of." ,
) ) ?
) ) ?
. content
. content ,
. clone ( ) ,
)
)
. map_err( | _ | Error ::bad_database ( "Invalid member event in database." ) ) ?
. expect( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid member event in database." ) ) ? ;
. map_err ( | _ | Error ::bad_database ( "Invalid member event in database." ) ) ? ;
event . membership = member ::MembershipState ::Leave ;
event . membership = member ::MembershipState ::Leave ;
db . rooms . append_pdu (
db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomMember ,
None ,
content : serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
Some ( sender_id . to_string ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( sender_id . to_string ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1746,8 +1793,7 @@ pub fn kick_user_route(
ErrorKind ::BadState ,
ErrorKind ::BadState ,
"Cannot kick member that's not in the room." ,
"Cannot kick member that's not in the room." ,
) ) ?
) ) ?
. content
. content ,
. clone ( ) ,
)
)
. expect ( "Raw::from_value always works" )
. expect ( "Raw::from_value always works" )
. deserialize ( )
. deserialize ( )
@ -1757,13 +1803,15 @@ pub fn kick_user_route(
// TODO: reason
// TODO: reason
db . rooms . append_pdu (
db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomMember ,
None ,
content : serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
Some ( body . user_id . to_string ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( body . user_id . to_string ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1837,7 +1885,7 @@ pub fn ban_user_route(
} ) ,
} ) ,
| event | {
| event | {
let mut event = serde_json ::from_value ::< Raw < member ::MemberEventContent > > (
let mut event = serde_json ::from_value ::< Raw < member ::MemberEventContent > > (
event . content .clone ( ) ,
event . content ,
)
)
. expect ( "Raw::from_value always works" )
. expect ( "Raw::from_value always works" )
. deserialize ( )
. deserialize ( )
@ -1848,13 +1896,15 @@ pub fn ban_user_route(
) ? ;
) ? ;
db . rooms . append_pdu (
db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomMember ,
None ,
content : serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
Some ( body . user_id . to_string ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( body . user_id . to_string ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1882,23 +1932,24 @@ pub fn unban_user_route(
ErrorKind ::BadState ,
ErrorKind ::BadState ,
"Cannot unban a user who is not banned." ,
"Cannot unban a user who is not banned." ,
) ) ?
) ) ?
. content
. content ,
. clone ( ) ,
)
)
. map_err( | _ | Error ::bad_database ( "Invalid member event in database." ) ) ?
. expect( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid member event in database." ) ) ? ;
. map_err ( | _ | Error ::bad_database ( "Invalid member event in database." ) ) ? ;
event . membership = ruma ::events ::room ::member ::MembershipState ::Leave ;
event . membership = ruma ::events ::room ::member ::MembershipState ::Leave ;
db . rooms . append_pdu (
db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
event_type : EventType ::RoomMember ,
None ,
content : serde_json ::to_value ( event ) . expect ( "event is valid, we just created it" ) ,
Some ( body . user_id . to_string ( ) ) ,
unsigned : None ,
None ,
state_key : Some ( body . user_id . to_string ( ) ) ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -1932,10 +1983,11 @@ pub fn invite_user_route(
if let invite_user ::InvitationRecipient ::UserId { user_id } = & body . recipient {
if let invite_user ::InvitationRecipient ::UserId { user_id } = & body . recipient {
db . rooms . append_pdu (
db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
EventType ::RoomMember ,
sender : sender_id . clone ( ) ,
serde_json ::to_value ( member ::MemberEventContent {
event_type : EventType ::RoomMember ,
content : serde_json ::to_value ( member ::MemberEventContent {
membership : member ::MembershipState ::Invite ,
membership : member ::MembershipState ::Invite ,
displayname : db . users . displayname ( & user_id ) ? ,
displayname : db . users . displayname ( & user_id ) ? ,
avatar_url : db . users . avatar_url ( & user_id ) ? ,
avatar_url : db . users . avatar_url ( & user_id ) ? ,
@ -1943,9 +1995,10 @@ pub fn invite_user_route(
third_party_invite : None ,
third_party_invite : None ,
} )
} )
. expect ( "event is valid, we just created it" ) ,
. expect ( "event is valid, we just created it" ) ,
None ,
unsigned : None ,
Some ( user_id . to_string ( ) ) ,
state_key : Some ( user_id . to_string ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -2049,6 +2102,8 @@ pub async fn get_public_rooms_filtered_route(
db : State < ' _ , Database > ,
db : State < ' _ , Database > ,
_body : Ruma < get_public_rooms_filtered ::Request > ,
_body : Ruma < get_public_rooms_filtered ::Request > ,
) -> ConduitResult < get_public_rooms_filtered ::Response > {
) -> ConduitResult < get_public_rooms_filtered ::Response > {
use ruma ::events ::room ;
let mut chunk = db
let mut chunk = db
. rooms
. rooms
. public_rooms ( )
. public_rooms ( )
@ -2060,63 +2115,98 @@ pub async fn get_public_rooms_filtered_route(
let chunk = directory ::PublicRoomsChunk {
let chunk = directory ::PublicRoomsChunk {
aliases : Vec ::new ( ) ,
aliases : Vec ::new ( ) ,
canonical_alias : state . get ( & ( EventType ::RoomCanonicalAlias , "" . to_owned ( ) ) ) . map_or ( Ok ::< _ , Error > ( None ) , | s | {
canonical_alias : state
. get ( & ( EventType ::RoomCanonicalAlias , "" . to_owned ( ) ) )
. map_or ( Ok ::< _ , Error > ( None ) , | s | {
Ok ( serde_json ::from_value ::<
Ok ( serde_json ::from_value ::<
Raw < ruma ::events ::room ::canonical_alias ::CanonicalAliasEventContent > ,
Raw < r oom::canonical_alias ::CanonicalAliasEventContent > ,
> ( s . content . clone ( ) )
> ( s . content . clone ( ) )
. map_err( | _ | Error ::bad_database ( "Invalid canonical alias event in database." ) ) ?
. expect( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid canonical alias event in database." ) ) ?
. map_err ( | _ | {
Error ::bad_database ( "Invalid canonical alias event in database." )
} ) ?
. alias )
. alias )
} ) ? ,
} ) ? ,
name : state . get ( & ( EventType ::RoomName , "" . to_owned ( ) ) ) . map_or ( Ok ::< _ , Error > ( None ) , | s | {
name : state . get ( & ( EventType ::RoomName , "" . to_owned ( ) ) ) . map_or (
Ok ( serde_json ::from_value ::< Raw < ruma ::events ::room ::name ::NameEventContent > > (
Ok ::< _ , Error > ( None ) ,
| s | {
Ok ( serde_json ::from_value ::< Raw < room ::name ::NameEventContent > > (
s . content . clone ( ) ,
s . content . clone ( ) ,
)
)
. map_err ( | _ | Error ::bad_database ( "Invalid room name event in database." ) ) ?
. expect ( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid room name event in database." ) ) ?
. map_err ( | _ | Error ::bad_database ( "Invalid room name event in database." ) ) ?
. name ( )
. name ( )
. map ( | n | n . to_owned ( ) ) )
. map ( | n | n . to_owned ( ) ) )
} ) ? ,
} ,
) ? ,
num_joined_members : ( db . rooms . room_members ( & room_id ) . count ( ) as u32 ) . into ( ) ,
num_joined_members : ( db . rooms . room_members ( & room_id ) . count ( ) as u32 ) . into ( ) ,
room_id ,
room_id ,
topic : state . get ( & ( EventType ::RoomTopic , "" . to_owned ( ) ) ) . map_or ( Ok ::< _ , Error > ( None ) , | s | {
topic : state . get ( & ( EventType ::RoomTopic , "" . to_owned ( ) ) ) . map_or (
Ok ( Some ( serde_json ::from_value ::<
Ok ::< _ , Error > ( None ) ,
Raw < ruma ::events ::room ::topic ::TopicEventContent > ,
| s | {
> ( s . content . clone ( ) )
Ok ( Some (
. map_err ( | _ | Error ::bad_database ( "Invalid room topic event in database." ) ) ?
serde_json ::from_value ::< Raw < room ::topic ::TopicEventContent > > (
s . content . clone ( ) ,
)
. expect ( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid room topic event in database." ) ) ?
. map_err ( | _ | {
. topic ) )
Error ::bad_database ( "Invalid room topic event in database." )
} ) ? ,
} ) ?
world_readable : state . get ( & ( EventType ::RoomHistoryVisibility , "" . to_owned ( ) ) ) . map_or ( Ok ::< _ , Error > ( false ) , | s | {
. topic ,
) )
} ,
) ? ,
world_readable : state
. get ( & ( EventType ::RoomHistoryVisibility , "" . to_owned ( ) ) )
. map_or ( Ok ::< _ , Error > ( false ) , | s | {
Ok ( serde_json ::from_value ::<
Ok ( serde_json ::from_value ::<
Raw < ruma ::events ::room ::history_visibility ::HistoryVisibilityEventContent > ,
Raw < r oom::history_visibility ::HistoryVisibilityEventContent > ,
> ( s . content . clone ( ) )
> ( s . content . clone ( ) )
. map_err ( | _ | Error ::bad_database ( "Invalid room history visibility event in database." ) ) ?
. expect( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid room history visibility event in database." ) ) ?
. map_err ( | _ | {
. history_visibility = = history_visibility ::HistoryVisibility ::WorldReadable )
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 | {
guest_can_join : state
Ok ( serde_json ::from_value ::<
. get ( & ( EventType ::RoomGuestAccess , "" . to_owned ( ) ) )
Raw < ruma ::events ::room ::guest_access ::GuestAccessEventContent > ,
. map_or ( Ok ::< _ , Error > ( false ) , | s | {
Ok (
serde_json ::from_value ::<
Raw < room ::guest_access ::GuestAccessEventContent > ,
> ( s . content . clone ( ) )
> ( s . content . clone ( ) )
. map_err ( | _ | Error ::bad_database ( "Invalid room guest access event in database." ) ) ?
. expect ( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid room guest access event in database." ) ) ?
. map_err ( | _ | {
. guest_access = = guest_access ::GuestAccess ::CanJoin )
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 | {
avatar_url : state . get ( & ( EventType ::RoomAvatar , "" . to_owned ( ) ) ) . map_or (
Ok ( Some ( serde_json ::from_value ::<
Ok ::< _ , Error > ( None ) ,
Raw < ruma ::events ::room ::avatar ::AvatarEventContent > ,
| s | {
> ( s . content . clone ( ) )
Ok ( Some (
. map_err ( | _ | Error ::bad_database ( "Invalid room avatar event in database." ) ) ?
serde_json ::from_value ::< Raw < room ::avatar ::AvatarEventContent > > (
s . content . clone ( ) ,
)
. expect ( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::bad_database ( "Invalid room avatar event in database." ) ) ?
. map_err ( | _ | {
. url ) )
Error ::bad_database ( "Invalid room avatar event in database." )
} ) ? ,
} ) ?
. url ,
) )
} ,
) ? ,
} ;
} ;
Ok ::< _ , Error > ( chunk )
Ok ::< _ , Error > ( chunk )
} )
} )
@ -2280,18 +2370,20 @@ pub fn create_message_event_route(
unsigned . insert ( "transaction_id" . to_owned ( ) , body . txn_id . clone ( ) . into ( ) ) ;
unsigned . insert ( "transaction_id" . to_owned ( ) , body . txn_id . clone ( ) . into ( ) ) ;
let event_id = db . rooms . append_pdu (
let event_id = db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
body . event_type . clone ( ) ,
sender : sender_id . clone ( ) ,
serde_json ::from_str (
event_type : body . event_type . clone ( ) ,
content : serde_json ::from_str (
body . json_body
body . json_body
. ok_or ( Error ::BadRequest ( ErrorKind ::BadJson , "Invalid JSON body." ) ) ?
. ok_or ( Error ::BadRequest ( ErrorKind ::BadJson , "Invalid JSON body." ) ) ?
. get ( ) ,
. get ( ) ,
)
)
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::BadJson , "Invalid JSON body." ) ) ? ,
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::BadJson , "Invalid JSON body." ) ) ? ,
Some ( unsigned ) ,
unsigned : Some ( unsigned ) ,
None ,
state_key : None ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -2320,7 +2412,7 @@ pub fn create_state_event_for_key_route(
let canonical_alias = serde_json ::from_value ::<
let canonical_alias = serde_json ::from_value ::<
Raw < canonical_alias ::CanonicalAliasEventContent > ,
Raw < canonical_alias ::CanonicalAliasEventContent > ,
> ( content . clone ( ) )
> ( content . clone ( ) )
. map_err( | _ | Error ::BadRequest ( ErrorKind ::InvalidParam , "Invalid canonical alias." ) ) ?
. expect( "from_value::<Raw<..>> can never fail" )
. deserialize ( )
. deserialize ( )
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::InvalidParam , "Invalid canonical alias." ) ) ? ;
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::InvalidParam , "Invalid canonical alias." ) ) ? ;
@ -2338,19 +2430,25 @@ pub fn create_state_event_for_key_route(
. filter ( | room | room = = & body . room_id ) // Make sure it's the right room
. filter ( | room | room = = & body . room_id ) // Make sure it's the right room
. is_none ( )
. is_none ( )
{
{
return Err ( Error ::BadRequest ( ErrorKind ::Forbidden , "You are only allowed to send canonical_alias events when it's aliases already exists" ) ) ;
return Err ( Error ::BadRequest (
ErrorKind ::Forbidden ,
" You are only allowed to send canonical_alias \
events when it ' s aliases already exists " ,
) ) ;
}
}
}
}
}
}
let event_id = db . rooms . append_pdu (
let event_id = db . rooms . append_pdu (
body . room_id . clone ( ) ,
PduBuilder {
sender_id . clone ( ) ,
room_id : body . room_id . clone ( ) ,
body . event_type . clone ( ) ,
sender : sender_id . clone ( ) ,
event_type : body . event_type . clone ( ) ,
content ,
content ,
None ,
unsigned : None ,
Some ( body . state_key . clone ( ) ) ,
state_key : Some ( body . state_key . clone ( ) ) ,
None ,
redacts : None ,
} ,
& db . globals ,
& db . globals ,
) ? ;
) ? ;
@ -2645,7 +2743,7 @@ pub async fn sync_events_route(
// Filter for possible heroes
// Filter for possible heroes
. filter_map ( | u | u )
. filter_map ( | u | u )
{
{
if heroes . contains ( & hero ) | | hero = = sender_id . to_string ( ) {
if heroes . contains ( & hero ) | | hero = = sender_id . as_str ( ) {
continue ;
continue ;
}
}
@ -2745,7 +2843,7 @@ pub async fn sync_events_route(
notification_count ,
notification_count ,
} ,
} ,
timeline : sync_events ::Timeline {
timeline : sync_events ::Timeline {
limited : false | | joined_since_last_sync,
limited : joined_since_last_sync,
prev_batch ,
prev_batch ,
events : room_events ,
events : room_events ,
} ,
} ,
@ -2933,7 +3031,7 @@ pub async fn sync_events_route(
{
{
// Hang a few seconds so requests are not spammed
// Hang a few seconds so requests are not spammed
// Stop hanging if new info arrives
// Stop hanging if new info arrives
let mut duration = body . timeout . unwrap_or ( Duration ::default ( ) ) ;
let mut duration = body . timeout . unwrap_or _default( ) ;
if duration . as_secs ( ) > 30 {
if duration . as_secs ( ) > 30 {
duration = Duration ::from_secs ( 30 ) ;
duration = Duration ::from_secs ( 30 ) ;
}
}
@ -3224,7 +3322,11 @@ pub fn get_content_route(
_server_name : String ,
_server_name : String ,
_media_id : String ,
_media_id : String ,
) -> ConduitResult < get_content ::Response > {
) -> ConduitResult < get_content ::Response > {
if let Some ( ( filename , content_type , file ) ) = db
if let Some ( FileMeta {
filename ,
content_type ,
file ,
} ) = db
. media
. media
. get ( format! ( "mxc://{}/{}" , body . server_name , body . media_id ) ) ?
. get ( format! ( "mxc://{}/{}" , body . server_name , body . media_id ) ) ?
{
{
@ -3252,7 +3354,9 @@ pub fn get_content_thumbnail_route(
_server_name : String ,
_server_name : String ,
_media_id : String ,
_media_id : String ,
) -> ConduitResult < get_content_thumbnail ::Response > {
) -> ConduitResult < get_content_thumbnail ::Response > {
if let Some ( ( _ , content_type , file ) ) = db . media . get_thumbnail (
if let Some ( FileMeta {
content_type , file , ..
} ) = db . media . get_thumbnail (
format! ( "mxc://{}/{}" , body . server_name , body . media_id ) ,
format! ( "mxc://{}/{}" , body . server_name , body . media_id ) ,
body . width
body . width
. try_into ( )
. try_into ( )