summaryrefslogtreecommitdiffstats
path: root/server/message.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/message.go')
-rw-r--r--server/message.go74
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)
+}