mirror of
https://github.com/ergochat/ergo.git
synced 2025-12-20 02:00:11 -08:00
fix #1003
This commit is contained in:
parent
21958768d8
commit
be0dedf260
12 changed files with 199 additions and 437 deletions
|
|
@ -7,14 +7,12 @@ package irc
|
|||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/goshuirc/irc-go/ircmatch"
|
||||
|
||||
"github.com/oragono/oragono/irc/caps"
|
||||
"github.com/oragono/oragono/irc/modes"
|
||||
|
||||
"sync"
|
||||
"github.com/oragono/oragono/irc/utils"
|
||||
)
|
||||
|
||||
// ClientManager keeps track of clients by nick, enforcing uniqueness of casefolded nicks
|
||||
|
|
@ -301,12 +299,16 @@ func (clients *ClientManager) FindAll(userhost string) (set ClientSet) {
|
|||
if err != nil {
|
||||
return set
|
||||
}
|
||||
matcher := ircmatch.MakeMatch(userhost)
|
||||
matcher, err := utils.CompileGlob(userhost, false)
|
||||
if err != nil {
|
||||
// not much we can do here
|
||||
return
|
||||
}
|
||||
|
||||
clients.RLock()
|
||||
defer clients.RUnlock()
|
||||
for _, client := range clients.byNick {
|
||||
if matcher.Match(client.NickMaskCasefolded()) {
|
||||
if matcher.MatchString(client.NickMaskCasefolded()) {
|
||||
set.Add(client)
|
||||
}
|
||||
}
|
||||
|
|
@ -330,8 +332,9 @@ type MaskInfo struct {
|
|||
// UserMaskSet holds a set of client masks and lets you match hostnames to them.
|
||||
type UserMaskSet struct {
|
||||
sync.RWMutex
|
||||
masks map[string]MaskInfo
|
||||
regexp *regexp.Regexp
|
||||
serialCacheUpdateMutex sync.Mutex
|
||||
masks map[string]MaskInfo
|
||||
regexp *regexp.Regexp
|
||||
}
|
||||
|
||||
func NewUserMaskSet() *UserMaskSet {
|
||||
|
|
@ -345,6 +348,9 @@ func (set *UserMaskSet) Add(mask, creatorNickmask, creatorAccount string) (maskA
|
|||
return
|
||||
}
|
||||
|
||||
set.serialCacheUpdateMutex.Lock()
|
||||
defer set.serialCacheUpdateMutex.Unlock()
|
||||
|
||||
set.Lock()
|
||||
if set.masks == nil {
|
||||
set.masks = make(map[string]MaskInfo)
|
||||
|
|
@ -373,6 +379,9 @@ func (set *UserMaskSet) Remove(mask string) (maskRemoved string, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
set.serialCacheUpdateMutex.Lock()
|
||||
defer set.serialCacheUpdateMutex.Unlock()
|
||||
|
||||
set.Lock()
|
||||
_, removed := set.masks[mask]
|
||||
if removed {
|
||||
|
|
@ -430,31 +439,14 @@ func (set *UserMaskSet) Length() int {
|
|||
// parts are re-joined and finally all masks are joined into a big
|
||||
// or-expression.
|
||||
func (set *UserMaskSet) setRegexp() {
|
||||
var re *regexp.Regexp
|
||||
|
||||
set.RLock()
|
||||
maskExprs := make([]string, len(set.masks))
|
||||
index := 0
|
||||
for mask := range set.masks {
|
||||
manyParts := strings.Split(mask, "*")
|
||||
manyExprs := make([]string, len(manyParts))
|
||||
for mindex, manyPart := range manyParts {
|
||||
oneParts := strings.Split(manyPart, "?")
|
||||
oneExprs := make([]string, len(oneParts))
|
||||
for oindex, onePart := range oneParts {
|
||||
oneExprs[oindex] = regexp.QuoteMeta(onePart)
|
||||
}
|
||||
manyExprs[mindex] = strings.Join(oneExprs, ".")
|
||||
}
|
||||
maskExprs[index] = strings.Join(manyExprs, ".*")
|
||||
index++
|
||||
maskExprs = append(maskExprs, mask)
|
||||
}
|
||||
set.RUnlock()
|
||||
|
||||
if index > 0 {
|
||||
expr := "^(" + strings.Join(maskExprs, "|") + ")$"
|
||||
re, _ = regexp.Compile(expr)
|
||||
}
|
||||
re, _ := utils.CompileMasks(maskExprs)
|
||||
|
||||
set.Lock()
|
||||
set.regexp = re
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue