Fix various channel freezer bugs.

This commit is contained in:
Mikkel Krautz 2011-11-12 21:08:24 +01:00
parent a42e4d07b4
commit 41689595f2

124
freeze.go
View file

@ -245,52 +245,66 @@ func (c *Channel) Unfreeze(fc *freezer.Channel) {
} }
// Update ACLs // Update ACLs
c.ACL = nil if fc.Acl != nil {
for _, facl := range fc.Acl { c.ACL = nil
acl := NewChannelACL(c) for _, facl := range fc.Acl {
if facl.ApplyHere != nil { acl := NewChannelACL(c)
acl.ApplyHere = *facl.ApplyHere if facl.ApplyHere != nil {
acl.ApplyHere = *facl.ApplyHere
}
if facl.ApplySubs != nil {
acl.ApplySubs = *facl.ApplySubs
}
if facl.UserId != nil {
acl.UserId = int(*facl.UserId)
} else {
acl.UserId = -1
}
if facl.Group != nil {
acl.Group = *facl.Group
}
if facl.Deny != nil {
acl.Deny = Permission(*facl.Deny)
}
if facl.Allow != nil {
acl.Allow = Permission(*facl.Allow)
}
c.ACL = append(c.ACL, acl)
} }
if facl.ApplySubs != nil {
acl.ApplySubs = *facl.ApplySubs
}
if facl.UserId != nil {
acl.UserId = int(*facl.UserId)
} else {
acl.UserId = -1
}
if facl.Group != nil {
acl.Group = *facl.Group
}
if facl.Deny != nil {
acl.Deny = Permission(*facl.Deny)
}
if facl.Allow != nil {
acl.Allow = Permission(*facl.Allow)
}
c.ACL = append(c.ACL, acl)
} }
// Update groups // Update groups
c.Groups = make(map[string]*Group) if fc.Groups != nil {
for _, fgrp := range fc.Groups { c.Groups = make(map[string]*Group)
if fgrp.Name == nil { for _, fgrp := range fc.Groups {
continue if fgrp.Name == nil {
continue
}
g := NewGroup(c, *fgrp.Name)
if fgrp.Inherit != nil {
g.Inherit = *fgrp.Inherit
}
if fgrp.Inheritable != nil {
g.Inheritable = *fgrp.Inheritable
}
for _, uid := range fgrp.Add {
g.Add[int(uid)] = true
}
for _, uid := range fgrp.Remove {
g.Remove[int(uid)] = true
}
c.Groups[g.Name] = g
} }
g := NewGroup(c, *fgrp.Name) }
if fgrp.Inherit != nil {
g.Inherit = *fgrp.Inherit // Hook up links, but make them point to the channel itself.
// We can't be sure that the channels the links point to exist
// yet, so we delay hooking up the map 'correctly' to later.
if fc.Links != nil {
c.Links = make(map[int]*Channel)
for _, link := range fc.Links {
c.Links[int(link)] = c
} }
if fgrp.Inheritable != nil {
g.Inheritable = *fgrp.Inheritable
}
for _, uid := range fgrp.Add {
g.Add[int(uid)] = true
}
for _, uid := range fgrp.Remove {
g.Remove[int(uid)] = true
}
c.Groups[g.Name] = g
} }
} }
@ -588,8 +602,8 @@ func NewServerFromFrozen(name string) (s *Server, err error) {
channelId := int(*fc.Id) channelId := int(*fc.Id)
channel, ok := s.Channels[channelId] channel, alreadyExists := s.Channels[channelId]
if !ok { if !alreadyExists {
if fc.Name == nil { if fc.Name == nil {
log.Printf("Skipped Channel creation log entry: No name given.") log.Printf("Skipped Channel creation log entry: No name given.")
continue continue
@ -610,10 +624,12 @@ func NewServerFromFrozen(name string) (s *Server, err error) {
s.Channels[channelId] = channel s.Channels[channelId] = channel
// Mark the channel's parent // Mark the channel's parent
if fc.ParentId != nil { if !alreadyExists {
parents[*fc.Id] = *fc.ParentId if fc.ParentId != nil {
} else { parents[*fc.Id] = *fc.ParentId
delete(parents, *fc.Id) } else {
delete(parents, *fc.Id)
}
} }
case *freezer.ChannelRemove: case *freezer.ChannelRemove:
@ -657,6 +673,20 @@ func NewServerFromFrozen(name string) (s *Server, err error) {
parentChan.AddChild(childChan) parentChan.AddChild(childChan)
} }
// Hook up all channel links
for _, channel := range s.Channels {
if len(channel.Links) > 0 {
links := channel.Links
channel.Links = make(map[int]*Channel)
for chanId, _ := range links {
targetChannel := s.Channels[chanId]
if targetChannel != nil {
s.LinkChannels(channel, targetChannel)
}
}
}
}
return s, nil return s, nil
} }
@ -717,7 +747,7 @@ func (server *Server) UpdateFrozenChannel(channel *Channel, state *mumbleproto.C
if state.Parent != nil { if state.Parent != nil {
fc.ParentId = state.Parent fc.ParentId = state.Parent
} }
if len(state.LinksAdd) > 0 && len(state.LinksRemove) > 0 { if len(state.LinksAdd) > 0 || len(state.LinksRemove) > 0 {
links := []uint32{} links := []uint32{}
for cid, _ := range channel.Links { for cid, _ := range channel.Links {
links = append(links, uint32(cid)) links = append(links, uint32(cid))