[WIP] Fix ban by software version, some other under-hood changes

- Use updated version of upstream go-xmpp + fixes on client-side
- Introduce golangci-lint v2 + fixes
- Move especially noisy debugging stuff to separate config handles to be able to switch them off
- Add a bit debug to ban by software path
This commit is contained in:
eleksir
2025-11-30 14:19:01 +03:00
parent a128b473ff
commit 3d85dbcb58
55 changed files with 4165 additions and 13190 deletions

View File

@@ -9,7 +9,7 @@ import (
"strings"
"github.com/davecgh/go-spew/spew"
"github.com/eleksir/go-xmpp"
"github.com/xmppo/go-xmpp"
)
// BunyPresense производит проверку по бело-чёрным спискам. Если presence пришёл от злодея (из чёрного списка), то
@@ -28,7 +28,11 @@ func (j *Jabber) BunyPresense(v xmpp.Presence) error { //nolint:gocognit,gocyclo
room := strings.SplitN(v.From, "/", 2)[0]
if room == "" {
log.Infof("We got empty room field in presence event, which kinda strange: %s", spew.Sdump(v))
msg := "We got empty room field in presence event, which kinda strange: " + spew.Sdump(v)
for str := range strings.SplitSeq(msg, "\n") {
log.Info(str)
}
return err
}
@@ -419,32 +423,42 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
_ = json.Unmarshal([]byte(presenceJSONString), &p)
if p.Affiliation == "admin" || p.Affiliation == "owner" {
log.Infof("Skipping useragent blacklist check for %s because his affiliation is %s", v.From, p.Affiliation)
continue
}
// На всякий случай.
if p.Role == "moderator" {
log.Infof("Skipping useragent blacklist check for %s because his role is %s", v.From, p.Role)
continue
}
if v.From == p.From {
log.Errorf("Found jid of %s in presence db: %s", v.From, p.JID)
log.Infof("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)
continue
}
// На всякий случай.
if p.Role == "moderator" {
log.Infof("Skipping useragent blacklist check for %s because his role is %s", v.From, p.Role)
continue
}
log.Debug("Useragent is not owner or moderator, proceeding with check...")
// Lookup in global blacklist.
log.Debug("Find our room in connected room list...")
for _, cRoom := range j.RoomsConnected {
if cRoom == room {
log.Debug("Found our room in list of connected rooms")
for _, bEntry := range j.BlackList.Blacklist {
// Обработаем правила глобального чёрного списка.
if bEntry.RoomName == "" {
log.Debugf("Check in global blacklist")
for _, useragent := range bEntry.UserAgent {
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")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -462,6 +476,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
case useragent.Name != "" && useragent.Version != "":
if ver.Name == useragent.Name && ver.Version == useragent.Version {
log.Debug("Found sw name and version in blacklist, it is ban")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -479,6 +495,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
case useragent.Name != "":
if ver.Name == useragent.Name {
log.Debug("Found sw name in blacklist, it is ban")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -496,6 +514,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
case useragent.Version != "":
if ver.Version == useragent.Version {
log.Debug("Found sw version in blacklist, it is ban")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -515,10 +535,14 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
}
if bEntry.RoomName == room {
log.Debug("Found blacklist entries for room")
for _, useragent := range bEntry.UserAgent {
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")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -536,6 +560,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
case useragent.Name != "" && useragent.Version != "":
if ver.Name == useragent.Name && ver.Version == useragent.Version {
log.Debug("Found sw name and version in blacklist, it is ban")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -553,6 +579,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
case useragent.Name != "":
if ver.Name == useragent.Name {
log.Debug("Found sw name in blacklist, it is ban")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {
@@ -570,6 +598,8 @@ func (j *Jabber) BunySoftwareVersion(v xmpp.IQ, ver IqResultSoftwareVersion) err
case useragent.Version != "":
if ver.Version == useragent.Version {
log.Debug("Found sw version in blacklist, it is ban")
id, err := j.Squash(room, p.JID, bEntry.ReasonEnable, v.Type)
if err != nil {