about summary refs log tree commit diff stats
path: root/src/xmpp
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2021-06-30 23:42:32 +0200
committerMichael Vetter <jubalh@iodoru.org>2021-07-01 00:14:32 +0200
commit31ebd6ab1cb464c66b1555e5d78896a46d092cc9 (patch)
tree674b49364a0e962c2b836f0fc36c5e38500f4511 /src/xmpp
parentdc79c514be403cff93a1165b47d456182a03fd05 (diff)
downloadprofani-tty-31ebd6ab1cb464c66b1555e5d78896a46d092cc9.tar.gz
Add XEP-0377: Spam Reporting
Report and block:
`/blocked add someone@domain.org report-abuse This is not nice`
`/blocked add someone@domain.org report-spam This is not nice`

Regular block:
`/blocked add someone@domain.org`

Implement https://github.com/profanity-im/profanity/issues/1434
Diffstat (limited to 'src/xmpp')
-rw-r--r--src/xmpp/blocking.c27
-rw-r--r--src/xmpp/stanza.h4
-rw-r--r--src/xmpp/xmpp.h9
3 files changed, 38 insertions, 2 deletions
diff --git a/src/xmpp/blocking.c b/src/xmpp/blocking.c
index 34614679..b16f95cb 100644
--- a/src/xmpp/blocking.c
+++ b/src/xmpp/blocking.c
@@ -109,7 +109,7 @@ blocked_ac_reset(void)
 }
 
 gboolean
-blocked_add(char* jid)
+blocked_add(char* jid, blocked_report reportkind, const char* const message)
 {
     GList* found = g_list_find_custom(blocked, jid, (GCompareFunc)g_strcmp0);
     if (found) {
@@ -129,6 +129,31 @@ blocked_add(char* jid)
     xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
     xmpp_stanza_set_attribute(item, STANZA_ATTR_JID, jid);
 
+    if (reportkind != BLOCKED_NO_REPORT) {
+        xmpp_stanza_t* report = xmpp_stanza_new(ctx);
+        xmpp_stanza_set_name(report, STANZA_NAME_REPORT);
+        if (reportkind == BLOCKED_REPORT_ABUSE) {
+            xmpp_stanza_set_attribute(report, STANZA_ATTR_REASON, STANZA_REPORTING_ABUSE);
+        } else {
+            xmpp_stanza_set_attribute(report, STANZA_ATTR_REASON, STANZA_REPORTING_SPAM);
+        }
+
+        if (message) {
+            xmpp_stanza_t* text = xmpp_stanza_new(ctx);
+            xmpp_stanza_set_name(text, STANZA_NAME_TEXT);
+
+            xmpp_stanza_t* txt = xmpp_stanza_new(ctx);
+            xmpp_stanza_set_text(txt, message);
+
+            xmpp_stanza_add_child(text, txt);
+            xmpp_stanza_add_child(report, text);
+            xmpp_stanza_release(txt);
+        }
+
+        xmpp_stanza_add_child(item, report);
+        xmpp_stanza_release(report);
+    }
+
     xmpp_stanza_add_child(block, item);
     xmpp_stanza_release(item);
 
diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h
index aeddf6a2..47560ce0 100644
--- a/src/xmpp/stanza.h
+++ b/src/xmpp/stanza.h
@@ -122,6 +122,7 @@
 #define STANZA_NAME_AFTER            "after"
 #define STANZA_NAME_USERNAME         "username"
 #define STANZA_NAME_PROPOSE          "propose"
+#define STANZA_NAME_REPORT           "report"
 
 // error conditions
 #define STANZA_NAME_BAD_REQUEST             "bad-request"
@@ -245,6 +246,9 @@
 
 #define STANZA_DATAFORM_SOFTWARE "urn:xmpp:dataforms:softwareinfo"
 
+#define STANZA_REPORTING_ABUSE "urn:xmpp:reporting:abuse"
+#define STANZA_REPORTING_SPAM  "urn:xmpp:reporting:spam"
+
 typedef struct caps_stanza_t
 {
     char* hash;
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index 003c3e07..61c7a642 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -70,6 +70,7 @@
 #define XMPP_FEATURE_USER_AVATAR_METADATA_NOTIFY "urn:xmpp:avatar:metadata+notify"
 #define XMPP_FEATURE_LAST_MESSAGE_CORRECTION     "urn:xmpp:message-correct:0"
 #define XMPP_FEATURE_MAM2                        "urn:xmpp:mam:2"
+#define XMPP_FEATURE_SPAM_REPORTING              "urn:xmpp:reporting:1"
 
 typedef enum {
     JABBER_CONNECTING,
@@ -89,6 +90,12 @@ typedef enum {
     INVITE_MEDIATED
 } jabber_invite_t;
 
+typedef enum {
+    BLOCKED_NO_REPORT,
+    BLOCKED_REPORT_ABUSE,
+    BLOCKED_REPORT_SPAM
+} blocked_report;
+
 typedef struct bookmark_t
 {
     char* barejid;
@@ -286,7 +293,7 @@ void roster_send_add_new(const char* const barejid, const char* const name);
 void roster_send_remove(const char* const barejid);
 
 GList* blocked_list(void);
-gboolean blocked_add(char* jid);
+gboolean blocked_add(char* jid, blocked_report reportkind, const char* const message);
 gboolean blocked_remove(char* jid);
 char* blocked_ac_find(const char* const search_str, gboolean previous, void* context);
 void blocked_ac_reset(void);