示例#1
0
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");
        }
    }

}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
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;
}
示例#5
0
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 */
}
示例#6
0
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;
}
示例#7
0
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;
}