diff options
| author | bt <bt@rctt.net> | 2026-05-24 21:24:06 +0200 |
|---|---|---|
| committer | bt <bt@rctt.net> | 2026-05-24 21:49:48 +0200 |
| commit | 60c6f3dd306c50bb2330eb09372bd032eaf996eb (patch) | |
| tree | 12918ca48004b3a83dda98c89fdb898870d324c8 /server/message.go | |
| parent | 509bfdbcfc483240f31f9ecd0b4f97dbba96f6f7 (diff) | |
| download | solec-60c6f3dd306c50bb2330eb09372bd032eaf996eb.tar.gz solec-60c6f3dd306c50bb2330eb09372bd032eaf996eb.zip | |
[common] Handle channels using database
Diffstat (limited to 'server/message.go')
| -rw-r--r-- | server/message.go | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/server/message.go b/server/message.go index 19bfadf..801a4cf 100644 --- a/server/message.go +++ b/server/message.go @@ -30,7 +30,7 @@ func (s *Server) SendBroadcast(msg string) { } } -func (s *Server) handleMessage(sender net.Conn, connType core.ConnType, msg core.Message) error { +func (s *Server) handleMessage(sender net.Conn, connType core.ConnType, senderUser *User, msg core.Message) error { if connType == core.ConnTypeUser { msg.Timestamp = time.Now() } @@ -47,34 +47,60 @@ func (s *Server) handleMessage(sender net.Conn, connType core.ConnType, msg core } if addr.Host == s.cfg.Name { - return s.handleLocalMessage(sender, addr, msg) + return s.handleLocalMessage(sender, senderUser, addr, msg) } - return s.handleOutboundMessage(sender, addr, msg) + return s.handleOutboundMessage(addr, msg) } -func (s *Server) handleLocalMessage(sender net.Conn, addr core.Addr, msg core.Message) error { - if addr.Type == core.AddrUser { - s.usersMu.RLock() - user, ok := s.users[addr.Channel] - if !ok { - return core.Send(sender, core.Error{core.ErrorNotFound}) - } - s.usersMu.RUnlock() - return user.Send(sender, msg) +func (s *Server) handleLocalMessage(sender net.Conn, senderUser *User, addr core.Addr, msg core.Message) error { + perm, err := s.Storage.GetPermission(senderUser.Addr, addr.String()) + if err != nil { + log.Println("cannot get channel permissions:", err) + return core.Send(sender, core.Error{core.ErrorNotFound}) } - s.channelsMu.RLock() - channel, ok := s.channels[addr.Channel] - if !ok { + if !perm.Write { + log.Println("user not authorized") return core.Send(sender, core.Error{core.ErrorNotFound}) } - s.channelsMu.RUnlock() - channel.Send(sender, msg) + + if addr.Type == core.AddrUser { + s.handleUserMessage(addr, sender, msg) + return nil + } + + users, err := s.Storage.GetChannelUsers(addr.String()) + if err != nil { + log.Println("cannot get channel users:", err) + return core.Send(sender, core.Error{core.ErrorUnknown}) + } + + for _, u := range users { + addr, err := core.ReadAddr(u) + if err != nil { + log.Println("cannot read user address:", err) + continue + } + + if addr.Host != s.cfg.Name { + err := s.handleOutboundMessage(addr, msg) + if err != nil { + log.Println("cannot send group message to remote user:", err) + } + continue + } + + err = s.handleUserMessage(addr, sender, msg) + if err != nil { + log.Println("cannot send group message to local user:", err) + } + } + return nil } -func (s *Server) handleOutboundMessage(sender net.Conn, addr core.Addr, msg core.Message) error { +func (s *Server) handleOutboundMessage(addr core.Addr, msg core.Message) error { remote, err := s.getRemote(addr.Host) if err != nil { return fmt.Errorf("cannot access remote server: %w", err) @@ -82,3 +108,15 @@ func (s *Server) handleOutboundMessage(sender net.Conn, addr core.Addr, msg core return core.Send(remote.Conn, msg) } + +func (s *Server) handleUserMessage(addr core.Addr, sender net.Conn, msg core.Message) error { + s.usersMu.RLock() + user, ok := s.users[addr.String()] + if !ok { + log.Println("user not found") + return core.Send(sender, core.Error{core.ErrorNotFound}) + } + s.usersMu.RUnlock() + + return user.Send(sender, msg) +} |
