Fix filling presence db, fix ban by useragent
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user