Пример #1
0
JabberID*
jabber_id_new(const char *str)
{
    char *at;
    char *slash;
    JabberID *jid;

    if(!str || !g_utf8_validate(str, -1, NULL))
        return NULL;

    jid = g_new0(JabberID, 1);

    at = g_utf8_strchr(str, -1, '@');
    slash = g_utf8_strchr(str, -1, '/');

    if(at) {
        jid->node = g_utf8_normalize(str, at-str, G_NORMALIZE_NFKC);
        if(slash) {
            jid->domain = g_utf8_normalize(at+1, slash-(at+1), G_NORMALIZE_NFKC);
            jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
        } else {
            jid->domain = g_utf8_normalize(at+1, -1, G_NORMALIZE_NFKC);
        }
    } else {
        if(slash) {
            jid->domain = g_utf8_normalize(str, slash-str, G_NORMALIZE_NFKC);
            jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
        } else {
            jid->domain = g_utf8_normalize(str, -1, G_NORMALIZE_NFKC);
        }
    }


    if(!jabber_nodeprep_validate(jid->node) ||
            !jabber_nameprep_validate(jid->domain) ||
            !jabber_resourceprep_validate(jid->resource)) {
        jabber_id_free(jid);
        return NULL;
    }

    return jid;
}
Пример #2
0
void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
{
	JabberChat *chat;
	char *room, *server, *handle, *passwd;
	xmlnode *presence, *x;
	char *tmp, *room_jid, *full_jid;
	JabberStream *js = gc->proto_data;
	PurplePresence *gpresence;
	PurpleStatus *status;
	JabberBuddyState state;
	char *msg;
	int priority;

	room = g_hash_table_lookup(data, "room");
	server = g_hash_table_lookup(data, "server");
	handle = g_hash_table_lookup(data, "handle");
	passwd = g_hash_table_lookup(data, "password");

	if(!room || !server)
		return;

	if(!handle)
		handle = js->user->node;

	if(!jabber_nodeprep_validate(room)) {
		char *buf = g_strdup_printf(_("%s is not a valid room name"), room);
		purple_notify_error(gc, _("Invalid Room Name"), _("Invalid Room Name"),
				buf);
		g_free(buf);
		return;
	} else if(!jabber_nameprep_validate(server)) {
		char *buf = g_strdup_printf(_("%s is not a valid server name"), server);
		purple_notify_error(gc, _("Invalid Server Name"),
				_("Invalid Server Name"), buf);
		g_free(buf);
		return;
	} else if(!jabber_resourceprep_validate(handle)) {
		char *buf = g_strdup_printf(_("%s is not a valid room handle"), handle);
		purple_notify_error(gc, _("Invalid Room Handle"),
				_("Invalid Room Handle"), buf);
	}

	if(jabber_chat_find(js, room, server))
		return;

	tmp = g_strdup_printf("%s@%s", room, server);
	room_jid = g_strdup(jabber_normalize(NULL, tmp));
	g_free(tmp);

	chat = g_new0(JabberChat, 1);
	chat->js = gc->proto_data;

	chat->room = g_strdup(room);
	chat->server = g_strdup(server);
	chat->handle = g_strdup(handle);

	chat->members = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
			(GDestroyNotify)jabber_chat_member_free);

	g_hash_table_insert(js->chats, room_jid, chat);

	gpresence = purple_account_get_presence(gc->account);
	status = purple_presence_get_active_status(gpresence);

	purple_status_to_jabber(status, &state, &msg, &priority);

	presence = jabber_presence_create(state, msg, priority);
	full_jid = g_strdup_printf("%s/%s", room_jid, handle);
	xmlnode_set_attrib(presence, "to", full_jid);
	g_free(full_jid);
	g_free(msg);

	x = xmlnode_new_child(presence, "x");
	xmlnode_set_namespace(x, "http://jabber.org/protocol/muc");

	if(passwd && *passwd) {
		xmlnode *password = xmlnode_new_child(x, "password");
		xmlnode_insert_data(password, passwd, -1);
	}

	jabber_send(js, presence);
	xmlnode_free(presence);
}