From 4a28307c1e638f6dc36d8f468d8741df73812bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Sun, 14 Mar 2021 00:45:51 +0100 Subject: [PATCH] session profile decoupled. --- internal/api/members/controler.go | 6 ++-- internal/api/room/control.go | 8 ++--- internal/api/room/handler.go | 2 +- internal/api/session.go | 8 ++--- internal/http/auth/auth.go | 8 ++--- internal/session/manager.go | 2 +- internal/session/session.go | 42 +++---------------------- internal/types/session.go | 13 ++------ internal/websocket/handler/clipboard.go | 2 +- internal/websocket/handler/control.go | 4 +-- internal/websocket/handler/screen.go | 2 +- internal/websocket/handler/session.go | 10 +++--- internal/websocket/handler/signal.go | 2 +- internal/websocket/handler/system.go | 4 +-- internal/websocket/manager.go | 4 +-- 15 files changed, 38 insertions(+), 79 deletions(-) diff --git a/internal/api/members/controler.go b/internal/api/members/controler.go index 42371216..579f0e3b 100644 --- a/internal/api/members/controler.go +++ b/internal/api/members/controler.go @@ -15,7 +15,7 @@ type MemberDataPayload struct { func (h *MembersHandler) membersList(w http.ResponseWriter, r *http.Request) { members := []MemberDataPayload{} for _, session := range h.sessions.List() { - profile := session.GetProfile() + profile := session.Profile() members = append(members, MemberDataPayload{ ID: session.ID(), MemberProfile: &profile, @@ -73,14 +73,14 @@ func (h *MembersHandler) membersCreate(w http.ResponseWriter, r *http.Request) { func (h *MembersHandler) membersRead(w http.ResponseWriter, r *http.Request) { member := GetMember(r) - profile := member.GetProfile() + profile := member.Profile() utils.HttpSuccess(w, profile) } func (h *MembersHandler) membersUpdate(w http.ResponseWriter, r *http.Request) { member := GetMember(r) - profile := member.GetProfile() + profile := member.Profile() if !utils.HttpJsonRequest(w, r, &profile) { return diff --git a/internal/api/room/control.go b/internal/api/room/control.go index a5855747..6a7806bd 100644 --- a/internal/api/room/control.go +++ b/internal/api/room/control.go @@ -41,7 +41,7 @@ func (h *RoomHandler) controlRequest(w http.ResponseWriter, r *http.Request) { } session := auth.GetSession(r) - if !session.CanHost() { + if !session.Profile().CanHost { utils.HttpBadRequest(w, "Session is not allowed to host.") return } @@ -58,7 +58,7 @@ func (h *RoomHandler) controlRelease(w http.ResponseWriter, r *http.Request) { return } - if !session.CanHost() { + if !session.Profile().CanHost { utils.HttpBadRequest(w, "Session is not allowed to host.") return } @@ -71,7 +71,7 @@ func (h *RoomHandler) controlRelease(w http.ResponseWriter, r *http.Request) { func (h *RoomHandler) controlTake(w http.ResponseWriter, r *http.Request) { session := auth.GetSession(r) - if !session.CanHost() { + if !session.Profile().CanHost { utils.HttpBadRequest(w, "Session is not allowed to host.") return } @@ -90,7 +90,7 @@ func (h *RoomHandler) controlGive(w http.ResponseWriter, r *http.Request) { return } - if !target.CanHost() { + if !target.Profile().CanHost { utils.HttpBadRequest(w, "Target session is not allowed to host.") return } diff --git a/internal/api/room/handler.go b/internal/api/room/handler.go index 2aa3fe19..689000f6 100644 --- a/internal/api/room/handler.go +++ b/internal/api/room/handler.go @@ -89,7 +89,7 @@ func (h *RoomHandler) Route(r chi.Router) { func (h *RoomHandler) uploadMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := auth.GetSession(r) - if !session.IsHost() && (!session.CanHost() || !h.sessions.ImplicitHosting()) { + if !session.IsHost() && (!session.Profile().CanHost || !h.sessions.ImplicitHosting()) { utils.HttpForbidden(w, "Without implicit hosting, only host can upload files.") } else { next.ServeHTTP(w, r) diff --git a/internal/api/session.go b/internal/api/session.go index 7526b838..fce14a28 100644 --- a/internal/api/session.go +++ b/internal/api/session.go @@ -62,8 +62,8 @@ func (api *ApiManagerCtx) Login(w http.ResponseWriter, r *http.Request) { utils.HttpSuccess(w, SessionDataPayload{ ID: session.ID(), - Profile: session.GetProfile(), - State: session.GetState(), + Profile: session.Profile(), + State: session.State(), }) } @@ -99,7 +99,7 @@ func (api *ApiManagerCtx) Whoami(w http.ResponseWriter, r *http.Request) { utils.HttpSuccess(w, SessionDataPayload{ ID: session.ID(), - Profile: session.GetProfile(), - State: session.GetState(), + Profile: session.Profile(), + State: session.State(), }) } diff --git a/internal/http/auth/auth.go b/internal/http/auth/auth.go index 3c6ac7e4..bfb79fea 100644 --- a/internal/http/auth/auth.go +++ b/internal/http/auth/auth.go @@ -26,7 +26,7 @@ func GetSession(r *http.Request) types.Session { func AdminsOnly(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := GetSession(r) - if !session.IsAdmin() { + if !session.Profile().IsAdmin { utils.HttpForbidden(w) } else { next.ServeHTTP(w, r) @@ -48,7 +48,7 @@ func HostsOnly(next http.Handler) http.Handler { func HostsOrAdminsOnly(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := GetSession(r) - if !session.IsHost() && !session.IsAdmin() { + if !session.IsHost() && !session.Profile().IsAdmin { utils.HttpForbidden(w, "Only host can do this.") } else { next.ServeHTTP(w, r) @@ -59,7 +59,7 @@ func HostsOrAdminsOnly(next http.Handler) http.Handler { func CanHostOnly(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := GetSession(r) - if !session.CanHost() { + if !session.Profile().CanHost { utils.HttpForbidden(w, "Only for sessions, that can host.") } else { next.ServeHTTP(w, r) @@ -70,7 +70,7 @@ func CanHostOnly(next http.Handler) http.Handler { func CanWatchOnly(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := GetSession(r) - if !session.CanWatch() { + if !session.Profile().CanWatch { utils.HttpForbidden(w, "Only for sessions, that can watch.") } else { next.ServeHTTP(w, r) diff --git a/internal/session/manager.go b/internal/session/manager.go index 2a7c4a73..fddda4f1 100644 --- a/internal/session/manager.go +++ b/internal/session/manager.go @@ -196,7 +196,7 @@ func (manager *SessionManagerCtx) AdminBroadcast(v interface{}, exclude interfac defer manager.sessionsMu.Unlock() for id, session := range manager.sessions { - if !session.IsConnected() || !session.IsAdmin() { + if !session.IsConnected() || !session.Profile().IsAdmin { continue } diff --git a/internal/session/session.go b/internal/session/session.go index b62b4949..603ad379 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -23,54 +23,22 @@ func (session *SessionCtx) ID() string { return session.id } -// --- -// profile -// --- - -func (session *SessionCtx) Name() string { - return session.profile.Name -} - -func (session *SessionCtx) IsAdmin() bool { - return session.profile.IsAdmin -} - -func (session *SessionCtx) CanLogin() bool { - return session.profile.CanLogin -} - -func (session *SessionCtx) CanConnect() bool { - return session.profile.CanConnect -} - -func (session *SessionCtx) CanWatch() bool { - return session.profile.CanWatch -} - -func (session *SessionCtx) CanHost() bool { - return session.profile.CanHost -} - -func (session *SessionCtx) CanAccessClipboard() bool { - return session.profile.CanAccessClipboard -} - -func (session *SessionCtx) GetProfile() types.MemberProfile { +func (session *SessionCtx) Profile() types.MemberProfile { return session.profile } func (session *SessionCtx) profileChanged() { - if !session.CanHost() && session.IsHost() { + if !session.profile.CanHost && session.IsHost() { session.manager.ClearHost() } - if !session.CanWatch() && session.state.IsWatching { + if !session.profile.CanWatch && session.state.IsWatching { if err := session.webrtcPeer.Destroy(); err != nil { session.logger.Warn().Err(err).Msgf("webrtc destroy has failed") } } - if (!session.CanConnect() || !session.CanLogin()) && session.state.IsConnected { + if (!session.profile.CanConnect || !session.profile.CanLogin) && session.state.IsConnected { if err := session.Disconnect("profile changed"); err != nil { session.logger.Warn().Err(err).Msgf("websocket destroy has failed") } @@ -89,7 +57,7 @@ func (session *SessionCtx) IsConnected() bool { return session.state.IsConnected } -func (session *SessionCtx) GetState() types.SessionState { +func (session *SessionCtx) State() types.SessionState { return session.state } diff --git a/internal/types/session.go b/internal/types/session.go index f6b669af..73c2716f 100644 --- a/internal/types/session.go +++ b/internal/types/session.go @@ -19,21 +19,12 @@ type SessionState struct { type Session interface { ID() string - - // profile - Name() string - IsAdmin() bool - CanLogin() bool - CanConnect() bool - CanWatch() bool - CanHost() bool - CanAccessClipboard() bool - GetProfile() MemberProfile + Profile() MemberProfile // state IsHost() bool IsConnected() bool - GetState() SessionState + State() SessionState // websocket SetWebSocketPeer(websocketPeer WebSocketPeer) diff --git a/internal/websocket/handler/clipboard.go b/internal/websocket/handler/clipboard.go index 0cef78e4..62a1d79c 100644 --- a/internal/websocket/handler/clipboard.go +++ b/internal/websocket/handler/clipboard.go @@ -6,7 +6,7 @@ import ( ) func (h *MessageHandlerCtx) clipboardSet(session types.Session, payload *message.ClipboardData) error { - if !session.CanAccessClipboard() { + if !session.Profile().CanAccessClipboard { h.logger.Debug().Str("session_id", session.ID()).Msg("cannot access clipboard") return nil } diff --git a/internal/websocket/handler/control.go b/internal/websocket/handler/control.go index ec13d7f8..ac348464 100644 --- a/internal/websocket/handler/control.go +++ b/internal/websocket/handler/control.go @@ -7,7 +7,7 @@ import ( ) func (h *MessageHandlerCtx) controlRelease(session types.Session) error { - if !session.CanHost() { + if !session.Profile().CanHost { h.logger.Debug().Str("session_id", session.ID()).Msg("is not allowed to host") return nil } @@ -24,7 +24,7 @@ func (h *MessageHandlerCtx) controlRelease(session types.Session) error { } func (h *MessageHandlerCtx) controlRequest(session types.Session) error { - if !session.CanHost() { + if !session.Profile().CanHost { h.logger.Debug().Str("session_id", session.ID()).Msg("is not allowed to host") return nil } diff --git a/internal/websocket/handler/screen.go b/internal/websocket/handler/screen.go index cd69e1d7..a88b6c06 100644 --- a/internal/websocket/handler/screen.go +++ b/internal/websocket/handler/screen.go @@ -7,7 +7,7 @@ import ( ) func (h *MessageHandlerCtx) screenSet(session types.Session, payload *message.ScreenSize) error { - if !session.IsAdmin() { + if !session.Profile().IsAdmin { h.logger.Debug().Str("session_id", session.ID()).Msg("is not the admin") return nil } diff --git a/internal/websocket/handler/session.go b/internal/websocket/handler/session.go index fec66c55..f50d69f5 100644 --- a/internal/websocket/handler/session.go +++ b/internal/websocket/handler/session.go @@ -11,8 +11,8 @@ func (h *MessageHandlerCtx) SessionCreated(session types.Session) error { message.SessionData{ Event: event.SESSION_CREATED, ID: session.ID(), - Profile: session.GetProfile(), - State: session.GetState(), + Profile: session.Profile(), + State: session.State(), }, nil) return nil @@ -33,7 +33,7 @@ func (h *MessageHandlerCtx) SessionConnected(session types.Session) error { return err } - if session.IsAdmin() { + if session.Profile().IsAdmin { if err := h.systemAdmin(session); err != nil { return err } @@ -53,7 +53,7 @@ func (h *MessageHandlerCtx) SessionDisconnected(session types.Session) error { } func (h *MessageHandlerCtx) SessionProfileChanged(session types.Session) error { - profile := session.GetProfile() + profile := session.Profile() h.sessions.Broadcast( message.MemberProfile{ @@ -66,7 +66,7 @@ func (h *MessageHandlerCtx) SessionProfileChanged(session types.Session) error { } func (h *MessageHandlerCtx) SessionStateChanged(session types.Session) error { - state := session.GetState() + state := session.State() h.sessions.Broadcast( message.SessionState{ diff --git a/internal/websocket/handler/signal.go b/internal/websocket/handler/signal.go index cfc31113..22bc8786 100644 --- a/internal/websocket/handler/signal.go +++ b/internal/websocket/handler/signal.go @@ -7,7 +7,7 @@ import ( ) func (h *MessageHandlerCtx) signalRequest(session types.Session) error { - if !session.CanWatch() { + if !session.Profile().CanWatch { return nil } diff --git a/internal/websocket/handler/system.go b/internal/websocket/handler/system.go index 14e4bc7a..8752e607 100644 --- a/internal/websocket/handler/system.go +++ b/internal/websocket/handler/system.go @@ -29,8 +29,8 @@ func (h *MessageHandlerCtx) systemInit(session types.Session) error { sessionId := session.ID() sessions[sessionId] = message.SessionData{ ID: sessionId, - Profile: session.GetProfile(), - State: session.GetState(), + Profile: session.Profile(), + State: session.State(), } } diff --git a/internal/websocket/manager.go b/internal/websocket/manager.go index df7d46cd..ab023f14 100644 --- a/internal/websocket/manager.go +++ b/internal/websocket/manager.go @@ -107,7 +107,7 @@ func (manager *WebSocketManagerCtx) Start() { manager.desktop.OnClipboardUpdated(func() { session := manager.sessions.GetHost() - if session == nil || !session.CanAccessClipboard() { + if session == nil || !session.Profile().CanAccessClipboard { return } @@ -167,7 +167,7 @@ func (manager *WebSocketManagerCtx) Upgrade(w http.ResponseWriter, r *http.Reque return connection.Close() } - if !session.CanConnect() { + if !session.Profile().CanConnect { // TODO: Refactor, return error code. if err = connection.WriteJSON( message.SystemDisconnect{