From 4adf1d718220dc03dbf77d48f16521a2271d5d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Sun, 21 Jul 2024 15:29:37 +0200 Subject: [PATCH] fix locks. --- server/internal/http/legacy/session.go | 13 ++- server/internal/http/legacy/wstobackend.go | 36 +++++++- server/internal/http/legacy/wstoclient.go | 97 +++++++++++++++++++--- 3 files changed, 129 insertions(+), 17 deletions(-) diff --git a/server/internal/http/legacy/session.go b/server/internal/http/legacy/session.go index 894d76a4..461bf3c1 100644 --- a/server/internal/http/legacy/session.go +++ b/server/internal/http/legacy/session.go @@ -22,8 +22,11 @@ type session struct { profile types.MemberProfile client *http.Client - lastHostID string - sessions map[string]*oldTypes.Member + lastHostID string + lockedControls bool + lockedLogins bool + lockedFileTransfer bool + sessions map[string]*oldTypes.Member connClient *websocket.Conn connBackend *websocket.Conn @@ -60,11 +63,15 @@ func (s *session) apiReq(method, path string, request, response any) error { } defer res.Body.Close() - if res.StatusCode != http.StatusOK { + if res.StatusCode < 200 || res.StatusCode >= 300 { body, _ := io.ReadAll(res.Body) return fmt.Errorf("unexpected status code: %d, body: %s", res.StatusCode, body) } + if res.Body == nil { + return nil + } + return json.NewDecoder(res.Body).Decode(response) } diff --git a/server/internal/http/legacy/wstobackend.go b/server/internal/http/legacy/wstobackend.go index 010e141b..2a046d86 100644 --- a/server/internal/http/legacy/wstobackend.go +++ b/server/internal/http/legacy/wstobackend.go @@ -242,8 +242,22 @@ func (s *session) wsToBackend(msg []byte, sendMsg func([]byte) error) error { return err } - // TODO: No WS equivalent, call HTTP API. - return fmt.Errorf("event not implemented: %s", header.Event) + data := map[string]any{} + + switch request.Resource { + case "login": + data["locked_logins"] = true + case "control": + data["locked_controls"] = true + case "file_transfer": + data["plugins"] = map[string]any{ + "filetransfer.enabled": false, + } + default: + return fmt.Errorf("unknown resource: %s", request.Resource) + } + + return s.apiReq(http.MethodPost, "/api/room/settings", data, nil) case oldEvent.ADMIN_UNLOCK: request := &oldMessage.AdminLock{} @@ -252,8 +266,22 @@ func (s *session) wsToBackend(msg []byte, sendMsg func([]byte) error) error { return err } - // TODO: No WS equivalent, call HTTP API. - return fmt.Errorf("event not implemented: %s", header.Event) + data := map[string]any{} + + switch request.Resource { + case "login": + data["locked_logins"] = false + case "control": + data["locked_controls"] = false + case "file_transfer": + data["plugins"] = map[string]any{ + "filetransfer.enabled": true, + } + default: + return fmt.Errorf("unknown resource: %s", request.Resource) + } + + return s.apiReq(http.MethodPost, "/api/room/settings", data, nil) case oldEvent.ADMIN_CONTROL: return s.apiReq(http.MethodPost, "/api/room/control/take", nil, nil) diff --git a/server/internal/http/legacy/wstoclient.go b/server/internal/http/legacy/wstoclient.go index ddb50e49..bf3c5054 100644 --- a/server/internal/http/legacy/wstoclient.go +++ b/server/internal/http/legacy/wstoclient.go @@ -196,12 +196,15 @@ func (s *session) wsToClient(msg []byte, sendMsg func([]byte) error) error { locks := map[string]string{} if request.Settings.LockedLogins { locks["login"] = "" // TODO: We don't know who locked the login. + s.lockedLogins = true } if request.Settings.LockedControls { locks["control"] = "" // TODO: We don't know who locked the control. + s.lockedControls = true } if !filetransferSettings.Enabled { - locks["filetransfer"] = "" // TODO: We don't know who locked the file transfer. + locks["file_transfer"] = "" // TODO: We don't know who locked the file transfer. + s.lockedFileTransfer = true } return send(&oldMessage.SystemInit{ @@ -540,16 +543,90 @@ func (s *session) wsToClient(msg []byte, sendMsg func([]byte) error) error { IsActive: request.IsActive, }) + // Admin Events + case event.SYSTEM_SETTINGS: + request := &message.SystemSettingsUpdate{} + err := json.Unmarshal(data.Payload, request) + if err != nil { + return err + } + + if s.lockedControls != request.LockedControls { + s.lockedControls = request.LockedControls + + if request.LockedControls { + err = send(&oldMessage.AdminLock{ + Event: oldEvent.ADMIN_LOCK, + Resource: "control", + }) + } else { + err = send(&oldMessage.AdminLock{ + Event: oldEvent.ADMIN_UNLOCK, + Resource: "control", + }) + } + + if err != nil { + return err + } + } + + if s.lockedLogins != request.LockedLogins { + s.lockedLogins = request.LockedLogins + + if request.LockedLogins { + err = send(&oldMessage.AdminLock{ + Event: oldEvent.ADMIN_LOCK, + Resource: "login", + }) + } else { + err = send(&oldMessage.AdminLock{ + Event: oldEvent.ADMIN_UNLOCK, + Resource: "login", + }) + } + + if err != nil { + return err + } + } + + // + // FileTransfer + // + + filetransferSettings := filetransfer.Settings{ + Enabled: true, // defaults to true + } + + err = request.Settings.Plugins.Unmarshal(filetransfer.PluginName, &filetransferSettings) + if err != nil && !errors.Is(err, types.ErrPluginSettingsNotFound) { + return fmt.Errorf("unable to unmarshal %s plugin settings from global settings: %w", filetransfer.PluginName, err) + } + + if s.lockedFileTransfer != !filetransferSettings.Enabled { + s.lockedFileTransfer = !filetransferSettings.Enabled + + if !filetransferSettings.Enabled { + err = send(&oldMessage.AdminLock{ + Event: oldEvent.ADMIN_LOCK, + Resource: "file_transfer", + }) + } else { + err = send(&oldMessage.AdminLock{ + Event: oldEvent.ADMIN_UNLOCK, + Resource: "file_transfer", + }) + } + + if err != nil { + return err + } + } + + return nil + /* - // Admin Events - case: - send(&oldMessage.AdminLock{ - Event: oldEvent.ADMIN_LOCK, - }) - case: - send(&oldMessage.AdminLock{ - Event: oldEvent.ADMIN_UNLOCK, - }) case: send(&oldMessage.AdminTarget{ Event: oldEvent.ADMIN_BAN,