diff src/protocols/oscar/oscar.c @ 10464:61ef9a964574

[gaim-migrate @ 11739] SecurID support for AIM. This is untested. I'll try to get it tested in the next few days. I'm backporting this to oldstatus. If you don't know what SecurID, google around for it. Basically it's an optional additional authentication method that AOL members can opt for (and pay an extra fee). After entering your password, you are prompted for a 6 digit number from a digit readout/ keychain-sized LCD screen. This number is pseudo-random and changes every 60 seconds. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 02 Jan 2005 07:20:38 +0000
parents ad9258716144
children 133a33699e19
line wrap: on
line diff
--- a/src/protocols/oscar/oscar.c	Fri Dec 31 16:34:22 2004 +0000
+++ b/src/protocols/oscar/oscar.c	Sun Jan 02 07:20:38 2005 +0000
@@ -219,6 +219,7 @@
 /* All the libfaim->gaim callback functions */
 static int gaim_parse_auth_resp  (aim_session_t *, aim_frame_t *, ...);
 static int gaim_parse_login      (aim_session_t *, aim_frame_t *, ...);
+static int gaim_parse_auth_securid_request(aim_session_t *, aim_frame_t *, ...);
 static int gaim_handle_redirect  (aim_session_t *, aim_frame_t *, ...);
 static int gaim_info_change      (aim_session_t *, aim_frame_t *, ...);
 static int gaim_account_confirm  (aim_session_t *, aim_frame_t *, ...);
@@ -1783,8 +1784,9 @@
 	}
 
 	aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0);
+	aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0);
 	aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0);
-	aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0);
+	aim_conn_addhandler(sess, conn, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_REQUEST, gaim_parse_auth_securid_request, 0);
 
 	conn->status |= AIM_CONN_STATUS_INPROGRESS;
 	if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER),
@@ -2339,6 +2341,49 @@
 	return 1;
 }
 
+static void
+gaim_parse_auth_securid_request_yes_cb(gpointer user_data, const char *msg)
+{
+	GaimConnection *gc = user_data;
+	OscarData *od = gc->proto_data;
+	aim_session_t *sess = od->sess;
+
+	aim_auth_securid_send(sess, msg);
+}
+
+static void
+gaim_parse_auth_securid_request_no_cb(gpointer user_data, const char *value)
+{
+	GaimConnection *gc = user_data;
+	OscarData *od = gc->proto_data;
+
+	/* Disconnect */
+	gc->wants_to_die = TRUE;
+	gaim_connection_error(gc, _("The SecurID key entered is invalid."));
+	od->killme = TRUE;
+}
+
+static int
+gaim_parse_auth_securid_request(aim_session_t *sess, aim_frame_t *fr, ...)
+{
+	GaimConnection *gc = sess->aux_data;
+	GaimAccount *account = gaim_connection_get_account(gc);
+	gchar *primary;
+
+	gaim_debug_info("oscar", "Got SecurID request\n");
+
+	primary = g_strdup_printf("Enter the SecurID key for %s.", gaim_account_get_username(account));
+	gaim_request_input(gc, NULL, _("Enter SecurID"), primary,
+					   _("Enter the 6 digit number from the digital display."),
+					   FALSE, FALSE, NULL,
+					   _("OK"), G_CALLBACK(gaim_parse_auth_securid_request_yes_cb),
+					   _("Cancel"), G_CALLBACK(gaim_parse_auth_securid_request_no_cb),
+					   gc);
+	g_free(primary);
+
+	return 1;
+}
+
 /* XXX - Should use gaim_url_fetch for the below stuff */
 struct pieceofcrap {
 	GaimConnection *gc;