Fix to not reveal channel key to nonmembers
MODE queries were revealing channel key to non-members, now they will just be allowed to see if a key is required to join, but not see the key
This commit is contained in:
		
							parent
							
								
									1b0553da10
								
							
						
					
					
						commit
						9e0c276783
					
				
							
								
								
									
										81
									
								
								channel.go
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								channel.go
									
									
									
									
									
								
							@ -83,21 +83,6 @@ func (c *Channel) Join(client *Client, key string) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetKey sets the channel key
 | 
					 | 
				
			||||||
func (c *Channel) SetKey(key string) {
 | 
					 | 
				
			||||||
	c.AddModeWithValue(ChannelModeKey, key)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetKey gets the key for the channel
 | 
					 | 
				
			||||||
func (c *Channel) GetKey() string {
 | 
					 | 
				
			||||||
	val := c.GetMode(ChannelModeKey)
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return val.(string)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Names responds to to IRC NAMES command for the channel
 | 
					// Names responds to to IRC NAMES command for the channel
 | 
				
			||||||
func (c *Channel) Names(client *Client) {
 | 
					func (c *Channel) Names(client *Client) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -395,72 +380,6 @@ func (c *Channel) TopicCommand(client *Client, topic string) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddBanMask sets the channel ban mask
 | 
					 | 
				
			||||||
func (c *Channel) AddBanMask(mask string) {
 | 
					 | 
				
			||||||
	masks := c.GetBanMasks()
 | 
					 | 
				
			||||||
	masks[mask] = nil
 | 
					 | 
				
			||||||
	c.AddModeWithValue(ChannelModeBan, masks)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetBanMasks gets the ban masks for the channel
 | 
					 | 
				
			||||||
func (c *Channel) GetBanMasks() map[string]interface{} {
 | 
					 | 
				
			||||||
	val := c.GetMode(ChannelModeBan)
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return make(map[string]interface{}, 0)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return val.(map[string]interface{})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AddExceptionMask sets the channel exception mask
 | 
					 | 
				
			||||||
func (c *Channel) AddExceptionMask(mask string) {
 | 
					 | 
				
			||||||
	masks := c.GetExceptionMasks()
 | 
					 | 
				
			||||||
	masks[mask] = nil
 | 
					 | 
				
			||||||
	c.AddModeWithValue(ChannelModeExceptionMask, masks)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetExceptionMasks gets the exception masks for the channel
 | 
					 | 
				
			||||||
func (c *Channel) GetExceptionMasks() map[string]interface{} {
 | 
					 | 
				
			||||||
	val := c.GetMode(ChannelModeExceptionMask)
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return make(map[string]interface{}, 0)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return val.(map[string]interface{})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AddInvitationMask sets the channel invitation mask
 | 
					 | 
				
			||||||
func (c *Channel) AddInvitationMask(mask string) {
 | 
					 | 
				
			||||||
	masks := c.GetInvitationMasks()
 | 
					 | 
				
			||||||
	masks[mask] = nil
 | 
					 | 
				
			||||||
	c.AddModeWithValue(ChannelModeInvitationMask, masks)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetInvitationMasks gets the invitation masks for the channel
 | 
					 | 
				
			||||||
func (c *Channel) GetInvitationMasks() map[string]interface{} {
 | 
					 | 
				
			||||||
	val := c.GetMode(ChannelModeInvitationMask)
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return make(map[string]interface{}, 0)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return val.(map[string]interface{})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetLimit sets the channel member limit
 | 
					 | 
				
			||||||
func (c *Channel) SetLimit(limit int) {
 | 
					 | 
				
			||||||
	c.AddModeWithValue(ChannelModeLimit, limit)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetLimit gets the member limit for the channel
 | 
					 | 
				
			||||||
func (c *Channel) GetLimit() int {
 | 
					 | 
				
			||||||
	val := c.GetMode(ChannelModeLimit)
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return val.(int)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ListMessage creates and returns the message that should be sent for an IRC LIST query
 | 
					// ListMessage creates and returns the message that should be sent for an IRC LIST query
 | 
				
			||||||
func (c *Channel) ListMessage(client *Client) (m *irc.Message) {
 | 
					func (c *Channel) ListMessage(client *Client) (m *irc.Message) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -322,7 +322,7 @@ func WhoHandler(message *irc.Message, client *Client) {
 | 
				
			|||||||
		for clientName := range ch.members {
 | 
							for clientName := range ch.members {
 | 
				
			||||||
			cl, found := client.Server.GetClientByNick(clientName)
 | 
								cl, found := client.Server.GetClientByNick(clientName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if found {
 | 
								if found && !client.HasMode(UserModeInvisible) {
 | 
				
			||||||
				msg := whoLine(cl, ch, client.Nickname)
 | 
									msg := whoLine(cl, ch, client.Nickname)
 | 
				
			||||||
				m := irc.Message{Prefix: client.Server.Prefix, Command: irc.RPL_WHOREPLY, Params: strings.Fields(msg)}
 | 
									m := irc.Message{Prefix: client.Server.Prefix, Command: irc.RPL_WHOREPLY, Params: strings.Fields(msg)}
 | 
				
			||||||
				client.Encode(&m)
 | 
									client.Encode(&m)
 | 
				
			||||||
@ -523,7 +523,11 @@ func ChannelModeHandler(message *irc.Message, client *Client) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if len(message.Params) == 1 { // just channel name is provided
 | 
						if len(message.Params) == 1 { // just channel name is provided
 | 
				
			||||||
		// return current settings for this channel
 | 
							// return current settings for this channel
 | 
				
			||||||
		m := irc.Message{Prefix: client.Server.Prefix, Command: irc.RPL_CHANNELMODEIS, Params: []string{client.Nickname, channel.Name, channel.ChannelModeSet.String()}}
 | 
							modes := channel.ChannelModeSet.Copy()
 | 
				
			||||||
 | 
							if !channel.HasMember(client) { // only current members should see the channel key
 | 
				
			||||||
 | 
								modes.SetKey("")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							m := irc.Message{Prefix: client.Server.Prefix, Command: irc.RPL_CHANNELMODEIS, Params: []string{client.Nickname, channel.Name, modes.String()}}
 | 
				
			||||||
		client.Encode(&m)
 | 
							client.Encode(&m)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										93
									
								
								modes.go
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								modes.go
									
									
									
									
									
								
							@ -126,6 +126,16 @@ func NewChannelModeSet() *ChannelModeSet {
 | 
				
			|||||||
	return &c
 | 
						return &c
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copy creates and returns a deep copy of a ChannelModeSet
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) Copy() *ChannelModeSet {
 | 
				
			||||||
 | 
						tmp := NewChannelModeSet()
 | 
				
			||||||
 | 
						for k, v := range c.modes {
 | 
				
			||||||
 | 
							tmp.modes[k] = v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return tmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddMode adds a ChannelMode as active
 | 
					// AddMode adds a ChannelMode as active
 | 
				
			||||||
func (c *ChannelModeSet) AddMode(mode ChannelMode) {
 | 
					func (c *ChannelModeSet) AddMode(mode ChannelMode) {
 | 
				
			||||||
	c.mutex.Lock()
 | 
						c.mutex.Lock()
 | 
				
			||||||
@ -135,7 +145,7 @@ func (c *ChannelModeSet) AddMode(mode ChannelMode) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddModeWithValue adds a ChannelMode as active with a value
 | 
					// AddModeWithValue adds a ChannelMode as active with a value
 | 
				
			||||||
func (c *Channel) AddModeWithValue(mode ChannelMode, value interface{}) {
 | 
					func (c *ChannelModeSet) AddModeWithValue(mode ChannelMode, value interface{}) {
 | 
				
			||||||
	c.mutex.Lock()
 | 
						c.mutex.Lock()
 | 
				
			||||||
	defer c.mutex.Unlock()
 | 
						defer c.mutex.Unlock()
 | 
				
			||||||
	c.modes[mode] = value
 | 
						c.modes[mode] = value
 | 
				
			||||||
@ -189,3 +199,84 @@ func (c *ChannelModeSet) String() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return s
 | 
						return s
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AddBanMask sets the channel ban mask
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) AddBanMask(mask string) {
 | 
				
			||||||
 | 
						masks := c.GetBanMasks()
 | 
				
			||||||
 | 
						masks[mask] = nil
 | 
				
			||||||
 | 
						c.AddModeWithValue(ChannelModeBan, masks)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetBanMasks gets the ban masks for the channel
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) GetBanMasks() map[string]interface{} {
 | 
				
			||||||
 | 
						val := c.GetMode(ChannelModeBan)
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return make(map[string]interface{}, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return val.(map[string]interface{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AddExceptionMask sets the channel exception mask
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) AddExceptionMask(mask string) {
 | 
				
			||||||
 | 
						masks := c.GetExceptionMasks()
 | 
				
			||||||
 | 
						masks[mask] = nil
 | 
				
			||||||
 | 
						c.AddModeWithValue(ChannelModeExceptionMask, masks)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetExceptionMasks gets the exception masks for the channel
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) GetExceptionMasks() map[string]interface{} {
 | 
				
			||||||
 | 
						val := c.GetMode(ChannelModeExceptionMask)
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return make(map[string]interface{}, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return val.(map[string]interface{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AddInvitationMask sets the channel invitation mask
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) AddInvitationMask(mask string) {
 | 
				
			||||||
 | 
						masks := c.GetInvitationMasks()
 | 
				
			||||||
 | 
						masks[mask] = nil
 | 
				
			||||||
 | 
						c.AddModeWithValue(ChannelModeInvitationMask, masks)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetInvitationMasks gets the invitation masks for the channel
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) GetInvitationMasks() map[string]interface{} {
 | 
				
			||||||
 | 
						val := c.GetMode(ChannelModeInvitationMask)
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return make(map[string]interface{}, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return val.(map[string]interface{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetLimit sets the channel member limit
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) SetLimit(limit int) {
 | 
				
			||||||
 | 
						c.AddModeWithValue(ChannelModeLimit, limit)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetLimit gets the member limit for the channel
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) GetLimit() int {
 | 
				
			||||||
 | 
						val := c.GetMode(ChannelModeLimit)
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return val.(int)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetKey sets the channel key
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) SetKey(key string) {
 | 
				
			||||||
 | 
						c.AddModeWithValue(ChannelModeKey, key)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetKey gets the key if stored in the ChannelModeSet
 | 
				
			||||||
 | 
					func (c *ChannelModeSet) GetKey() string {
 | 
				
			||||||
 | 
						val := c.GetMode(ChannelModeKey)
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return val.(string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user