static int process_command(byte *buf) { int retval = 0; ETERM *pattern, *tuple, *cmd, *port, *data; pattern = erl_format("{Cmd, Port, Data}"); tuple = erl_decode(buf); if (erl_match(pattern, tuple)) { cmd = erl_var_content(pattern, "Cmd"); port = erl_var_content(pattern, "Port"); data = erl_var_content(pattern, "Data"); switch (ERL_INT_VALUE(cmd)) { case CMD_AUTH: retval = process_auth(port, data); break; case CMD_ACCT: retval = process_acct(port, data); break; }; erl_free_term(cmd); erl_free_term(port); erl_free_term(data); } erl_free_term(pattern); erl_free_term(tuple); return retval; }
void YahooClient::process_packet() { Params params; Params::iterator it; for (;;) { string key; string value; if (!m_socket->readBuffer.scan("\xC0\x80", key) || !m_socket->readBuffer.scan("\xC0\x80", value)) break; unsigned key_id = atol(key.c_str()); params.push_back(PARAM(key_id, value)); log(L_DEBUG, "Param: %u %s", key_id, value.c_str()); } switch (m_service) { case YAHOO_SERVICE_VERIFY: if (m_pkt_status != 1) { m_reconnect = NO_RECONNECT; m_socket->error_state(I18N_NOOP("Yahoo! login lock")); return; } addParam(1, getLogin().utf8()); sendPacket(YAHOO_SERVICE_AUTH); break; case YAHOO_SERVICE_AUTH: process_auth(params[13], params[94], params[1]); break; case YAHOO_SERVICE_AUTHRESP: m_pkt_status = 0; if (params[66]) m_pkt_status = atol(params[66]); switch (m_pkt_status) { case YAHOO_LOGIN_OK: authOk(); return; case YAHOO_LOGIN_PASSWD: m_reconnect = NO_RECONNECT; m_socket->error_state(I18N_NOOP("Login failed"), AuthError); return; case YAHOO_LOGIN_LOCK: m_reconnect = NO_RECONNECT; m_socket->error_state(I18N_NOOP("Your account has been locked"), AuthError); return; case YAHOO_LOGIN_DUPL: m_reconnect = NO_RECONNECT; m_socket->error_state(I18N_NOOP("Your account is being used from another location")); return; default: m_socket->error_state(I18N_NOOP("Login failed")); } break; case YAHOO_SERVICE_LIST: authOk(); loadList(params[87]); for (it = params.begin(); it != params.end(); ++it) { if ((*it).first == 59) { string s = (*it).second; string n = getToken(s, ' '); const char *p = s.c_str(); for (; *p; ++p) if (*p != ' ') break; string cookie = p; s = getToken(cookie, ';'); if (n == "Y") setCookieY(s.c_str()); if (n == "T") setCookieT(s.c_str()); } } break; case YAHOO_SERVICE_LOGOFF: if (m_pkt_status == (unsigned long)(-1)) { m_reconnect = NO_RECONNECT; m_socket->error_state(I18N_NOOP("Your account is being used from another location")); return; } case YAHOO_SERVICE_LOGON: if (params[1]) authOk(); case YAHOO_SERVICE_USERSTAT: case YAHOO_SERVICE_ISAWAY: case YAHOO_SERVICE_ISBACK: case YAHOO_SERVICE_GAMELOGON: case YAHOO_SERVICE_GAMELOGOFF: case YAHOO_SERVICE_IDACT: case YAHOO_SERVICE_IDDEACT: if (params[7] && params[13]) processStatus(m_service, params[7], params[10], params[19], params[47], params[137]); break; case YAHOO_SERVICE_IDLE: case YAHOO_SERVICE_MAILSTAT: case YAHOO_SERVICE_CHATINVITE: case YAHOO_SERVICE_CALENDAR: case YAHOO_SERVICE_NEWPERSONALMAIL: case YAHOO_SERVICE_ADDIDENT: case YAHOO_SERVICE_ADDIGNORE: case YAHOO_SERVICE_PING: case YAHOO_SERVICE_GOTGROUPRENAME: case YAHOO_SERVICE_GROUPRENAME: case YAHOO_SERVICE_PASSTHROUGH2: case YAHOO_SERVICE_CHATLOGON: case YAHOO_SERVICE_CHATLOGOFF: case YAHOO_SERVICE_CHATMSG: case YAHOO_SERVICE_REJECTCONTACT: case YAHOO_SERVICE_PEERTOPEER: break; case YAHOO_SERVICE_MESSAGE: if (params[4] && params[14]) process_message(params[4], params[14], params[97]); break; case YAHOO_SERVICE_NOTIFY: if (params[4] && params[49]) notify(params[4], params[49], params[13]); break; case YAHOO_SERVICE_NEWCONTACT: if (params[1]) { contact_added(params[3], params[14]); return; } if (params[7]) { processStatus(m_service, params[7], params[10], params[14], params[47], params[137]); return; } if (m_pkt_status == 7) contact_rejected(params[3], params[14]); break; case YAHOO_SERVICE_P2PFILEXFER: if ((params[49] == NULL) || strcmp(params[49], "FILEXFER")) { log(L_WARN, "Unhandled p2p type %s", params[49]); break; } case YAHOO_SERVICE_FILETRANSFER: if (params[4] && params[27] && params[28] && params[14] && params[20]) process_file(params[4], params[27], params[28], params[14], params[20]); break; default: log(L_WARN, "Unknown service %X", m_service); } }
/* Reinitialize outgoing request after 401/407 response is received. * The purpose of this function is: * - to add a Authorization/Proxy-Authorization header. * - to put the newly created Authorization/Proxy-Authorization header * in cached_list. */ PJ_DEF(pj_status_t) pjsip_auth_clt_reinit_req( pjsip_auth_clt_sess *sess, const pjsip_rx_data *rdata, pjsip_tx_data *old_request, pjsip_tx_data **new_request ) { pjsip_tx_data *tdata; const pjsip_hdr *hdr; unsigned chal_cnt; pjsip_via_hdr *via; pj_status_t status; PJ_ASSERT_RETURN(sess && rdata && old_request && new_request, PJ_EINVAL); PJ_ASSERT_RETURN(sess->pool, PJSIP_ENOTINITIALIZED); PJ_ASSERT_RETURN(rdata->msg_info.msg->type == PJSIP_RESPONSE_MSG, PJSIP_ENOTRESPONSEMSG); PJ_ASSERT_RETURN(old_request->msg->type == PJSIP_REQUEST_MSG, PJSIP_ENOTREQUESTMSG); PJ_ASSERT_RETURN(rdata->msg_info.msg->line.status.code == 401 || rdata->msg_info.msg->line.status.code == 407, PJSIP_EINVALIDSTATUS); tdata = old_request; tdata->auth_retry = PJ_FALSE; /* * Respond to each authentication challenge. */ hdr = rdata->msg_info.msg->hdr.next; chal_cnt = 0; while (hdr != &rdata->msg_info.msg->hdr) { pjsip_cached_auth *cached_auth; const pjsip_www_authenticate_hdr *hchal; pjsip_authorization_hdr *hauth; /* Find WWW-Authenticate or Proxy-Authenticate header. */ while (hdr != &rdata->msg_info.msg->hdr && hdr->type != PJSIP_H_WWW_AUTHENTICATE && hdr->type != PJSIP_H_PROXY_AUTHENTICATE) { hdr = hdr->next; } if (hdr == &rdata->msg_info.msg->hdr) break; hchal = (const pjsip_www_authenticate_hdr*) hdr; ++chal_cnt; /* Find authentication session for this realm, create a new one * if not present. */ cached_auth = find_cached_auth(sess, &hchal->challenge.common.realm ); if (!cached_auth) { cached_auth = PJ_POOL_ZALLOC_T( sess->pool, pjsip_cached_auth); pj_strdup( sess->pool, &cached_auth->realm, &hchal->challenge.common.realm); cached_auth->is_proxy = (hchal->type == PJSIP_H_PROXY_AUTHENTICATE); # if (PJSIP_AUTH_HEADER_CACHING) { pj_list_init(&cached_auth->cached_hdr); } # endif pj_list_insert_before( &sess->cached_auth, cached_auth ); } /* Create authorization header for this challenge, and update * authorization session. */ status = process_auth( tdata->pool, hchal, tdata->msg->line.req.uri, tdata, sess, cached_auth, &hauth); if (status != PJ_SUCCESS) return status; /* Add to the message. */ pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)hauth); /* Process next header. */ hdr = hdr->next; } /* Check if challenge is present */ if (chal_cnt == 0) return PJSIP_EAUTHNOCHAL; /* Remove branch param in Via header. */ via = (pjsip_via_hdr*) pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); via->branch_param.slen = 0; /* Restore strict route set. * See http://trac.pjsip.org/repos/ticket/492 */ pjsip_restore_strict_route_set(tdata); /* Must invalidate the message! */ pjsip_tx_data_invalidate_msg(tdata); /* Retrying.. */ tdata->auth_retry = PJ_TRUE; /* Increment reference counter. */ pjsip_tx_data_add_ref(tdata); /* Done. */ *new_request = tdata; return PJ_SUCCESS; }
/* Reinitialize outgoing request after 401/407 response is received. * The purpose of this function is: * - to add a Authorization/Proxy-Authorization header. * - to put the newly created Authorization/Proxy-Authorization header * in cached_list. */ PJ_DEF(pjsip_tx_data*) pjsip_auth_reinit_req( pjsip_endpoint *endpt, pj_pool_t *ses_pool, pjsip_auth_session *sess_list, int cred_count, const pjsip_cred_info cred_info[], pjsip_tx_data *tdata, const pjsip_rx_data *rdata) { const pjsip_hdr *hdr; pjsip_via_hdr *via; PJ_UNUSED_ARG(endpt) pj_assert(rdata->msg->type == PJSIP_RESPONSE_MSG); pj_assert(rdata->msg->line.status.code == 401 || rdata->msg->line.status.code == 407 ); /* * Respond to each authentication challenge. */ hdr = rdata->msg->hdr.next; while (hdr != &rdata->msg->hdr) { pjsip_auth_session *sess; const pjsip_www_authenticate_hdr *hchal; pjsip_authorization_hdr *hauth; /* Find WWW-Authenticate or Proxy-Authenticate header. */ while (hdr->type != PJSIP_H_WWW_AUTHENTICATE && hdr->type != PJSIP_H_PROXY_AUTHENTICATE && hdr != &rdata->msg->hdr) { hdr = hdr->next; } if (hdr == &rdata->msg->hdr) break; hchal = (const pjsip_www_authenticate_hdr*) hdr; /* Find authentication session for this realm, create a new one * if not present. */ sess = find_session(sess_list, &hchal->challenge.common.realm ); if (!sess) { sess = pj_pool_calloc( ses_pool, 1, sizeof(*sess)); pj_strdup( ses_pool, &sess->realm, &hchal->challenge.common.realm); sess->is_proxy = (hchal->type == PJSIP_H_PROXY_AUTHENTICATE); # if (PJSIP_AUTH_HEADER_CACHING) { pj_list_init(&sess->cached_hdr); } # endif pj_list_insert_before( sess_list, sess ); } /* Create authorization header for this challenge, and update * authorization session. */ hauth = process_auth( tdata->pool, hchal, tdata->msg->line.req.uri, tdata, cred_count, cred_info, ses_pool, sess ); if (!hauth) return NULL; /* Add to the message. */ pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)hauth); /* Process next header. */ hdr = hdr->next; } /* Remove branch param in Via header. */ via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); if (via) via->branch_param.slen = 0; /* Increment reference counter. */ pjsip_tx_data_add_ref(tdata); /* Done. */ return tdata; }