예제 #1
0
파일: xode.c 프로젝트: 4N7HR4X/kamailio
/* return the cdata from any tag */
char *xode_get_tagdata(xode parent, const char *name)
{
    xode tag;

    tag = xode_get_tag(parent, name);
    if(tag == NULL) return NULL;

    return xode_get_data(tag);
}
예제 #2
0
/**
 * parse incoming message from Jabber server
 */
int xj_manage_jab(char *buf, int len, int *pos, xj_jalias als, xj_jcon jbc)
{
    int j, err=0;
    char *p, *to, *from, *msg, *type, *emsg, *ecode, lbuf[4096], fbuf[128];
    xj_jconf jcf = NULL;
    str ts, tf;
    xode x, y, z;
    str *sid;
    xj_pres_cell prc = NULL;

    if(!jbc)
        return -1;

    sid = jbc->jkey->id;
    x = xode_from_strx(buf, len, &err, &j);
#ifdef XJ_EXTRA_DEBUG
    DBG("XJAB:xj_parse_jab: XODE ret:%d pos:%d\n", err, j);
#endif
    if(err && pos != NULL)
        *pos= j;
    if(x == NULL)
        return -1;
    lbuf[0] = 0;
    ecode = NULL;

    /******************** XMPP 'MESSAGE' HANDLING **********************/

    if(!strncasecmp(xode_get_name(x), "message", 7))
    {
#ifdef XJ_EXTRA_DEBUG
        DBG("XJAB:xj_manage_jab: jabber [message] received\n");
#endif
        if((to = xode_get_attrib(x, "to")) == NULL)
        {
#ifdef XJ_EXTRA_DEBUG
            DBG("XJAB:xj_manage_jab: missing 'to' attribute\n");
#endif
            err = -1;
            goto ready;
        }
        if((from = xode_get_attrib(x, "from")) == NULL)
        {
#ifdef XJ_EXTRA_DEBUG
            DBG("XJAB:xj_manage_jab: missing 'from' attribute\n");
#endif
            err = -1;
            goto ready;
        }
        if((y = xode_get_tag(x, "body")) == NULL
                || (msg = xode_get_data(y)) == NULL)
        {
#ifdef XJ_EXTRA_DEBUG
            DBG("XJAB:xj_manage_jab: missing 'body' of message\n");
#endif
            err = -1;
            goto ready;
        }
        type = xode_get_attrib(x, "type");
        if(type != NULL && !strncasecmp(type, "error", 5))
        {
            if((y = xode_get_tag(x, "error")) == NULL
                    || (emsg = xode_get_data(y)) == NULL)
                strcpy(lbuf, "{Error sending following message} - ");
            else
            {
                ecode = xode_get_attrib(y, "code");
                strcpy(lbuf, "{Error (");
                if(ecode != NULL)
                {
                    strcat(lbuf, ecode);
                    strcat(lbuf, " - ");
                }
                strcat(lbuf, emsg);
                strcat(lbuf, ") when trying to send following message}");
            }

        }

        // is from a conference?!?!
        if((jcf=xj_jcon_check_jconf(jbc, from))!=NULL)
        {
            if(lbuf[0] == 0)
            {
                p = from + strlen(from);
                while(p>from && *p != '/')
                    p--;
                if(*p == '/')
                {
                    if(jcf->nick.len>0
                            && strlen(p+1) == jcf->nick.len
                            && !strncasecmp(p+1, jcf->nick.s, jcf->nick.len))
                    {
#ifdef XJ_EXTRA_DEBUG
                        DBG("XJAB:xj_manage_jab: message sent by myself\n");
#endif
                        goto ready;
                    }
                    lbuf[0] = '[';
                    lbuf[1] = 0;
                    strcat(lbuf, p+1);
                    strcat(lbuf, "] ");
                }
            }
            else
            {
                jcf->status = XJ_JCONF_NULL;
                xj_jcon_jconf_presence(jbc,jcf,NULL,"online");
            }
            strcat(lbuf, msg);
            ts.s = lbuf;
            ts.len = strlen(lbuf);

            if(xj_send_sip_msg(als->proxy, sid, &jcf->uri, &ts,
                               &jbc->jkey->flag)<0)
                DBG("XJAB:xj_manage_jab: ERROR SIP MESSAGE was not sent!\n");
#ifdef XJ_EXTRA_DEBUG
            else
                DBG("XJAB:xj_manage_jab: SIP MESSAGE was sent!\n");
#endif
            goto ready;
        }

        strcat(lbuf, msg);
        ts.s = from;
        ts.len = strlen(from);
        tf.s = fbuf;
        tf.len = 0;
        if(xj_address_translation(&ts, &tf, als, XJ_ADDRTR_J2S) == 0)
        {
            ts.s = lbuf;
            ts.len = strlen(lbuf);

            if(xj_send_sip_msg(als->proxy, sid, &tf, &ts, &jbc->jkey->flag)<0)
                DBG("XJAB:xj_manage_jab: ERROR SIP MESSAGE was not sent ...\n");
#ifdef XJ_EXTRA_DEBUG
            else
                DBG("XJAB:xj_manage_jab: SIP MESSAGE was sent.\n");
#endif
        }
        goto ready;
    }
    /*------------------- END 'MESSAGE' HANDLING ----------------------*/

    /******************** XMPP 'PRESENCE' HANDLING *********************/
    if(!strncasecmp(xode_get_name(x), "presence", 8))
    {
#ifdef XJ_EXTRA_DEBUG
        DBG("XJAB:xj_manage_jab: jabber [presence] received\n");
#endif
        type = xode_get_attrib(x, "type");
        from = xode_get_attrib(x, "from");
        if(from == NULL)
            goto ready;
        ts.s = from;
        p = from;
        while(p<from + strlen(from) && *p != '/')
            p++;
        if(*p == '/')
            ts.len = p - from;
        else
            ts.len = strlen(from);

        if(type == NULL || !strncasecmp(type, "online", 6)
                || !strncasecmp(type, "available", 9))
        {
            if(strchr(from, '@') == NULL)
            {
                if(!strncasecmp(from, XJ_AIM_NAME, XJ_AIM_LEN))
                {
                    jbc->ready |= XJ_NET_AIM;
#ifdef XJ_EXTRA_DEBUG
                    DBG("XJAB:xj_manage_jab: AIM network ready\n");
#endif
                }
                else if(!strncasecmp(from, XJ_ICQ_NAME, XJ_ICQ_LEN))
                {
                    jbc->ready |= XJ_NET_ICQ;
#ifdef XJ_EXTRA_DEBUG
                    DBG("XJAB:xj_manage_jab: ICQ network ready\n");
#endif
                }
                else if(!strncasecmp(from, XJ_MSN_NAME, XJ_MSN_LEN))
                {
                    jbc->ready |= XJ_NET_MSN;
#ifdef XJ_EXTRA_DEBUG
                    DBG("XJAB:xj_manage_jab: MSN network ready\n");
#endif
                }
                else if(!strncasecmp(from, XJ_YAH_NAME, XJ_YAH_LEN))
                {
                    jbc->ready |= XJ_NET_YAH;
#ifdef XJ_EXTRA_DEBUG
                    DBG("XJAB:xj_manage_jab: YAHOO network ready\n");
#endif
                }
            }
            else if((jcf=xj_jcon_check_jconf(jbc, from))!=NULL)
            {
                jcf->status = XJ_JCONF_READY;
#ifdef XJ_EXTRA_DEBUG
                DBG("XJAB:xj_manage_jab: %s conference ready\n", from);
#endif
            }
            else
            {
#ifdef XJ_EXTRA_DEBUG
                DBG("XJAB:xj_manage_jab: user <%.*s> is online\n",ts.len,ts.s);
#endif
                prc = xj_pres_list_check(jbc->plist, &ts);
                if(prc)
                {
                    if(prc->state != XJ_PS_ONLINE)
                    {
                        prc->state = XJ_PS_ONLINE;
                        goto call_pa_cbf;
                    }
                }
                else
                {
#ifdef XJ_EXTRA_DEBUG
                    DBG("XJAB:xj_manage_jab: user state received - creating"
                        " presence cell for [%.*s]\n", ts.len, ts.s);
#endif
                    prc = xj_pres_cell_new();
                    if(prc == NULL)
                    {
                        DBG("XJAB:xj_manage_jab: cannot create presence"
                            " cell for [%s]\n", from);
                        goto ready;
                    }
                    if(xj_pres_cell_init(prc, &ts, NULL, NULL)<0)
                    {
                        DBG("XJAB:xj_manage_jab: cannot init presence"
                            " cell for [%s]\n", from);
                        xj_pres_cell_free(prc);
                        goto ready;
                    }
                    prc = xj_pres_list_add(jbc->plist, prc);
                    if(prc)
                    {
                        prc->state = XJ_PS_ONLINE;
                        goto call_pa_cbf;
                    }
                }
            }
            goto ready;
        }

        if(strchr(from, '@') == NULL)
            goto ready;


        if(!strncasecmp(type, "error", 5))
        {
            if((jcf=xj_jcon_check_jconf(jbc, from))!=NULL)
            {
                tf.s = from;
                tf.len = strlen(from);
                if((y = xode_get_tag(x, "error")) == NULL)
                    goto ready;
                if ((p = xode_get_attrib(y, "code")) != NULL
                        && atoi(p) == 409)
                {
                    xj_send_sip_msgz(als->proxy, sid, &tf,
                                     XJ_DMSG_ERR_JCONFNICK, &jbc->jkey->flag);
                    goto ready;
                }
                xj_send_sip_msgz(als->proxy,sid,&tf,XJ_DMSG_ERR_JCONFREFUSED,
                                 &jbc->jkey->flag);
            }
            goto ready;
        }
        if(type!=NULL && !strncasecmp(type, "subscribe", 9))
        {
            xj_jcon_send_presence(jbc, from, "subscribed", NULL, NULL);
            goto ready;
        }

        prc = xj_pres_list_check(jbc->plist, &ts);
        if(!prc)
            goto ready;

        if(!strncasecmp(type, "unavailable", 11))
        {
#ifdef XJ_EXTRA_DEBUG
            DBG("XJAB:xj_manage_jab: user <%s> is offline\n", from);
#endif
            if(prc->state != XJ_PS_OFFLINE)
            {
                prc->state = XJ_PS_OFFLINE;
                goto call_pa_cbf;
            }
            goto ready;
        }

        if(!strncasecmp(type, "unsubscribed", 12))
        {
#ifdef XJ_EXTRA_DEBUG
            DBG("XJAB:xj_manage_jab: user <%s> does not allow to see his"
                " presence status\n", from);
#endif
            if(prc->state != XJ_PS_REFUSED)
            {
                prc->state = XJ_PS_REFUSED;
                goto call_pa_cbf;
            }
        }

        // ignoring unknown types
        goto ready;
    }
    /*------------------- END XMPP 'PRESENCE' HANDLING ----------------*/

    /******************** XMPP 'IQ' HANDLING ***************************/
    if(!strncasecmp(xode_get_name(x), "iq", 2))
    {
#ifdef XJ_EXTRA_DEBUG
        DBG("XJAB:xj_manage_jab: jabber [iq] received\n");
#endif
        if(!strncasecmp(xode_get_attrib(x, "type"), "result", 6))
        {
            if((y = xode_get_tag(x, "query?xmlns=jabber:iq:roster")) == NULL)
                goto ready;
            z = xode_get_firstchild(y);
            while(z)
            {
                if(!strncasecmp(xode_get_name(z), "item", 5)
                        && (from = xode_get_attrib(z, "jid")) != NULL)
                {
                    if(strchr(from, '@') == NULL)
                    {   // transports
                        if(!strncasecmp(from, XJ_AIM_NAME, XJ_AIM_LEN))
                        {
                            jbc->allowed |= XJ_NET_AIM;
#ifdef XJ_EXTRA_DEBUG
                            DBG("XJAB:xj_manage_jab:AIM network available\n");
#endif
                        }
                        else if(!strncasecmp(from, XJ_ICQ_NAME, XJ_ICQ_LEN))
                        {
                            jbc->allowed |= XJ_NET_ICQ;
#ifdef XJ_EXTRA_DEBUG
                            DBG("XJAB:xj_manage_jab:ICQ network available\n");
#endif
                        }
                        else if(!strncasecmp(from, XJ_MSN_NAME, XJ_MSN_LEN))
                        {
                            jbc->allowed |= XJ_NET_MSN;
#ifdef XJ_EXTRA_DEBUG
                            DBG("XJAB:xj_manage_jab:MSN network available\n");
#endif
                        }
                        else if(!strncasecmp(from, XJ_YAH_NAME, XJ_YAH_LEN))
                        {
                            jbc->allowed |= XJ_NET_YAH;
#ifdef XJ_EXTRA_DEBUG
                            DBG("XJAB:xj_manage_jab:YAHOO network available\n");
#endif
                        }
                        goto next_sibling;
                    }
                }
next_sibling:
                z = xode_get_nextsibling(z);
            }
        }

        goto ready;
    }
    /*------------------- END XMPP 'IQ' HANDLING ----------------------*/

call_pa_cbf:
    if(prc && prc->cbf)
    {
        // call the PA callback function
        tf.s = fbuf;
        tf.len = 0;
        if(xj_address_translation(&ts,&tf,als,XJ_ADDRTR_J2S)==0)
        {
#ifdef XJ_EXTRA_DEBUG
            DBG("XJAB:xj_manage_jab: calling CBF(%.*s,%d)\n",
                tf.len, tf.s, prc->state);
#endif
            (*(prc->cbf))(&tf, &tf, prc->state, prc->cbp);
        }
    }
ready:
    xode_free(x);
    return err;
}
예제 #3
0
static void stream_node_callback(int type, xode node, void *arg) 
{
	struct xmpp_private_data *priv = (struct xmpp_private_data *) arg;
	char *id, *hash, *tag;
	char buf[4096];
	xode x;

	LM_DBG("stream callback: %d: %s\n", type, node ? xode_get_name(node) : "n/a");
	switch (type) {
	case XODE_STREAM_ROOT:
		id = xode_get_attrib(node, "id");
		snprintf(buf, sizeof(buf), "%s%s", id, xmpp_password);
		hash = shahash(buf);
		
		x = xode_new_tag("handshake");
		xode_insert_cdata(x, hash, -1);
		xode_send(priv->fd, x);
		xode_free(x);
		break;
	case XODE_STREAM_NODE:
		tag = xode_get_name(node);
		if (!strcmp(tag, "handshake")) {
			LM_DBG("handshake succeeded\n");
		} else if (!strcmp(tag, "message")) {
			LM_DBG("XMPP IM received\n");
			char *from = xode_get_attrib(node, "from");
			char *to = xode_get_attrib(node, "to");
			char *type = xode_get_attrib(node, "type");
			xode body = xode_get_tag(node, "body");
			char *msg;
			
			if (!type)
				type = "chat";
			if (!strcmp(type, "error")) {	
				LM_DBG("received message error stanza\n");
				goto out;
			}
			
			if (!from || !to || !body) {
				LM_DBG("invalid <message/> attributes\n");
				goto out;
			}

			if (!(msg = xode_get_data(body)))
				msg = "";
			xmpp_send_sip_msg(
				encode_uri_xmpp_sip(from),
				decode_uri_xmpp_sip(to),
				msg);
		} else if (!strcmp(tag, "presence")) {
			/* call presence callbacks */
			LM_DBG("XMPP Presence received\n");
			run_xmpp_callbacks(XMPP_RCV_PRESENCE, xode_to_str(node));
		}else if (!strcmp(tag, "iq")) {
			/* call presence callbacks */
			LM_DBG("XMPP IQ received\n");
			run_xmpp_callbacks(XMPP_RCV_IQ, xode_to_str(node));
		}
		break;
	case XODE_STREAM_ERROR:
		LM_ERR("stream error\n");
		/* fall-through */
	case XODE_STREAM_CLOSE:
		priv->running = 0;
		break;
	}
out:
	xode_free(node);
}
예제 #4
0
파일: users.c 프로젝트: Doap/transports
tt_user *users_read(const char *jid) {
	tt_user *user;
	xode cfg, x;
	char *file, *temp;

	if (jid == NULL)
		return NULL;

	if ((file = malloc(strlen(config_dir) + strlen(jid) + 2)) == NULL) {
		perror("malloc()");
		exit(1);
	}
	sprintf(file, "%s/%s", config_dir, jid);

	my_debug(0, "users: Wczytuje plik %s", file);

	if ((cfg = xode_from_file(file)) == NULL) {
		my_debug(0, "users: Nie moge wczytac usera");
		return NULL;
	}

	user = (tt_user*)malloc(sizeof(tt_user));
	memset(user, 0, sizeof(tt_user));

	x = xode_get_tag(cfg, "jid");
	temp = xode_get_data(x);
	my_strcpy(user->jid, temp);

	x = xode_get_tag(cfg, "tid");
	temp = xode_get_data(x);
	my_strcpy(user->tid_short, temp);

	user->tid = malloc(strlen(user->tid_short) + strlen("@tlen.pl") + 1);
	sprintf(user->tid, "*****@*****.**", user->tid_short);

	x = xode_get_tag(cfg, "password");
	temp = xode_get_data(x);
	my_strcpy(user->password, temp);

	user->tlen_sesja = NULL;
	user->tlen_loged = 0;
	user->last_ping_time = 0;

	user->roster = NULL;
	user->search = NULL;
	user->search_id = NULL;

	x = xode_get_tag(cfg, "notify");

	temp = xode_get_attrib(x, "mail");
	if (temp != NULL) {
		if (strcmp(temp, "1") == 0) {
			user->mailnotify = 1;
		} else if (strcmp(temp, "0") == 0) {
			user->mailnotify = 0;
		} else {
			user->mailnotify = 0;
			my_debug(0, "Blad w pliku");
		}
	} else {
		user->mailnotify = 0;
	}

	temp = xode_get_attrib(x, "typing");
	if (temp != NULL) {
		if (strcmp(temp, "1") == 0) {
			user->typingnotify = 1;
		} else if (strcmp(temp, "0") == 0) {
			user->typingnotify = 0;
		} else {
			user->typingnotify = 0;
			my_debug(0, "Blad w pliku");
		}
	} else {
		user->typingnotify = 0;
	}

	temp = xode_get_attrib(x, "alarm");
	if (temp != NULL) {
		if (strcmp(temp, "1") == 0) {
			user->alarmnotify = 1;
		} else if (strcmp(temp, "0") == 0) {
			user->alarmnotify = 0;
		} else {
			user->alarmnotify = 0;
			my_debug(0, "Blad w pliku");
		}
	} else {
		user->alarmnotify = 0;
	}

	user->status = NULL;
	user->status_type = 0;

	user->jabber_status = NULL;
	user->jabber_status_type = NULL;

	xode_free(cfg);
	t_free(file);

	return user;
}
예제 #5
0
static void in_stream_node_callback(int type, xode node, void *arg) 
{
	struct xmpp_connection *conn = (struct xmpp_connection *) arg;
	char *tag;
	xode x;

	LM_DBG("instream callback: %d: %s\n",
			type, node ? xode_get_name(node) : "n/a");
	switch (type) {
	case XODE_STREAM_ROOT:
		conn->stream_id = strdup(random_secret());
		net_printf(conn->fd,
			"<?xml version='1.0'?>"
			"<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:server' version='1.0'"
			" xmlns:db='jabber:server:dialback' id='%s' from='%s'>", conn->stream_id, xmpp_domain);
		net_printf(conn->fd,"<stream:features xmlns:stream='http://etherx.jabber.org/streams'/>");
		break;
	case XODE_STREAM_NODE:
		tag = xode_get_name(node);

		if (!strcmp(tag, "db:result")) {
			char *from = xode_get_attrib(node, "from");
			char *to = xode_get_attrib(node, "to");
			/* char *id = xode_get_attrib(node, "id"); */
			char *type = xode_get_attrib(node, "type");
			char *cdata = xode_get_data(node);
			
			if (!type) {
				if (conn->domain) {
					LM_DBG("connection %d has old domain '%s'\n",conn->fd,
							conn->domain);
					free(conn->domain);
				}
				conn->domain = strdup(from);
				LM_DBG("connection %d set domain '%s'\n",
						conn->fd, conn->domain);

				/* it's a request; send verification over outgoing connection */
				x = xode_new_tag("db:verify");
				xode_put_attrib(x, "xmlns:db", "jabber:server:dialback");
				xode_put_attrib(x, "from", to);
				xode_put_attrib(x, "to", from);
				//xode_put_attrib(x, "id", "someid"); /* XXX fix ID */
				xode_put_attrib(x, "id", conn->stream_id);
				xode_insert_cdata(x, cdata, -1);
				xode_send_domain(from, x);
			}			
		} else if (!strcmp(tag, "db:verify")) {
			char *from = xode_get_attrib(node, "from");
			char *to = xode_get_attrib(node, "to");
			char *id = xode_get_attrib(node, "id");
			char *type = xode_get_attrib(node, "type");
			char *cdata = xode_get_data(node);
			
			if (!type) {
				/* it's a request */
				x = xode_new_tag("db:verify");
				xode_put_attrib(x, "xmlns:db", "jabber:server:dialback");
				xode_put_attrib(x, "from", to);
				xode_put_attrib(x, "to", from);
				xode_put_attrib(x, "id", id);
				//if (cdata && !strcmp(cdata, DB_KEY)) {
				if (cdata && !strcmp(cdata, db_key(local_secret, from, id))) {
					xode_put_attrib(x, "type", "valid");
				} else {
					xode_put_attrib(x, "type", "invalid");
				}
				xode_send(conn->fd, x);
				xode_free(x);
			}			
		} else if (!strcmp(tag, "message")) {
			char *from = xode_get_attrib(node, "from");
			char *to = xode_get_attrib(node, "to");
			char *type = xode_get_attrib(node, "type");
			xode body = xode_get_tag(node, "body");
			char *msg;
			
			if (!type)
				type = "chat";
			if (!strcmp(type, "error")) {	
				LM_DBG("received message error stanza\n");
				goto out;
			}
			
			if (!from || !to || !body) {
				LM_DBG("invalid <message/> attributes\n");
				goto out;
			}

			if (!(msg = xode_get_data(body)))
				msg = "";
			xmpp_send_sip_msg(
				encode_uri_xmpp_sip(from),
				decode_uri_xmpp_sip(to),
				msg);
		} else if (!strcmp(tag, "presence")) {
			/* run presence callbacks */
		}
		break;

		break;
	case XODE_STREAM_ERROR:
		LM_ERR("instream error\n");
		/* fall-through */
	case XODE_STREAM_CLOSE:
		conn->type = CONN_DEAD;
		break;
	}
out:
	xode_free(node);
}
예제 #6
0
/**
 * authentication to the JABBER server
 */
int xj_jcon_user_auth(xj_jcon jbc, char *username, char *passwd,
				char *resource)
{
	char msg_buff[4096];
	int n, i, err;
	char *p0, *p1;
	xode x, y, z;

	/*** send open stream tag **/
	sprintf(msg_buff, JB_CLIENT_OPEN_STREAM, jbc->hostname);
	if(send(jbc->sock, msg_buff, strlen(msg_buff), 0) != strlen(msg_buff))
		goto error;
	
	n = recv(jbc->sock, msg_buff, 4096, 0);
	msg_buff[n] = 0;
	if(strncasecmp(msg_buff, JB_START_STREAM, JB_START_STREAM_LEN))
		goto error;
	
	p0 = strstr(msg_buff + JB_START_STREAM_LEN, "id='");
	if(p0 == NULL)
		goto error;

	p0 += 4;
	p1 = strchr(p0, '\'');
	if(p1 == NULL)
		goto error;

	jbc->stream_id = (char*)_M_MALLOC(p1-p0+1);
	strncpy(jbc->stream_id, p0, p1-p0);
    jbc->stream_id[p1-p0] = 0;

	sprintf(msg_buff, "%08X", jbc->seq_nr);
	
	x = xode_new_tag("iq");
	if(!x)
		return -1;

	xode_put_attrib(x, "id", msg_buff);
	xode_put_attrib(x, "type", "get");
	y = xode_insert_tag(x, "query");
	xode_put_attrib(y, "xmlns", "jabber:iq:auth");
	z = xode_insert_tag(y, "username");
	xode_insert_cdata(z, username, -1);
	p0 = xode_to_str(x);
	n = strlen(p0);

	i = send(jbc->sock, p0, n, 0);
	if(i != n)
		goto errorx;
	
	xode_free(x);
	
	// receive  response
	// try 10 times
	i = 10;
	while(i)
	{
		if((n = recv(jbc->sock, msg_buff, 4096, 0)) > 0)
		{
			msg_buff[n] = 0;
			break;
		}
		usleep(1000);
		i--;
	}
	if(!i)
		goto error;

	x = xode_from_strx(msg_buff, n, &err, &i);
	p0 = msg_buff;
	if(err)
		p0 += i; 
	
	if(strncasecmp(xode_get_name(x), "iq", 2))
		goto errorx;
	
	if((x = xode_get_tag(x, "query?xmlns=jabber:iq:auth")) == NULL)
		goto errorx;
			
	y = xode_new_tag("query");
	xode_put_attrib(y, "xmlns", "jabber:iq:auth");
	z = xode_insert_tag(y, "username");
	xode_insert_cdata(z, username, -1);
	z = xode_insert_tag(y, "resource");
	xode_insert_cdata(z, resource, -1);
	
	if(xode_get_tag(x, "digest") != NULL)
	{ // digest authentication
			
		//sprintf(msg_buff, "%s%s", jbc->stream_id, passwd);
		strcpy(msg_buff, jbc->stream_id);
		strcat(msg_buff, passwd);
		//DBG("XJAB:xj_jcon_user_auth: [%s:%s]\n", jbc->stream_id, passwd);
		p1 = shahash(msg_buff);

		z = xode_insert_tag(y, "digest");
		xode_insert_cdata(z, p1, -1);
	}
	else
	{ // plaint text authentication
		z = xode_insert_tag(y, "password");
		xode_insert_cdata(z, passwd, -1);
	}

	y = xode_wrap(y, "iq");
	
	jbc->seq_nr++;
	sprintf(msg_buff, "%08X", jbc->seq_nr);
	
	xode_put_attrib(y, "id", msg_buff);
	xode_put_attrib(y, "type", "set");
	
	p1 = xode_to_str(y);
	n = strlen(p1);
	
	i = send(jbc->sock, p1, n, 0);
	if(i != n)
	{
		xode_free(y);
		goto errorx;
	}
	xode_free(x);
	xode_free(y);
	
	// receive  response
	// try 10 times
	i = 10;
	while(i)
	{
		if((n = recv(jbc->sock, msg_buff, 4096, 0)) > 0)
		{
			msg_buff[n] = 0;
			break;
		}
		usleep(1000);
		i--;
	}
	if(!i)
		goto error;

	x = xode_from_strx(msg_buff, n, &err, &i);
	p0 = msg_buff;
	if(err)
		p0 += i; 
	
	if(strncasecmp(xode_get_name(x), "iq", 2) || 
			strncasecmp(xode_get_attrib(x, "type"), "result", 6))
		goto errorx;
	
	jbc->resource = (char*)_M_MALLOC(strlen(resource)+1);
	strcpy(jbc->resource, resource);

	jbc->allowed = XJ_NET_ALL;
	jbc->ready = XJ_NET_JAB;	
	return 0;
	
errorx:
	xode_free(x);
error:
	return -1;
}
예제 #7
0
파일: xode.c 프로젝트: 4N7HR4X/kamailio
/*
 *  xode_gettag -- find given tag in an xode tree
 *
 *  parameters
 *      parent -- pointer to the parent tag
 *      name -- "name" for the child tag of that name
 *              "name/name" for a sub child (recurses)
 *              "?attrib" to match the first tag with that attrib defined
 *              "?attrib=value" to match the first tag with that attrib and value
 *              or any combination: "name/name/?attrib", etc
 *
 *  results
 *      a pointer to the tag matching search criteria
 *      or NULL if search was unsuccessful
 */
xode xode_get_tag(xode parent, const char* name)
{
    char *str, *slash, *qmark, *equals;
    xode step, ret;

    if(parent == NULL || parent->firstchild == NULL || name == NULL || name == '\0') return NULL;

    if(strstr(name, "/") == NULL && strstr(name,"?") == NULL)
        return _xode_search(parent->firstchild, name, XODE_TYPE_TAG);

    /* jer's note: why can't I modify the name directly, why do I have to strdup it?  damn c grrr! */
    str = strdup(name);
    slash = strstr(str, "/");
    qmark = strstr(str, "?");
    equals = strstr(str, "=");

    if(qmark != NULL && (slash == NULL || qmark < slash))
    { /* of type ?attrib */

        *qmark = '\0';
        qmark++;
        if(equals != NULL)
        {
            *equals = '\0';
            equals++;
        }

        for(step = parent->firstchild; step != NULL; step = xode_get_nextsibling(step))
        {
            if(xode_get_type(step) != XODE_TYPE_TAG)
                continue;

            if(*str != '\0')
                if(_xode_strcmp(xode_get_name(step),str) != 0)
                    continue;

            if(xode_get_attrib(step,qmark) == NULL)
                continue;

            if(equals != NULL && _xode_strcmp(xode_get_attrib(step,qmark),equals) != 0)
                continue;

            break;
        }

        free(str);
        return step;
    }


    *slash = '\0';
    ++slash;

    for(step = parent->firstchild; step != NULL; step = xode_get_nextsibling(step))
    {
        if(xode_get_type(step) != XODE_TYPE_TAG) continue;

        if(_xode_strcmp(xode_get_name(step),str) != 0)
            continue;

        ret = xode_get_tag(step, slash);
        if(ret != NULL)
        {
            free(str);
            return ret;
        }
    }

    free(str);
    return NULL;
}
예제 #8
0
static void init_mq(global_conf_st *g_conf, xode pnode)
{

    if (g_conf == NULL && pnode == NULL)
    {
	exit(1);
    }
    xode receive_node = xode_get_tag(pnode, "receiveMq");
    if (receive_node == NULL)
    {
	exit(1);
    }
    memcacheq_st *mq_receive = NULL;
    mq_receive = (memcacheq_st *) calloc(sizeof(memcacheq_st), 1);
    char *task_name = NULL;
    char *addr = NULL;
    task_name = xode_get_tagdata(receive_node, "mqName");
    if (task_name == NULL)
    {
	fprintf(stderr, "task_name is needed\n");
	exit(1);
    }
    if (NULL == (addr = xode_get_tagdata(receive_node, "mqAddr")))
    {
	fprintf(stderr, "mq addr is needed\n");
	exit(1);
    }
    snprintf(mq_receive->task_name, sizeof(mq_receive->task_name), "%s",
	     task_name);
    if (NULL == (mq_receive->mq_server = create_memcacheq_from_str(addr)))
    {
	fprintf(stderr, "%s:%d receive mq setup is wrong\n", __FILE__, __LINE__);
	exit(1);
    }
    mq_receive->mq_pool = NULL;
    g_conf->receive_mq = mq_receive;

    memcacheq_st *mq_send = NULL;
    xode send_node = xode_get_tag(pnode, "sendMq");
    if (send_node == NULL)
    {
	exit(1);
    }
    mq_send = (memcacheq_st *) calloc(sizeof(memcacheq_st), 1);
    task_name = xode_get_tagdata(send_node, "mqName");
    if (task_name == NULL)
    {
	fprintf(stderr, "task_name is needed\n");
	exit(1);
    }
    if (NULL == (addr = xode_get_tagdata(send_node, "mqAddr")))
    {
	fprintf(stderr, "mq addr is needed\n");
	exit(1);
    }

    snprintf(mq_send->task_name, sizeof(mq_send->task_name), "%s", task_name);
    mq_send->mq_server = NULL;
    mq_send->mq_pool = init_mq_pool(addr, g_conf->max_thread + 5);
    g_conf->send_mq = mq_send;
    return;
}