Merge branch 'plugin-377' into 'master'
Add a plugin for XEP-0377: spam reporting See merge request poezio/slixmpp!53
This commit is contained in:
commit
6f4e9b485f
5 changed files with 183 additions and 0 deletions
|
@ -85,6 +85,7 @@ __all__ = [
|
||||||
'xep_0323', # IoT Systems Sensor Data
|
'xep_0323', # IoT Systems Sensor Data
|
||||||
'xep_0325', # IoT Systems Control
|
'xep_0325', # IoT Systems Control
|
||||||
'xep_0332', # HTTP Over XMPP Transport
|
'xep_0332', # HTTP Over XMPP Transport
|
||||||
|
'xep_0377', # Spam reporting
|
||||||
'protoxep_reactions', # https://dino.im/xeps/reactions.html
|
'protoxep_reactions', # https://dino.im/xeps/reactions.html
|
||||||
'protoxep_occupantid', # https://dino.im/xeps/occupant-id.html
|
'protoxep_occupantid', # https://dino.im/xeps/occupant-id.html
|
||||||
]
|
]
|
||||||
|
|
15
slixmpp/plugins/xep_0377/__init__.py
Normal file
15
slixmpp/plugins/xep_0377/__init__.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
"""
|
||||||
|
Slixmpp: The Slick XMPP Library
|
||||||
|
Copyright (C) 2020 Mathieu Pasquet
|
||||||
|
This file is part of Slixmpp.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from slixmpp.plugins.base import register_plugin
|
||||||
|
|
||||||
|
from slixmpp.plugins.xep_0377.stanza import Report, Text
|
||||||
|
from slixmpp.plugins.xep_0377.spam_reporting import XEP_0377
|
||||||
|
|
||||||
|
|
||||||
|
register_plugin(XEP_0377)
|
41
slixmpp/plugins/xep_0377/spam_reporting.py
Normal file
41
slixmpp/plugins/xep_0377/spam_reporting.py
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
"""
|
||||||
|
Slixmpp: The Slick XMPP Library
|
||||||
|
Copyright (C) 2020 Mathieu Pasquet
|
||||||
|
This file is part of Slixmpp.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import slixmpp
|
||||||
|
from slixmpp import Message
|
||||||
|
from slixmpp.plugins import BasePlugin
|
||||||
|
from slixmpp.xmlstream import register_stanza_plugin
|
||||||
|
from slixmpp.xmlstream.handler import Callback
|
||||||
|
from slixmpp.xmlstream.matcher import StanzaPath
|
||||||
|
from slixmpp.plugins.xep_0377 import stanza
|
||||||
|
from slixmpp.plugins.xep_0191 import Block
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class XEP_0377(BasePlugin):
|
||||||
|
"""XEP-0377: Spam reporting"""
|
||||||
|
|
||||||
|
name = 'xep_0377'
|
||||||
|
description = 'XEP-0377: Spam Reporting'
|
||||||
|
dependencies = {'xep_0030', 'xep_0191'}
|
||||||
|
stanza = stanza
|
||||||
|
|
||||||
|
def plugin_init(self):
|
||||||
|
register_stanza_plugin(Block, stanza.Report)
|
||||||
|
register_stanza_plugin(stanza.Report, stanza.Text)
|
||||||
|
|
||||||
|
def plugin_end(self):
|
||||||
|
self.xmpp['xep_0030'].del_feature(feature=stanza.Report.namespace)
|
||||||
|
|
||||||
|
def session_bind(self, jid):
|
||||||
|
self.xmpp['xep_0030'].add_feature(stanza.Report.namespace)
|
||||||
|
|
70
slixmpp/plugins/xep_0377/stanza.py
Normal file
70
slixmpp/plugins/xep_0377/stanza.py
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
"""
|
||||||
|
Slixmpp: The Slick XMPP Library
|
||||||
|
Copyright (C) 2020 Mathieu Pasquet
|
||||||
|
This file is part of Slixmpp.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from slixmpp.xmlstream import ET, ElementBase
|
||||||
|
|
||||||
|
|
||||||
|
class Report(ElementBase):
|
||||||
|
"""
|
||||||
|
A spam/abuse report.
|
||||||
|
|
||||||
|
Example sub stanza:
|
||||||
|
|
||||||
|
<report xmlns="urn:xmpp:reporting:0">
|
||||||
|
<text xml:lang="en">
|
||||||
|
Never came trouble to my house like this.
|
||||||
|
</text>
|
||||||
|
<spam/>
|
||||||
|
</report>
|
||||||
|
|
||||||
|
Stanza Interface:
|
||||||
|
abuse -- Flag the report as abuse
|
||||||
|
spam -- Flag the report as spam
|
||||||
|
text -- Add a reason to the report
|
||||||
|
|
||||||
|
Only one <spam/> or <abuse/> element can be present at once.
|
||||||
|
"""
|
||||||
|
name = "report"
|
||||||
|
namespace = "urn:xmpp:reporting:0"
|
||||||
|
plugin_attrib = "report"
|
||||||
|
interfaces = ("spam", "abuse", "text")
|
||||||
|
sub_interfaces = {'text'}
|
||||||
|
|
||||||
|
def _purge_spam(self):
|
||||||
|
spam = self.xml.findall('{%s}spam' % self.namespace)
|
||||||
|
for element in spam:
|
||||||
|
self.xml.remove(element)
|
||||||
|
|
||||||
|
def _purge_abuse(self):
|
||||||
|
abuse = self.xml.findall('{%s}abuse' % self.namespace)
|
||||||
|
for element in abuse:
|
||||||
|
self.xml.remove(element)
|
||||||
|
|
||||||
|
def get_spam(self):
|
||||||
|
return self.xml.find('{%s}spam' % self.namespace) is not None
|
||||||
|
|
||||||
|
def set_spam(self, value):
|
||||||
|
self._purge_spam()
|
||||||
|
if bool(value):
|
||||||
|
self._purge_abuse()
|
||||||
|
self.xml.append(ET.Element('{%s}spam' % self.namespace))
|
||||||
|
|
||||||
|
def get_abuse(self):
|
||||||
|
return self.xml.find('{%s}abuse' % self.namespace) is not None
|
||||||
|
|
||||||
|
def set_abuse(self, value):
|
||||||
|
self._purge_abuse()
|
||||||
|
if bool(value):
|
||||||
|
self._purge_spam()
|
||||||
|
self.xml.append(ET.Element('{%s}abuse' % self.namespace))
|
||||||
|
|
||||||
|
|
||||||
|
class Text(ElementBase):
|
||||||
|
name = "text"
|
||||||
|
plugin_attrib = "text"
|
||||||
|
namespace = "urn:xmpp:reporting:0"
|
56
tests/test_stanza_xep_0377.py
Normal file
56
tests/test_stanza_xep_0377.py
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
import unittest
|
||||||
|
from slixmpp import Iq
|
||||||
|
from slixmpp.test import SlixTest
|
||||||
|
import slixmpp.plugins.xep_0191 as xep_0191
|
||||||
|
import slixmpp.plugins.xep_0377 as xep_0377
|
||||||
|
from slixmpp.xmlstream import register_stanza_plugin
|
||||||
|
|
||||||
|
|
||||||
|
class TestSpamReporting(SlixTest):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
register_stanza_plugin(Iq, xep_0191.Block)
|
||||||
|
register_stanza_plugin(
|
||||||
|
xep_0191.Block,
|
||||||
|
xep_0377.Report,
|
||||||
|
)
|
||||||
|
register_stanza_plugin(
|
||||||
|
xep_0377.Report,
|
||||||
|
xep_0377.Text,
|
||||||
|
)
|
||||||
|
|
||||||
|
def testCreateReport(self):
|
||||||
|
report = """
|
||||||
|
<iq type="set">
|
||||||
|
<block xmlns="urn:xmpp:blocking">
|
||||||
|
<report xmlns="urn:xmpp:reporting:0">
|
||||||
|
<spam/>
|
||||||
|
</report>
|
||||||
|
</block>
|
||||||
|
</iq>
|
||||||
|
"""
|
||||||
|
|
||||||
|
iq = self.Iq()
|
||||||
|
iq['type'] = 'set'
|
||||||
|
iq['block']['report']['spam'] = True
|
||||||
|
|
||||||
|
self.check(iq, report)
|
||||||
|
|
||||||
|
def testEnforceOnlyOneSubElement(self):
|
||||||
|
report = """
|
||||||
|
<iq type="set">
|
||||||
|
<block xmlns="urn:xmpp:blocking">
|
||||||
|
<report xmlns="urn:xmpp:reporting:0">
|
||||||
|
<abuse/>
|
||||||
|
</report>
|
||||||
|
</block>
|
||||||
|
</iq>
|
||||||
|
"""
|
||||||
|
|
||||||
|
iq = self.Iq()
|
||||||
|
iq['type'] = 'set'
|
||||||
|
iq['block']['report']['spam'] = True
|
||||||
|
iq['block']['report']['abuse'] = True
|
||||||
|
self.check(iq, report)
|
||||||
|
|
||||||
|
suite = unittest.TestLoader().loadTestsFromTestCase(TestSpamReporting)
|
Loading…
Reference in a new issue