Fix filling presence db, fix ban by useragent

This commit is contained in:
eleksir
2025-12-21 19:07:48 +03:00
parent 9ea444f365
commit de3db48d47
7 changed files with 273 additions and 103 deletions

View File

@@ -403,28 +403,42 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
if v.From != "" {
// На всякий случай: себя никогда не баним, явным образом.
if v.From == j.Talk.JID() {
log.Debugf("Skipping useragent blacklist check for myself")
return err
}
room := strings.SplitN(v.From, "/", 2)[0]
var (
presenceJSONStrings []string
)
if presenceJSONInterface, present := j.RoomPresences.Get(room); present {
presenceJSONStrings = InterfaceToStringSlice(presenceJSONInterface)
}
presenceJSON, ok := presenceJSONInterface.([]byte)
log.Debugf("Looking up %s in presence db", v.From)
if !ok {
log.Errorf("Looks like we have corrupted entry in presence db")
for _, presenceJSONString := range presenceJSONStrings {
var p xmpp.Presence
return nil
}
_ = json.Unmarshal([]byte(presenceJSONString), &p)
var presences []xmpp.Presence
if v.From == p.From {
log.Infof("Found jid of %s in presence db: %s", v.From, p.JID)
if err := json.Unmarshal(presenceJSON, &presences); err != nil {
log.Errorf("Looks like we have corrupted entry in presence db")
return nil //nolint: nilerr // Это не критическая ошибка, её не надо возвращать.
}
for _, p := range presences { //nolint: gocritic // Развели тут, блять, страну советов, напиши что надо сделать кодом, сука.
// Если находим, что у нас уже есть клиент с таким же From, то есть полным nick-ом (для groupchat)
// пропускаем его.
if p.From != v.From {
log.Debugf("Skip check for %s because it is not %s", p.From, v.From)
continue
}
if j.C.Debug.PresenceDB {
log.Debugf("Found jid of %s in presence db: %s", v.From, p.JID)
}
if p.Affiliation == "admin" || p.Affiliation == "owner" {
log.Infof("Skipping useragent blacklist check for %s because his affiliation is %s", v.From, p.Affiliation)
@@ -442,7 +456,7 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
log.Debug("Useragent is not owner or moderator, proceeding with check...")
// Lookup in global blacklist.
log.Debug("Find our room in connected room list...")
log.Debug("Searching our room in connected room list...")
for _, cRoom := range j.RoomsConnected {
if cRoom == room {
@@ -452,12 +466,15 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
// Обработаем правила глобального чёрного списка.
if bEntry.RoomName == "" {
log.Debugf("Check in global blacklist")
log.Debugf("We have useragent struct with Name=%s, Version=%s, OS=%s", ver.Name, ver.Version, ver.Os)
for _, useragent := range bEntry.UserAgent {
log.Debugf("We have useragent blacklist entry Name=%s, Version=%s, OS=%s", useragent.Name, useragent.Version, useragent.Os)
switch {
case useragent.Name != "" && useragent.Version != "" && useragent.Os != "":
if ver.Name == useragent.Name && ver.Version == useragent.Version && ver.Os == useragent.Os {
log.Debug("Found all 3 components in black list, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Name, Version and OS match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -474,9 +491,9 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
return err
}
case useragent.Name != "" && useragent.Version != "":
case useragent.Name != "" && useragent.Version != "" && useragent.Os == "":
if ver.Name == useragent.Name && ver.Version == useragent.Version {
log.Debug("Found sw name and version in blacklist, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Name and Version match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -493,9 +510,9 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
return err
}
case useragent.Name != "":
case useragent.Name != "" && useragent.Version == "" && useragent.Os == "":
if ver.Name == useragent.Name {
log.Debug("Found sw name in blacklist, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Name match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -512,9 +529,9 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
return err
}
case useragent.Version != "":
case useragent.Name == "" && useragent.Version != "" && useragent.Os == "":
if ver.Version == useragent.Version {
log.Debug("Found sw version in blacklist, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Version match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -532,16 +549,20 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
}
}
}
log.Debug("No matches in global software versions blacklist")
}
if bEntry.RoomName == room {
log.Debug("Found blacklist entries for room")
for _, useragent := range bEntry.UserAgent {
log.Debugf("We have useragent blacklist entry Name=%s, Version=%s, OS=%s", useragent.Name, useragent.Version, useragent.Os)
switch {
case useragent.Name != "" && useragent.Version != "" && useragent.Os != "":
if ver.Name == useragent.Name && ver.Version == useragent.Version && ver.Os == useragent.Os {
log.Debug("Found all 3 components in black list, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Name, Version and OS match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -558,9 +579,9 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
return err
}
case useragent.Name != "" && useragent.Version != "":
case useragent.Name != "" && useragent.Version != "" && useragent.Os == "":
if ver.Name == useragent.Name && ver.Version == useragent.Version {
log.Debug("Found sw name and version in blacklist, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Name and Version match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -577,9 +598,9 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
return err
}
case useragent.Name != "":
case useragent.Name != "" && useragent.Version == "" && useragent.Os == "":
if ver.Name == useragent.Name {
log.Debug("Found sw name in blacklist, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Name match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -596,9 +617,9 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
return err
}
case useragent.Version != "":
case useragent.Name == "" && useragent.Version != "" && useragent.Os == "":
if ver.Version == useragent.Version {
log.Debug("Found sw version in blacklist, it is ban")
log.Warnf("Hammer falls on %s (%s): Software Version match entry in blacklist", p.From, p.JID)
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
@@ -616,6 +637,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
}
}
}
log.Debugf("No matches in software versions blacklist for %s", room)
}
}
}