pidgin/pidgin

Added tag v2.14.2 for changeset 2eb25613d054
release-2.x.y
2021-04-01, Gary Kramlich
1dd6e5170860
Added tag v2.14.2 for changeset 2eb25613d054
/* purple
*
* Purple is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*
*/
/* libxmpp is the XMPP protocol plugin. It is linked against libjabbercommon,
* which may be used to support other protocols (Bonjour) which may need to
* share code.
*/
#include "internal.h"
#include "accountopt.h"
#include "core.h"
#include "debug.h"
#include "version.h"
#include "iq.h"
#include "jabber.h"
#include "chat.h"
#include "disco.h"
#include "message.h"
#include "roster.h"
#include "si.h"
#include "message.h"
#include "presence.h"
#include "google/google.h"
#include "pep.h"
#include "usermood.h"
#include "usertune.h"
#include "caps.h"
#include "data.h"
#include "ibb.h"
static PurplePlugin *my_protocol = NULL;
static PurplePluginProtocolInfo prpl_info =
{
OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME | OPT_PROTO_MAIL_CHECK |
#ifdef HAVE_CYRUS_SASL
OPT_PROTO_PASSWORD_OPTIONAL |
#endif
OPT_PROTO_SLASH_COMMANDS_NATIVE,
NULL, /* user_splits */
NULL, /* protocol_options */
{"png", 32, 32, 96, 96, 0, PURPLE_ICON_SCALE_SEND | PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */
jabber_list_icon, /* list_icon */
jabber_list_emblem, /* list_emblems */
jabber_status_text, /* status_text */
jabber_tooltip_text, /* tooltip_text */
jabber_status_types, /* status_types */
jabber_blist_node_menu, /* blist_node_menu */
jabber_chat_info, /* chat_info */
jabber_chat_info_defaults, /* chat_info_defaults */
jabber_login, /* login */
jabber_close, /* close */
jabber_message_send_im, /* send_im */
jabber_set_info, /* set_info */
jabber_send_typing, /* send_typing */
jabber_buddy_get_info, /* get_info */
jabber_set_status, /* set_status */
jabber_idle_set, /* set_idle */
NULL, /* change_passwd */
jabber_roster_add_buddy, /* add_buddy */
NULL, /* add_buddies */
jabber_roster_remove_buddy, /* remove_buddy */
NULL, /* remove_buddies */
NULL, /* add_permit */
jabber_add_deny, /* add_deny */
NULL, /* rem_permit */
jabber_rem_deny, /* rem_deny */
NULL, /* set_permit_deny */
jabber_chat_join, /* join_chat */
NULL, /* reject_chat */
jabber_get_chat_name, /* get_chat_name */
jabber_chat_invite, /* chat_invite */
jabber_chat_leave, /* chat_leave */
NULL, /* chat_whisper */
jabber_message_send_chat, /* chat_send */
jabber_keepalive, /* keepalive */
jabber_register_account, /* register_user */
NULL, /* get_cb_info */
NULL, /* get_cb_away */
jabber_roster_alias_change, /* alias_buddy */
jabber_roster_group_change, /* group_buddy */
jabber_roster_group_rename, /* rename_group */
NULL, /* buddy_free */
jabber_convo_closed, /* convo_closed */
jabber_normalize, /* normalize */
jabber_set_buddy_icon, /* set_buddy_icon */
NULL, /* remove_group */
jabber_chat_buddy_real_name, /* get_cb_real_name */
jabber_chat_set_topic, /* set_chat_topic */
jabber_find_blist_chat, /* find_blist_chat */
jabber_roomlist_get_list, /* roomlist_get_list */
jabber_roomlist_cancel, /* roomlist_cancel */
NULL, /* roomlist_expand_category */
jabber_can_receive_file, /* can_receive_file */
jabber_si_xfer_send, /* send_file */
jabber_si_new_xfer, /* new_xfer */
jabber_offline_message, /* offline_message */
NULL, /* whiteboard_prpl_ops */
jabber_prpl_send_raw, /* send_raw */
jabber_roomlist_room_serialize, /* roomlist_room_serialize */
jabber_unregister_account, /* unregister_user */
jabber_send_attention, /* send_attention */
jabber_attention_types, /* attention_types */
sizeof(PurplePluginProtocolInfo), /* struct_size */
NULL, /* get_account_text_table */
jabber_initiate_media, /* initiate_media */
jabber_get_media_caps, /* get_media_caps */
jabber_get_moods, /* get_moods */
NULL, /* set_public_alias */
NULL, /* get_public_alias */
NULL, /* add_buddy_with_invite */
NULL, /* add_buddies_with_invite */
NULL, /* get_cb_alias */
NULL, /* chat_can_receive_file */
NULL, /* chat_send_file */
};
static gboolean load_plugin(PurplePlugin *plugin)
{
jabber_plugin_init(plugin);
return TRUE;
}
static gboolean unload_plugin(PurplePlugin *plugin)
{
jabber_plugin_uninit(plugin);
return TRUE;
}
static PurplePluginInfo info =
{
PURPLE_PLUGIN_MAGIC,
PURPLE_MAJOR_VERSION,
PURPLE_MINOR_VERSION,
PURPLE_PLUGIN_PROTOCOL, /**< type */
NULL, /**< ui_requirement */
0, /**< flags */
NULL, /**< dependencies */
PURPLE_PRIORITY_DEFAULT, /**< priority */
"prpl-jabber", /**< id */
"XMPP", /**< name */
DISPLAY_VERSION, /**< version */
/** summary */
N_("XMPP Protocol Plugin"),
/** description */
N_("XMPP Protocol Plugin"),
NULL, /**< author */
PURPLE_WEBSITE, /**< homepage */
load_plugin, /**< load */
unload_plugin, /**< unload */
NULL, /**< destroy */
NULL, /**< ui_info */
&prpl_info, /**< extra_info */
NULL, /**< prefs_info */
jabber_actions,
/* padding */
NULL,
NULL,
NULL,
NULL
};
static PurpleAccount *find_acct(const char *prpl, const char *acct_id)
{
PurpleAccount *acct = NULL;
/* If we have a specific acct, use it */
if (acct_id) {
acct = purple_accounts_find(acct_id, prpl);
if (acct && !purple_account_is_connected(acct))
acct = NULL;
} else { /* Otherwise find an active account for the protocol */
GList *l = purple_accounts_get_all();
while (l) {
if (purple_strequal(prpl, purple_account_get_protocol_id(l->data))
&& purple_account_is_connected(l->data)) {
acct = l->data;
break;
}
l = l->next;
}
}
return acct;
}
static gboolean xmpp_uri_handler(const char *proto, const char *user, GHashTable *params)
{
char *acct_id = params ? g_hash_table_lookup(params, "account") : NULL;
PurpleAccount *acct;
if (g_ascii_strcasecmp(proto, "xmpp"))
return FALSE;
acct = find_acct(purple_plugin_get_id(my_protocol), acct_id);
if (!acct)
return FALSE;
/* xmpp:romeo@montague.net?message;subject=Test%20Message;body=Here%27s%20a%20test%20message */
/* params is NULL if the URI has no '?' (or anything after it) */
if (!params || g_hash_table_lookup_extended(params, "message", NULL, NULL)) {
char *body = g_hash_table_lookup(params, "body");
if (user && *user) {
PurpleConversation *conv =
purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, user);
purple_conversation_present(conv);
if (body && *body)
purple_conv_send_confirm(conv, body);
}
} else if (g_hash_table_lookup_extended(params, "roster", NULL, NULL)) {
char *name = g_hash_table_lookup(params, "name");
if (user && *user)
purple_blist_request_add_buddy(acct, user, NULL, name);
} else if (g_hash_table_lookup_extended(params, "join", NULL, NULL)) {
PurpleConnection *gc = purple_account_get_connection(acct);
if (user && *user) {
GHashTable *params = jabber_chat_info_defaults(gc, user);
jabber_chat_join(gc, params);
}
return TRUE;
}
return FALSE;
}
static void
init_plugin(PurplePlugin *plugin)
{
PurpleAccountUserSplit *split;
PurpleAccountOption *option;
GList *encryption_values = NULL;
/* Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im */
split = purple_account_user_split_new(_("Domain"), NULL, '@');
purple_account_user_split_set_reverse(split, FALSE);
prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
split = purple_account_user_split_new(_("Resource"), "", '/');
purple_account_user_split_set_reverse(split, FALSE);
prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
#define ADD_VALUE(list, desc, v) { \
PurpleKeyValuePair *kvp = g_new0(PurpleKeyValuePair, 1); \
kvp->key = g_strdup((desc)); \
kvp->value = g_strdup((v)); \
list = g_list_prepend(list, kvp); \
}
ADD_VALUE(encryption_values, _("Require encryption"), "require_tls");
ADD_VALUE(encryption_values, _("Use encryption if available"), "opportunistic_tls");
ADD_VALUE(encryption_values, _("Use old-style SSL"), "old_ssl");
#if 0
ADD_VALUE(encryption_values, "None", "none");
#endif
encryption_values = g_list_reverse(encryption_values);
#undef ADD_VALUE
option = purple_account_option_list_new(_("Connection security"), "connection_security", encryption_values);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
option = purple_account_option_bool_new(
_("Allow plaintext auth over unencrypted streams"),
"auth_plain_in_clear", FALSE);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
option = purple_account_option_int_new(_("Connect port"), "port", 5222);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
option = purple_account_option_string_new(_("Connect server"),
"connect_server", NULL);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
option = purple_account_option_string_new(_("File transfer proxies"),
"ft_proxies", NULL);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
option = purple_account_option_string_new(_("BOSH URL"),
"bosh_url", NULL);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
/* this should probably be part of global smiley theme settings
* later on
*/
option = purple_account_option_bool_new(_("Show Custom Smileys"),
"custom_smileys", TRUE);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
option);
my_protocol = plugin;
purple_prefs_remove("/plugins/prpl/jabber");
purple_signal_connect(purple_get_core(), "uri-handler", plugin,
PURPLE_CALLBACK(xmpp_uri_handler), NULL);
}
PURPLE_INIT_PLUGIN(jabber, init_plugin, info);