diff --git a/client.go b/client.go index 12d6212..22185a1 100644 --- a/client.go +++ b/client.go @@ -538,7 +538,7 @@ func (client *Client) receiver() { } func (client *Client) sendChannelList() { - client.sendChannelTree(client.server.root) + client.sendChannelTree(client.server.RootChannel()) } func (client *Client) sendChannelTree(channel *Channel) { diff --git a/freeze.go b/freeze.go index 3394759..83457bd 100644 --- a/freeze.go +++ b/freeze.go @@ -295,6 +295,10 @@ func NewServerFromFrozen(filename string) (s *Server, err os.Error) { } s.Channels[c.Id] = c + + if c.Id >= s.nextChanId { + s.nextChanId = c.Id + 1 + } } // Hook up children with their parents. @@ -313,8 +317,6 @@ func NewServerFromFrozen(filename string) (s *Server, err os.Error) { parentChan.AddChild(childChan) } - s.root = s.Channels[0] - // Add all users for _, fu := range fs.Users { u, err := NewUser(fu.Id, fu.Name) diff --git a/message.go b/message.go index 3524796..4e989f9 100644 --- a/message.go +++ b/message.go @@ -532,8 +532,8 @@ func (server *Server) handleUserRemoveMessage(client *Client, msg *Message) { if isBan { perm = Permission(BanPermission) } - if removeClient.IsSuperUser() || !server.HasPermission(client, server.root, perm) { - client.sendPermissionDenied(client, server.root, perm) + if removeClient.IsSuperUser() || !server.HasPermission(client, server.RootChannel(), perm) { + client.sendPermissionDenied(client, server.RootChannel(), perm) return } @@ -647,8 +647,8 @@ func (server *Server) handleUserStateMessage(client *Client, msg *Message) { if target != actor { // Check if actor has 'move' permissions on the root channel. It is needed // to clear another user's comment. - if !server.HasPermission(actor, server.root, MovePermission) { - client.sendPermissionDenied(actor, server.root, MovePermission) + if !server.HasPermission(actor, server.RootChannel(), MovePermission) { + client.sendPermissionDenied(actor, server.RootChannel(), MovePermission) return } @@ -676,8 +676,8 @@ func (server *Server) handleUserStateMessage(client *Client, msg *Message) { perm = Permission(SelfRegisterPermission) } - if target.IsRegistered() || !server.HasPermission(actor, server.root, perm) { - client.sendPermissionDenied(actor, server.root, perm) + if target.IsRegistered() || !server.HasPermission(actor, server.RootChannel(), perm) { + client.sendPermissionDenied(actor, server.RootChannel(), perm) return } @@ -895,8 +895,8 @@ func (server *Server) handleBanListMessage(client *Client, msg *Message) { return } - if !server.HasPermission(client, server.root, BanPermission) { - client.sendPermissionDenied(client, server.root, BanPermission) + if !server.HasPermission(client, server.RootChannel(), BanPermission) { + client.sendPermissionDenied(client, server.RootChannel(), BanPermission) return } @@ -1283,7 +1283,7 @@ func (server *Server) handleUserStatsMessage(client *Client, msg *Message) { } // Otherwise, only send extended UserStats for people with +register permissions // on the root channel. - if server.HasPermission(client, server.root, RegisterPermission) { + if server.HasPermission(client, server.RootChannel(), RegisterPermission) { extended = true } @@ -1471,8 +1471,8 @@ func (server *Server) handleUserList(client *Client, msg *Message) { } // Only users who are allowed to register other users can access the user list. - if !server.HasPermission(client, server.root, RegisterPermission) { - client.sendPermissionDenied(client, server.root, RegisterPermission) + if !server.HasPermission(client, server.RootChannel(), RegisterPermission) { + client.sendPermissionDenied(client, server.RootChannel(), RegisterPermission) return } diff --git a/murmurdb.go b/murmurdb.go index 10b386a..fd4e342 100644 --- a/murmurdb.go +++ b/murmurdb.go @@ -37,17 +37,17 @@ func NewServerFromSQLite(id int64, db *sqlite.Conn) (s *Server, err os.Error) { return nil, err } - err = populateChannelInfoFromDatabase(s, s.root, db) + err = populateChannelInfoFromDatabase(s, s.RootChannel(), db) if err != nil { return nil, err } - err = populateChannelACLFromDatabase(s, s.root, db) + err = populateChannelACLFromDatabase(s, s.RootChannel(), db) if err != nil { return nil, err } - err = populateChannelGroupsFromDatabase(s, s.root, db) + err = populateChannelGroupsFromDatabase(s, s.RootChannel(), db) if err != nil { return nil, err } @@ -252,7 +252,8 @@ func populateChannelsFromDatabase(server *Server, db *sqlite.Conn, parentId int) return err } - c := server.NewChannel(chanid, name) + c := NewChannel(chanid, name) + server.Channels[c.Id] = c c.InheritACL = inherit parent.AddChild(c) } diff --git a/server.go b/server.go index 09fd023..2d8d92d 100644 --- a/server.go +++ b/server.go @@ -83,9 +83,8 @@ type Server struct { PreferAlphaCodec bool // Channels - chanid int - root *Channel - Channels map[int]*Channel + Channels map[int]*Channel + nextChanId int // Administration SuperUserPassword string @@ -158,14 +157,26 @@ func NewServer(id int64, addr string, port int) (s *Server, err os.Error) { s.UserNameMap["SuperUser"] = s.Users[0] s.Channels = make(map[int]*Channel) - s.root = s.NewChannel(0, "Root") s.aclcache = NewACLCache() + // Create root channel + s.Channels[0] = NewChannel(0, "Root") + s.nextChanId = 1 + s.Logger = log.New(os.Stdout, fmt.Sprintf("[%v] ", s.Id), log.Ldate|log.Ltime) return } +// Get a pointer to the root channel +func (server *Server) RootChannel() *Channel { + root, exists := server.Channels[0] + if !exists { + server.Fatalf("Not Root channel found for server") + } + return root +} + // Set password as the new SuperUser password func (server *Server) SetSuperUserPassword(password string) { saltBytes := make([]byte, 24) @@ -300,28 +311,11 @@ func (server *Server) RemoveClient(client *Client, kicked bool) { } } -// Add an existing channel to the Server. (Do not arbitrarily pick an ID) -func (server *Server) NewChannel(id int, name string) (channel *Channel) { - _, exists := server.Channels[id] - if exists { - // fime(mkrautz): Handle duplicates - return nil - } - - channel = NewChannel(id, name) - server.Channels[id] = channel - - if id > server.chanid { - server.chanid = id + 1 - } - - return -} - // Add a new channel to the server. Automatically assign it a channel ID. func (server *Server) AddChannel(name string) (channel *Channel) { - channel = NewChannel(server.chanid, name) + channel = NewChannel(server.nextChanId, name) server.Channels[channel.Id] = channel + server.nextChanId += 1 return } @@ -623,7 +617,7 @@ func (server *Server) finishAuthenticate(client *Client) { } } - server.userEnterChannel(client, server.root, userstate) + server.userEnterChannel(client, server.RootChannel(), userstate) if err := server.broadcastProtoMessage(MessageUserState, userstate); err != nil { // Server panic? } @@ -637,8 +631,8 @@ func (server *Server) finishAuthenticate(client *Client) { if client.IsSuperUser() { sync.Permissions = proto.Uint64(uint64(AllPermissions)) } else { - server.HasPermission(client, server.root, EnterPermission) - perm := server.aclcache.GetPermission(client, server.root) + server.HasPermission(client, server.RootChannel(), EnterPermission) + perm := server.aclcache.GetPermission(client, server.RootChannel()) if !perm.IsCached() { client.Panic("Corrupt ACL cache") return @@ -1100,7 +1094,7 @@ func (s *Server) RemoveRegistration(uid uint32) (err os.Error) { s.UserNameMap[user.Name] = nil, false // Remove from groups and ACLs. - s.removeRegisteredUserFromChannel(uid, s.root) + s.removeRegisteredUserFromChannel(uid, s.RootChannel()) return nil }