diff -Naur pidgin-2.2.1.orig/libpurple/account.c pidgin-2.2.1/libpurple/account.c --- pidgin-2.2.1.orig/libpurple/account.c 2007-10-01 15:31:33.000000000 +0200 +++ pidgin-2.2.1/libpurple/account.c 2007-10-01 15:34:15.000000000 +0200 @@ -2451,6 +2451,24 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_ACCOUNT), purple_value_new(PURPLE_TYPE_STRING)); + purple_signal_register(handle, "account-request-authorization", + purple_marshal_BOOLEAN__POINTER_POINTER, + purple_value_new(PURPLE_TYPE_BOOLEAN), 2, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_ACCOUNT), + purple_value_new(PURPLE_TYPE_STRING)); + + purple_signal_register(handle, "account-authorization-denied", + purple_marshal_VOID__POINTER_POINTER, NULL, 2, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_ACCOUNT), + purple_value_new(PURPLE_TYPE_STRING)); + + purple_signal_register(handle, "account-authorization-granted", + purple_marshal_VOID__POINTER_POINTER, NULL, 2, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_ACCOUNT), + purple_value_new(PURPLE_TYPE_STRING)); load_accounts(); diff -Naur pidgin-2.2.1.orig/pidgin/gtkaccount.c pidgin-2.2.1/pidgin/gtkaccount.c --- pidgin-2.2.1.orig/pidgin/gtkaccount.c 2007-10-01 15:31:33.000000000 +0200 +++ pidgin-2.2.1/pidgin/gtkaccount.c 2007-10-01 15:31:45.000000000 +0200 @@ -2510,6 +2510,8 @@ static void authorize_and_add_cb(struct auth_and_add *aa) { + purple_signal_emit(purple_accounts_get_handle(), + "account-authorization-granted", aa->account, &aa->username); aa->auth_cb(aa->data); purple_blist_request_add_buddy(aa->account, aa->username, NULL, aa->alias); @@ -2520,8 +2522,22 @@ } static void +auth_no_add_cb(struct auth_and_add *aa) +{ + purple_signal_emit(purple_accounts_get_handle(), + "account-authorization-granted", aa->account, &aa->username); + aa->auth_cb(aa->data); + + g_free(aa->username); + g_free(aa->alias); + g_free(aa); +} + +static void deny_no_add_cb(struct auth_and_add *aa) { + purple_signal_emit(purple_accounts_get_handle(), + "account-authorization-denied", aa->account, &aa->username); aa->deny_cb(aa->data); g_free(aa->username); @@ -2543,6 +2559,8 @@ char *buffer; PurpleConnection *gc; GtkWidget *alert; + int plugin_return; + struct auth_and_add *aa; gc = purple_account_get_connection(account); if (message != NULL && *message == '\0') @@ -2561,15 +2579,24 @@ (message != NULL ? ": " : "."), (message != NULL ? message : "")); + plugin_return = GPOINTER_TO_INT( + purple_signal_emit_return_1(purple_accounts_get_handle(), + "account-request-authorization", account, &remote_user)); + + if (plugin_return) { + g_free(buffer); + return; + } + + aa = g_new0(struct auth_and_add, 1); + aa->auth_cb = auth_cb; + aa->deny_cb = deny_cb; + aa->data = user_data; + aa->username = g_strdup(remote_user); + aa->alias = g_strdup(alias); + aa->account = account; if (!on_list) { - struct auth_and_add *aa = g_new0(struct auth_and_add, 1); - aa->auth_cb = auth_cb; - aa->deny_cb = deny_cb; - aa->data = user_data; - aa->username = g_strdup(remote_user); - aa->alias = g_strdup(alias); - aa->account = account; alert = pidgin_make_mini_dialog(gc, PIDGIN_STOCK_DIALOG_QUESTION, _("Authorize buddy?"), buffer, aa, _("Authorize"), authorize_and_add_cb, @@ -2577,9 +2604,9 @@ NULL); } else { alert = pidgin_make_mini_dialog(gc, PIDGIN_STOCK_DIALOG_QUESTION, - _("Authorize buddy?"), buffer, user_data, - _("Authorize"), auth_cb, - _("Deny"), deny_cb, + _("Authorize buddy?"), buffer, aa, + _("Authorize"), auth_no_add_cb, + _("Deny"), deny_no_add_cb, NULL); } pidgin_blist_add_alert(alert);