pidgin/pidgin

Remove the user search from XMPP

16 months ago, Gary Kramlich
c13754d0bd3d
Parents 739fc280f3b5
Children df50021edabd
Remove the user search from XMPP

This was from XEP-0055 and doesn't seem to be implemented anywhere anymore. Even
the user directory they mention in the XEP (users.jabber.org) no longer exists.

Testing Done:
Connected an xmpp account and verified that the menu item was removed.

Reviewed at https://reviews.imfreedom.org/r/2163/
--- a/libpurple/protocols/jabber/buddy.c Sun Jan 01 01:28:49 2023 -0600
+++ b/libpurple/protocols/jabber/buddy.c Mon Jan 02 02:54:22 2023 -0600
@@ -1918,367 +1918,6 @@
}
}
-
-static void
-user_search_result_add_buddy_cb(PurpleConnection *gc, GList *row,
- G_GNUC_UNUSED gpointer user_data)
-{
- /* XXX find out the jid */
- purple_blist_request_add_buddy(purple_connection_get_account(gc),
- g_list_nth_data(row, 0), NULL, NULL);
-}
-
-static void
-user_search_result_cb(JabberStream *js, G_GNUC_UNUSED const char *from,
- G_GNUC_UNUSED JabberIqType type,
- G_GNUC_UNUSED const char *id, PurpleXmlNode *packet,
- G_GNUC_UNUSED gpointer data)
-{
- PurpleNotifySearchResults *results;
- PurpleNotifySearchColumn *column;
- PurpleXmlNode *x, *query, *item, *field;
-
- /* XXX error checking? */
- if(!(query = purple_xmlnode_get_child(packet, "query")))
- return;
-
- results = purple_notify_searchresults_new();
- if((x = purple_xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) {
- PurpleXmlNode *reported;
- GSList *column_vars = NULL;
-
- purple_debug_info("jabber", "new-skool\n");
-
- if((reported = purple_xmlnode_get_child(x, "reported"))) {
- PurpleXmlNode *field = purple_xmlnode_get_child(reported, "field");
- while(field) {
- const char *var = purple_xmlnode_get_attrib(field, "var");
- const char *label = purple_xmlnode_get_attrib(field, "label");
- if(var) {
- column = purple_notify_searchresults_column_new(label ? label : var);
- purple_notify_searchresults_column_add(results, column);
- column_vars = g_slist_append(column_vars, (char *)var);
- }
- field = purple_xmlnode_get_next_twin(field);
- }
- }
-
- item = purple_xmlnode_get_child(x, "item");
- while(item) {
- GList *row = NULL;
- GSList *l;
- PurpleXmlNode *valuenode;
- const char *var;
-
- for (l = column_vars; l != NULL; l = l->next) {
- /*
- * Build a row containing the strings that correspond
- * to each column of the search results.
- */
- for (field = purple_xmlnode_get_child(item, "field");
- field != NULL;
- field = purple_xmlnode_get_next_twin(field))
- {
- if ((var = purple_xmlnode_get_attrib(field, "var")) &&
- purple_strequal(var, l->data) &&
- (valuenode = purple_xmlnode_get_child(field, "value")))
- {
- char *value = purple_xmlnode_get_data(valuenode);
- row = g_list_append(row, value);
- break;
- }
- }
- if (field == NULL)
- /* No data for this column */
- row = g_list_append(row, NULL);
- }
- purple_notify_searchresults_row_add(results, row);
- item = purple_xmlnode_get_next_twin(item);
- }
-
- g_slist_free(column_vars);
- } else {
- /* old skool */
- purple_debug_info("jabber", "old-skool\n");
-
- column = purple_notify_searchresults_column_new(_("JID"));
- purple_notify_searchresults_column_add(results, column);
- column = purple_notify_searchresults_column_new(_("First Name"));
- purple_notify_searchresults_column_add(results, column);
- column = purple_notify_searchresults_column_new(_("Last Name"));
- purple_notify_searchresults_column_add(results, column);
- column = purple_notify_searchresults_column_new(_("Nickname"));
- purple_notify_searchresults_column_add(results, column);
- column = purple_notify_searchresults_column_new(_("Email"));
- purple_notify_searchresults_column_add(results, column);
-
- for(item = purple_xmlnode_get_child(query, "item"); item; item = purple_xmlnode_get_next_twin(item)) {
- const char *jid;
- PurpleXmlNode *node;
- GList *row = NULL;
-
- if(!(jid = purple_xmlnode_get_attrib(item, "jid")))
- continue;
-
- row = g_list_append(row, g_strdup(jid));
- node = purple_xmlnode_get_child(item, "first");
- row = g_list_append(row, node ? purple_xmlnode_get_data(node) : NULL);
- node = purple_xmlnode_get_child(item, "last");
- row = g_list_append(row, node ? purple_xmlnode_get_data(node) : NULL);
- node = purple_xmlnode_get_child(item, "nick");
- row = g_list_append(row, node ? purple_xmlnode_get_data(node) : NULL);
- node = purple_xmlnode_get_child(item, "email");
- row = g_list_append(row, node ? purple_xmlnode_get_data(node) : NULL);
- purple_debug_info("jabber", "row=%p\n", row);
- purple_notify_searchresults_row_add(results, row);
- }
- }
-
- purple_notify_searchresults_button_add(results, PURPLE_NOTIFY_BUTTON_ADD,
- user_search_result_add_buddy_cb);
-
- purple_notify_searchresults(js->gc, NULL, NULL, _("The following are the results of your search"), results, NULL, NULL);
-}
-
-static void user_search_x_data_cb(JabberStream *js, PurpleXmlNode *result, gpointer data)
-{
- PurpleXmlNode *query;
- JabberIq *iq;
- char *dir_server = data;
- const char *type;
-
- /* if they've cancelled the search, we're
- * just going to get an error if we send
- * a cancel, so skip it */
- type = purple_xmlnode_get_attrib(result, "type");
- if(purple_strequal(type, "cancel")) {
- g_free(dir_server);
- return;
- }
-
- iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:search");
- query = purple_xmlnode_get_child(iq->node, "query");
-
- purple_xmlnode_insert_child(query, result);
-
- jabber_iq_set_callback(iq, user_search_result_cb, NULL);
- purple_xmlnode_set_attrib(iq->node, "to", dir_server);
- jabber_iq_send(iq);
- g_free(dir_server);
-}
-
-struct user_search_info {
- JabberStream *js;
- char *directory_server;
-};
-
-static void
-user_search_cancel_cb(struct user_search_info *usi,
- G_GNUC_UNUSED PurpleRequestFields *fields)
-{
- g_free(usi->directory_server);
- g_free(usi);
-}
-
-static void user_search_cb(struct user_search_info *usi, PurpleRequestFields *fields)
-{
- JabberStream *js = usi->js;
- JabberIq *iq;
- PurpleXmlNode *query;
- GList *groups, *flds;
-
- iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:search");
- query = purple_xmlnode_get_child(iq->node, "query");
-
- for(groups = purple_request_fields_get_groups(fields); groups; groups = groups->next) {
- for(flds = purple_request_field_group_get_fields(groups->data);
- flds; flds = flds->next) {
- PurpleRequestField *field = flds->data;
- const char *id = purple_request_field_get_id(field);
- const char *value = purple_request_field_string_get_value(field);
-
- if(value && (purple_strequal(id, "first") || purple_strequal(id, "last") || purple_strequal(id, "nick") || purple_strequal(id, "email"))) {
- PurpleXmlNode *y = purple_xmlnode_new_child(query, id);
- purple_xmlnode_insert_data(y, value, -1);
- }
- }
- }
-
- jabber_iq_set_callback(iq, user_search_result_cb, NULL);
- purple_xmlnode_set_attrib(iq->node, "to", usi->directory_server);
- jabber_iq_send(iq);
-
- g_free(usi->directory_server);
- g_free(usi);
-}
-
-static void
-user_search_fields_result_cb(JabberStream *js, const char *from,
- JabberIqType type, G_GNUC_UNUSED const char *id,
- PurpleXmlNode *packet,
- G_GNUC_UNUSED gpointer data)
-{
- PurpleXmlNode *query, *x;
-
- if (!from)
- return;
-
- if (type == JABBER_IQ_ERROR) {
- char *msg = jabber_parse_error(js, packet, NULL);
-
- if(!msg)
- msg = g_strdup(_("Unknown error"));
-
- purple_notify_error(js->gc, _("Directory Query Failed"),
- _("Could not query the directory server."), msg,
- purple_request_cpar_from_connection(js->gc));
- g_free(msg);
-
- return;
- }
-
-
- if(!(query = purple_xmlnode_get_child(packet, "query")))
- return;
-
- if((x = purple_xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) {
- jabber_x_data_request(js, x, user_search_x_data_cb, g_strdup(from));
- return;
- } else {
- struct user_search_info *usi;
- PurpleXmlNode *instnode;
- char *instructions = NULL;
- PurpleRequestFields *fields;
- PurpleRequestFieldGroup *group;
- PurpleRequestField *field;
-
- /* old skool */
- fields = purple_request_fields_new();
- group = purple_request_field_group_new(NULL);
- purple_request_fields_add_group(fields, group);
-
- if((instnode = purple_xmlnode_get_child(query, "instructions")))
- {
- char *tmp = purple_xmlnode_get_data(instnode);
-
- if(tmp)
- {
- /* Try to translate the message (see static message
- list in jabber_user_dir_comments[]) */
- instructions = g_strdup_printf(_("Server Instructions: %s"), _(tmp));
- g_free(tmp);
- }
- }
-
- if(!instructions)
- {
- instructions = g_strdup(_("Fill in one or more fields to search "
- "for any matching XMPP users."));
- }
-
- if(purple_xmlnode_get_child(query, "first")) {
- field = purple_request_field_string_new("first", _("First Name"),
- NULL, FALSE);
- purple_request_field_group_add_field(group, field);
- }
- if(purple_xmlnode_get_child(query, "last")) {
- field = purple_request_field_string_new("last", _("Last Name"),
- NULL, FALSE);
- purple_request_field_group_add_field(group, field);
- }
- if(purple_xmlnode_get_child(query, "nick")) {
- field = purple_request_field_string_new("nick", _("Nickname"),
- NULL, FALSE);
- purple_request_field_group_add_field(group, field);
- }
- if(purple_xmlnode_get_child(query, "email")) {
- field = purple_request_field_string_new("email", _("Email Address"),
- NULL, FALSE);
- purple_request_field_group_add_field(group, field);
- }
-
- usi = g_new0(struct user_search_info, 1);
- usi->js = js;
- usi->directory_server = g_strdup(from);
-
- purple_request_fields(js->gc, _("Search for XMPP users"),
- _("Search for XMPP users"), instructions, fields,
- _("Search"), G_CALLBACK(user_search_cb),
- _("Cancel"), G_CALLBACK(user_search_cancel_cb),
- purple_request_cpar_from_connection(js->gc),
- usi);
-
- g_free(instructions);
- }
-}
-
-static void
-jabber_user_search(JabberStream *js, const char *directory)
-{
- JabberIq *iq;
-
- /* XXX: should probably better validate the directory we're given */
- if(!directory || !*directory) {
- purple_notify_error(js->gc, _("Invalid Directory"),
- _("Invalid Directory"), NULL,
- purple_request_cpar_from_connection(js->gc));
- return;
- }
-
- /* If the value provided isn't the disco#info default, persist it. Otherwise,
- make sure we aren't persisting an old value */
- if(js->user_directories && js->user_directories->data &&
- purple_strequal(directory, js->user_directories->data)) {
- purple_account_set_string(purple_connection_get_account(js->gc), "user_directory", "");
- }
- else {
- purple_account_set_string(purple_connection_get_account(js->gc), "user_directory", directory);
- }
-
- iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:search");
- purple_xmlnode_set_attrib(iq->node, "to", directory);
-
- jabber_iq_set_callback(iq, user_search_fields_result_cb, NULL);
-
- jabber_iq_send(iq);
-}
-
-void
-jabber_user_search_begin(G_GNUC_UNUSED GSimpleAction *action,
- GVariant *parameter, G_GNUC_UNUSED gpointer data)
-{
- const char *account_id = NULL;
- PurpleAccountManager *manager = NULL;
- PurpleAccount *account = NULL;
- PurpleConnection *connection = NULL;
- JabberStream *js = NULL;
- const char *def_val = NULL;
-
- if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) {
- g_critical("XMPP User Search action parameter is of incorrect type %s",
- g_variant_get_type_string(parameter));
- }
-
- account_id = g_variant_get_string(parameter, NULL);
- manager = purple_account_manager_get_default();
- account = purple_account_manager_find_by_id(manager, account_id);
- connection = purple_account_get_connection(account);
-
- js = purple_connection_get_protocol_data(connection);
- def_val = purple_account_get_string(account, "user_directory", "");
- if(*def_val == '\0' && js->user_directories) {
- def_val = js->user_directories->data;
- }
-
- purple_request_input(connection, _("Enter a User Directory"),
- _("Enter a User Directory"),
- _("Select a user directory to search"),
- def_val, FALSE, FALSE, NULL,
- _("Search Directory"), G_CALLBACK(jabber_user_search),
- _("Cancel"), NULL,
- NULL, js);
-}
-
gboolean
jabber_resource_know_capabilities(const JabberBuddyResource *jbr)
{
--- a/libpurple/protocols/jabber/buddy.h Sun Jan 01 01:28:49 2023 -0600
+++ b/libpurple/protocols/jabber/buddy.h Mon Jan 02 02:54:22 2023 -0600
@@ -99,8 +99,6 @@
void jabber_setup_set_info(GSimpleAction *action, GVariant *parameter, gpointer data);
void jabber_set_buddy_icon(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleImage *img);
-void jabber_user_search_begin(GSimpleAction *action, GVariant *parameter, gpointer data);
-
void jabber_buddy_remove_all_pending_buddy_info_requests(JabberStream *js);
void jabber_vcard_fetch_mine(JabberStream *js);
--- a/libpurple/protocols/jabber/jabber.c Sun Jan 01 01:28:49 2023 -0600
+++ b/libpurple/protocols/jabber/jabber.c Mon Jan 02 02:54:22 2023 -0600
@@ -2038,11 +2038,6 @@
.activate = jabber_password_change,
.parameter_type = "s",
},
- {
- .name = "search-users",
- .activate = jabber_user_search_begin,
- .parameter_type = "s",
- },
};
gsize nentries = G_N_ELEMENTS(entries);
@@ -2083,12 +2078,6 @@
g_menu_append_item(menu, item);
g_object_unref(item);
- item = g_menu_item_new(_("Search for Users..."), "prpl-xmpp.search-users");
- g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s",
- "account");
- g_menu_append_item(menu, item);
- g_object_unref(item);
-
jabber_pep_append_menu(menu);
#if 0