Clean up channel handling.

This commit is contained in:
Mikkel Krautz 2011-05-20 17:27:53 +02:00
parent 3eca9a9d3e
commit 4e95d40645
5 changed files with 42 additions and 45 deletions

View file

@ -538,7 +538,7 @@ func (client *Client) receiver() {
} }
func (client *Client) sendChannelList() { func (client *Client) sendChannelList() {
client.sendChannelTree(client.server.root) client.sendChannelTree(client.server.RootChannel())
} }
func (client *Client) sendChannelTree(channel *Channel) { func (client *Client) sendChannelTree(channel *Channel) {

View file

@ -295,6 +295,10 @@ func NewServerFromFrozen(filename string) (s *Server, err os.Error) {
} }
s.Channels[c.Id] = c s.Channels[c.Id] = c
if c.Id >= s.nextChanId {
s.nextChanId = c.Id + 1
}
} }
// Hook up children with their parents. // Hook up children with their parents.
@ -313,8 +317,6 @@ func NewServerFromFrozen(filename string) (s *Server, err os.Error) {
parentChan.AddChild(childChan) parentChan.AddChild(childChan)
} }
s.root = s.Channels[0]
// Add all users // Add all users
for _, fu := range fs.Users { for _, fu := range fs.Users {
u, err := NewUser(fu.Id, fu.Name) u, err := NewUser(fu.Id, fu.Name)

View file

@ -532,8 +532,8 @@ func (server *Server) handleUserRemoveMessage(client *Client, msg *Message) {
if isBan { if isBan {
perm = Permission(BanPermission) perm = Permission(BanPermission)
} }
if removeClient.IsSuperUser() || !server.HasPermission(client, server.root, perm) { if removeClient.IsSuperUser() || !server.HasPermission(client, server.RootChannel(), perm) {
client.sendPermissionDenied(client, server.root, perm) client.sendPermissionDenied(client, server.RootChannel(), perm)
return return
} }
@ -647,8 +647,8 @@ func (server *Server) handleUserStateMessage(client *Client, msg *Message) {
if target != actor { if target != actor {
// Check if actor has 'move' permissions on the root channel. It is needed // Check if actor has 'move' permissions on the root channel. It is needed
// to clear another user's comment. // to clear another user's comment.
if !server.HasPermission(actor, server.root, MovePermission) { if !server.HasPermission(actor, server.RootChannel(), MovePermission) {
client.sendPermissionDenied(actor, server.root, MovePermission) client.sendPermissionDenied(actor, server.RootChannel(), MovePermission)
return return
} }
@ -676,8 +676,8 @@ func (server *Server) handleUserStateMessage(client *Client, msg *Message) {
perm = Permission(SelfRegisterPermission) perm = Permission(SelfRegisterPermission)
} }
if target.IsRegistered() || !server.HasPermission(actor, server.root, perm) { if target.IsRegistered() || !server.HasPermission(actor, server.RootChannel(), perm) {
client.sendPermissionDenied(actor, server.root, perm) client.sendPermissionDenied(actor, server.RootChannel(), perm)
return return
} }
@ -895,8 +895,8 @@ func (server *Server) handleBanListMessage(client *Client, msg *Message) {
return return
} }
if !server.HasPermission(client, server.root, BanPermission) { if !server.HasPermission(client, server.RootChannel(), BanPermission) {
client.sendPermissionDenied(client, server.root, BanPermission) client.sendPermissionDenied(client, server.RootChannel(), BanPermission)
return return
} }
@ -1283,7 +1283,7 @@ func (server *Server) handleUserStatsMessage(client *Client, msg *Message) {
} }
// Otherwise, only send extended UserStats for people with +register permissions // Otherwise, only send extended UserStats for people with +register permissions
// on the root channel. // on the root channel.
if server.HasPermission(client, server.root, RegisterPermission) { if server.HasPermission(client, server.RootChannel(), RegisterPermission) {
extended = true 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. // Only users who are allowed to register other users can access the user list.
if !server.HasPermission(client, server.root, RegisterPermission) { if !server.HasPermission(client, server.RootChannel(), RegisterPermission) {
client.sendPermissionDenied(client, server.root, RegisterPermission) client.sendPermissionDenied(client, server.RootChannel(), RegisterPermission)
return return
} }

View file

@ -37,17 +37,17 @@ func NewServerFromSQLite(id int64, db *sqlite.Conn) (s *Server, err os.Error) {
return nil, err return nil, err
} }
err = populateChannelInfoFromDatabase(s, s.root, db) err = populateChannelInfoFromDatabase(s, s.RootChannel(), db)
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = populateChannelACLFromDatabase(s, s.root, db) err = populateChannelACLFromDatabase(s, s.RootChannel(), db)
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = populateChannelGroupsFromDatabase(s, s.root, db) err = populateChannelGroupsFromDatabase(s, s.RootChannel(), db)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -252,7 +252,8 @@ func populateChannelsFromDatabase(server *Server, db *sqlite.Conn, parentId int)
return err return err
} }
c := server.NewChannel(chanid, name) c := NewChannel(chanid, name)
server.Channels[c.Id] = c
c.InheritACL = inherit c.InheritACL = inherit
parent.AddChild(c) parent.AddChild(c)
} }

View file

@ -83,9 +83,8 @@ type Server struct {
PreferAlphaCodec bool PreferAlphaCodec bool
// Channels // Channels
chanid int Channels map[int]*Channel
root *Channel nextChanId int
Channels map[int]*Channel
// Administration // Administration
SuperUserPassword string 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.UserNameMap["SuperUser"] = s.Users[0]
s.Channels = make(map[int]*Channel) s.Channels = make(map[int]*Channel)
s.root = s.NewChannel(0, "Root")
s.aclcache = NewACLCache() 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) s.Logger = log.New(os.Stdout, fmt.Sprintf("[%v] ", s.Id), log.Ldate|log.Ltime)
return 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 // Set password as the new SuperUser password
func (server *Server) SetSuperUserPassword(password string) { func (server *Server) SetSuperUserPassword(password string) {
saltBytes := make([]byte, 24) 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. // Add a new channel to the server. Automatically assign it a channel ID.
func (server *Server) AddChannel(name string) (channel *Channel) { func (server *Server) AddChannel(name string) (channel *Channel) {
channel = NewChannel(server.chanid, name) channel = NewChannel(server.nextChanId, name)
server.Channels[channel.Id] = channel server.Channels[channel.Id] = channel
server.nextChanId += 1
return 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 { if err := server.broadcastProtoMessage(MessageUserState, userstate); err != nil {
// Server panic? // Server panic?
} }
@ -637,8 +631,8 @@ func (server *Server) finishAuthenticate(client *Client) {
if client.IsSuperUser() { if client.IsSuperUser() {
sync.Permissions = proto.Uint64(uint64(AllPermissions)) sync.Permissions = proto.Uint64(uint64(AllPermissions))
} else { } else {
server.HasPermission(client, server.root, EnterPermission) server.HasPermission(client, server.RootChannel(), EnterPermission)
perm := server.aclcache.GetPermission(client, server.root) perm := server.aclcache.GetPermission(client, server.RootChannel())
if !perm.IsCached() { if !perm.IsCached() {
client.Panic("Corrupt ACL cache") client.Panic("Corrupt ACL cache")
return return
@ -1100,7 +1094,7 @@ func (s *Server) RemoveRegistration(uid uint32) (err os.Error) {
s.UserNameMap[user.Name] = nil, false s.UserNameMap[user.Name] = nil, false
// Remove from groups and ACLs. // Remove from groups and ACLs.
s.removeRegisteredUserFromChannel(uid, s.root) s.removeRegisteredUserFromChannel(uid, s.RootChannel())
return nil return nil
} }