From 41689595f2827a98f5977778055135c73f9006c5 Mon Sep 17 00:00:00 2001 From: Mikkel Krautz Date: Sat, 12 Nov 2011 21:08:24 +0100 Subject: [PATCH] Fix various channel freezer bugs. --- freeze.go | 124 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 47 deletions(-) diff --git a/freeze.go b/freeze.go index 82c5b63..393ee02 100644 --- a/freeze.go +++ b/freeze.go @@ -245,52 +245,66 @@ func (c *Channel) Unfreeze(fc *freezer.Channel) { } // Update ACLs - c.ACL = nil - for _, facl := range fc.Acl { - acl := NewChannelACL(c) - if facl.ApplyHere != nil { - acl.ApplyHere = *facl.ApplyHere + if fc.Acl != nil { + c.ACL = nil + for _, facl := range fc.Acl { + acl := NewChannelACL(c) + 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 - c.Groups = make(map[string]*Group) - for _, fgrp := range fc.Groups { - if fgrp.Name == nil { - continue + if fc.Groups != nil { + c.Groups = make(map[string]*Group) + for _, fgrp := range fc.Groups { + 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) - channel, ok := s.Channels[channelId] - if !ok { + channel, alreadyExists := s.Channels[channelId] + if !alreadyExists { if fc.Name == nil { log.Printf("Skipped Channel creation log entry: No name given.") continue @@ -610,10 +624,12 @@ func NewServerFromFrozen(name string) (s *Server, err error) { s.Channels[channelId] = channel // Mark the channel's parent - if fc.ParentId != nil { - parents[*fc.Id] = *fc.ParentId - } else { - delete(parents, *fc.Id) + if !alreadyExists { + if fc.ParentId != nil { + parents[*fc.Id] = *fc.ParentId + } else { + delete(parents, *fc.Id) + } } case *freezer.ChannelRemove: @@ -657,6 +673,20 @@ func NewServerFromFrozen(name string) (s *Server, err error) { 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 } @@ -717,7 +747,7 @@ func (server *Server) UpdateFrozenChannel(channel *Channel, state *mumbleproto.C if state.Parent != nil { fc.ParentId = state.Parent } - if len(state.LinksAdd) > 0 && len(state.LinksRemove) > 0 { + if len(state.LinksAdd) > 0 || len(state.LinksRemove) > 0 { links := []uint32{} for cid, _ := range channel.Links { links = append(links, uint32(cid))