Skip to content
Snippets Groups Projects
membership.rs 34.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jonas Platte's avatar
    Jonas Platte committed
            let origin: Box<ServerName> = serde_json::from_value(
    
                serde_json::to_value(value.get("origin").ok_or(Error::BadRequest(
                    ErrorKind::InvalidParam,
                    "Event needs an origin field.",
                ))?)
                .expect("CanonicalJson is valid json value"),
            )
            .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Origin field is invalid."))?;
    
    
            let pdu_id = server_server::handle_incoming_pdu(
                &origin,
                &event_id,
    
                &pub_key_map,
            )
            .await
            .map_err(|_| {
                Error::BadRequest(
                    ErrorKind::InvalidParam,
                    "Error while handling incoming PDU.",
                )
            })?
            .ok_or(Error::BadRequest(
                ErrorKind::InvalidParam,
                "Could not accept incoming PDU as timeline event.",
            ))?;
    
                .rooms
                .room_servers(room_id)
                .filter_map(|r| r.ok())
    
                .filter(|server| &**server != db.globals.server_name());
    
            db.sending.send_pdu(servers, &pdu_id)?;
    
    Timo Kösters's avatar
    Timo Kösters committed
        let mutex_state = Arc::clone(
    
    Timo Kösters's avatar
    Timo Kösters committed
                .roomid_mutex_state
    
    Jonas Platte's avatar
    Jonas Platte committed
                .entry(room_id.to_owned())
    
    Timo Kösters's avatar
    Timo Kösters committed
        let state_lock = mutex_state.lock().await;
    
        db.rooms.build_and_append_pdu(
            PduBuilder {
                event_type: EventType::RoomMember,
    
    Jonas Platte's avatar
    Jonas Platte committed
                content: to_raw_value(&RoomMemberEventContent {
                    membership: MembershipState::Invite,
    
                    displayname: db.users.displayname(user_id)?,
                    avatar_url: db.users.avatar_url(user_id)?,
    
                    is_direct: Some(is_direct),
    
                    third_party_invite: None,
    
                    blurhash: db.users.blurhash(user_id)?,
    
                    join_authorized_via_users_server: None,
    
                })
                .expect("event is valid, we just created it"),
                unsigned: None,
                state_key: Some(user_id.to_string()),
                redacts: None,
            },
    
    Timo Kösters's avatar
    Timo Kösters committed
            &state_lock,
    
    Timo Kösters's avatar
    Timo Kösters committed
        drop(state_lock);