Include actor information in room join/leave events for fed. sessions.

This commit is contained in:
Joachim Bauch 2024-08-29 14:53:27 +02:00
commit 7f03ffff55
No known key found for this signature in database
GPG key ID: 77C1D22D53E15F02
6 changed files with 97 additions and 20 deletions

View file

@ -296,12 +296,26 @@ type BackendClientRoomRequest struct {
UserId string `json:"userid"`
SessionId string `json:"sessionid"`
// For Nextcloud Talk with SIP support.
// For Nextcloud Talk with SIP support and for federated sessions.
ActorId string `json:"actorid,omitempty"`
ActorType string `json:"actortype,omitempty"`
InCall int `json:"incall,omitempty"`
}
func (r *BackendClientRoomRequest) UpdateFromSession(s Session) {
if s.ClientType() == HelloClientTypeFederation {
// Need to send additional data for requests of federated users.
if u, err := s.ParsedUserData(); err == nil && len(u) > 0 {
if actorType, found := getStringMapEntry[string](u, "actorType"); found {
if actorId, found := getStringMapEntry[string](u, "actorId"); found {
r.ActorId = actorId
r.ActorType = actorType
}
}
}
}
}
func NewBackendClientRoomRequest(roomid string, userid string, sessionid string) *BackendClientRequest {
return &BackendClientRequest{
Type: "room",

View file

@ -560,6 +560,7 @@ func (s *ClientSession) doUnsubscribeRoomEvents(notify bool) {
go func(sid string) {
ctx := context.Background()
request := NewBackendClientRoomRequest(room.Id(), s.userId, sid)
request.Room.UpdateFromSession(s)
request.Room.Action = "leave"
var response map[string]interface{}
if err := s.hub.backend.PerformJSONRequest(ctx, s.ParsedBackendUrl(), request, &response); err != nil {

View file

@ -109,7 +109,12 @@ func Test_Federation(t *testing.T) {
require.NotNil(room)
now := time.Now()
token, err := client1.CreateHelloV2Token(testDefaultUserId+"2", now, now.Add(time.Minute))
userdata := map[string]interface{}{
"displayname": "Federated user",
"actorType": "federated_users",
"actorId": "the-federated-user-id",
}
token, err := client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"2", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg := &ClientMessage{
@ -424,18 +429,24 @@ func Test_Federation(t *testing.T) {
hello4, err := client4.RunUntilHello(ctx)
require.NoError(err)
token, err = client4.CreateHelloV2Token(testDefaultUserId+"4", now, now.Add(time.Minute))
userdata = map[string]interface{}{
"displayname": "Federated user 2",
"actorType": "federated_users",
"actorId": "the-other-federated-user-id",
}
token, err = client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"4", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg = &ClientMessage{
Id: "join-room-fed",
Type: "room",
Room: &RoomClientMessage{
RoomId: roomId,
SessionId: roomId + "-" + hello4.Hello.SessionId,
RoomId: federatedRoomId,
SessionId: federatedRoomId + "-" + hello4.Hello.SessionId,
Federation: &RoomFederationMessage{
SignalingUrl: server1.URL,
NextcloudUrl: server1.URL,
RoomId: roomId,
Token: token,
},
},
@ -445,10 +456,10 @@ func Test_Federation(t *testing.T) {
if message, err := client4.RunUntilMessage(ctx); assert.NoError(err) {
assert.Equal(msg.Id, message.Id)
require.Equal("room", message.Type)
require.Equal(roomId, message.Room.RoomId)
require.Equal(federatedRoomId, message.Room.RoomId)
}
// The client1 will see the remote session id for client2.
// The client1 will see the remote session id for client4.
var remoteSessionId4 string
if message, err := client1.RunUntilMessage(ctx); assert.NoError(err) {
assert.NoError(client1.checkSingleMessageJoined(message))
@ -514,7 +525,12 @@ func Test_FederationJoinRoomTwice(t *testing.T) {
assert.NoError(client1.RunUntilJoined(ctx, hello1.Hello))
now := time.Now()
token, err := client1.CreateHelloV2Token(testDefaultUserId+"2", now, now.Add(time.Minute))
userdata := map[string]interface{}{
"displayname": "Federated user",
"actorType": "federated_users",
"actorId": "the-federated-user-id",
}
token, err := client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"2", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg := &ClientMessage{
@ -620,7 +636,12 @@ func Test_FederationChangeRoom(t *testing.T) {
assert.NoError(client1.RunUntilJoined(ctx, hello1.Hello))
now := time.Now()
token, err := client1.CreateHelloV2Token(testDefaultUserId+"2", now, now.Add(time.Minute))
userdata := map[string]interface{}{
"displayname": "Federated user",
"actorType": "federated_users",
"actorId": "the-federated-user-id",
}
token, err := client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"2", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg := &ClientMessage{
@ -734,6 +755,7 @@ func Test_FederationMedia(t *testing.T) {
require.NoError(err)
roomId := "test-room"
federatedRooId := roomId + "@federated"
room1, err := client1.JoinRoom(ctx, roomId)
require.NoError(err)
require.Equal(roomId, room1.Room.RoomId)
@ -741,18 +763,24 @@ func Test_FederationMedia(t *testing.T) {
assert.NoError(client1.RunUntilJoined(ctx, hello1.Hello))
now := time.Now()
token, err := client1.CreateHelloV2Token(testDefaultUserId+"2", now, now.Add(time.Minute))
userdata := map[string]interface{}{
"displayname": "Federated user",
"actorType": "federated_users",
"actorId": "the-federated-user-id",
}
token, err := client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"2", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg := &ClientMessage{
Id: "join-room-fed",
Type: "room",
Room: &RoomClientMessage{
RoomId: roomId,
SessionId: roomId + "-" + hello2.Hello.SessionId,
RoomId: federatedRooId,
SessionId: federatedRooId + "-" + hello2.Hello.SessionId,
Federation: &RoomFederationMessage{
SignalingUrl: server1.URL,
NextcloudUrl: server1.URL,
RoomId: roomId,
Token: token,
},
},
@ -762,7 +790,7 @@ func Test_FederationMedia(t *testing.T) {
if message, err := client2.RunUntilMessage(ctx); assert.NoError(err) {
assert.Equal(msg.Id, message.Id)
require.Equal("room", message.Type)
require.Equal(roomId, message.Room.RoomId)
require.Equal(federatedRooId, message.Room.RoomId)
}
// The client1 will see the remote session id for client2.
@ -832,7 +860,12 @@ func Test_FederationResume(t *testing.T) {
assert.NoError(client1.RunUntilJoined(ctx, hello1.Hello))
now := time.Now()
token, err := client1.CreateHelloV2Token(testDefaultUserId+"2", now, now.Add(time.Minute))
userdata := map[string]interface{}{
"displayname": "Federated user",
"actorType": "federated_users",
"actorId": "the-federated-user-id",
}
token, err := client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"2", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg := &ClientMessage{
@ -960,7 +993,12 @@ func Test_FederationResumeNewSession(t *testing.T) {
assert.NoError(client1.RunUntilJoined(ctx, hello1.Hello))
now := time.Now()
token, err := client1.CreateHelloV2Token(testDefaultUserId+"2", now, now.Add(time.Minute))
userdata := map[string]interface{}{
"displayname": "Federated user",
"actorType": "federated_users",
"actorId": "the-federated-user-id",
}
token, err := client1.CreateHelloV2TokenWithUserdata(testDefaultUserId+"2", now, now.Add(time.Minute), userdata)
require.NoError(err)
msg := &ClientMessage{

1
hub.go
View file

@ -1695,6 +1695,7 @@ func (h *Hub) processRoom(sess Session, message *ClientMessage) {
sessionId = session.PublicId()
}
request := NewBackendClientRoomRequest(roomId, session.UserId(), sessionId)
request.Room.UpdateFromSession(session)
if err := h.backend.PerformJSONRequest(ctx, session.ParsedBackendUrl(), request, &room); err != nil {
session.SendMessage(message.NewWrappedErrorServerMessage(err))
return

View file

@ -420,6 +420,25 @@ func processRoomRequest(t *testing.T, w http.ResponseWriter, r *http.Request, re
}
}
if strings.Contains(t.Name(), "Federation") {
// Check additional fields present for federated sessions.
if strings.Contains(request.Room.SessionId, "@federated") {
if actorType := request.Room.ActorType; actorType != ActorTypeFederatedUsers {
t.Errorf("expected actorType %s, received %+v", ActorTypeFederatedUsers, request.Room)
}
if actorId := request.Room.ActorId; actorId == "" {
t.Errorf("expected actorId, received %+v", request.Room)
}
} else {
if actorType := request.Room.ActorType; actorType != "" {
t.Errorf("expected empty actorType, received %+v", request.Room)
}
if actorId := request.Room.ActorId; actorId != "" {
t.Errorf("expected empty actorId, received %+v", request.Room)
}
}
}
// Allow joining any room.
response := &BackendClientResponse{
Type: "room",

View file

@ -401,11 +401,7 @@ func (c *TestClient) SendHelloV2(userid string) error {
return c.SendHelloV2WithTimes(userid, now, now.Add(time.Minute))
}
func (c *TestClient) CreateHelloV2Token(userid string, issuedAt time.Time, expiresAt time.Time) (string, error) {
userdata := map[string]string{
"displayname": "Displayname " + userid,
}
func (c *TestClient) CreateHelloV2TokenWithUserdata(userid string, issuedAt time.Time, expiresAt time.Time, userdata map[string]interface{}) (string, error) {
data, err := json.Marshal(userdata)
if err != nil {
return "", err
@ -437,6 +433,14 @@ func (c *TestClient) CreateHelloV2Token(userid string, issuedAt time.Time, expir
return token.SignedString(private)
}
func (c *TestClient) CreateHelloV2Token(userid string, issuedAt time.Time, expiresAt time.Time) (string, error) {
userdata := map[string]interface{}{
"displayname": "Displayname " + userid,
}
return c.CreateHelloV2TokenWithUserdata(userid, issuedAt, expiresAt, userdata)
}
func (c *TestClient) SendHelloV2WithTimes(userid string, issuedAt time.Time, expiresAt time.Time) error {
tokenString, err := c.CreateHelloV2Token(userid, issuedAt, expiresAt)
if err != nil {