Mercurial > pidgin
diff src/protocols/oscar/auth.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 | 9cafe038c95e |
children | cbbf5af9e520 |
line wrap: on
line diff
--- a/src/protocols/oscar/auth.c Fri Dec 31 16:34:22 2004 +0000 +++ b/src/protocols/oscar/auth.c Sun Jan 02 07:20:38 2005 +0000 @@ -468,15 +468,22 @@ aim_sendflapver(sess, conn); - if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+2+2+strlen(sn) /*+8*/ ))) + if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+2+2+strlen(sn)+8 ))) return -ENOMEM; snacid = aim_cachesnac(sess, 0x0017, 0x0006, 0x0000, NULL, 0); aim_putsnac(&fr->data, 0x0017, 0x0006, 0x0000, snacid); aim_tlvlist_add_raw(&tl, 0x0001, strlen(sn), sn); -/* aim_tlvlist_add_noval(&tl, 0x004b); - aim_tlvlist_add_noval(&tl, 0x005a); */ + + /* + * These are sent in logins for recent WinAIM clients. Maybe tells + * the server we're able to handle SecurID requests? That's a complete + * guess. + */ + aim_tlvlist_add_noval(&tl, 0x004b); + aim_tlvlist_add_noval(&tl, 0x005a); + aim_tlvlist_write(&fr->data, &tl); aim_tlvlist_free(&tl); @@ -515,6 +522,53 @@ return ret; } +/** + * Subtype 0x000a + * + * Receive SecurID request. + */ +static int got_securid_request(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) +{ + int ret = 0; + aim_rxcallback_t userfunc; + + if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) + ret = userfunc(sess, rx); + + return ret; +} + +/** + * Subtype 0x000b + * + * Send SecurID response. + */ +faim_export int aim_auth_securid_send(aim_session_t *sess, const char *securid) +{ + aim_conn_t *conn; + aim_frame_t *fr; + aim_snacid_t snacid; + int len; + + if (!sess || !(conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH)) || !securid) + return -EINVAL; + + len = strlen(securid); + + if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x01, 10+2+len))) + return -ENOMEM; + + snacid = aim_cachesnac(sess, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_RESPONSE, 0x0000, NULL, 0); + aim_putsnac(&fr->data, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_RESPONSE, 0x0000, 0); + + aimbs_put16(&fr->data, len); + aimbs_putraw(&fr->data, securid, len); + + aim_tx_enqueue(sess, fr); + + return 0; +} + static void auth_shutdown(aim_session_t *sess, aim_module_t *mod) { if (sess->authinfo) { @@ -540,6 +594,8 @@ return parse(sess, mod, rx, snac, bs); else if (snac->subtype == 0x0007) return keyparse(sess, mod, rx, snac, bs); + else if (snac->subtype == 0x000a) + return got_securid_request(sess, mod, rx, snac, bs); return 0; }