static void xmpp_process_msg( axis2_xmpp_session_data_t *session, iks *node) { iks *t = NULL; session->features = iks_stream_features(node); /* save features */ if(session->features & IKS_STREAM_BIND) { t = iks_make_resource_bind(session->jid); iks_send(session->parser, t); iks_delete(t); } /* Send a session if required */ if(session->features & IKS_STREAM_SESSION) { t = iks_make_session(); iks_insert_attrib(t, "id", "auth"); iks_send(session->parser, t); iks_delete(t); } /* Subscribe if the service is configured to do so */ if((session->subscribe) && (session->subscribe_to)) { /* Check whether the type of subscription is user or room * and send the subscription request accordingly */ if(!axutil_strcmp(session->subscribe_type, AXIS2_XMPP_SUB_TYPE_USER)) { iks_send(session->parser, iks_make_s10n(IKS_TYPE_SUBSCRIBE, session->subscribe_to, "")); } else if(!axutil_strcmp(session->subscribe_type, AXIS2_XMPP_SUB_TYPE_ROOM)) { axis2_char_t *id = axutil_uuid_gen(session->env); iks *x = iks_make_pres(IKS_SHOW_AVAILABLE, ""); iks_insert_attrib(x, "to", session->subscribe_to); iks_insert_attrib(x, "id", id); iks_send(session->parser, x); AXIS2_FREE(session->env->allocator, id); } else { AXIS2_LOG_ERROR(session->env->log, AXIS2_LOG_SI, "[xmpp]Unknown subscription type. No subscription done"); } } }
static void iks_sasl_challenge(struct stream_data *data, iks *challenge) { char *message; iks *x; char *tmp; tmp = iks_cdata(iks_child(challenge)); if(!tmp) return; /* decode received blob */ message = iks_base64_decode(tmp, NULL); if(!message) return; /* reply the challenge */ if(strstr(message, "rspauth")) { x = iks_new("response"); } else { x = make_sasl_response(data, message); } if(x) { iks_insert_attrib(x, "xmlns", IKS_NS_XMPP_SASL); iks_send(data->prs, x); iks_delete(x); } iks_free(message); }
void jabber_send (char *user, char *message) { iks *x; x = iks_make_msg (IKS_TYPE_NONE, user, message); iks_send (j_parser, x); iks_delete (x); }
int iks_start_sasl(iksparser *prs, enum ikssasltype type, char *username, char *pass) { iks *x; x = iks_new("auth"); iks_insert_attrib(x, "xmlns", IKS_NS_XMPP_SASL); switch(type) { case IKS_SASL_PLAIN: { int len = iks_strlen(username) + iks_strlen(pass) + 2; char *s = iks_malloc(80 + len); char *base64; iks_insert_attrib(x, "mechanism", "PLAIN"); sprintf(s, "%c%s%c%s", 0, username, 0, pass); base64 = iks_base64_encode(s, len); iks_insert_cdata(x, base64, 0); iks_free(base64); iks_free(s); break; } case IKS_SASL_DIGEST_MD5: { struct stream_data *data = iks_user_data(prs); iks_insert_attrib(x, "mechanism", "DIGEST-MD5"); data->auth_username = username; data->auth_pass = pass; break; } case IKS_SASL_OAUTH_2: { int len = iks_strlen(username) + iks_strlen(pass) + 2; char *s = iks_malloc(80 + len); char *base64; iks_insert_attrib(x, "mechanism", "X-OAUTH2"); iks_insert_attrib(x, "auth:service", "oauth2"); iks_insert_attrib(x, "xmlns:auth", "http://www.google.com/talk/protocol/auth"); sprintf(s, "%c%s%c%s", 0, username, 0, pass); base64 = iks_base64_encode(s, len); iks_insert_cdata(x, base64, 0); iks_free(base64); iks_free(s); break; } default: iks_delete(x); return IKS_NET_NOTSUPP; } iks_send(prs, x); iks_delete(x); return IKS_OK; }
int axis2_xmpp_client_on_iq( void *user_data, ikspak *pak) { axis2_xmpp_session_data_t *session = NULL; axutil_env_t *env = NULL; session = (axis2_xmpp_session_data_t*) user_data; env = session->env; if(pak->subtype == IKS_TYPE_RESULT) { if(pak->ns) { if(!axutil_strcmp(pak->ns, IKS_NS_XMPP_BIND)) { session->bind = 1; AXIS2_LOG_INFO(env->log, "[xmpp]Bind iq recieved"); } else if(!axutil_strcmp(pak->ns, IKS_NS_XMPP_SESSION)) { session->session = 1; AXIS2_LOG_INFO(env->log, "[xmpp]Session iq recieved"); } } else if(pak->id) { if(!axutil_strcmp(pak->id, "auth")) { session->session = 1; AXIS2_LOG_INFO(env->log, "[xmpp]Session iq recieved"); } } } if(session->session) iks_send(session->parser, iks_make_pres(IKS_SHOW_AVAILABLE, "Online")); return IKS_FILTER_EAT; /* no need to pass to other filters */ }
int axis2_xmpp_client_on_start_node( axis2_xmpp_session_data_t *session, iks* node) { if(session->use_tls && (!iks_is_secure(session->parser))) { iks_start_tls(session->parser); return IKS_OK; } if(!session->use_sasl) /* basic authentication */ { iks *x; session->authorized = 1; /* get id given from svr */ session->session_id = iks_find_attrib(node, "id"); x = iks_make_auth(session->jid, session->password, session->session_id); iks_insert_attrib(x, "id", "auth"); iks_send(session->parser, x); iks_delete(x); } return IKS_OK; }
static int on_stream (void *ptr, int type, iks *node) { iks *x; ikspak *pak; switch (type) { case IKS_NODE_START: /* x = iks_make_auth (j_user, prefs.pass, iks_find_attrib (node, "id")); iks_insert_attrib (x, "id", "auth"); iks_send (j_parser, x); iks_delete (x); */ break; case IKS_NODE_NORMAL: if (strcmp("stream:features", iks_name(node)) == 0) { if (authorized) { int features; features = iks_stream_features(node); if (features & IKS_STREAM_BIND) { x = iks_make_resource_bind(j_user); iks_send(j_parser, x); iks_delete(x); } if (features & IKS_STREAM_SESSION) { x = iks_make_session(); iks_insert_attrib(x, "id", "auth"); iks_send(j_parser, x); iks_delete(x); } } else { iks_start_sasl(j_parser, IKS_SASL_DIGEST_MD5, j_user->user, prefs.pass); } break; } else if (strcmp("failure", iks_name(node)) == 0) { log_event ("Hata: SASL başarısız!"); return IKS_HOOK; } else if (strcmp("success", iks_name(node)) == 0) { authorized = 1; iks_send_header(j_parser, j_user->server); break; } pak = iks_packet (node); if (pak->type == IKS_PAK_MESSAGE) { // process incoming messages command_parse (pak->from->partial, iks_find_cdata (node, "body")); } else if (pak->type == IKS_PAK_S10N) { // always accept subscriptions if (pak->subtype == IKS_TYPE_SUBSCRIBE) { x = iks_make_s10n (IKS_TYPE_SUBSCRIBED, pak->from->full, NULL); iks_send (j_parser, x); iks_delete (x); } } else if (pak->type == IKS_PAK_IQ) { if (iks_strcmp (pak->id, "auth") == 0) { // auth response if (pak->subtype == IKS_TYPE_RESULT) { log_event ("Bağlandık."); x = iks_make_iq (IKS_TYPE_GET, IKS_NS_ROSTER); iks_send (j_parser, x); iks_delete (x); x = iks_make_pres (IKS_SHOW_AVAILABLE, NULL); iks_send (j_parser, x); iks_delete (x); } else { log_event ("Hata: kullanıcı doğrulama başarısız oldu!"); return IKS_HOOK; } } } break; case IKS_NODE_STOP: case IKS_NODE_ERROR: log_event ("Hata: XMPP stream hatası!"); return IKS_HOOK; } if (node) iks_delete (node); return IKS_OK; }