mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Merge pull request #1569 from profanity-im/feature/1434-spam-reporting
Add XEP-0377: Spam Reporting
This commit is contained in:
commit
226cffe75b
@ -951,6 +951,8 @@ cmd_ac_init(void)
|
|||||||
blocked_ac = autocomplete_new();
|
blocked_ac = autocomplete_new();
|
||||||
autocomplete_add(blocked_ac, "add");
|
autocomplete_add(blocked_ac, "add");
|
||||||
autocomplete_add(blocked_ac, "remove");
|
autocomplete_add(blocked_ac, "remove");
|
||||||
|
autocomplete_add(blocked_ac, "report-abuse");
|
||||||
|
autocomplete_add(blocked_ac, "report-spam");
|
||||||
|
|
||||||
clear_ac = autocomplete_new();
|
clear_ac = autocomplete_new();
|
||||||
autocomplete_add(clear_ac, "persist_history");
|
autocomplete_add(clear_ac, "persist_history");
|
||||||
|
@ -420,7 +420,7 @@ static struct cmd_t command_defs[] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
{ "/blocked",
|
{ "/blocked",
|
||||||
parse_args, 0, 2, NULL,
|
parse_args_with_freetext, 0, 3, NULL,
|
||||||
CMD_NOSUBFUNCS
|
CMD_NOSUBFUNCS
|
||||||
CMD_MAINFUNC(cmd_blocked)
|
CMD_MAINFUNC(cmd_blocked)
|
||||||
CMD_TAGS(
|
CMD_TAGS(
|
||||||
@ -429,15 +429,21 @@ static struct cmd_t command_defs[] = {
|
|||||||
CMD_SYN(
|
CMD_SYN(
|
||||||
"/blocked",
|
"/blocked",
|
||||||
"/blocked add [<jid>]",
|
"/blocked add [<jid>]",
|
||||||
|
"/blocked report-abuse [<jid>] [<message>]",
|
||||||
|
"/blocked report-spam [<jid>] [<message>]",
|
||||||
"/blocked remove <jid>")
|
"/blocked remove <jid>")
|
||||||
CMD_DESC(
|
CMD_DESC(
|
||||||
"Manage blocked users (XEP-0191), calling with no arguments shows the current list of blocked users. "
|
"Manage blocked users (XEP-0191), calling with no arguments shows the current list of blocked users. "
|
||||||
"To blog a certain user in a MUC use the following as jid: room@conference.example.org/spammy-user")
|
"To blog a certain user in a MUC use the following as jid: room@conference.example.org/spammy-user"
|
||||||
|
"It is also possible to block and report (XEP-0377) a user with the report-abuse and report-spam commands.")
|
||||||
CMD_ARGS(
|
CMD_ARGS(
|
||||||
{ "add [<jid>]", "Block the specified Jabber ID. If in a chat window and no jid is specified, the current recipient will be blocked." },
|
{ "add [<jid>]", "Block the specified Jabber ID. If in a chat window and no jid is specified, the current recipient will be blocked." },
|
||||||
{ "remove <jid>", "Remove the specified Jabber ID from the blocked list." })
|
{ "remove <jid>", "Remove the specified Jabber ID from the blocked list." },
|
||||||
|
{ "report-abuse <jid> [<message>]", "Report the jid as abuse with an optional message to the service operator." },
|
||||||
|
{ "report-spam <jid> [<message>]", "Report the jid as spam with an optional message to the service operator." })
|
||||||
CMD_EXAMPLES(
|
CMD_EXAMPLES(
|
||||||
"/blocked add hel@helheim.edda",
|
"/blocked add hel@helheim.edda",
|
||||||
|
"/blocked report-spam hel@helheim.edda Very annoying guy",
|
||||||
"/blocked add profanity@rooms.dismail.de/spammy-user")
|
"/blocked add profanity@rooms.dismail.de/spammy-user")
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -3008,12 +3008,17 @@ cmd_blocked(ProfWin* window, const char* const command, gchar** args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!connection_supports(XMPP_FEATURE_BLOCKING)) {
|
if (!connection_supports(XMPP_FEATURE_BLOCKING)) {
|
||||||
cons_show("Blocking not supported by server.");
|
cons_show("Blocking (%s) not supported by server.", XMPP_FEATURE_BLOCKING);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blocked_report br = BLOCKED_NO_REPORT;
|
||||||
|
|
||||||
if (g_strcmp0(args[0], "add") == 0) {
|
if (g_strcmp0(args[0], "add") == 0) {
|
||||||
char* jid = args[1];
|
char* jid = args[1];
|
||||||
|
|
||||||
|
// /blocked add jid or /blocked add (in window)
|
||||||
|
if (g_strv_length(args) < 3) {
|
||||||
if (jid == NULL && (window->type == WIN_CHAT)) {
|
if (jid == NULL && (window->type == WIN_CHAT)) {
|
||||||
ProfChatWin* chatwin = (ProfChatWin*)window;
|
ProfChatWin* chatwin = (ProfChatWin*)window;
|
||||||
jid = chatwin->barejid;
|
jid = chatwin->barejid;
|
||||||
@ -3023,8 +3028,9 @@ cmd_blocked(ProfWin* window, const char* const command, gchar** args)
|
|||||||
cons_bad_cmd_usage(command);
|
cons_bad_cmd_usage(command);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gboolean res = blocked_add(jid);
|
gboolean res = blocked_add(jid, br, NULL);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
cons_show("User %s already blocked.", jid);
|
cons_show("User %s already blocked.", jid);
|
||||||
}
|
}
|
||||||
@ -3046,6 +3052,28 @@ cmd_blocked(ProfWin* window, const char* const command, gchar** args)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strncmp(args[0], "report-", 7) == 0) {
|
||||||
|
if (args[1] && g_strcmp0(args[0], "report-abuse") == 0) {
|
||||||
|
br = BLOCKED_REPORT_ABUSE;
|
||||||
|
} else if (args[1] && g_strcmp0(args[0], "report-spam") == 0) {
|
||||||
|
br = BLOCKED_REPORT_SPAM;
|
||||||
|
} else {
|
||||||
|
cons_bad_cmd_usage(command);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!connection_supports(XMPP_FEATURE_SPAM_REPORTING)) {
|
||||||
|
cons_show("Spam reporting (%s) not supported by server.", XMPP_FEATURE_SPAM_REPORTING);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// args[3] is an optional message
|
||||||
|
gboolean res = blocked_add(args[1], br, args[3]);
|
||||||
|
if (!res) {
|
||||||
|
cons_show("User %s already blocked.", args[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GList* blocked = blocked_list();
|
GList* blocked = blocked_list();
|
||||||
GList* curr = blocked;
|
GList* curr = blocked;
|
||||||
if (curr) {
|
if (curr) {
|
||||||
@ -6497,7 +6525,7 @@ cmd_ping(ProfWin* window, const char* const command, gchar** args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (args[0] == NULL && connection_supports(XMPP_FEATURE_PING) == FALSE) {
|
if (args[0] == NULL && connection_supports(XMPP_FEATURE_PING) == FALSE) {
|
||||||
cons_show("Server does not support ping requests.");
|
cons_show("Server does not support ping requests (%s).", XMPP_FEATURE_PING);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8102,7 +8130,7 @@ cmd_command_list(ProfWin* window, const char* const command, gchar** args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (connection_supports(XMPP_FEATURE_COMMANDS) == FALSE) {
|
if (connection_supports(XMPP_FEATURE_COMMANDS) == FALSE) {
|
||||||
cons_show("Server does not support ad hoc commands.");
|
cons_show("Server does not support ad hoc commands (%s).", XMPP_FEATURE_COMMANDS);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8158,7 +8186,7 @@ cmd_command_exec(ProfWin* window, const char* const command, gchar** args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (connection_supports(XMPP_FEATURE_COMMANDS) == FALSE) {
|
if (connection_supports(XMPP_FEATURE_COMMANDS) == FALSE) {
|
||||||
cons_show("Server does not support ad hoc commands.");
|
cons_show("Server does not support ad hoc commands (%s).", XMPP_FEATURE_COMMANDS);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ blocked_ac_reset(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
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);
|
GList* found = g_list_find_custom(blocked, jid, (GCompareFunc)g_strcmp0);
|
||||||
if (found) {
|
if (found) {
|
||||||
@ -129,6 +129,31 @@ blocked_add(char* jid)
|
|||||||
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
|
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
|
||||||
xmpp_stanza_set_attribute(item, STANZA_ATTR_JID, jid);
|
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_add_child(block, item);
|
||||||
xmpp_stanza_release(item);
|
xmpp_stanza_release(item);
|
||||||
|
|
||||||
|
@ -1385,7 +1385,7 @@ _autoping_timed_send(xmpp_conn_t* const conn, void* const userdata)
|
|||||||
if (connection_supports(XMPP_FEATURE_PING) == FALSE) {
|
if (connection_supports(XMPP_FEATURE_PING) == FALSE) {
|
||||||
log_warning("Server doesn't advertise %s feature, disabling autoping.", XMPP_FEATURE_PING);
|
log_warning("Server doesn't advertise %s feature, disabling autoping.", XMPP_FEATURE_PING);
|
||||||
prefs_set_autoping(0);
|
prefs_set_autoping(0);
|
||||||
cons_show_error("Server ping not supported, autoping disabled.");
|
cons_show_error("Server ping not supported (%s), autoping disabled.", XMPP_FEATURE_PING);
|
||||||
xmpp_conn_t* conn = connection_get_conn();
|
xmpp_conn_t* conn = connection_get_conn();
|
||||||
xmpp_timed_handler_delete(conn, _autoping_timed_send);
|
xmpp_timed_handler_delete(conn, _autoping_timed_send);
|
||||||
return 1;
|
return 1;
|
||||||
@ -2586,7 +2586,7 @@ iq_mam_request(ProfChatWin* win)
|
|||||||
{
|
{
|
||||||
if (connection_supports(XMPP_FEATURE_MAM2) == FALSE) {
|
if (connection_supports(XMPP_FEATURE_MAM2) == FALSE) {
|
||||||
log_warning("Server doesn't advertise %s feature.", XMPP_FEATURE_MAM2);
|
log_warning("Server doesn't advertise %s feature.", XMPP_FEATURE_MAM2);
|
||||||
cons_show_error("Server doesn't support MAM.");
|
cons_show_error("Server doesn't support MAM (%s).", XMPP_FEATURE_MAM2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +122,7 @@
|
|||||||
#define STANZA_NAME_AFTER "after"
|
#define STANZA_NAME_AFTER "after"
|
||||||
#define STANZA_NAME_USERNAME "username"
|
#define STANZA_NAME_USERNAME "username"
|
||||||
#define STANZA_NAME_PROPOSE "propose"
|
#define STANZA_NAME_PROPOSE "propose"
|
||||||
|
#define STANZA_NAME_REPORT "report"
|
||||||
|
|
||||||
// error conditions
|
// error conditions
|
||||||
#define STANZA_NAME_BAD_REQUEST "bad-request"
|
#define STANZA_NAME_BAD_REQUEST "bad-request"
|
||||||
@ -245,6 +246,9 @@
|
|||||||
|
|
||||||
#define STANZA_DATAFORM_SOFTWARE "urn:xmpp:dataforms:softwareinfo"
|
#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
|
typedef struct caps_stanza_t
|
||||||
{
|
{
|
||||||
char* hash;
|
char* hash;
|
||||||
|
@ -70,6 +70,7 @@
|
|||||||
#define XMPP_FEATURE_USER_AVATAR_METADATA_NOTIFY "urn:xmpp:avatar:metadata+notify"
|
#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_LAST_MESSAGE_CORRECTION "urn:xmpp:message-correct:0"
|
||||||
#define XMPP_FEATURE_MAM2 "urn:xmpp:mam:2"
|
#define XMPP_FEATURE_MAM2 "urn:xmpp:mam:2"
|
||||||
|
#define XMPP_FEATURE_SPAM_REPORTING "urn:xmpp:reporting:1"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
JABBER_CONNECTING,
|
JABBER_CONNECTING,
|
||||||
@ -89,6 +90,12 @@ typedef enum {
|
|||||||
INVITE_MEDIATED
|
INVITE_MEDIATED
|
||||||
} jabber_invite_t;
|
} jabber_invite_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BLOCKED_NO_REPORT,
|
||||||
|
BLOCKED_REPORT_ABUSE,
|
||||||
|
BLOCKED_REPORT_SPAM
|
||||||
|
} blocked_report;
|
||||||
|
|
||||||
typedef struct bookmark_t
|
typedef struct bookmark_t
|
||||||
{
|
{
|
||||||
char* barejid;
|
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);
|
void roster_send_remove(const char* const barejid);
|
||||||
|
|
||||||
GList* blocked_list(void);
|
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);
|
gboolean blocked_remove(char* jid);
|
||||||
char* blocked_ac_find(const char* const search_str, gboolean previous, void* context);
|
char* blocked_ac_find(const char* const search_str, gboolean previous, void* context);
|
||||||
void blocked_ac_reset(void);
|
void blocked_ac_reset(void);
|
||||||
|
@ -547,7 +547,7 @@ blocked_list(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
blocked_add(char* jid)
|
blocked_add(char* jid, blocked_report reportkind, const char* const message)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user