Add PduCount value to userroomid/roomuserid_joined; move PduCount to argument for update_membership.
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -22,6 +22,7 @@ use ruma::{
|
|||||||
use tuwunel_core::{
|
use tuwunel_core::{
|
||||||
Err, Result, debug, debug_info, debug_warn, err, extract_variant, info,
|
Err, Result, debug, debug_info, debug_warn, err, extract_variant, info,
|
||||||
matrix::{
|
matrix::{
|
||||||
|
PduCount,
|
||||||
event::{Event, gen_event_id},
|
event::{Event, gen_event_id},
|
||||||
pdu::{PduBuilder, PduEvent},
|
pdu::{PduBuilder, PduEvent},
|
||||||
},
|
},
|
||||||
@@ -276,6 +277,7 @@ async fn knock_room_helper_local(
|
|||||||
.map_err(|e| err!(BadServerResponse("Invalid knock event PDU: {e:?}")))?;
|
.map_err(|e| err!(BadServerResponse("Invalid knock event PDU: {e:?}")))?;
|
||||||
|
|
||||||
info!("Updating membership locally to knock state with provided stripped state events");
|
info!("Updating membership locally to knock state with provided stripped state events");
|
||||||
|
let count = services.globals.next_count();
|
||||||
services
|
services
|
||||||
.state_cache
|
.state_cache
|
||||||
.update_membership(
|
.update_membership(
|
||||||
@@ -294,6 +296,7 @@ async fn knock_room_helper_local(
|
|||||||
),
|
),
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
@@ -490,6 +493,7 @@ async fn knock_room_helper_remote(
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
info!("Updating membership locally to knock state with provided stripped state events");
|
info!("Updating membership locally to knock state with provided stripped state events");
|
||||||
|
let count = services.globals.next_count();
|
||||||
services
|
services
|
||||||
.state_cache
|
.state_cache
|
||||||
.update_membership(
|
.update_membership(
|
||||||
@@ -508,6 +512,7 @@ async fn knock_room_helper_remote(
|
|||||||
),
|
),
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use ruma::{
|
|||||||
};
|
};
|
||||||
use tuwunel_core::{
|
use tuwunel_core::{
|
||||||
Err, Error, Result, err, extract_variant,
|
Err, Error, Result, err, extract_variant,
|
||||||
matrix::{Event, PduEvent, event::gen_event_id},
|
matrix::{Event, PduCount, PduEvent, event::gen_event_id},
|
||||||
utils,
|
utils,
|
||||||
utils::hash::sha256,
|
utils::hash::sha256,
|
||||||
warn,
|
warn,
|
||||||
@@ -143,6 +143,7 @@ pub(crate) async fn create_invite_route(
|
|||||||
.server_in_room(services.globals.server_name(), &body.room_id)
|
.server_in_room(services.globals.server_name(), &body.room_id)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
|
let count = services.globals.next_count();
|
||||||
services
|
services
|
||||||
.state_cache
|
.state_cache
|
||||||
.update_membership(
|
.update_membership(
|
||||||
@@ -153,8 +154,10 @@ pub(crate) async fn create_invite_route(
|
|||||||
Some(invite_state),
|
Some(invite_state),
|
||||||
body.via.clone(),
|
body.via.clone(),
|
||||||
true,
|
true,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
drop(count);
|
||||||
|
|
||||||
for appservice in services.appservice.read().await.values() {
|
for appservice in services.appservice.read().await.values() {
|
||||||
if appservice.is_user_match(&invited_user) {
|
if appservice.is_user_match(&invited_user) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ use ruma::{
|
|||||||
};
|
};
|
||||||
use tuwunel_core::{
|
use tuwunel_core::{
|
||||||
Err, Result, debug_info, debug_warn, err, implement,
|
Err, Result, debug_info, debug_warn, err, implement,
|
||||||
|
matrix::PduCount,
|
||||||
pdu::PduBuilder,
|
pdu::PduBuilder,
|
||||||
utils::{self, FutureBoolExt, future::ReadyEqExt},
|
utils::{self, FutureBoolExt, future::ReadyEqExt},
|
||||||
warn,
|
warn,
|
||||||
@@ -51,6 +52,7 @@ pub async fn leave(
|
|||||||
if is_banned.or(is_disabled).await {
|
if is_banned.or(is_disabled).await {
|
||||||
// the room is banned/disabled, the room must be rejected locally since we
|
// the room is banned/disabled, the room must be rejected locally since we
|
||||||
// cant/dont want to federate with this server
|
// cant/dont want to federate with this server
|
||||||
|
let count = self.services.globals.next_count();
|
||||||
self.services
|
self.services
|
||||||
.state_cache
|
.state_cache
|
||||||
.update_membership(
|
.update_membership(
|
||||||
@@ -61,6 +63,7 @@ pub async fn leave(
|
|||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
true,
|
true,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
@@ -104,6 +107,7 @@ pub async fn leave(
|
|||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
// We always drop the invite, we can't rely on other servers
|
// We always drop the invite, we can't rely on other servers
|
||||||
|
let count = self.services.globals.next_count();
|
||||||
self.services
|
self.services
|
||||||
.state_cache
|
.state_cache
|
||||||
.update_membership(
|
.update_membership(
|
||||||
@@ -114,6 +118,7 @@ pub async fn leave(
|
|||||||
last_state,
|
last_state,
|
||||||
None,
|
None,
|
||||||
true,
|
true,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
} else {
|
} else {
|
||||||
@@ -131,6 +136,7 @@ pub async fn leave(
|
|||||||
"Trying to leave a room you are not a member of, marking room as left locally."
|
"Trying to leave a room you are not a member of, marking room as left locally."
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let count = self.services.globals.next_count();
|
||||||
return self
|
return self
|
||||||
.services
|
.services
|
||||||
.state_cache
|
.state_cache
|
||||||
@@ -142,6 +148,7 @@ pub async fn leave(
|
|||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
true,
|
true,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ use ruma::{
|
|||||||
};
|
};
|
||||||
use tuwunel_core::{
|
use tuwunel_core::{
|
||||||
Err, Result, debug, debug_info, debug_warn, error, info,
|
Err, Result, debug, debug_info, debug_warn, error, info,
|
||||||
|
matrix::PduCount,
|
||||||
result::NotFound,
|
result::NotFound,
|
||||||
utils::{
|
utils::{
|
||||||
IterStream, ReadyExt,
|
IterStream, ReadyExt,
|
||||||
@@ -450,16 +451,18 @@ async fn retroactively_fix_bad_data_from_roomuserid_joined(services: &Services)
|
|||||||
|
|
||||||
for user_id in &joined_members {
|
for user_id in &joined_members {
|
||||||
debug_info!("User is joined, marking as joined");
|
debug_info!("User is joined, marking as joined");
|
||||||
|
let count = services.globals.next_count();
|
||||||
services
|
services
|
||||||
.state_cache
|
.state_cache
|
||||||
.mark_as_joined(user_id, room_id);
|
.mark_as_joined(user_id, room_id, PduCount::Normal(*count));
|
||||||
}
|
}
|
||||||
|
|
||||||
for user_id in &non_joined_members {
|
for user_id in &non_joined_members {
|
||||||
debug_info!("User is left or banned, marking as left");
|
debug_info!("User is left or banned, marking as left");
|
||||||
|
let count = services.globals.next_count();
|
||||||
services
|
services
|
||||||
.state_cache
|
.state_cache
|
||||||
.mark_as_left(user_id, room_id);
|
.mark_as_left(user_id, room_id, PduCount::Normal(*count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use tuwunel_core::{
|
|||||||
Event, PduEvent, Result, err,
|
Event, PduEvent, Result, err,
|
||||||
error::inspect_debug_log,
|
error::inspect_debug_log,
|
||||||
implement,
|
implement,
|
||||||
matrix::{RoomVersionRules, StateKey, TypeStateKey, room_version},
|
matrix::{PduCount, RoomVersionRules, StateKey, TypeStateKey, room_version},
|
||||||
result::{AndThenRef, FlatOk},
|
result::{AndThenRef, FlatOk},
|
||||||
state_res::{StateMap, auth_types_for_event},
|
state_res::{StateMap, auth_types_for_event},
|
||||||
trace,
|
trace,
|
||||||
@@ -126,6 +126,7 @@ pub async fn force_state(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let count = self.services.globals.next_count();
|
||||||
self.services
|
self.services
|
||||||
.state_cache
|
.state_cache
|
||||||
.update_membership(
|
.update_membership(
|
||||||
@@ -136,6 +137,7 @@ pub async fn force_state(
|
|||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
|
PduCount::Normal(*count),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -371,6 +371,17 @@ pub async fn get_left_count(&self, room_id: &RoomId, user_id: &UserId) -> Result
|
|||||||
.deserialized()
|
.deserialized()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[implement(Service)]
|
||||||
|
#[tracing::instrument(skip(self), level = "trace")]
|
||||||
|
pub async fn get_joined_count(&self, room_id: &RoomId, user_id: &UserId) -> Result<u64> {
|
||||||
|
let key = (room_id, user_id);
|
||||||
|
self.db
|
||||||
|
.roomuserid_joined
|
||||||
|
.qry(&key)
|
||||||
|
.await
|
||||||
|
.deserialized()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an iterator over all rooms this user joined.
|
/// Returns an iterator over all rooms this user joined.
|
||||||
#[implement(Service)]
|
#[implement(Service)]
|
||||||
#[tracing::instrument(skip(self), level = "debug")]
|
#[tracing::instrument(skip(self), level = "debug")]
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use ruma::{
|
|||||||
},
|
},
|
||||||
serde::Raw,
|
serde::Raw,
|
||||||
};
|
};
|
||||||
use tuwunel_core::{Result, implement, is_not_empty, utils::ReadyExt, warn};
|
use tuwunel_core::{Result, implement, is_not_empty, matrix::PduCount, utils::ReadyExt, warn};
|
||||||
use tuwunel_database::{Json, serialize_key};
|
use tuwunel_database::{Json, serialize_key};
|
||||||
|
|
||||||
/// Update current membership data.
|
/// Update current membership data.
|
||||||
@@ -26,6 +26,7 @@ use tuwunel_database::{Json, serialize_key};
|
|||||||
%room_id,
|
%room_id,
|
||||||
%user_id,
|
%user_id,
|
||||||
%sender,
|
%sender,
|
||||||
|
%count,
|
||||||
?membership_event,
|
?membership_event,
|
||||||
),
|
),
|
||||||
)]
|
)]
|
||||||
@@ -39,6 +40,7 @@ pub async fn update_membership(
|
|||||||
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
||||||
invite_via: Option<Vec<OwnedServerName>>,
|
invite_via: Option<Vec<OwnedServerName>>,
|
||||||
update_joined_count: bool,
|
update_joined_count: bool,
|
||||||
|
count: PduCount,
|
||||||
) -> Result {
|
) -> Result {
|
||||||
let membership = membership_event.membership;
|
let membership = membership_event.membership;
|
||||||
|
|
||||||
@@ -58,11 +60,6 @@ pub async fn update_membership(
|
|||||||
|
|
||||||
match &membership {
|
match &membership {
|
||||||
| MembershipState::Join => {
|
| MembershipState::Join => {
|
||||||
// Increment the counter for a unique value and hold the guard even though the
|
|
||||||
// value is not used. This will allow proper sync to clients similar to the
|
|
||||||
// other membership state changes.
|
|
||||||
let _next_count = self.services.globals.next_count();
|
|
||||||
|
|
||||||
// Check if the user never joined this room
|
// Check if the user never joined this room
|
||||||
if !self.once_joined(user_id, room_id).await {
|
if !self.once_joined(user_id, room_id).await {
|
||||||
// Add the user ID to the join list then
|
// Add the user ID to the join list then
|
||||||
@@ -128,7 +125,7 @@ pub async fn update_membership(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.mark_as_joined(user_id, room_id);
|
self.mark_as_joined(user_id, room_id, count);
|
||||||
},
|
},
|
||||||
| MembershipState::Invite => {
|
| MembershipState::Invite => {
|
||||||
// We want to know if the sender is ignored by the receiver
|
// We want to know if the sender is ignored by the receiver
|
||||||
@@ -141,11 +138,11 @@ pub async fn update_membership(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
self.mark_as_invited(user_id, room_id, last_state, invite_via)
|
self.mark_as_invited(user_id, room_id, count, last_state, invite_via)
|
||||||
.await;
|
.await;
|
||||||
},
|
},
|
||||||
| MembershipState::Leave | MembershipState::Ban => {
|
| MembershipState::Leave | MembershipState::Ban => {
|
||||||
self.mark_as_left(user_id, room_id);
|
self.mark_as_left(user_id, room_id, count);
|
||||||
|
|
||||||
if self.services.globals.user_is_local(user_id)
|
if self.services.globals.user_is_local(user_id)
|
||||||
&& (self.services.config.forget_forced_upon_leave
|
&& (self.services.config.forget_forced_upon_leave
|
||||||
@@ -241,15 +238,19 @@ pub async fn update_joined_count(&self, room_id: &RoomId) {
|
|||||||
/// `update_membership` instead
|
/// `update_membership` instead
|
||||||
#[implement(super::Service)]
|
#[implement(super::Service)]
|
||||||
#[tracing::instrument(skip(self), level = "debug")]
|
#[tracing::instrument(skip(self), level = "debug")]
|
||||||
pub(crate) fn mark_as_joined(&self, user_id: &UserId, room_id: &RoomId) {
|
pub(crate) fn mark_as_joined(&self, user_id: &UserId, room_id: &RoomId, count: PduCount) {
|
||||||
let userroom_id = (user_id, room_id);
|
let userroom_id = (user_id, room_id);
|
||||||
let userroom_id = serialize_key(userroom_id).expect("failed to serialize userroom_id");
|
let userroom_id = serialize_key(userroom_id).expect("failed to serialize userroom_id");
|
||||||
|
|
||||||
let roomuser_id = (room_id, user_id);
|
let roomuser_id = (room_id, user_id);
|
||||||
let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id");
|
let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id");
|
||||||
|
|
||||||
self.db.userroomid_joined.insert(&userroom_id, []);
|
self.db
|
||||||
self.db.roomuserid_joined.insert(&roomuser_id, []);
|
.userroomid_joined
|
||||||
|
.raw_aput::<8, _, _>(&userroom_id, count.into_unsigned());
|
||||||
|
self.db
|
||||||
|
.roomuserid_joined
|
||||||
|
.raw_aput::<8, _, _>(&roomuser_id, count.into_unsigned());
|
||||||
|
|
||||||
self.db
|
self.db
|
||||||
.userroomid_invitestate
|
.userroomid_invitestate
|
||||||
@@ -276,9 +277,7 @@ pub(crate) fn mark_as_joined(&self, user_id: &UserId, room_id: &RoomId) {
|
|||||||
/// `update_membership` instead
|
/// `update_membership` instead
|
||||||
#[implement(super::Service)]
|
#[implement(super::Service)]
|
||||||
#[tracing::instrument(skip(self), level = "debug")]
|
#[tracing::instrument(skip(self), level = "debug")]
|
||||||
pub(crate) fn mark_as_left(&self, user_id: &UserId, room_id: &RoomId) {
|
pub(crate) fn mark_as_left(&self, user_id: &UserId, room_id: &RoomId, count: PduCount) {
|
||||||
let count = self.services.globals.next_count();
|
|
||||||
|
|
||||||
let userroom_id = (user_id, room_id);
|
let userroom_id = (user_id, room_id);
|
||||||
let userroom_id = serialize_key(userroom_id).expect("failed to serialize userroom_id");
|
let userroom_id = serialize_key(userroom_id).expect("failed to serialize userroom_id");
|
||||||
|
|
||||||
@@ -293,7 +292,7 @@ pub(crate) fn mark_as_left(&self, user_id: &UserId, room_id: &RoomId) {
|
|||||||
.raw_put(&userroom_id, Json(leftstate));
|
.raw_put(&userroom_id, Json(leftstate));
|
||||||
self.db
|
self.db
|
||||||
.roomuserid_leftcount
|
.roomuserid_leftcount
|
||||||
.raw_aput::<8, _, _>(&roomuser_id, *count);
|
.raw_aput::<8, _, _>(&roomuser_id, count.into_unsigned());
|
||||||
|
|
||||||
self.db.userroomid_joined.remove(&userroom_id);
|
self.db.userroomid_joined.remove(&userroom_id);
|
||||||
self.db.roomuserid_joined.remove(&roomuser_id);
|
self.db.roomuserid_joined.remove(&roomuser_id);
|
||||||
@@ -324,10 +323,9 @@ pub(crate) fn _mark_as_knocked(
|
|||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
room_id: &RoomId,
|
room_id: &RoomId,
|
||||||
|
count: PduCount,
|
||||||
knocked_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
knocked_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
||||||
) {
|
) {
|
||||||
let count = self.services.globals.next_count();
|
|
||||||
|
|
||||||
let userroom_id = (user_id, room_id);
|
let userroom_id = (user_id, room_id);
|
||||||
let userroom_id = serialize_key(userroom_id).expect("failed to serialize userroom_id");
|
let userroom_id = serialize_key(userroom_id).expect("failed to serialize userroom_id");
|
||||||
|
|
||||||
@@ -339,7 +337,7 @@ pub(crate) fn _mark_as_knocked(
|
|||||||
.raw_put(&userroom_id, Json(knocked_state.unwrap_or_default()));
|
.raw_put(&userroom_id, Json(knocked_state.unwrap_or_default()));
|
||||||
self.db
|
self.db
|
||||||
.roomuserid_knockedcount
|
.roomuserid_knockedcount
|
||||||
.raw_aput::<8, _, _>(&roomuser_id, *count);
|
.raw_aput::<8, _, _>(&roomuser_id, count.into_unsigned());
|
||||||
|
|
||||||
self.db.userroomid_joined.remove(&userroom_id);
|
self.db.userroomid_joined.remove(&userroom_id);
|
||||||
self.db.roomuserid_joined.remove(&roomuser_id);
|
self.db.roomuserid_joined.remove(&roomuser_id);
|
||||||
@@ -381,11 +379,10 @@ pub(crate) async fn mark_as_invited(
|
|||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
room_id: &RoomId,
|
room_id: &RoomId,
|
||||||
|
count: PduCount,
|
||||||
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
||||||
invite_via: Option<Vec<OwnedServerName>>,
|
invite_via: Option<Vec<OwnedServerName>>,
|
||||||
) {
|
) {
|
||||||
let count = self.services.globals.next_count();
|
|
||||||
|
|
||||||
let roomuser_id = (room_id, user_id);
|
let roomuser_id = (room_id, user_id);
|
||||||
let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id");
|
let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id");
|
||||||
|
|
||||||
@@ -397,7 +394,7 @@ pub(crate) async fn mark_as_invited(
|
|||||||
.raw_put(&userroom_id, Json(last_state.unwrap_or_default()));
|
.raw_put(&userroom_id, Json(last_state.unwrap_or_default()));
|
||||||
self.db
|
self.db
|
||||||
.roomuserid_invitecount
|
.roomuserid_invitecount
|
||||||
.raw_aput::<8, _, _>(&roomuser_id, *count);
|
.raw_aput::<8, _, _>(&roomuser_id, count.into_unsigned());
|
||||||
|
|
||||||
self.db.userroomid_joined.remove(&userroom_id);
|
self.db.userroomid_joined.remove(&userroom_id);
|
||||||
self.db.roomuserid_joined.remove(&roomuser_id);
|
self.db.roomuserid_joined.remove(&roomuser_id);
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ where
|
|||||||
stripped_state,
|
stripped_state,
|
||||||
None,
|
None,
|
||||||
true,
|
true,
|
||||||
|
count,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user