Browse Source

Fixed deadlock when authorizeRoomCreation=true.

pull/168/head
Simon Eisenmann 11 years ago
parent
commit
f8a44d1add
  1. 2
      src/app/spreed-webrtc-server/channelling_api_test.go
  2. 10
      src/app/spreed-webrtc-server/room_manager.go
  3. 6
      src/app/spreed-webrtc-server/room_manager_test.go
  4. 14
      src/app/spreed-webrtc-server/session.go

2
src/app/spreed-webrtc-server/channelling_api_test.go

@ -57,7 +57,7 @@ func (fake *fakeRoomManager) RoomUsers(session *Session) []*DataSession {
return fake.roomUsers 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 fake.joinedID = id
return &DataRoom{Name: id}, fake.joinError return &DataRoom{Name: id}, fake.joinError
} }

10
src/app/spreed-webrtc-server/room_manager.go

@ -28,7 +28,7 @@ import (
type RoomStatusManager interface { type RoomStatusManager interface {
RoomUsers(*Session) []*DataSession 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) LeaveRoom(roomID, sessionID string)
UpdateRoom(*Session, *DataRoom) (*DataRoom, error) UpdateRoom(*Session, *DataRoom) (*DataRoom, error)
} }
@ -71,12 +71,12 @@ func (rooms *roomManager) RoomUsers(session *Session) []*DataSession {
return []*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 { if roomID == "" && !rooms.DefaultRoomEnabled {
return nil, NewDataError("default_room_disabled", "The default room is not enabled") 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 { if err != nil {
return nil, err return nil, err
} }
@ -145,7 +145,7 @@ func (rooms *roomManager) Get(roomID string) (room RoomWorker, ok bool) {
return 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 { if room, ok := rooms.Get(roomID); ok {
return room, nil return room, nil
} }
@ -158,7 +158,7 @@ func (rooms *roomManager) GetOrCreate(roomID string, credentials *DataRoomCreden
return room, nil return room, nil
} }
if rooms.UsersEnabled && rooms.AuthorizeRoomCreation && !session.Authenticated() { if rooms.UsersEnabled && rooms.AuthorizeRoomCreation && !sessionAuthenticated {
rooms.Unlock() rooms.Unlock()
return nil, NewDataError("room_join_requires_account", "Room creation requires a user account") return nil, NewDataError("room_join_requires_account", "Room creation requires a user account")
} }

6
src/app/spreed-webrtc-server/room_manager_test.go

@ -36,16 +36,16 @@ func Test_RoomManager_JoinRoom_ReturnsAnErrorForUnauthenticatedSessionsWhenCreat
config.AuthorizeRoomCreation = true config.AuthorizeRoomCreation = true
unauthenticatedSession := &Session{} unauthenticatedSession := &Session{}
_, err := roomManager.JoinRoom("foo", nil, unauthenticatedSession, nil) _, err := roomManager.JoinRoom("foo", nil, unauthenticatedSession, false, nil)
assertDataError(t, err, "room_join_requires_account") assertDataError(t, err, "room_join_requires_account")
authenticatedSession := &Session{userid: "9870457"} authenticatedSession := &Session{userid: "9870457"}
_, err = roomManager.JoinRoom("foo", nil, authenticatedSession, nil) _, err = roomManager.JoinRoom("foo", nil, authenticatedSession, true, nil)
if err != nil { if err != nil {
t.Fatalf("Unexpected error %v joining room while authenticated", err) 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 { if err != nil {
t.Fatalf("Unexpected error %v joining room while unauthenticated", err) t.Fatalf("Unexpected error %v joining room while unauthenticated", err)
} }

14
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) { func (s *Session) Subscribe(session *Session) {
s.mutex.Lock() 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 { if err == nil {
s.Hello = true s.Hello = true
s.Roomid = roomID 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 { func (s *Session) Authenticate(realm string, st *SessionToken, userid string) error {
s.mutex.Lock() s.mutex.Lock()

Loading…
Cancel
Save