From f8a44d1addc325aa4b92744ae6a179eb8555e313 Mon Sep 17 00:00:00 2001 From: Simon Eisenmann Date: Wed, 28 Jan 2015 12:38:31 +0100 Subject: [PATCH] Fixed deadlock when authorizeRoomCreation=true. --- .../spreed-webrtc-server/channelling_api_test.go | 2 +- src/app/spreed-webrtc-server/room_manager.go | 10 +++++----- src/app/spreed-webrtc-server/room_manager_test.go | 6 +++--- src/app/spreed-webrtc-server/session.go | 14 ++++++-------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/app/spreed-webrtc-server/channelling_api_test.go b/src/app/spreed-webrtc-server/channelling_api_test.go index af9b0f9f..ebf004fd 100644 --- a/src/app/spreed-webrtc-server/channelling_api_test.go +++ b/src/app/spreed-webrtc-server/channelling_api_test.go @@ -57,7 +57,7 @@ func (fake *fakeRoomManager) RoomUsers(session *Session) []*DataSession { return fake.roomUsers } -func (fake *fakeRoomManager) JoinRoom(id string, _ *DataRoomCredentials, session *Session, _ Sender) (*DataRoom, error) { +func (fake *fakeRoomManager) JoinRoom(id string, _ *DataRoomCredentials, session *Session, sessionAuthenticated bool, _ Sender) (*DataRoom, error) { fake.joinedID = id return &DataRoom{Name: id}, fake.joinError } diff --git a/src/app/spreed-webrtc-server/room_manager.go b/src/app/spreed-webrtc-server/room_manager.go index 91a08fe7..fffacc71 100644 --- a/src/app/spreed-webrtc-server/room_manager.go +++ b/src/app/spreed-webrtc-server/room_manager.go @@ -28,7 +28,7 @@ import ( type RoomStatusManager interface { RoomUsers(*Session) []*DataSession - JoinRoom(string, *DataRoomCredentials, *Session, Sender) (*DataRoom, error) + JoinRoom(roomID string, credentials *DataRoomCredentials, session *Session, sessionAuthenticated bool, sender Sender) (*DataRoom, error) LeaveRoom(roomID, sessionID string) UpdateRoom(*Session, *DataRoom) (*DataRoom, error) } @@ -71,12 +71,12 @@ func (rooms *roomManager) RoomUsers(session *Session) []*DataSession { return []*DataSession{} } -func (rooms *roomManager) JoinRoom(roomID string, credentials *DataRoomCredentials, session *Session, sender Sender) (*DataRoom, error) { +func (rooms *roomManager) JoinRoom(roomID string, credentials *DataRoomCredentials, session *Session, sessionAuthenticated bool, sender Sender) (*DataRoom, error) { if roomID == "" && !rooms.DefaultRoomEnabled { return nil, NewDataError("default_room_disabled", "The default room is not enabled") } - roomWorker, err := rooms.GetOrCreate(roomID, credentials, session) + roomWorker, err := rooms.GetOrCreate(roomID, credentials, sessionAuthenticated) if err != nil { return nil, err } @@ -145,7 +145,7 @@ func (rooms *roomManager) Get(roomID string) (room RoomWorker, ok bool) { return } -func (rooms *roomManager) GetOrCreate(roomID string, credentials *DataRoomCredentials, session *Session) (RoomWorker, error) { +func (rooms *roomManager) GetOrCreate(roomID string, credentials *DataRoomCredentials, sessionAuthenticated bool) (RoomWorker, error) { if room, ok := rooms.Get(roomID); ok { return room, nil } @@ -158,7 +158,7 @@ func (rooms *roomManager) GetOrCreate(roomID string, credentials *DataRoomCreden return room, nil } - if rooms.UsersEnabled && rooms.AuthorizeRoomCreation && !session.Authenticated() { + if rooms.UsersEnabled && rooms.AuthorizeRoomCreation && !sessionAuthenticated { rooms.Unlock() return nil, NewDataError("room_join_requires_account", "Room creation requires a user account") } diff --git a/src/app/spreed-webrtc-server/room_manager_test.go b/src/app/spreed-webrtc-server/room_manager_test.go index 34e7e3ec..94540709 100644 --- a/src/app/spreed-webrtc-server/room_manager_test.go +++ b/src/app/spreed-webrtc-server/room_manager_test.go @@ -36,16 +36,16 @@ func Test_RoomManager_JoinRoom_ReturnsAnErrorForUnauthenticatedSessionsWhenCreat config.AuthorizeRoomCreation = true unauthenticatedSession := &Session{} - _, err := roomManager.JoinRoom("foo", nil, unauthenticatedSession, nil) + _, err := roomManager.JoinRoom("foo", nil, unauthenticatedSession, false, nil) assertDataError(t, err, "room_join_requires_account") authenticatedSession := &Session{userid: "9870457"} - _, err = roomManager.JoinRoom("foo", nil, authenticatedSession, nil) + _, err = roomManager.JoinRoom("foo", nil, authenticatedSession, true, nil) if err != nil { t.Fatalf("Unexpected error %v joining room while authenticated", err) } - _, err = roomManager.JoinRoom("foo", nil, unauthenticatedSession, nil) + _, err = roomManager.JoinRoom("foo", nil, unauthenticatedSession, false, nil) if err != nil { t.Fatalf("Unexpected error %v joining room while unauthenticated", err) } diff --git a/src/app/spreed-webrtc-server/session.go b/src/app/spreed-webrtc-server/session.go index fece3c28..2a040511 100644 --- a/src/app/spreed-webrtc-server/session.go +++ b/src/app/spreed-webrtc-server/session.go @@ -79,6 +79,11 @@ func NewSession(manager SessionManager, unicaster Unicaster, broadcaster Broadca } +func (s *Session) authenticated() (authenticated bool) { + authenticated = s.userid != "" + return +} + func (s *Session) Subscribe(session *Session) { s.mutex.Lock() @@ -132,7 +137,7 @@ func (s *Session) JoinRoom(roomID string, credentials *DataRoomCredentials, send }) } - room, err := s.RoomStatusManager.JoinRoom(roomID, credentials, s, sender) + room, err := s.RoomStatusManager.JoinRoom(roomID, credentials, s, s.authenticated(), sender) if err == nil { s.Hello = true s.Roomid = roomID @@ -292,13 +297,6 @@ func (s *Session) Authorize(realm string, st *SessionToken) (string, error) { } -func (s *Session) Authenticated() (authenticated bool) { - s.mutex.Lock() - authenticated = s.userid != "" - s.mutex.Unlock() - return -} - func (s *Session) Authenticate(realm string, st *SessionToken, userid string) error { s.mutex.Lock()