reverted:
--- pidgin-encryption-3.0/encrypt.c
+++ pidgin-encryption-3.0.orig/encrypt.c
@@ -1114,21 +1114,21 @@
notify_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
g_hash_table_insert(header_table, g_strdup("prpl-toc"),
+ g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
g_hash_table_insert(notify_table, g_strdup("prpl-toc"),
g_strdup(""));
g_hash_table_insert(header_table, g_strdup("prpl-oscar"),
+ g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
g_hash_table_insert(notify_table, g_strdup("prpl-oscar"),
g_strdup(""));
g_hash_table_insert(header_table, g_strdup("prpl-aim"),
+ g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
g_hash_table_insert(notify_table, g_strdup("prpl-aim"),
@@ -1136,7 +1136,7 @@
/* If jabber stops stripping HTML, we can go back to these headers */
/* g_hash_table_insert(header_table, g_strdup("prpl-jabber"), */
+/* g_strdup("*** Encrypted with the Gaim-Encryption plugin ")); */
/* g_hash_table_insert(notify_table, g_strdup("prpl-jabber"), */
@@ -1144,22 +1144,22 @@
g_hash_table_insert(header_table, g_strdup("prpl-jabber"),
+ g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
- g_strdup("--- Encrypted with the Gaim-Encryption plugin "));
g_hash_table_insert(footer_table, g_strdup("prpl-jabber"),
g_strdup(" "));
g_hash_table_insert(notify_table, g_strdup("prpl-jabber"),
g_strdup(" "));
+ header_default = g_strdup("*** Encrypted :");
- header_default = g_strdup("--- Encrypted :");
}
+/* #define CRYPT_HEADER "*** Encrypted with the Gaim-Encryption plugin " */
/* #define CRYPT_NOTIFY_HEADER "" */
// Jabber seems to turn our double quotes into single quotes at times, so define
// the same headers, only with single quotes. Lengths MUST be the same as above
+/* #define CRYPT_HEADER_MANGLED "*** Encrypted with the Gaim-Encryption plugin " */
diff -u pidgin-encryption-3.0/debian/changelog pidgin-encryption-3.0/debian/changelog
--- pidgin-encryption-3.0/debian/changelog
+++ pidgin-encryption-3.0/debian/changelog
@@ -1,8 +1,17 @@
-pidgin-encryption (3.0-5~karmic~ppa1) karmic; urgency=low
+pidgin-encryption (3.0-6~karmic~ppa1) karmic; urgency=low
- * Backport to Karmic -- No Source Changes (Source format 1.0)
+ * Backport to karmic
+ - use source format (1.0)
- -- Micah Gersten Mon, 04 Jan 2010 13:46:58 -0600
+ -- Micah Gersten Thu, 21 Jan 2010 15:50:29 -0600
+
+pidgin-encryption (3.0-6) unstable; urgency=low
+
+ * debian/patches: drop patch to fix scrambled header. It was clearly
+ not meant to interoperate with other versions and shouldn't have
+ been included in the first place. (closes: #564770)
+
+ -- Leo Costela Tue, 12 Jan 2010 19:49:01 +0100
pidgin-encryption (3.0-5) unstable; urgency=low
diff -u pidgin-encryption-3.0/debian/patches/series pidgin-encryption-3.0/debian/patches/series
--- pidgin-encryption-3.0/debian/patches/series
+++ pidgin-encryption-3.0/debian/patches/series
@@ -1,2 +1 @@
-fix_header_escaping.patch
log_crash.patch
diff -u pidgin-encryption-3.0/debian/patches/.dpkg-source-applied pidgin-encryption-3.0/debian/patches/.dpkg-source-applied
--- pidgin-encryption-3.0/debian/patches/.dpkg-source-applied
+++ pidgin-encryption-3.0/debian/patches/.dpkg-source-applied
@@ -1,2 +1 @@
-fix_header_escaping.patch
log_crash.patch
diff -u pidgin-encryption-3.0/.pc/applied-patches pidgin-encryption-3.0/.pc/applied-patches
--- pidgin-encryption-3.0/.pc/applied-patches
+++ pidgin-encryption-3.0/.pc/applied-patches
@@ -1,2 +1 @@
-fix_header_escaping.patch
log_crash.patch
reverted:
--- pidgin-encryption-3.0/.pc/fix_header_escaping.patch/encrypt.c
+++ pidgin-encryption-3.0.orig/.pc/fix_header_escaping.patch/encrypt.c
@@ -1,1348 +0,0 @@
-/* Pidgin encryption plugin */
-/* Copyright (C) 2001-2007 William Tompkins */
-
-/* This plugin is free software, distributed under the GNU General Public */
-/* License. */
-/* Please see the file "COPYING" distributed with this source code */
-/* for more details */
-/* */
-/* */
-/* This software 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. */
-
-/* To compile and use: */
-/* See INSTALL file. */
-
-#define PURPLE_PLUGINS
-
-#include "pidgin-encryption-config.h"
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "cryptproto.h"
-#include "cryptutil.h"
-#include "state.h"
-#include "state_ui.h"
-#include "keys.h"
-#include "nonce.h"
-#include "prefs.h"
-#include "config_ui.h"
-#include "pe_blist.h"
-
-#include "encrypt.h"
-#include "nls.h"
-
-#include
-#include
-#ifndef _WIN32
- #include
-#endif
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#ifdef HAVE_ALLOCA_H
-#include
-#endif
-
-#ifdef _WIN32
-#include "win32dep.h"
-#endif
-
-
-/* from Purple's internal.h, but it isn't critical that it is in sync: */
-#define PE_BUF_LONG 4096
-
-G_MODULE_IMPORT GSList *purple_accounts;
-G_MODULE_IMPORT guint im_options;
-
-
-#define ENCRYPT_PLUGIN_ID "gtk-obobo-pidgin-encryption"
-
-/* Types */
-struct msg_node {
- char who[64];
- time_t time;
- PurpleConnection* gc;
- struct msg_node* next;
- char msg[1];
-};
-typedef struct msg_node msg_node;
-
-
-static PurplePlugin *PE_plugin_handle;
-static guint PE_pref_callback_id;
-
-/* Outgoing message queue (waiting on a public key to encrypt) */
-static msg_node* first_out_msg = 0;
-static msg_node* last_out_msg = 0;
-
-/* Incoming message queue (waiting on a public key to verify) */
-static msg_node* first_inc_msg = 0;
-static msg_node* last_inc_msg = 0;
-
-static int PE_get_msg_size_limit(PurpleAccount*);
-static void PE_send_key(PurpleAccount *, const char *name, int, char*);
-static crypt_key * PE_get_key(PurpleConnection *, const char *name);
-static int decrypt_msg(char **decrypted, char *msg,
- const char *name, crypt_key *, crypt_key *);
-static void PE_store_msg(const char *name, PurpleConnection*, char *,
- msg_node**, msg_node**);
-static void got_encrypted_msg(PurpleConnection *, const char *name, char **);
-
-static void reap_all_sent_messages(PurpleConversation*);
-static void reap_old_sent_messages(PurpleConversation*);
-
-/* Function pointers exported to Purple */
-static gboolean PE_got_msg_cb(PurpleAccount *, char **, char **, PurpleConversation *conv, int* flags);
-static void PE_send_msg_cb(PurpleAccount *, char *, char **, void *);
-static void PE_new_conv_cb(PurpleConversation *, void *);
-static void PE_del_conv_cb(PurpleConversation *, void *);
-static void PE_updated_conv_cb(PurpleConversation *, void *);
-
-static GHashTable *header_table, *footer_table, *notify_table;
-static gchar* header_default;
-
-static char * unrequited_capable_who = 0; /* if we learn that someone is capable, but don't have */
- /* a conv for them yet, we set this to be them */
-
-static void strip_crypto_smiley(char* s) {
- char * pos;
-
- while ( (pos = strstr(s, CRYPTO_SMILEY)) != 0 ) {
- memmove(pos, pos + CRYPTO_SMILEY_LEN, strlen(pos + CRYPTO_SMILEY_LEN)+1);
- }
-}
-
-/* Send key to other side. If msg_id is non-null, we include a request to re-send */
-/* a certain message, as well. */
-
-static void PE_send_key(PurpleAccount *acct, const char *name, int asError, gchar *msg_id) {
- /* load key somehow */
- char *msg;
- GString *key_str;
- crypt_key *pub_key;
- PurpleConversation *conv;
-
- int header_size, footer_size;
- const gchar* header = g_hash_table_lookup(header_table, purple_account_get_protocol_id(acct));
- const gchar* footer = g_hash_table_lookup(footer_table, purple_account_get_protocol_id(acct));
-
- if (!header) header = header_default;
- if (!footer) footer = "";
-
- header_size = strlen(header);
- footer_size = strlen(footer);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "send_key: %s\n", acct->username);
-
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, acct);
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "send_key: %s, %p, %s\n", name, conv, acct->username);
-
- pub_key = PE_find_own_key_by_name(&PE_my_pub_ring, acct->username, acct, conv);
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "send_key2: %s\n", acct->username);
- if (!pub_key) return;
-
- key_str = PE_make_sendable_key(pub_key, name);
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "send_key3: %s\n", acct->username);
-
- msg = alloca(header_size + footer_size + key_str->len + 100);
- if (msg == 0) return;
- if (asError) {
- if (msg_id) {
- sprintf(msg, "%s: ErrKey: Prot %s: Len %d:%sResend:%s:%s", header,
- pub_key->proto->name, (int)key_str->len, key_str->str, msg_id, footer);
- } else {
- sprintf(msg, "%s: ErrKey: Prot %s: Len %d:%s%s", header,
- pub_key->proto->name, (int)key_str->len, key_str->str, footer);
- }
- } else {
- sprintf(msg, "%s: Key: Prot %s: Len %d:%s%s", header,
- pub_key->proto->name, (int)key_str->len, key_str->str, footer);
- }
-
- if (strlen(msg) > PE_get_msg_size_limit(acct)) {
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Key too big to send in message (%d > %d)\n",
- strlen(msg), PE_get_msg_size_limit(acct));
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, acct);
- if (conv == NULL) {
- conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, name);
- }
- purple_conversation_write(conv, 0,
- _("This account key is too large for this protocol. "
- "Unable to send."),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
- return;
- }
-
- serv_send_im(acct->gc, name, msg, 0);
- g_string_free(key_str, TRUE);
-}
-
-
-
-static crypt_key *PE_get_key(PurpleConnection *gc, const char *name) {
- crypt_key *bkey;
- char* tmpmsg;
-
- int header_size, footer_size;
- const gchar* header = g_hash_table_lookup(header_table, purple_account_get_protocol_id(gc->account));
- const gchar* footer = g_hash_table_lookup(footer_table, purple_account_get_protocol_id(gc->account));
-
- if (!header) header = header_default;
- if (!footer) footer = "";
-
- header_size = strlen(header);
- footer_size = strlen(footer);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "get_key: %s\n", name);
- bkey = PE_find_key_by_name(PE_buddy_ring, name, gc->account);
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "got key: %p\n", bkey);
-
- if( bkey == 0 ) {
- tmpmsg = alloca(header_size + footer_size +
- sizeof (": Send Key")); // sizeof() gets the trailing null too
-
- sprintf(tmpmsg, "%s%s%s", header, ": Send Key", footer);
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Sending: %s\n", tmpmsg);
- serv_send_im(gc, name, tmpmsg, 0);
- return 0;
- }
-
- return bkey;
-}
-
-
-static int decrypt_msg(char **decrypted, char *msg, const char *name,
- crypt_key *priv_key, crypt_key *pub_key) {
- int realstart = 0;
- unsigned int length;
- int len;
- char* decrypted_no_header = 0;
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "decrypt_msg\n");
-
- *decrypted = 0;
- if ( (sscanf(msg, ": Len %u:%n", &length, &realstart) < 1) || (realstart == 0)) {
- purple_debug(PURPLE_DEBUG_ERROR, "pidgin-encryption", "Garbled length in decrypt\n");
- return -1;
- }
-
- msg += realstart;
-
- if (strlen(msg) < length) {
- purple_debug(PURPLE_DEBUG_ERROR, "pidgin-encryption", "Length doesn't match in decrypt\n");
- return -1;
- }
- msg[length] = 0;
-
- len = PE_decrypt_signed(&decrypted_no_header, msg, priv_key, pub_key, name);
-
- if (len <= 0 || decrypted_no_header == 0) {
- return -1;
- }
- strip_crypto_smiley(decrypted_no_header);
-
- if (purple_prefs_get_bool("/plugins/gtk/encrypt/show_inline_icons")) {
- if (decrypted_no_header[0] == '/') {
- gchar** slashsplit = g_strsplit(decrypted_no_header, " ", 2);
- *decrypted = g_strconcat(slashsplit[0], " ", CRYPTO_SMILEY, " ", slashsplit[1], NULL);
- g_strfreev(slashsplit);
- g_free(decrypted_no_header);
- } else {
- *decrypted = g_strconcat(CRYPTO_SMILEY, " ", decrypted_no_header, NULL);
- g_free(decrypted_no_header);
- }
-
- return len + CRYPTO_SMILEY_LEN + 1; /* plus 1 from space after smiley */
-
- } else {
- /* not showing inline icons */
- *decrypted = decrypted_no_header;
- return len;
- }
-}
-
-
-static void PE_store_msg(const char *who, PurpleConnection *gc, char *msg, msg_node** first_node,
- msg_node** last_node) {
- msg_node* newnode;
-
-
- newnode = g_malloc(sizeof(msg_node) + strlen(msg));
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "store_msg: %p : %s\n", newnode, who);
-
- strncpy(newnode->who, purple_normalize(gc->account, who), sizeof(newnode->who));
- newnode->who[sizeof(newnode->who)-1] = 0;
-
- newnode->gc = gc;
- newnode->time = time((time_t)NULL);
- strcpy(newnode->msg, msg);
- newnode->next = 0;
-
-
- if (*first_node == 0) {
- *last_node = newnode;
- *first_node = newnode;
- } else {
- (*last_node)->next = newnode;
- *last_node = newnode;
- }
-
- for (newnode = *first_node; newnode != *last_node; newnode = newnode->next) {
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", " In store stack: %p\n",
- newnode, newnode->who);
- }
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", " In store stack: %p\n",
- *last_node, (*last_node)->who);
-}
-
-void PE_send_stored_msgs(PurpleAccount* acct, const char* who) {
- msg_node* node = first_out_msg;
- msg_node* prev = 0;
- char *tmp_msg;
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "send_stored_msgs\n");
-
- while (node != 0) {
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "Looking for stored msg:%s:%s\n",node->who, who);
- if ((strcmp(node->who, who) == 0) && (node->gc->account == acct)) {
- tmp_msg = g_strdup(node->msg);
- PE_send_msg_cb(node->gc->account, (char*)who, &tmp_msg, 0);
- PE_clear_string(node->msg);
- if (tmp_msg != 0) {
- g_free(tmp_msg);
- }
- if (node == last_out_msg) {
- last_out_msg = prev;
- }
- if (prev != 0) { /* a random one matched */
- prev->next = node->next;
- g_free(node);
- node = prev->next;
- } else { /* the first one matched */
- first_out_msg = node->next;
- g_free(node);
- node = first_out_msg;
- }
- } else { /* didn't match */
- prev = node;
- node = node->next;
- }
- }
-}
-
-void PE_delete_stored_msgs(PurpleAccount* acct, const char* who) {
- msg_node* node = first_out_msg;
- msg_node* prev = 0;
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "delete_stored_msgs\n");
-
- while (node != 0) {
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "Looking for stored msg:%s:%s\n",node->who, who);
- if ((strcmp(node->who, who) == 0) && (node->gc->account == acct)) {
- PE_clear_string(node->msg);
- if (node == last_out_msg) {
- last_out_msg = prev;
- }
- if (prev != 0) { /* a random one matched */
- prev->next = node->next;
- g_free(node);
- node = prev->next;
- } else { /* the first one matched */
- first_out_msg = node->next;
- g_free(node);
- node = first_out_msg;
- }
- } else { /* didn't match */
- prev = node;
- node = node->next;
- }
- }
-}
-
-void PE_show_stored_msgs(PurpleAccount*acct, const char* who) {
- msg_node* node = first_inc_msg;
- msg_node* prev = 0;
- char *tmp_msg;
-
- PurpleConversation *conv;
-
- while (node != 0) {
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "show_stored_msgs:%p:%s:%s:\n", node, node->who, who);
- if (strcmp(node->who, who) == 0) {
- tmp_msg = g_strdup(node->msg);
- got_encrypted_msg(node->gc, who, &tmp_msg);
- if (tmp_msg != 0) {
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "showing msg:%s\n", tmp_msg);
-
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, acct);
-
- // let gtkconv (and others) know that we're about to display a message, so
- // this is their chance to thwart it, or change the window, or...
- purple_signal_emit(purple_conversations_get_handle(), "received-im-msg", acct,
- who, tmp_msg, conv, PURPLE_MESSAGE_RECV);
-
- // the conv may have been updated with that signal, so fetch it again
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, acct);
-
- if (!conv) {
- conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, node->gc->account, who);
- }
-
- purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, tmp_msg,
- PURPLE_MESSAGE_RECV, time((time_t)NULL));
-
- g_free(tmp_msg);
-
- /* we might have just created the conversation, and now we're displaying an */
- /* encrypted message. So... make sure we've got all the trappings, and then */
- /* set the various indicators */
-
- PE_updated_conv_cb(conv, 0);
- PE_set_capable(conv, TRUE);
- if (purple_prefs_get_bool("/plugins/gtk/encrypt/encrypt_response")) {
- PE_set_tx_encryption(conv, TRUE);
- }
- PE_set_rx_encryption(conv, TRUE);
-
- }
- if (node == last_inc_msg) {
- last_inc_msg = prev;
- }
- if (prev != 0) { /* a random one matched */
- prev->next = node->next;
- g_free(node);
- node = prev->next;
- } else { /* the first one matched */
- first_inc_msg = node->next;
- g_free(node);
- node = first_inc_msg;
- }
- } else { /* didn't match */
- prev = node;
- node = node->next;
- }
- }
-}
-
-static void reap_all_sent_messages(PurpleConversation* conv){
-
- GQueue *sent_msg_queue = g_hash_table_lookup(conv->data, "sent messages");
-
- PE_SentMessage *sent_msg_item;
-
- /* purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "ZZZ Reaping all messages: %p\n", conv); */
-
- while (!g_queue_is_empty(sent_msg_queue)) {
- sent_msg_item = g_queue_pop_tail(sent_msg_queue);
- /* purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "ZZZ Message: %s\n", sent_msg_item->id); */
- g_free(sent_msg_item->id);
- g_free(sent_msg_item->msg);
- g_free(sent_msg_item);
- }
-}
-
-static void reap_old_sent_messages(PurpleConversation* conv){
- GQueue *sent_msg_queue = g_hash_table_lookup(conv->data, "sent messages");
-
- PE_SentMessage *sent_msg_item;
- time_t curtime = time(0);
-
- /* purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "ZZZ Reaping old messages: %p\n", conv); */
-
- while (!g_queue_is_empty(sent_msg_queue)) {
- sent_msg_item = g_queue_peek_tail(sent_msg_queue);
- /* purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "ZZZ Message: %s\n", sent_msg_item->id); */
- if (curtime - sent_msg_item->time > 60) { /* message is over 1 minute old */
- sent_msg_item = g_queue_pop_tail(sent_msg_queue);
- /* purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "ZZZ Deleted\n"); */
- g_free(sent_msg_item->id);
- g_free(sent_msg_item->msg);
- g_free(sent_msg_item);
- } else {
- /* These were pushed on in order, so if this one is not old, we're done */
- break;
- }
- }
-}
-
-static gboolean PE_got_msg_cb(PurpleAccount *acct, char **who, char **message,
- PurpleConversation *conv, int *flags) {
- char *name;
-
- gchar *headerpos; /* Header is allowed to be anywhere in message now */
- gchar *notifypos = 0;
- gchar *caps_header, *caps_message, /* temps for ascii_strup() versions of each */
- *caps_notify; /* since Jabber mucks with case */
-
- gchar *unescaped_message; /* temps for html_unescaped */
- /* since ICQ will now escape HTML */
-
- int header_size, footer_size;
- const gchar* header = g_hash_table_lookup(header_table, purple_account_get_protocol_id(acct));
- const gchar* footer = g_hash_table_lookup(footer_table, purple_account_get_protocol_id(acct));
- const gchar* notify = g_hash_table_lookup(notify_table, purple_account_get_protocol_id(acct));
-
- if (!header) header = header_default;
- if (!footer) footer = "";
-
- header_size = strlen(header);
- footer_size = strlen(footer);
-
- /* Since we don't have a periodic callback, we do some housekeeping here */
- purple_conversation_foreach(reap_old_sent_messages);
-
- name = g_strdup(purple_normalize(acct, *who));
-
- if (*message != NULL) {
- caps_message = g_ascii_strup(*message, -1);
- caps_header = g_ascii_strup(header, -1);
-
- headerpos = strstr(caps_message, caps_header);
- g_free(caps_header);
-
- if (headerpos == 0 && notify) {
- caps_notify = g_ascii_strup(notify, -1);
- notifypos = strstr(caps_message, caps_notify);
- g_free(caps_notify);
- } else {
- notifypos = 0;
- }
- if (headerpos != 0) {
- /* adjust to where the header is in the _real_ message, if */
- /* we found it in the caps_message */
- headerpos += (*message) - caps_message;
- }
-
- if (notifypos != 0) {
- /* ditto for the notification header */
- notifypos += (*message) - caps_message;
- }
-
- g_free(caps_message);
-
- if (headerpos == 0 && notifypos == 0) {
- unescaped_message = purple_unescape_html(*message);
- /* Check for ICQ-escaped header*/
- headerpos = strstr(unescaped_message, header);
- if (headerpos == 0 && notify) {
- notifypos = strstr(unescaped_message, notify);
- }
- if (headerpos != 0 || notifypos != 0) {
- /* ICQ PRPL escaped our HTML header, but we outsmarted it */
- /* replace message with unescaped message. */
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Escaped header: replacing %s with %s\n",
- *message, unescaped_message);
- g_free(*message);
- *message = unescaped_message;
- } else {
- g_free(unescaped_message);
- }
- }
-
- /* Whew. Enough of this header-finding. */
-
- if (headerpos != 0) {
- PE_set_capable(conv, TRUE);
- if (purple_prefs_get_bool("/plugins/gtk/encrypt/encrypt_response")) {
- PE_set_tx_encryption(conv, TRUE);
- }
- if (strncmp(headerpos + header_size, ": Send Key",
- sizeof(": Send Key")-1) == 0) {
- PE_send_key(acct, name, 0, 0);
- (*message)[0] = 0;
- g_free(*message);
- *message = NULL;
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Sent key per request\n");
- } else if (strncmp(headerpos + header_size, ": Key",
- sizeof(": Key") - 1) == 0) {
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Got key\n");
- PE_received_key(headerpos + header_size + sizeof(": Key") - 1, name, acct,
- conv, message);
- } else if (strncmp(headerpos + header_size, ": ErrKey",
- sizeof(": ErrKey") - 1) == 0) {
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Got key in response to error\n");
- purple_conversation_write(conv, 0,
- _("Last outgoing message not received properly- resetting"),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
-
- PE_received_key(headerpos + header_size + sizeof(": ErrKey") - 1, name, acct,
- conv, message);
- } else if (strncmp(headerpos + header_size, ": Msg",
- sizeof(": Msg") - 1) == 0){
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
- "Got encrypted message: %d\n", strlen(*message));
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "Message is:%s:\n", *message);
- memmove(*message, headerpos + header_size + sizeof(": Msg") - 1,
- strlen(headerpos + header_size + sizeof(": Msg") -1)+1);
- got_encrypted_msg(acct->gc, name, message);
- PE_set_rx_encryption(conv, TRUE);
- } else {
- purple_debug(PURPLE_DEBUG_ERROR, "pidgin-encryption",
- "Invalid Pidgin-Encryption packet type\n");
- }
- } else if (notifypos != 0) {
- PE_set_rx_encryption(conv, FALSE);
- if (conv) {
- PE_set_capable(conv, TRUE);
- if (purple_prefs_get_bool("/plugins/gtk/encrypt/encrypt_if_notified")) {
- PE_set_tx_encryption(conv, TRUE);
- }
- } else {
- /* remember who this was. If the next new conversation event is for */
- /* the same guy, we'll set as capable then */
- if (unrequited_capable_who) {
- g_free(unrequited_capable_who);
- }
- unrequited_capable_who = g_strdup(*who);
- }
- /* remove the notification HTML so it doesn't pollute the logs */
- memmove(notifypos, notifypos+strlen(notify),
- strlen(notifypos+strlen(notify))+1); /* +1 to include null */
- strip_crypto_smiley(*message);
- } else { /* No encrypt-o-header */
- PE_set_rx_encryption(conv, FALSE);
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "No header: %s\n", *message);
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
- "Proto '%s', header should be: %s\n", purple_account_get_protocol_id(acct), header);
- strip_crypto_smiley(*message);
- }
- }
-
- g_free(name);
-
- if (*message) {
- return FALSE;
- }
- else {
- return TRUE;
- }
-}
-
-static void got_encrypted_msg(PurpleConnection *gc, const char* name, char **message){
- unsigned char send_key_sum[KEY_DIGEST_LENGTH], recv_key_sum[KEY_DIGEST_LENGTH];
- char *tmp_msg=0;
- crypt_key *priv_key, *pub_key;
- int msg_pos = 0;
- PurpleConversation* conv;
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "got_encrypted_msg\n");
-
- if ( (sscanf(*message, ": S%10c: R%10c%n", send_key_sum, recv_key_sum, &msg_pos) < 2) ||
- (msg_pos == 0) ) {
- purple_debug(PURPLE_DEBUG_WARNING, "pidgin-encryption", "Garbled msg header\n");
- return;
- }
-
- priv_key = PE_find_key_by_name(PE_my_priv_ring, gc->account->username, gc->account);
- pub_key = PE_get_key(gc, name);
-
- if (strncmp((char*)priv_key->digest, (char*)recv_key_sum, KEY_DIGEST_LENGTH) != 0) {
- /* Someone sent us a message, but didn't use our correct public key */
- PE_send_key(gc->account, name, 1, 0);
- purple_debug(PURPLE_DEBUG_WARNING, "pidgin-encryption",
- "Digests aren't same: {%*s} and {%*s}\n",
- KEY_DIGEST_LENGTH, priv_key->digest,
- KEY_DIGEST_LENGTH, recv_key_sum);
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, gc->account);
- if (conv != 0) {
- purple_conversation_write(conv, 0,
- _("Received message encrypted with wrong key"),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
-
- } else {
- purple_debug(PURPLE_DEBUG_WARNING, "pidgin-encryption",
- "Received msg with wrong key, "
- "but can't write err msg to conv: %s\n", name);
- }
- g_free(*message);
- *message = NULL;
- return;
- }
-
- if (pub_key && (strncmp((char*)pub_key->digest, (char*)send_key_sum, KEY_DIGEST_LENGTH) != 0)) {
- /* We have a key for this guy, but the digest didn't match. Store the message */
- /* and ask for a new key */
- PE_del_key_from_ring(PE_buddy_ring, name, gc->account);
- pub_key = PE_get_key(gc, name); /* will be 0 now */
- }
-
- if (pub_key == 0) {
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "g_e_m: Storing message on Show stack\n");
- PE_store_msg(name, gc, *message, &first_inc_msg, &last_inc_msg);
- g_free(*message);
- *message = NULL;
- return;
- }
-
- memmove(*message, *message + msg_pos, strlen(*message + msg_pos) + 1);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "attempting decrypt on '%s'\n", *message);
-
- if (decrypt_msg(&tmp_msg, *message, name, priv_key, pub_key) < 0) {
- purple_debug(PURPLE_DEBUG_ERROR, "pidgin-encryption", "Error in decrypt\n");
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, gc->account);
- if (conv != 0) {
- purple_conversation_write(conv, 0,
- _("Error in decryption- asking for resend..."),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
-
- } else {
- purple_debug(PURPLE_DEBUG_WARNING, "pidgin-encryption",
- "Asking for resend, but can't write err msg to conv: %s\n", name);
- }
- PE_send_key(gc->account, name, 1, tmp_msg);
- g_free(*message);
- if (tmp_msg) g_free(tmp_msg);
- *message = NULL;
- return;
- }
-
- /* Successful Decryption */
-
- /* Note- we're feeding purple an arbitrarily formed message, which could
- potentially have lots of nasty control characters and stuff. But, that
- has been tested, and at present, at least, Purple won't barf on any
- characters that we give it.
-
- As an aside- Purple does now use g_convert() to convert to UTF-8 from
- other character streams. If we wanted to be all i18n, we could
- do the same, and even include the encoding type with the message.
- We're not all that, at least not yet.
- */
-
- /* Why the extra space (and the extra buffered copy)? Well, the *
- * purple server.c code does this, and having the extra space seems *
- * to prevent at least one possible type of crash. Pretty scary. */
-
- g_free(*message);
- *message = g_malloc(MAX(strlen(tmp_msg) + 1, PE_BUF_LONG));
- strcpy(*message, tmp_msg);
- g_free(tmp_msg);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "Msg rcv:'%s'\n", *message);
-}
-
-/* Get account-specific message size limit*/
-
-static int PE_get_msg_size_limit(PurpleAccount *acct) {
- const char* protocol_id = purple_account_get_protocol_id(acct);
-
- if (strcmp(protocol_id, "prpl-yahoo") == 0) {
- return 945;
- } else if (strcmp(protocol_id, "prpl-msn") == 0) {
- return 1500; /* This may be too small... somewhere in the 1500-1600 (+ html on front/back) */
- } else {
- /* Well, ok, this isn't too exciting. Someday we can actually check */
- /* to see what the real limits are. For now, 2500 works for everyone */
- /* but Yahoo. */
- return 2500;
- }
-}
-
-static void PE_send_msg_cb(PurpleAccount *acct, char *who, char **message, void* data) {
- char *out_msg, *crypt_msg = 0;
- char *dupname;
- int msgsize;
- const char msg_format[] = "%s: Msg:S%.10s:R%.10s: Len %d:%s%s";
- PurpleConversation *conv;
- crypt_key *our_key, *his_key;
- GSList *cur_msg;
- GQueue *sent_msg_queue;
- PE_SentMessage *sent_msg_item;
-
- int unencrypted_size_limit, msg_size_limit;
- int baggage_size;
- char baggage[PE_BUF_LONG];
-
- const gchar* header = g_hash_table_lookup(header_table, purple_account_get_protocol_id(acct));
- const gchar* footer = g_hash_table_lookup(footer_table, purple_account_get_protocol_id(acct));
- const gchar* notify = g_hash_table_lookup(notify_table, purple_account_get_protocol_id(acct));
-
- if (!header) header = header_default;
- if (!footer) footer = "";
-
- msg_size_limit = PE_get_msg_size_limit(acct);
-
- /* who: name that you are sending to */
- /* gc->username: your name */
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "send_msg: %s\n", who);
-
- /* Since we don't have a periodic callback, we do some housekeeping here */
- purple_conversation_foreach(reap_old_sent_messages);
-
- /* Message might have been eaten by another plugin: */
- if ((message == NULL) || (*message == NULL)) {
- return;
- }
-
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, acct);
-
- if (conv == NULL) {
- conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, who);
- }
-
- if (PE_get_tx_encryption(conv) == FALSE) {
- if (notify && purple_prefs_get_bool("/plugins/gtk/encrypt/broadcast_notify")
- && !PE_has_been_notified(conv)) {
- PE_set_notified(conv, TRUE);
- if (PE_msg_starts_with_link(*message) == TRUE) {
- /* This is a hack- AOL's client has a bug in the html parsing
- so that adjacent links (like )
- get concatenated (into ). So we insert a
- space if the first thing in the message is a link.
- */
- out_msg = g_strconcat(notify, " ", *message, NULL);
- } else {
- out_msg = g_strconcat(notify, *message, NULL);
- }
- g_free(*message);
- *message = out_msg;
- }
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Outgoing Msg::%s::\n", *message);
- return;
- }
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "send_msg B: %s, %p, %p, %p\n",
- who, &PE_my_priv_ring, acct, conv);
-
- our_key = PE_find_own_key_by_name(&PE_my_priv_ring, acct->username, acct, conv);
-
- if (!our_key) {
- *message[0] = 0; /* Nuke message so it doesn't look like it was sent. */
- /* find_own_key (above) will have displayed error messages */
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "leaving\n");
-
- return;
- }
-
- dupname = g_strdup(purple_normalize(acct, who));
- his_key = PE_get_key(acct->gc, dupname);
-
- if (his_key == 0) { /* Don't have key for this guy yet */
- /* PE_get_key will have sent the key request, just let user know */
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "requesting key\n");
- purple_conversation_write(conv, 0, _("Requesting key..."),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
-
- PE_store_msg(who, acct->gc, *message, &first_out_msg, &last_out_msg);
-
- } else { /* We have a key. Encrypt and send. */
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "has key\n", dupname);
- baggage_size = snprintf(baggage, sizeof(baggage), msg_format, header, our_key->digest,
- his_key->digest, 10000, "", footer);
- baggage_size = MIN(baggage_size, sizeof(baggage) - 1);
-
- /* Warning: message_split keeps static copies, so if our */
- /* caller uses it, we're hosed. Looks like nobody else */
- /* uses it now, though. */
- unencrypted_size_limit =
- PE_calc_unencrypted_size(our_key, his_key, msg_size_limit - baggage_size);
-
- cur_msg = PE_message_split(*message, unencrypted_size_limit);
- while (cur_msg) {
- gchar* disp_msg;
- if (purple_prefs_get_bool("/plugins/gtk/encrypt/show_inline_icons")) {
- /* add our smiley to front of message */
- if (((gchar*)cur_msg->data)[0] == '/') {
- /* doh, starting with a /command, so put the smiley after the /command */
- gchar** slashsplit = g_strsplit(cur_msg->data, " ", 2);
- disp_msg = g_strconcat(slashsplit[0], " ", CRYPTO_SMILEY, " ", slashsplit[1], NULL);
- g_strfreev(slashsplit);
- } else {
- disp_msg = g_strconcat(CRYPTO_SMILEY, " ", cur_msg->data, NULL);
- }
- } else {
- /* no smiley at front of message */
- disp_msg = g_strdup(cur_msg->data);
- }
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "im_write: %s\n", dupname);
-
- purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, disp_msg,
- PURPLE_MESSAGE_SEND, time((time_t)NULL));
- g_free(disp_msg);
-
- /* Add message to stash of sent messages: in case a key or nonce is wrong, we */
- /* can then re-send the message when asked. */
- sent_msg_queue = g_hash_table_lookup(conv->data, "sent messages");
- sent_msg_item = g_malloc(sizeof(PE_SentMessage));
- sent_msg_item->time = time(0);
- sent_msg_item->id = PE_make_key_id(his_key); /* current nonce value */
- sent_msg_item->msg = g_strdup(cur_msg->data);
-
- g_queue_push_head(sent_msg_queue, sent_msg_item);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "Enc for send: '%s'\n", cur_msg->data);
-
- PE_encrypt_signed(&crypt_msg, cur_msg->data, our_key, his_key);
- msgsize = strlen(crypt_msg);
-
- out_msg = g_malloc(msgsize + baggage_size + 1);
-
- sprintf(out_msg, msg_format, header,
- our_key->digest, his_key->digest, msgsize, crypt_msg,
- footer);
-
- serv_send_im(acct->gc, who, out_msg, 0);
-
- /* emit the "sent-im-msg" event, which will cause sounds to get played, etc*/
- purple_signal_emit(purple_conversations_get_handle(), "sent-im-msg",
- acct, purple_conversation_get_name(conv), out_msg);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "send_im: %s: %d\n", who, strlen(out_msg));
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "outgoing:%s:\n", out_msg);
- g_free(out_msg);
- g_free(crypt_msg);
- cur_msg = cur_msg->next;
- /* if (purple_prefs_get_bool("/pidgin/conversations/im/hide_on_send")) {
- purple_window_hide(purple_conversation_get_window(conv));
- } */
- }
- }
-
- *message[0] = 0;
- g_free(dupname);
-
- return;
-}
-
-
-void PE_resend_msg(PurpleAccount* acct, const char* name, gchar *msg_id) {
- char *out_msg, *crypt_msg = 0, *msg = 0;
- PurpleConversation* conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, acct);
- int msgsize;
- const char msg_format[] = "%s: Msg:S%.10s:R%.10s: Len %d:%s%s";
- crypt_key *our_key, *his_key;
-
- GQueue *sent_msg_queue;
- PE_SentMessage *sent_msg_item;
-
- int baggage_size;
- char baggage[PE_BUF_LONG];
- const gchar *header, *footer;
-
- if (msg_id == 0) {
- purple_debug(PURPLE_DEBUG_ERROR, "pidgin-encryption", "Bad call to resend_msg: %p %p\n", conv, msg_id);
- return;
- }
-
- if (conv == 0) {
- conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, name);
- }
-
- header = g_hash_table_lookup(header_table, purple_account_get_protocol_id(acct));
- footer = g_hash_table_lookup(footer_table, purple_account_get_protocol_id(acct));
-
- if (!header) header = header_default;
- if (!footer) footer = "";
-
- /*Sometimes callers don't know whether there's a msg to send... */
- if (msg_id == 0 || conv == 0) return;
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
- "resend_encrypted_msg: %s:%s\n", conv->name, msg_id);
-
- our_key = PE_find_key_by_name(PE_my_priv_ring, conv->account->username, conv->account);
-
- his_key = PE_find_key_by_name(PE_buddy_ring, name, conv->account);
-
- if (his_key == 0) { /* Don't have key for this guy */
- purple_conversation_write(conv, 0,
- _("No key to resend message. Message lost."),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
-
- } else { /* We have a key. Encrypt and send. */
-
- sent_msg_queue = g_hash_table_lookup(conv->data, "sent messages");
-
- /* Root through the queue looking for the right message. Any that are older than this */
- /* one we will throw out, since they would have already been asked for. */
-
- while (!g_queue_is_empty(sent_msg_queue)) {
- sent_msg_item = g_queue_pop_tail(sent_msg_queue);
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "Examining Message: %s\n",
- sent_msg_item->id);
-
- if (strcmp(sent_msg_item->id, msg_id) == 0) { /* This is the one to resend */
- msg = sent_msg_item->msg;
- g_free(sent_msg_item->id);
- g_free(sent_msg_item);
- break;
- }
- /* Not the one to resend: pitch it */
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", " Deleted\n");
- g_free(sent_msg_item->id);
- g_free(sent_msg_item->msg);
- g_free(sent_msg_item);
- }
-
- if (msg) {
- baggage_size = snprintf(baggage, sizeof(baggage), msg_format, header, our_key->digest,
- his_key->digest, 10000, "", footer);
- baggage_size = MIN(baggage_size, sizeof(baggage) - 1);
-
- PE_encrypt_signed(&crypt_msg, msg, our_key, his_key);
- msgsize = strlen(crypt_msg);
- out_msg = g_malloc(msgsize + baggage_size + 1);
-
- sprintf(out_msg, msg_format, header,
- our_key->digest, his_key->digest, msgsize, crypt_msg,
- footer);
- purple_conversation_write(conv, 0,
- "Resending...",
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
- serv_send_im(conv->account->gc, name, out_msg, 0);
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "resend_im: %s: %d\n", name, strlen(out_msg));
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "resend outgoing:%s:\n", out_msg);
- g_free(msg);
- g_free(out_msg);
- g_free(crypt_msg);
- } else {
- purple_conversation_write(conv, 0, _("Outgoing message lost."),
- PURPLE_MESSAGE_SYSTEM, time((time_t)NULL));
- }
- }
-}
-
-
-
-static void PE_new_conv(PurpleConversation *conv) {
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "New conversation\n");
-
- if ((conv != NULL) && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)) {
- g_hash_table_insert(conv->data, g_strdup("sent messages"), g_queue_new());
- g_hash_table_insert(conv->data, g_strdup("sent_capable"), FALSE);
- PE_add_smiley(conv);
- PE_sync_state(conv);
- if (unrequited_capable_who) {
- if (strcmp(unrequited_capable_who, purple_conversation_get_name(conv)) == 0) {
- PE_set_capable(conv, TRUE);
- if (purple_prefs_get_bool("/plugins/gtk/encrypt/encrypt_if_notified")) {
- PE_set_tx_encryption(conv, TRUE);
- }
- }
- g_free(unrequited_capable_who);
- unrequited_capable_who = 0;
- }
- } else {
- purple_debug(PURPLE_DEBUG_ERROR, "pidgin-encryption", "New conversation IS NULL\n");
- }
-}
-
-static void PE_new_conv_cb(PurpleConversation *conv, void* data) {
- PE_new_conv(conv);
-}
-
-static void PE_updated_conv_cb(PurpleConversation *conv, void* data) {
- PE_add_smiley(conv);
- PE_sync_state(conv);
-}
-
-static void PE_del_conv_cb(PurpleConversation *conv, void* data)
-{
- GQueue *sent_msg_queue;
-
- if ((conv != NULL) && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)) {
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
- "Got conversation delete event for %s\n", conv->name);
-
- /* Remove cached copies of sent messages */
- reap_all_sent_messages(conv);
- sent_msg_queue = g_hash_table_lookup(conv->data, "sent messages");
- g_queue_free(sent_msg_queue);
- g_hash_table_remove(conv->data, "sent messages");
-
- /* Remove to-be-sent-on-receipt-of-key messages: */
- PE_delete_stored_msgs(conv->account, purple_normalize(conv->account, conv->name));
-
- PE_buddy_ring = PE_del_key_from_ring(PE_buddy_ring,
- purple_normalize(conv->account, conv->name), conv->account);
-
- /* Would be good to add prefs for these, but for now, just reset: */
- PE_free_state(conv);
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
- "Finished conversation delete event for %s\n", conv->name);
- /* button widgets (hopefully) destroyed on window close */
- /* hash table entries destroyed on hash table deletion, except */
- /* for any dynamically allocated values (keys are ok). */
- }
-}
-
-static void PE_headers_init() {
- header_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
- footer_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
- notify_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
-
- g_hash_table_insert(header_table, g_strdup("prpl-toc"),
- g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
- g_hash_table_insert(notify_table, g_strdup("prpl-toc"),
- g_strdup(""));
-
- g_hash_table_insert(header_table, g_strdup("prpl-oscar"),
- g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
- g_hash_table_insert(notify_table, g_strdup("prpl-oscar"),
- g_strdup(""));
-
- g_hash_table_insert(header_table, g_strdup("prpl-aim"),
- g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
- g_hash_table_insert(notify_table, g_strdup("prpl-aim"),
- g_strdup(""));
-
-/* If jabber stops stripping HTML, we can go back to these headers */
-/* g_hash_table_insert(header_table, g_strdup("prpl-jabber"), */
-/* g_strdup("*** Encrypted with the Gaim-Encryption plugin ")); */
-/* g_hash_table_insert(notify_table, g_strdup("prpl-jabber"), */
-/* g_strdup(" ")); */
-
-
- g_hash_table_insert(header_table, g_strdup("prpl-jabber"),
- g_strdup("*** Encrypted with the Gaim-Encryption plugin "));
- g_hash_table_insert(footer_table, g_strdup("prpl-jabber"),
- g_strdup(" "));
- g_hash_table_insert(notify_table, g_strdup("prpl-jabber"),
- g_strdup(" "));
-
- header_default = g_strdup("*** Encrypted :");
-}
-
-/* #define CRYPT_HEADER "*** Encrypted with the Gaim-Encryption plugin " */
-/* #define CRYPT_NOTIFY_HEADER "" */
-
-// Jabber seems to turn our double quotes into single quotes at times, so define
-// the same headers, only with single quotes. Lengths MUST be the same as above
-/* #define CRYPT_HEADER_MANGLED "*** Encrypted with the Gaim-Encryption plugin " */
-
-
-static void init_prefs() {
- /* These only add/set a pref if it doesn't currently exist: */
-
- int default_width;
-
- if (purple_prefs_get_type("/plugins/gtk/encrypt/accept_unknown_key") == PURPLE_PREF_NONE) {
- /* First time loading the plugin, since we don't have our prefs set yet */
-
- /* so up the default window width to accomodate new buttons */
- default_width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/default_width");
-
- if (default_width == 410) { /* the stock pidgin default width */
- purple_prefs_set_int(PIDGIN_PREFS_ROOT "/conversations/im/default_width", 490);
- }
- }
-
- purple_prefs_add_none("/plugins/gtk");
- purple_prefs_add_none("/plugins/gtk/encrypt");
-
- purple_prefs_add_bool("/plugins/gtk/encrypt/accept_unknown_key", FALSE);
- purple_prefs_add_bool("/plugins/gtk/encrypt/accept_conflicting_key", FALSE);
- purple_prefs_add_bool("/plugins/gtk/encrypt/encrypt_response", TRUE);
- purple_prefs_add_bool("/plugins/gtk/encrypt/broadcast_notify", FALSE);
- purple_prefs_add_bool("/plugins/gtk/encrypt/encrypt_if_notified", TRUE);
-
- purple_prefs_add_string("/plugins/gtk/encrypt/key_path", "");
- purple_prefs_add_string("/plugins/gtk/encrypt/key_path_displayed", purple_user_dir());
-
- PE_pref_callback_id =
- purple_prefs_connect_callback(PE_plugin_handle, "/plugins/gtk/encrypt/key_path_displayed",
- PE_prefs_changed_cb, 0);
-
- PE_convert_legacy_prefs();
-}
-
-/* Called by Purple when plugin is first loaded */
-static gboolean PE_plugin_load(PurplePlugin *h) {
-
- void *conv_handle;
-
-#ifdef ENABLE_NLS
- bindtextdomain (ENC_PACKAGE, LOCALEDIR);
- bind_textdomain_codeset (ENC_PACKAGE, "UTF-8");
- setlocale(LC_ALL, "");
-#endif
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
- "Compiled with Purple '%d.%d.%d', running with Purple '%s'.\n",
- PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION, PURPLE_MICRO_VERSION, purple_core_get_version());
-
- init_prefs();
-
- conv_handle = purple_conversations_get_handle();
-
- purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption", "plugin_load called\n");
- PE_plugin_handle = h;
-
- PE_state_init();
- PE_pixmap_init();
-
- if (!rsa_nss_init()) {
- return FALSE;
- }
-
- PE_key_rings_init();
- PE_nonce_map_init();
- PE_state_ui_init();
- PE_headers_init();
-
- purple_signal_connect(conv_handle, "receiving-im-msg", h,
- PURPLE_CALLBACK(PE_got_msg_cb), NULL);
- purple_signal_connect(conv_handle, "sending-im-msg", h,
- PURPLE_CALLBACK(PE_send_msg_cb), NULL);
- purple_signal_connect(conv_handle, "conversation-created", h,
- PURPLE_CALLBACK(PE_new_conv_cb), NULL);
- purple_signal_connect(conv_handle, "conversation-updated", h,
- PURPLE_CALLBACK(PE_updated_conv_cb), NULL);
- purple_signal_connect(conv_handle, "deleting-conversation", h,
- PURPLE_CALLBACK(PE_del_conv_cb), NULL);
- purple_signal_connect(pidgin_log_get_handle(), "log-displaying", h,
- PURPLE_CALLBACK(PE_log_displaying_cb), NULL);
-
- purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu", h,
- PURPLE_CALLBACK(PE_buddy_menu_cb), NULL);
-
-
- purple_conversation_foreach(PE_sync_state);
-
- purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "done loading\n");
-
-
- return TRUE;
-}
-
-/* Called by Purple when plugin is removed */
-static gboolean PE_plugin_unload(PurplePlugin *h) {
-
- purple_signals_disconnect_by_handle(h);
-
- purple_prefs_disconnect_callback(PE_pref_callback_id);
-
- PE_config_unload();
-
- purple_conversation_foreach(PE_remove_decorations);
-
- PE_my_priv_ring = PE_clear_ring(PE_my_priv_ring);
- PE_my_pub_ring = PE_clear_ring(PE_my_pub_ring);
- PE_buddy_ring = PE_clear_ring(PE_buddy_ring);
-
- PE_state_delete();
- PE_state_ui_delete();
- return TRUE;
-}
-
-static PidginPluginUiInfo ui_info =
-{
- PE_get_config_frame,
- 0, /* page_num (Reserved) */
-
- /* padding */
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-static PurplePluginInfo info =
-{
- PURPLE_PLUGIN_MAGIC, /**< I'm a plugin! */
- PURPLE_MAJOR_VERSION,
- PURPLE_MINOR_VERSION,
- PURPLE_PLUGIN_STANDARD, /**< type */
- PIDGIN_PLUGIN_TYPE, /**< ui_requirement */
- 0, /**< flags */
- NULL, /**< dependencies */
- PURPLE_PRIORITY_DEFAULT, /**< priority */
-
- ENCRYPT_PLUGIN_ID, /**< id */
- 0, /**< name */
- ENC_VERSION, /**< version */
- 0, /** summary */
- 0, /** description */
- 0, /**< author */
- ENC_WEBSITE, /**< homepage */
-
- PE_plugin_load, /**< load */
- PE_plugin_unload, /**< unload */
- NULL, /**< destroy */
-
- &ui_info, /**< ui_info */
- NULL, /**< extra_info */
- NULL, /**< prefs_info */
- NULL, /**< actions */
-
- /* padding */
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-static void
-init_plugin(PurplePlugin *plugin)
-{
-
-#ifdef ENABLE_NLS
- bindtextdomain (ENC_PACKAGE, LOCALEDIR);
- bind_textdomain_codeset (ENC_PACKAGE, "UTF-8");
- setlocale(LC_ALL, "");
-#endif
-
- info.name = _("Pidgin-Encryption");
- info.summary = _("Encrypts conversations with RSA encryption.");
- info.description = _("RSA encryption with keys up to 4096 bits,"
- " using the Mozilla NSS crypto library.\n");
- /* Translators: Feel free to add your name to the author field, with text like */
- /* "Bill Tompkins, translation by Phil McGee" */
- info.author = _("Bill Tompkins");
-
-}
-
-
-PURPLE_INIT_PLUGIN(pidgin_encryption, init_plugin, info);