forked from External/grumble
Clean up channel handling.
This commit is contained in:
parent
3eca9a9d3e
commit
4e95d40645
5 changed files with 42 additions and 45 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
22
message.go
22
message.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
48
server.go
48
server.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue