mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Add /blocked command
This commit is contained in:
parent
c31913f8d5
commit
b8c94376aa
@ -12,6 +12,7 @@ core_sources = \
|
||||
src/xmpp/capabilities.h src/xmpp/connection.h \
|
||||
src/xmpp/roster.c src/xmpp/roster.h \
|
||||
src/xmpp/bookmark.c src/xmpp/bookmark.h \
|
||||
src/xmpp/blocking.c src/xmpp/blocking.h \
|
||||
src/xmpp/form.c src/xmpp/form.h \
|
||||
src/event/server_events.c src/event/server_events.h \
|
||||
src/event/client_events.c src/event/client_events.h \
|
||||
|
@ -125,6 +125,7 @@ static char* _win_autocomplete(ProfWin *window, const char *const input);
|
||||
static char* _close_autocomplete(ProfWin *window, const char *const input);
|
||||
static char* _plugins_autocomplete(ProfWin *window, const char *const input);
|
||||
static char* _sendfile_autocomplete(ProfWin *window, const char *const input);
|
||||
static char* _blocked_autocomplete(ProfWin *window, const char *const input);
|
||||
|
||||
GHashTable *commands = NULL;
|
||||
|
||||
@ -423,6 +424,26 @@ static struct cmd_t command_defs[] =
|
||||
"/roster size 15")
|
||||
},
|
||||
|
||||
{ "/blocked",
|
||||
parse_args, 0, 2, NULL,
|
||||
CMD_NOSUBFUNCS
|
||||
CMD_MAINFUNC(cmd_blocked)
|
||||
CMD_TAGS(
|
||||
CMD_TAG_ROSTER,
|
||||
CMD_TAG_CHAT)
|
||||
CMD_SYN(
|
||||
"/blocked",
|
||||
"/blocked add [<jid>]",
|
||||
"/blocked remove <jid>")
|
||||
CMD_DESC(
|
||||
"Manage blocked users, calling with no arguments shows the current list of blocked users.")
|
||||
CMD_ARGS(
|
||||
{ "add [<jid>]", "Block the specified Jabber ID, if called in a chat window, the current recipient will be used." },
|
||||
{ "remove <jid>", "Remove the specified Jabber ID from the blocked list." })
|
||||
CMD_EXAMPLES(
|
||||
"/blocked add spammer@spam.org")
|
||||
},
|
||||
|
||||
{ "/group",
|
||||
parse_args_with_freetext, 0, 3, NULL,
|
||||
CMD_NOSUBFUNCS
|
||||
@ -2279,6 +2300,7 @@ static Autocomplete autoping_ac;
|
||||
static Autocomplete plugins_ac;
|
||||
static Autocomplete plugins_load_ac;
|
||||
static Autocomplete sendfile_ac;
|
||||
static Autocomplete blocked_ac;
|
||||
|
||||
/*
|
||||
* Initialise command autocompleter and history
|
||||
@ -2835,6 +2857,10 @@ cmd_init(void)
|
||||
autocomplete_add(plugins_ac, "load");
|
||||
|
||||
sendfile_ac = autocomplete_new();
|
||||
|
||||
blocked_ac = autocomplete_new();
|
||||
autocomplete_add(blocked_ac, "add");
|
||||
autocomplete_add(blocked_ac, "remove");
|
||||
}
|
||||
|
||||
void
|
||||
@ -2925,6 +2951,7 @@ cmd_uninit(void)
|
||||
autocomplete_free(plugins_ac);
|
||||
autocomplete_free(plugins_load_ac);
|
||||
autocomplete_free(sendfile_ac);
|
||||
autocomplete_free(blocked_ac);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@ -3154,6 +3181,7 @@ cmd_reset_autocomplete(ProfWin *window)
|
||||
autocomplete_reset(console_msg_ac);
|
||||
autocomplete_reset(autoping_ac);
|
||||
autocomplete_reset(plugins_ac);
|
||||
autocomplete_reset(blocked_ac);
|
||||
autocomplete_reset(script_ac);
|
||||
if (script_show_ac) {
|
||||
autocomplete_free(script_show_ac);
|
||||
@ -3176,6 +3204,7 @@ cmd_reset_autocomplete(ProfWin *window)
|
||||
}
|
||||
|
||||
bookmark_autocomplete_reset();
|
||||
blocked_ac_reset();
|
||||
prefs_reset_room_trigger_ac();
|
||||
win_reset_search_attempts();
|
||||
win_close_reset_search_attempts();
|
||||
@ -3445,8 +3474,9 @@ _cmd_complete_parameters(ProfWin *window, const char *const input)
|
||||
g_hash_table_insert(ac_funcs, "/console", _console_autocomplete);
|
||||
g_hash_table_insert(ac_funcs, "/win", _win_autocomplete);
|
||||
g_hash_table_insert(ac_funcs, "/close", _close_autocomplete);
|
||||
g_hash_table_insert(ac_funcs, "/plugins", _plugins_autocomplete);
|
||||
g_hash_table_insert(ac_funcs, "/plugins", _plugins_autocomplete);
|
||||
g_hash_table_insert(ac_funcs, "/sendfile", _sendfile_autocomplete);
|
||||
g_hash_table_insert(ac_funcs, "/blocked", _blocked_autocomplete);
|
||||
|
||||
int len = strlen(input);
|
||||
char parsed[len+1];
|
||||
@ -3716,6 +3746,25 @@ _group_autocomplete(ProfWin *window, const char *const input)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char*
|
||||
_blocked_autocomplete(ProfWin *window, const char *const input)
|
||||
{
|
||||
char *result = NULL;
|
||||
|
||||
result = autocomplete_param_with_func(input, "/blocked remove", blocked_ac_find);
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = autocomplete_param_with_ac(input, "/blocked", blocked_ac, FALSE);
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static char*
|
||||
_bookmark_autocomplete(ProfWin *window, const char *const input)
|
||||
{
|
||||
|
@ -2984,6 +2984,63 @@ cmd_roster(ProfWin *window, const char *const command, gchar **args)
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
cmd_blocked(ProfWin *window, const char *const command, gchar **args)
|
||||
{
|
||||
if (jabber_get_connection_status() != JABBER_CONNECTED) {
|
||||
cons_show("You are not currently connected.");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!jabber_service_supports(XMPP_FEATURE_BLOCKING)) {
|
||||
cons_show("Blocking not supported by server.");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (g_strcmp0(args[0], "add") == 0) {
|
||||
if (args[1] == NULL) {
|
||||
cons_bad_cmd_usage(command);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean res = blocked_add(args[1]);
|
||||
if (!res) {
|
||||
cons_show("User %s already blocked.", args[1]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (g_strcmp0(args[0], "remove") == 0) {
|
||||
if (args[1] == NULL) {
|
||||
cons_bad_cmd_usage(command);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean res = blocked_remove(args[1]);
|
||||
if (!res) {
|
||||
cons_show("User %s is not currently blocked.", args[1]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GList *blocked = blocked_list();
|
||||
GList *curr = blocked;
|
||||
if (curr) {
|
||||
cons_show("Blocked users:");
|
||||
while (curr) {
|
||||
cons_show(" %s", curr->data);
|
||||
curr = g_list_next(curr);
|
||||
}
|
||||
} else {
|
||||
cons_show("No blocked users.");
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
gboolean
|
||||
cmd_resource(ProfWin *window, const char *const command, gchar **args)
|
||||
{
|
||||
|
@ -199,6 +199,7 @@ gboolean cmd_export(ProfWin *window, const char *const command, gchar **args);
|
||||
gboolean cmd_charset(ProfWin *window, const char *const command, gchar **args);
|
||||
gboolean cmd_console(ProfWin *window, const char *const command, gchar **args);
|
||||
gboolean cmd_plugins(ProfWin *window, const char *const command, gchar **args);
|
||||
gboolean cmd_blocked(ProfWin *window, const char *const command, gchar **args);
|
||||
|
||||
gboolean cmd_form_field(ProfWin *window, char *tag, gchar **args);
|
||||
|
||||
|
323
src/xmpp/blocking.c
Normal file
323
src/xmpp/blocking.c
Normal file
@ -0,0 +1,323 @@
|
||||
/*
|
||||
* blocking.c
|
||||
*
|
||||
* Copyright (C) 2012 - 2016 James Booth <boothj5@gmail.com>
|
||||
*
|
||||
* This file is part of Profanity.
|
||||
*
|
||||
* Profanity is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Profanity is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Profanity. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link the code of portions of this program with the OpenSSL library under
|
||||
* certain conditions as described in each individual source file, and
|
||||
* distribute linked combinations including the two.
|
||||
*
|
||||
* You must obey the GNU General Public License in all respects for all of the
|
||||
* code used other than OpenSSL. If you modify file(s) with this exception, you
|
||||
* may extend this exception to your version of the file(s), but you are not
|
||||
* obligated to do so. If you do not wish to do so, delete this exception
|
||||
* statement from your version. If you delete this exception statement from all
|
||||
* source files in the program, then also delete it here.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef HAVE_LIBMESODE
|
||||
#include <mesode.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBSTROPHE
|
||||
#include <strophe.h>
|
||||
#endif
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "common.h"
|
||||
#include "ui/ui.h"
|
||||
#include "xmpp/connection.h"
|
||||
#include "xmpp/stanza.h"
|
||||
|
||||
static int _blocklist_result_handler(xmpp_stanza_t *const stanza, void *const userdata);
|
||||
static int _block_add_result_handler(xmpp_stanza_t *const stanza, void *const userdata);
|
||||
static int _block_remove_result_handler(xmpp_stanza_t *const stanza, void *const userdata);
|
||||
|
||||
static GList *blocked;
|
||||
static Autocomplete blocked_ac;
|
||||
|
||||
void
|
||||
blocking_request(void)
|
||||
{
|
||||
char *id = create_unique_id("blocked_list_request");
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq;
|
||||
|
||||
if (blocked) {
|
||||
g_list_free_full(blocked, free);
|
||||
blocked = NULL;
|
||||
}
|
||||
|
||||
if (blocked_ac) {
|
||||
autocomplete_free(blocked_ac);
|
||||
}
|
||||
blocked_ac = autocomplete_new();
|
||||
|
||||
id_handler_add(id, _blocklist_result_handler, id);
|
||||
|
||||
iq = stanza_create_blocked_list_request(ctx);
|
||||
xmpp_stanza_set_id(iq, id);
|
||||
send_iq_stanza(iq);
|
||||
xmpp_stanza_release(iq);
|
||||
free(id);
|
||||
}
|
||||
|
||||
GList*
|
||||
blocked_list(void)
|
||||
{
|
||||
return blocked;
|
||||
}
|
||||
|
||||
char*
|
||||
blocked_ac_find(const char *const search_str)
|
||||
{
|
||||
return autocomplete_complete(blocked_ac, search_str, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
blocked_ac_reset(void)
|
||||
{
|
||||
if (blocked_ac) {
|
||||
autocomplete_reset(blocked_ac);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
blocked_add(char *jid)
|
||||
{
|
||||
GList *found = g_list_find_custom(blocked, jid, (GCompareFunc)g_strcmp0);
|
||||
if (found) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
|
||||
xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
|
||||
xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
|
||||
char *id = create_unique_id("block");
|
||||
xmpp_stanza_set_id(iq, id);
|
||||
|
||||
xmpp_stanza_t *block = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(block, STANZA_NAME_BLOCK);
|
||||
xmpp_stanza_set_ns(block, STANZA_NS_BLOCKING);
|
||||
|
||||
xmpp_stanza_t *item = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
|
||||
xmpp_stanza_set_attribute(item, STANZA_ATTR_JID, jid);
|
||||
|
||||
xmpp_stanza_add_child(block, item);
|
||||
xmpp_stanza_release(item);
|
||||
|
||||
xmpp_stanza_add_child(iq, block);
|
||||
xmpp_stanza_release(block);
|
||||
|
||||
id_handler_add(id, _block_add_result_handler, strdup(jid));
|
||||
|
||||
send_iq_stanza(iq);
|
||||
xmpp_stanza_release(iq);
|
||||
free(id);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
blocked_remove(char *jid)
|
||||
{
|
||||
GList *found = g_list_find_custom(blocked, jid, (GCompareFunc)g_strcmp0);
|
||||
if (!found) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
|
||||
xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
|
||||
xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
|
||||
char *id = create_unique_id("unblock");
|
||||
xmpp_stanza_set_id(iq, id);
|
||||
|
||||
xmpp_stanza_t *block = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(block, STANZA_NAME_UNBLOCK);
|
||||
xmpp_stanza_set_ns(block, STANZA_NS_BLOCKING);
|
||||
|
||||
xmpp_stanza_t *item = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
|
||||
xmpp_stanza_set_attribute(item, STANZA_ATTR_JID, jid);
|
||||
|
||||
xmpp_stanza_add_child(block, item);
|
||||
xmpp_stanza_release(item);
|
||||
|
||||
xmpp_stanza_add_child(iq, block);
|
||||
xmpp_stanza_release(block);
|
||||
|
||||
id_handler_add(id, _block_remove_result_handler, strdup(jid));
|
||||
|
||||
send_iq_stanza(iq);
|
||||
xmpp_stanza_release(iq);
|
||||
free(id);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
blocked_set_handler(xmpp_stanza_t *stanza)
|
||||
{
|
||||
xmpp_stanza_t *block = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BLOCK);
|
||||
if (block) {
|
||||
xmpp_stanza_t *child = xmpp_stanza_get_children(block);
|
||||
while (child) {
|
||||
if (g_strcmp0(xmpp_stanza_get_name(child), STANZA_NAME_ITEM) == 0) {
|
||||
const char *jid = xmpp_stanza_get_attribute(child, STANZA_ATTR_JID);
|
||||
if (jid) {
|
||||
blocked = g_list_append(blocked, strdup(jid));
|
||||
autocomplete_add(blocked_ac, jid);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
child = xmpp_stanza_get_next(child);
|
||||
}
|
||||
}
|
||||
|
||||
xmpp_stanza_t *unblock = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_UNBLOCK);
|
||||
if (unblock) {
|
||||
xmpp_stanza_t *child = xmpp_stanza_get_children(unblock);
|
||||
if (!child) {
|
||||
g_list_free_full(blocked, free);
|
||||
blocked = NULL;
|
||||
autocomplete_clear(blocked_ac);
|
||||
} else {
|
||||
while (child) {
|
||||
if (g_strcmp0(xmpp_stanza_get_name(child), STANZA_NAME_ITEM) == 0) {
|
||||
const char *jid = xmpp_stanza_get_attribute(child, STANZA_ATTR_JID);
|
||||
if (jid) {
|
||||
GList *found = g_list_find_custom(blocked, jid, (GCompareFunc)g_strcmp0);
|
||||
if (found) {
|
||||
blocked = g_list_remove_link(blocked, found);
|
||||
g_list_free_full(found, free);
|
||||
autocomplete_remove(blocked_ac, jid);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
child = xmpp_stanza_get_next(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_block_add_result_handler(xmpp_stanza_t *const stanza, void *const userdata)
|
||||
{
|
||||
char *jid = (char*)userdata;
|
||||
|
||||
const char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE);
|
||||
if (type == NULL) {
|
||||
log_info("Block response received for %s with no type attribute.", jid);
|
||||
free(jid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_strcmp0(type, "result") != 0) {
|
||||
log_info("Block response received for %s with unrecognised type attribute.", jid);
|
||||
free(jid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cons_show("User %s successfully blocked.", jid);
|
||||
free(jid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_block_remove_result_handler(xmpp_stanza_t *const stanza, void *const userdata)
|
||||
{
|
||||
char *jid = (char*)userdata;
|
||||
|
||||
const char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE);
|
||||
if (type == NULL) {
|
||||
log_info("Unblock response received for %s with no type attribute.", jid);
|
||||
free(jid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_strcmp0(type, "result") != 0) {
|
||||
log_info("Unblock response received for %s with unrecognised type attribute.", jid);
|
||||
free(jid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cons_show("User %s successfully unblocked.", jid);
|
||||
free(jid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_blocklist_result_handler(xmpp_stanza_t *const stanza, void *const userdata)
|
||||
{
|
||||
log_info("Blocked list result handler fired.");
|
||||
|
||||
const char *type = xmpp_stanza_get_type(stanza);
|
||||
if (g_strcmp0(type, "result") != 0) {
|
||||
log_info("Received blocklist without result type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *blocklist = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BLOCKLIST);
|
||||
if (!blocklist) {
|
||||
log_info("Received blocklist without blocklist element");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (blocked) {
|
||||
g_list_free_full(blocked, free);
|
||||
blocked = NULL;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *items = xmpp_stanza_get_children(blocklist);
|
||||
if (!items) {
|
||||
log_info("No blocked users.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *curr = items;
|
||||
while (curr) {
|
||||
const char *name = xmpp_stanza_get_name(curr);
|
||||
if (g_strcmp0(name, "item") == 0) {
|
||||
const char *jid = xmpp_stanza_get_attribute(curr, STANZA_ATTR_JID);
|
||||
if (jid) {
|
||||
blocked = g_list_append(blocked, strdup(jid));
|
||||
autocomplete_add(blocked_ac, jid);
|
||||
}
|
||||
}
|
||||
curr = xmpp_stanza_get_next(curr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
41
src/xmpp/blocking.h
Normal file
41
src/xmpp/blocking.h
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* blocking.h
|
||||
*
|
||||
* Copyright (C) 2012 - 2016 James Booth <boothj5@gmail.com>
|
||||
*
|
||||
* This file is part of Profanity.
|
||||
*
|
||||
* Profanity is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Profanity is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Profanity. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link the code of portions of this program with the OpenSSL library under
|
||||
* certain conditions as described in each individual source file, and
|
||||
* distribute linked combinations including the two.
|
||||
*
|
||||
* You must obey the GNU General Public License in all respects for all of the
|
||||
* code used other than OpenSSL. If you modify file(s) with this exception, you
|
||||
* may extend this exception to your version of the file(s), but you are not
|
||||
* obligated to do so. If you do not wish to do so, delete this exception
|
||||
* statement from your version. If you delete this exception statement from all
|
||||
* source files in the program, then also delete it here.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef XMPP_BLOCKING_H
|
||||
#define XMPP_BLOCKING_H
|
||||
|
||||
void blocking_request(void);
|
||||
int blocked_set_handler(xmpp_stanza_t *stanza);
|
||||
|
||||
#endif
|
@ -55,6 +55,7 @@
|
||||
#include "profanity.h"
|
||||
#include "event/server_events.h"
|
||||
#include "xmpp/bookmark.h"
|
||||
#include "xmpp/blocking.h"
|
||||
#include "xmpp/capabilities.h"
|
||||
#include "xmpp/connection.h"
|
||||
#include "xmpp/iq.h"
|
||||
@ -343,6 +344,21 @@ jabber_get_disco_items(void)
|
||||
return (disco_items);
|
||||
}
|
||||
|
||||
gboolean
|
||||
jabber_service_supports(const char *const feature)
|
||||
{
|
||||
DiscoInfo *disco_info;
|
||||
while (disco_items) {
|
||||
disco_info = disco_items->data;
|
||||
if (g_hash_table_lookup_extended(disco_info->features, feature, NULL, NULL)) {
|
||||
return TRUE;
|
||||
}
|
||||
disco_items = g_slist_next(disco_items);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
jabber_set_disco_items(GSList *_disco_items)
|
||||
{
|
||||
@ -678,6 +694,7 @@ _connection_handler(xmpp_conn_t *const conn, const xmpp_conn_event_t status, con
|
||||
|
||||
roster_request();
|
||||
bookmark_request();
|
||||
blocking_request();
|
||||
|
||||
// items discovery
|
||||
DiscoInfo *info = malloc(sizeof(struct disco_info_t));
|
||||
|
@ -58,6 +58,7 @@
|
||||
#include "config/preferences.h"
|
||||
#include "event/server_events.h"
|
||||
#include "xmpp/capabilities.h"
|
||||
#include "xmpp/blocking.h"
|
||||
#include "xmpp/connection.h"
|
||||
#include "xmpp/stanza.h"
|
||||
#include "xmpp/form.h"
|
||||
@ -170,6 +171,11 @@ _iq_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const us
|
||||
roster_result_handler(stanza);
|
||||
}
|
||||
|
||||
xmpp_stanza_t *blocking = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_BLOCKING);
|
||||
if (blocking && (g_strcmp0(type, STANZA_TYPE_SET) == 0)) {
|
||||
blocked_set_handler(stanza);
|
||||
}
|
||||
|
||||
const char *id = xmpp_stanza_get_id(stanza);
|
||||
if (id) {
|
||||
ProfIdHandler *handler = g_hash_table_lookup(id_handlers, id);
|
||||
|
@ -117,6 +117,26 @@ stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx)
|
||||
return iq;
|
||||
}
|
||||
|
||||
xmpp_stanza_t*
|
||||
stanza_create_blocked_list_request(xmpp_ctx_t *ctx)
|
||||
{
|
||||
xmpp_stanza_t *iq, *blocklist;
|
||||
|
||||
iq = xmpp_stanza_new(ctx);
|
||||
blocklist = xmpp_stanza_new(ctx);
|
||||
|
||||
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
|
||||
xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
|
||||
|
||||
xmpp_stanza_set_name(blocklist, STANZA_NAME_BLOCKLIST);
|
||||
xmpp_stanza_set_ns(blocklist, STANZA_NS_BLOCKING);
|
||||
|
||||
xmpp_stanza_add_child(iq, blocklist);
|
||||
xmpp_stanza_release(blocklist);
|
||||
|
||||
return iq;
|
||||
}
|
||||
|
||||
#if 0
|
||||
xmpp_stanza_t*
|
||||
stanza_create_bookmarks_pubsub_add(xmpp_ctx_t *ctx, const char *const jid,
|
||||
|
@ -54,6 +54,9 @@
|
||||
|
||||
#define STANZA_NAME_MESSAGE "message"
|
||||
#define STANZA_NAME_BODY "body"
|
||||
#define STANZA_NAME_BLOCK "block"
|
||||
#define STANZA_NAME_UNBLOCK "unblock"
|
||||
#define STANZA_NAME_BLOCKLIST "blocklist"
|
||||
#define STANZA_NAME_PRESENCE "presence"
|
||||
#define STANZA_NAME_PRIORITY "priority"
|
||||
#define STANZA_NAME_X "x"
|
||||
@ -181,6 +184,7 @@
|
||||
#define STANZA_NS_ENCRYPTED "jabber:x:encrypted"
|
||||
#define STANZA_NS_HTTP_UPLOAD "urn:xmpp:http:upload"
|
||||
#define STANZA_NS_X_OOB "jabber:x:oob"
|
||||
#define STANZA_NS_BLOCKING "urn:xmpp:blocking"
|
||||
|
||||
#define STANZA_DATAFORM_SOFTWARE "urn:xmpp:dataforms:softwareinfo"
|
||||
|
||||
@ -205,6 +209,8 @@ typedef enum {
|
||||
|
||||
xmpp_stanza_t* stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx);
|
||||
|
||||
xmpp_stanza_t* stanza_create_blocked_list_request(xmpp_ctx_t *ctx);
|
||||
|
||||
xmpp_stanza_t* stanza_create_http_upload_request(xmpp_ctx_t *ctx, const char *const id, const char *const jid, HTTPUpload *upload);
|
||||
|
||||
xmpp_stanza_t* stanza_enable_carbons(xmpp_ctx_t *ctx);
|
||||
|
@ -54,6 +54,8 @@
|
||||
#define JABBER_PRIORITY_MIN -128
|
||||
#define JABBER_PRIORITY_MAX 127
|
||||
|
||||
#define XMPP_FEATURE_BLOCKING "urn:xmpp:blocking"
|
||||
|
||||
typedef enum {
|
||||
JABBER_UNDEFINED,
|
||||
JABBER_STARTED,
|
||||
@ -126,6 +128,7 @@ TLSCertificate* jabber_get_tls_peer_cert(void);
|
||||
#endif
|
||||
gboolean jabber_conn_is_secured(void);
|
||||
gboolean jabber_send_stanza(const char *const stanza);
|
||||
gboolean jabber_service_supports(const char *const feature);
|
||||
|
||||
// message functions
|
||||
char* message_send_chat(const char *const barejid, const char *const msg, const char *const oob_url);
|
||||
@ -206,6 +209,12 @@ void roster_send_remove_from_group(const char *const group, PContact contact);
|
||||
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_remove(char *jid);
|
||||
char* blocked_ac_find(const char *const search_str);
|
||||
void blocked_ac_reset(void);
|
||||
|
||||
void form_destroy(DataForm *form);
|
||||
char* form_get_form_type_field(DataForm *form);
|
||||
void form_set_value(DataForm *form, const char *const tag, char *value);
|
||||
|
@ -95,8 +95,8 @@ shows_role_and_affiliation_on_join(void **state)
|
||||
{
|
||||
prof_connect();
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -115,8 +115,8 @@ shows_subject_on_join(void **state)
|
||||
{
|
||||
prof_connect();
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -143,8 +143,8 @@ shows_history_message(void **state)
|
||||
{
|
||||
prof_connect();
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -172,8 +172,8 @@ shows_occupant_join(void **state)
|
||||
{
|
||||
prof_connect();
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -201,8 +201,8 @@ shows_message(void **state)
|
||||
{
|
||||
prof_connect();
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -228,8 +228,8 @@ shows_all_messages_in_console_when_window_not_focussed(void **state)
|
||||
{
|
||||
prof_connect();
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -269,8 +269,8 @@ shows_first_message_in_console_when_window_not_focussed(void **state)
|
||||
prof_input("/console muc first");
|
||||
assert_true(prof_output_exact("Console MUC messages set: first"));
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
@ -315,8 +315,8 @@ shows_no_message_in_console_when_window_not_focussed(void **state)
|
||||
prof_input("/console muc none");
|
||||
assert_true(prof_output_exact("Console MUC messages set: none"));
|
||||
|
||||
stbbr_for_id("prof_join_3",
|
||||
"<presence id='prof_join_3' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
stbbr_for_id("prof_join_4",
|
||||
"<presence id='prof_join_4' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://www.profanity.im' ver='*'/>"
|
||||
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
||||
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
||||
|
@ -14,18 +14,18 @@
|
||||
void
|
||||
ping_multiple(void **state)
|
||||
{
|
||||
stbbr_for_id("prof_ping_3",
|
||||
"<iq id='prof_ping_3' type='result' to='stabber@localhost/profanity'/>"
|
||||
);
|
||||
stbbr_for_id("prof_ping_4",
|
||||
"<iq id='prof_ping_4' type='result' to='stabber@localhost/profanity'/>"
|
||||
);
|
||||
stbbr_for_id("prof_ping_5",
|
||||
"<iq id='prof_ping_5' type='result' to='stabber@localhost/profanity'/>"
|
||||
);
|
||||
|
||||
prof_connect();
|
||||
|
||||
prof_input("/ping");
|
||||
assert_true(stbbr_received(
|
||||
"<iq id='prof_ping_3' type='get'>"
|
||||
"<iq id='prof_ping_4' type='get'>"
|
||||
"<ping xmlns='urn:xmpp:ping'/>"
|
||||
"</iq>"
|
||||
));
|
||||
@ -33,7 +33,7 @@ ping_multiple(void **state)
|
||||
|
||||
prof_input("/ping");
|
||||
assert_true(stbbr_received(
|
||||
"<iq id='prof_ping_4' type='get'>"
|
||||
"<iq id='prof_ping_5' type='get'>"
|
||||
"<ping xmlns='urn:xmpp:ping'/>"
|
||||
"</iq>"
|
||||
));
|
||||
|
@ -35,7 +35,7 @@ presence_online_with_message(void **state)
|
||||
prof_input("/online \"Hi there\"");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<status>Hi there</status>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -52,7 +52,7 @@ presence_away(void **state)
|
||||
prof_input("/away");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>away</show>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -69,7 +69,7 @@ presence_away_with_message(void **state)
|
||||
prof_input("/away \"I'm not here for a bit\"");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>away</show>"
|
||||
"<status>I'm not here for a bit</status>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
@ -87,7 +87,7 @@ presence_xa(void **state)
|
||||
prof_input("/xa");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>xa</show>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -104,7 +104,7 @@ presence_xa_with_message(void **state)
|
||||
prof_input("/xa \"Gone to the shops\"");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>xa</show>"
|
||||
"<status>Gone to the shops</status>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
@ -122,7 +122,7 @@ presence_dnd(void **state)
|
||||
prof_input("/dnd");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>dnd</show>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -139,7 +139,7 @@ presence_dnd_with_message(void **state)
|
||||
prof_input("/dnd \"Working\"");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>dnd</show>"
|
||||
"<status>Working</status>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
@ -157,7 +157,7 @@ presence_chat(void **state)
|
||||
prof_input("/chat");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>chat</show>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -174,7 +174,7 @@ presence_chat_with_message(void **state)
|
||||
prof_input("/chat \"Free to talk\"");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<show>chat</show>"
|
||||
"<status>Free to talk</status>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
@ -192,7 +192,7 @@ presence_set_priority(void **state)
|
||||
prof_input("/priority 25");
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<priority>25</priority>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -208,7 +208,7 @@ presence_includes_priority(void **state)
|
||||
|
||||
prof_input("/priority 25");
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_3'>"
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<priority>25</priority>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
|
||||
"</presence>"
|
||||
@ -217,7 +217,7 @@ presence_includes_priority(void **state)
|
||||
|
||||
prof_input("/chat \"Free to talk\"");
|
||||
assert_true(stbbr_received(
|
||||
"<presence id='prof_presence_4'>"
|
||||
"<presence id='prof_presence_5'>"
|
||||
"<priority>25</priority>"
|
||||
"<show>chat</show>"
|
||||
"<status>Free to talk</status>"
|
||||
|
@ -70,6 +70,12 @@ jabber_send_stanza(const char *const stanza)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
jabber_service_supports(const char *const feature)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// message functions
|
||||
char* message_send_chat(const char * const barejid, const char * const msg, const char *const oob_url)
|
||||
{
|
||||
@ -249,3 +255,25 @@ void roster_send_remove(const char * const barejid)
|
||||
{
|
||||
check_expected(barejid);
|
||||
}
|
||||
|
||||
GList* blocked_list(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean blocked_add(char *jid)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean blocked_remove(char *jid)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
char* blocked_ac_find(const char *const search_str)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void blocked_ac_reset(void) {}
|
||||
|
Loading…
Reference in New Issue
Block a user