--- 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 @@
-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);
-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")))
- 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");
- const char *var = purple_xmlnode_get_attrib(field, "var");
- const char *label = purple_xmlnode_get_attrib(field, "label");
- 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");
- PurpleXmlNode *valuenode;
- 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 = 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);
- /* 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);
- 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)) {
- if(!(jid = purple_xmlnode_get_attrib(item, "jid")))
- 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)
- char *dir_server = data;
- /* 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")) {
- 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);
-struct user_search_info {
- char *directory_server;
-user_search_cancel_cb(struct user_search_info *usi,
- G_GNUC_UNUSED PurpleRequestFields *fields)
- g_free(usi->directory_server);
-static void user_search_cb(struct user_search_info *usi, PurpleRequestFields *fields)
- JabberStream *js = usi->js;
- 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);
- g_free(usi->directory_server);
-user_search_fields_result_cb(JabberStream *js, const char *from,
- JabberIqType type, G_GNUC_UNUSED const char *id,
- G_GNUC_UNUSED gpointer data)
- PurpleXmlNode *query, *x;
- if (type == JABBER_IQ_ERROR) {
- char *msg = jabber_parse_error(js, packet, NULL);
- 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));
- if(!(query = purple_xmlnode_get_child(packet, "query")))
- 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));
- struct user_search_info *usi;
- PurpleXmlNode *instnode;
- char *instructions = NULL;
- PurpleRequestFields *fields;
- PurpleRequestFieldGroup *group;
- PurpleRequestField *field;
- 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);
- /* Try to translate the message (see static message
- list in jabber_user_dir_comments[]) */
- instructions = g_strdup_printf(_("Server Instructions: %s"), _(tmp));
- 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"),
- purple_request_field_group_add_field(group, field);
- if(purple_xmlnode_get_child(query, "last")) {
- field = purple_request_field_string_new("last", _("Last Name"),
- purple_request_field_group_add_field(group, field);
- if(purple_xmlnode_get_child(query, "nick")) {
- field = purple_request_field_string_new("nick", _("Nickname"),
- purple_request_field_group_add_field(group, field);
- if(purple_xmlnode_get_child(query, "email")) {
- field = purple_request_field_string_new("email", _("Email Address"),
- purple_request_field_group_add_field(group, field);
- usi = g_new0(struct user_search_info, 1);
- 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),
-jabber_user_search(JabberStream *js, const char *directory)
- /* 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));
- /* 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", "");
- 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_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),
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,
- .name = "search-users",
- .activate = jabber_user_search_begin,
gsize nentries = G_N_ELEMENTS(entries);
@@ -2083,12 +2078,6 @@
g_menu_append_item(menu, 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",
- g_menu_append_item(menu, item);
jabber_pep_append_menu(menu);