mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
remove locks.
This commit is contained in:
@ -8,7 +8,6 @@ import (
|
||||
type WebSocket struct {
|
||||
Password string
|
||||
AdminPassword string
|
||||
Locks []string
|
||||
}
|
||||
|
||||
func (WebSocket) Init(cmd *cobra.Command) error {
|
||||
@ -22,16 +21,10 @@ func (WebSocket) Init(cmd *cobra.Command) error {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.PersistentFlags().StringSlice("locks", []string{}, "resources, that will be locked when starting (control, login)")
|
||||
if err := viper.BindPFlag("locks", cmd.PersistentFlags().Lookup("locks")); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *WebSocket) Set() {
|
||||
s.Password = viper.GetString("password")
|
||||
s.AdminPassword = viper.GetString("password_admin")
|
||||
s.Locks = viper.GetStringSlice("locks")
|
||||
}
|
||||
|
@ -93,11 +93,6 @@ func New(conf *config.Server, webSocketHandler types.WebSocketHandler, desktop t
|
||||
return
|
||||
}
|
||||
|
||||
if webSocketHandler.IsLocked("login") {
|
||||
http.Error(w, "room is locked", http.StatusLocked)
|
||||
return
|
||||
}
|
||||
|
||||
quality, err := strconv.Atoi(r.URL.Query().Get("quality"))
|
||||
if err != nil {
|
||||
quality = 90
|
||||
|
@ -28,8 +28,6 @@ type SessionManager struct {
|
||||
capture types.CaptureManager
|
||||
members map[string]*Session
|
||||
eventsChannel chan types.SessionEvent
|
||||
// TODO: Handle locks in sessions as flags.
|
||||
controlLocked bool
|
||||
}
|
||||
|
||||
func (manager *SessionManager) New(id string, admin bool, socket types.WebSocket) types.Session {
|
||||
@ -118,16 +116,6 @@ func (manager *SessionManager) Get(id string) (types.Session, bool) {
|
||||
return session, ok
|
||||
}
|
||||
|
||||
// TODO: Handle locks in sessions as flags.
|
||||
func (manager *SessionManager) SetControlLocked(locked bool) {
|
||||
manager.controlLocked = locked
|
||||
}
|
||||
|
||||
func (manager *SessionManager) CanControl(id string) bool {
|
||||
session, ok := manager.Get(id)
|
||||
return ok && (!manager.controlLocked || session.Admin())
|
||||
}
|
||||
|
||||
func (manager *SessionManager) Admins() []*types.Member {
|
||||
manager.mu.Lock()
|
||||
defer manager.mu.Unlock()
|
||||
|
@ -49,9 +49,7 @@ const (
|
||||
const (
|
||||
ADMIN_BAN = "admin/ban"
|
||||
ADMIN_KICK = "admin/kick"
|
||||
ADMIN_LOCK = "admin/lock"
|
||||
ADMIN_MUTE = "admin/mute"
|
||||
ADMIN_UNLOCK = "admin/unlock"
|
||||
ADMIN_UNMUTE = "admin/unmute"
|
||||
ADMIN_CONTROL = "admin/control"
|
||||
ADMIN_RELEASE = "admin/release"
|
||||
|
@ -11,9 +11,8 @@ type Message struct {
|
||||
}
|
||||
|
||||
type SystemInit struct {
|
||||
Event string `json:"event"`
|
||||
ImplicitHosting bool `json:"implicit_hosting"`
|
||||
Locks map[string]string `json:"locks"`
|
||||
Event string `json:"event"`
|
||||
ImplicitHosting bool `json:"implicit_hosting"`
|
||||
}
|
||||
|
||||
type SystemMessage struct {
|
||||
|
@ -55,8 +55,6 @@ type SessionManager interface {
|
||||
ClearHost()
|
||||
Has(id string) bool
|
||||
Get(id string) (Session, bool)
|
||||
SetControlLocked(locked bool)
|
||||
CanControl(id string) bool
|
||||
Members() []*Member
|
||||
Admins() []*Member
|
||||
Destroy(id string)
|
||||
|
@ -11,7 +11,6 @@ type Stats struct {
|
||||
Members []*Member `json:"members"`
|
||||
|
||||
Banned map[string]string `json:"banned"` // IP -> session ID (that banned it)
|
||||
Locked map[string]string `json:"locked"` // resource name -> session ID (that locked it)
|
||||
|
||||
ServerStartedAt time.Time `json:"server_started_at"`
|
||||
LastAdminLeftAt *time.Time `json:"last_admin_left_at"`
|
||||
@ -31,6 +30,5 @@ type WebSocketHandler interface {
|
||||
Shutdown() error
|
||||
Upgrade(w http.ResponseWriter, r *http.Request) error
|
||||
Stats() Stats
|
||||
IsLocked(resource string) bool
|
||||
IsAdmin(password string) (bool, error)
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ type PayloadKey struct {
|
||||
}
|
||||
|
||||
func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) error {
|
||||
if (!manager.config.ImplicitControl && !manager.sessions.IsHost(id)) || (manager.config.ImplicitControl && !manager.sessions.CanControl(id)) {
|
||||
if (!manager.config.ImplicitControl && !manager.sessions.IsHost(id)) || manager.config.ImplicitControl {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -8,78 +8,6 @@ import (
|
||||
"m1k1o/neko/internal/types/message"
|
||||
)
|
||||
|
||||
func (h *MessageHandler) adminLock(id string, session types.Session, payload *message.AdminLock) error {
|
||||
if !session.Admin() {
|
||||
h.logger.Debug().Msg("user not admin")
|
||||
return nil
|
||||
}
|
||||
|
||||
if h.state.IsLocked(payload.Resource) {
|
||||
h.logger.Debug().Str("resource", payload.Resource).Msg("resource already locked...")
|
||||
return nil
|
||||
}
|
||||
|
||||
// allow only known resources
|
||||
switch payload.Resource {
|
||||
case "login":
|
||||
case "control":
|
||||
case "file_transfer":
|
||||
default:
|
||||
h.logger.Debug().Msg("unknown lock resource")
|
||||
return nil
|
||||
}
|
||||
|
||||
// TODO: Handle locks in sessions as flags.
|
||||
if payload.Resource == "control" {
|
||||
h.sessions.SetControlLocked(true)
|
||||
}
|
||||
|
||||
h.state.Lock(payload.Resource, id)
|
||||
|
||||
if err := h.sessions.Broadcast(
|
||||
message.AdminLock{
|
||||
Event: event.ADMIN_LOCK,
|
||||
ID: id,
|
||||
Resource: payload.Resource,
|
||||
}, nil); err != nil {
|
||||
h.logger.Warn().Err(err).Msgf("broadcasting event %s has failed", event.ADMIN_LOCK)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *MessageHandler) adminUnlock(id string, session types.Session, payload *message.AdminLock) error {
|
||||
if !session.Admin() {
|
||||
h.logger.Debug().Msg("user not admin")
|
||||
return nil
|
||||
}
|
||||
|
||||
if !h.state.IsLocked(payload.Resource) {
|
||||
h.logger.Debug().Str("resource", payload.Resource).Msg("resource not locked...")
|
||||
return nil
|
||||
}
|
||||
|
||||
// TODO: Handle locks in sessions as flags.
|
||||
if payload.Resource == "control" {
|
||||
h.sessions.SetControlLocked(false)
|
||||
}
|
||||
|
||||
h.state.Unlock(payload.Resource)
|
||||
|
||||
if err := h.sessions.Broadcast(
|
||||
message.AdminLock{
|
||||
Event: event.ADMIN_UNLOCK,
|
||||
ID: id,
|
||||
Resource: payload.Resource,
|
||||
}, nil); err != nil {
|
||||
h.logger.Warn().Err(err).Msgf("broadcasting event %s has failed", event.ADMIN_UNLOCK)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *MessageHandler) adminControl(id string, session types.Session) error {
|
||||
if !session.Admin() {
|
||||
h.logger.Debug().Msg("user not admin")
|
||||
|
@ -33,12 +33,6 @@ func (h *MessageHandler) controlRelease(id string, session types.Session) error
|
||||
func (h *MessageHandler) controlRequest(id string, session types.Session) error {
|
||||
// check for host
|
||||
if !h.sessions.HasHost() {
|
||||
// check if control is locked or user is admin
|
||||
if h.state.IsLocked("control") && !session.Admin() {
|
||||
h.logger.Debug().Msg("control is locked")
|
||||
return nil
|
||||
}
|
||||
|
||||
// set host
|
||||
err := h.sessions.SetHost(id)
|
||||
if err != nil {
|
||||
@ -96,12 +90,6 @@ func (h *MessageHandler) controlGive(id string, session types.Session, payload *
|
||||
return nil
|
||||
}
|
||||
|
||||
// check if control is locked or giver is admin
|
||||
if h.state.IsLocked("control") && !session.Admin() {
|
||||
h.logger.Debug().Msg("control is locked")
|
||||
return nil
|
||||
}
|
||||
|
||||
// set host
|
||||
err := h.sessions.SetHost(payload.ID)
|
||||
if err != nil {
|
||||
@ -124,7 +112,7 @@ func (h *MessageHandler) controlGive(id string, session types.Session, payload *
|
||||
|
||||
func (h *MessageHandler) controlClipboard(id string, session types.Session, payload *message.Clipboard) error {
|
||||
// check if session can access clipboard
|
||||
if (!h.webrtc.ImplicitControl() && !h.sessions.IsHost(id)) || (h.webrtc.ImplicitControl() && !h.sessions.CanControl(id)) {
|
||||
if (!h.webrtc.ImplicitControl() && !h.sessions.IsHost(id)) || h.webrtc.ImplicitControl() {
|
||||
h.logger.Debug().Str("id", id).Msg("cannot access clipboard")
|
||||
return nil
|
||||
}
|
||||
@ -135,7 +123,7 @@ func (h *MessageHandler) controlClipboard(id string, session types.Session, payl
|
||||
|
||||
func (h *MessageHandler) controlKeyboard(id string, session types.Session, payload *message.Keyboard) error {
|
||||
// check if session can control keyboard
|
||||
if (!h.webrtc.ImplicitControl() && !h.sessions.IsHost(id)) || (h.webrtc.ImplicitControl() && !h.sessions.CanControl(id)) {
|
||||
if (!h.webrtc.ImplicitControl() && !h.sessions.IsHost(id)) || h.webrtc.ImplicitControl() {
|
||||
h.logger.Debug().Str("id", id).Msg("cannot control keyboard")
|
||||
return nil
|
||||
}
|
||||
|
@ -50,11 +50,6 @@ func (h *MessageHandler) Connected(admin bool, address string) (bool, string) {
|
||||
}
|
||||
}
|
||||
|
||||
if h.state.IsLocked("login") && !admin {
|
||||
h.logger.Debug().Msg("server locked")
|
||||
return false, "locked"
|
||||
}
|
||||
|
||||
return true, ""
|
||||
}
|
||||
|
||||
@ -155,18 +150,6 @@ func (h *MessageHandler) Message(id string, raw []byte) error {
|
||||
return errors.Wrapf(h.boradcastDestroy(session), "%s failed", header.Event)
|
||||
|
||||
// Admin Events
|
||||
case event.ADMIN_LOCK:
|
||||
payload := &message.AdminLock{}
|
||||
return errors.Wrapf(
|
||||
utils.Unmarshal(payload, raw, func() error {
|
||||
return h.adminLock(id, session, payload)
|
||||
}), "%s failed", header.Event)
|
||||
case event.ADMIN_UNLOCK:
|
||||
payload := &message.AdminLock{}
|
||||
return errors.Wrapf(
|
||||
utils.Unmarshal(payload, raw, func() error {
|
||||
return h.adminUnlock(id, session, payload)
|
||||
}), "%s failed", header.Event)
|
||||
case event.ADMIN_CONTROL:
|
||||
return errors.Wrapf(h.adminControl(id, session), "%s failed", header.Event)
|
||||
case event.ADMIN_RELEASE:
|
||||
|
@ -16,7 +16,6 @@ func (h *MessageHandler) SessionCreated(id string, session types.Session) error
|
||||
if err := session.Send(message.SystemInit{
|
||||
Event: event.SYSTEM_INIT,
|
||||
ImplicitHosting: h.webrtc.ImplicitControl(),
|
||||
Locks: h.state.AllLocked(),
|
||||
}); err != nil {
|
||||
h.logger.Warn().Str("id", id).Err(err).Msgf("sending event %s has failed", event.SYSTEM_INIT)
|
||||
return err
|
||||
|
@ -35,27 +35,3 @@ func (s *State) GetBanned(ip string) (string, bool) {
|
||||
func (s *State) AllBanned() map[string]string {
|
||||
return s.banned
|
||||
}
|
||||
|
||||
// Lock
|
||||
|
||||
func (s *State) Lock(resource, id string) {
|
||||
s.locked[resource] = id
|
||||
}
|
||||
|
||||
func (s *State) Unlock(resource string) {
|
||||
delete(s.locked, resource)
|
||||
}
|
||||
|
||||
func (s *State) IsLocked(resource string) bool {
|
||||
_, ok := s.locked[resource]
|
||||
return ok
|
||||
}
|
||||
|
||||
func (s *State) GetLocked(resource string) (string, bool) {
|
||||
id, ok := s.locked[resource]
|
||||
return id, ok
|
||||
}
|
||||
|
||||
func (s *State) AllLocked() map[string]string {
|
||||
return s.locked
|
||||
}
|
||||
|
@ -25,15 +25,6 @@ func New(sessions types.SessionManager, desktop types.DesktopManager, capture ty
|
||||
|
||||
state := state.New()
|
||||
|
||||
// apply default locks
|
||||
for _, lock := range conf.Locks {
|
||||
state.Lock(lock, "") // empty session ID
|
||||
}
|
||||
|
||||
if len(conf.Locks) > 0 {
|
||||
logger.Info().Msgf("locked resources: %+v", conf.Locks)
|
||||
}
|
||||
|
||||
handler := handler.New(
|
||||
sessions,
|
||||
desktop,
|
||||
@ -261,7 +252,6 @@ func (ws *WebSocketHandler) Stats() types.Stats {
|
||||
Members: ws.sessions.Members(),
|
||||
|
||||
Banned: ws.state.AllBanned(),
|
||||
Locked: ws.state.AllLocked(),
|
||||
|
||||
ServerStartedAt: ws.serverStartedAt,
|
||||
LastAdminLeftAt: ws.lastAdminLeftAt,
|
||||
@ -271,10 +261,6 @@ func (ws *WebSocketHandler) Stats() types.Stats {
|
||||
}
|
||||
}
|
||||
|
||||
func (ws *WebSocketHandler) IsLocked(resource string) bool {
|
||||
return ws.state.IsLocked(resource)
|
||||
}
|
||||
|
||||
func (ws *WebSocketHandler) IsAdmin(password string) (bool, error) {
|
||||
if password == ws.conf.AdminPassword {
|
||||
return true, nil
|
||||
|
Reference in New Issue
Block a user