⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jabber.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	js->fd = source;	if(js->state == JABBER_STREAM_CONNECTING)		jabber_send_raw(js, "<?xml version='1.0' ?>", -1);	jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING);	gc->inpa = purple_input_add(js->fd, PURPLE_INPUT_READ, jabber_recv_cb, gc);}static voidjabber_ssl_connect_failure(PurpleSslConnection *gsc, PurpleSslErrorType error,		gpointer data){	PurpleConnection *gc = data;	JabberStream *js;	/* If the connection is already disconnected, we don't need to do anything else */	if(!PURPLE_CONNECTION_IS_VALID(gc))		return;	js = gc->proto_data;	js->gsc = NULL;	switch(error) {		case PURPLE_SSL_CONNECT_FAILED:			purple_connection_error(gc, _("Connection Failed"));			break;		case PURPLE_SSL_HANDSHAKE_FAILED:			purple_connection_error(gc, _("SSL Handshake Failed"));			break;	}}static void tls_init(JabberStream *js){	purple_input_remove(js->gc->inpa);	js->gc->inpa = 0;	js->gsc = purple_ssl_connect_fd(js->gc->account, js->fd,			jabber_login_callback_ssl, jabber_ssl_connect_failure, js->gc);}static void jabber_login_connect(JabberStream *js, const char *fqdn, const char *host, int port){#ifdef HAVE_CYRUS_SASL	js->serverFQDN = g_strdup(fqdn);#endif	if (purple_proxy_connect(js->gc, js->gc->account, host,			port, jabber_login_callback, js->gc) == NULL)		purple_connection_error(js->gc, _("Unable to create socket"));}static void srv_resolved_cb(PurpleSrvResponse *resp, int results, gpointer data){	JabberStream *js;	js = data;	js->srv_query_data = NULL;	if(results) {		jabber_login_connect(js, resp->hostname, resp->hostname, resp->port);		g_free(resp);	} else {		jabber_login_connect(js, js->user->domain, js->user->domain,			purple_account_get_int(js->gc->account, "port", 5222));	}}voidjabber_login(PurpleAccount *account){	PurpleConnection *gc = purple_account_get_connection(account);	const char *connect_server = purple_account_get_string(account,			"connect_server", "");	JabberStream *js;	JabberBuddy *my_jb = NULL;	gc->flags |= PURPLE_CONNECTION_HTML;	js = gc->proto_data = g_new0(JabberStream, 1);	js->gc = gc;	js->fd = -1;	js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,			g_free, g_free);	js->disco_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,			g_free, g_free);	js->buddies = g_hash_table_new_full(g_str_hash, g_str_equal,			g_free, (GDestroyNotify)jabber_buddy_free);	js->chats = g_hash_table_new_full(g_str_hash, g_str_equal,			g_free, (GDestroyNotify)jabber_chat_free);	js->user = jabber_id_new(purple_account_get_username(account));	js->next_id = g_random_int();	js->write_buffer = purple_circ_buffer_new(512);	if(!js->user) {		purple_connection_error(gc, _("Invalid XMPP ID"));		return;	}		if (!js->user->domain || *(js->user->domain) == '\0') {		purple_connection_error(gc, _("Invalid XMPP ID. Domain must be set."));		return;	}		if(!js->user->resource) {		char *me;		js->user->resource = g_strdup("Home");		if(!js->user->node) {			js->user->node = js->user->domain;			js->user->domain = g_strdup("jabber.org");		}		me = g_strdup_printf("%s@%s/%s", js->user->node, js->user->domain,				js->user->resource);		purple_account_set_username(account, me);		g_free(me);	}	if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE)))		my_jb->subscription |= JABBER_SUB_BOTH;	jabber_stream_set_state(js, JABBER_STREAM_CONNECTING);	/* if they've got old-ssl mode going, we probably want to ignore SRV lookups */	if(purple_account_get_bool(js->gc->account, "old_ssl", FALSE)) {		if(purple_ssl_is_supported()) {			js->gsc = purple_ssl_connect(js->gc->account,					connect_server[0] ? connect_server : js->user->domain,					purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl,					jabber_ssl_connect_failure, js->gc);		} else {			purple_connection_error(js->gc, _("SSL support unavailable"));		}	}	/* no old-ssl, so if they've specified a connect server, we'll use that, otherwise we'll	 * invoke the magic of SRV lookups, to figure out host and port */	if(!js->gsc) {		if(connect_server[0]) {			jabber_login_connect(js, js->user->domain, connect_server, purple_account_get_int(account, "port", 5222));		} else {			js->srv_query_data = purple_srv_resolve("xmpp-client",					"tcp", js->user->domain, srv_resolved_cb, js);		}	}}static gbooleanconn_close_cb(gpointer data){	JabberStream *js = data;	PurpleAccount *account = purple_connection_get_account(js->gc);	purple_account_disconnect(account);	return FALSE;}static voidjabber_connection_schedule_close(JabberStream *js){	purple_timeout_add(0, conn_close_cb, js);}static voidjabber_registration_result_cb(JabberStream *js, xmlnode *packet, gpointer data){	const char *type = xmlnode_get_attrib(packet, "type");	char *buf;	if(!strcmp(type, "result")) {		buf = g_strdup_printf(_("Registration of %s@%s successful"),				js->user->node, js->user->domain);		purple_notify_info(NULL, _("Registration Successful"),				_("Registration Successful"), buf);		g_free(buf);	} else {		char *msg = jabber_parse_error(js, packet);		if(!msg)			msg = g_strdup(_("Unknown Error"));		purple_notify_error(NULL, _("Registration Failed"),				_("Registration Failed"), msg);		g_free(msg);	}	jabber_connection_schedule_close(js);}static voidjabber_register_cb(JabberStream *js, PurpleRequestFields *fields){	GList *groups, *flds;	xmlnode *query, *y;	JabberIq *iq;	char *username;	iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:register");	query = xmlnode_get_child(iq->node, "query");	for(groups = purple_request_fields_get_groups(fields); groups;			groups = groups->next) {		for(flds = purple_request_field_group_get_fields(groups->data);				flds; flds = flds->next) {			PurpleRequestField *field = flds->data;			const char *id = purple_request_field_get_id(field);			const char *value = purple_request_field_string_get_value(field);			if(!strcmp(id, "username")) {				y = xmlnode_new_child(query, "username");			} else if(!strcmp(id, "password")) {				y = xmlnode_new_child(query, "password");			} else if(!strcmp(id, "name")) {				y = xmlnode_new_child(query, "name");			} else if(!strcmp(id, "email")) {				y = xmlnode_new_child(query, "email");			} else if(!strcmp(id, "nick")) {				y = xmlnode_new_child(query, "nick");			} else if(!strcmp(id, "first")) {				y = xmlnode_new_child(query, "first");			} else if(!strcmp(id, "last")) {				y = xmlnode_new_child(query, "last");			} else if(!strcmp(id, "address")) {				y = xmlnode_new_child(query, "address");			} else if(!strcmp(id, "city")) {				y = xmlnode_new_child(query, "city");			} else if(!strcmp(id, "state")) {				y = xmlnode_new_child(query, "state");			} else if(!strcmp(id, "zip")) {				y = xmlnode_new_child(query, "zip");			} else if(!strcmp(id, "phone")) {				y = xmlnode_new_child(query, "phone");			} else if(!strcmp(id, "url")) {				y = xmlnode_new_child(query, "url");			} else if(!strcmp(id, "date")) {				y = xmlnode_new_child(query, "date");			} else {				continue;			}			xmlnode_insert_data(y, value, -1);			if(!strcmp(id, "username")) {				if(js->user->node)					g_free(js->user->node);				js->user->node = g_strdup(value);			}		}	}	username = g_strdup_printf("%s@%s/%s", js->user->node, js->user->domain,			js->user->resource);	purple_account_set_username(js->gc->account, username);	g_free(username);	jabber_iq_set_callback(iq, jabber_registration_result_cb, NULL);	jabber_iq_send(iq);}static voidjabber_register_cancel_cb(JabberStream *js, PurpleRequestFields *fields){	jabber_connection_schedule_close(js);}static void jabber_register_x_data_cb(JabberStream *js, xmlnode *result, gpointer data){	xmlnode *query;	JabberIq *iq;	iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:register");	query = xmlnode_get_child(iq->node, "query");	xmlnode_insert_child(query, result);	jabber_iq_set_callback(iq, jabber_registration_result_cb, NULL);	jabber_iq_send(iq);}void jabber_register_parse(JabberStream *js, xmlnode *packet){	const char *type;	if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result"))		return;	if(js->registration) {		PurpleRequestFields *fields;		PurpleRequestFieldGroup *group;		PurpleRequestField *field;		xmlnode *query, *x, *y;		char *instructions;		/* get rid of the login thingy */		purple_connection_set_state(js->gc, PURPLE_CONNECTED);		query = xmlnode_get_child(packet, "query");		if(xmlnode_get_child(query, "registered")) {			purple_notify_error(NULL, _("Already Registered"),					_("Already Registered"), NULL);			jabber_connection_schedule_close(js);			return;		}		if((x = xmlnode_get_child_with_namespace(packet, "x",						"jabber:x:data"))) {			jabber_x_data_request(js, x, jabber_register_x_data_cb, NULL);			return;		} else if((x = xmlnode_get_child_with_namespace(packet, "x",						"jabber:x:oob"))) {			xmlnode *url;			if((url = xmlnode_get_child(x, "url"))) {				char *href;				if((href = xmlnode_get_data(url))) {					purple_notify_uri(NULL, href);					g_free(href);					js->gc->wants_to_die = TRUE;					jabber_connection_schedule_close(js);					return;				}			}		}		/* as a last resort, use the old jabber:iq:register syntax */		fields = purple_request_fields_new();		group = purple_request_field_group_new(NULL);		purple_request_fields_add_group(fields, group);		field = purple_request_field_string_new("username", _("Username"),				js->user->node, FALSE);		purple_request_field_group_add_field(group, field);		field = purple_request_field_string_new("password", _("Password"),				purple_connection_get_password(js->gc), FALSE);		purple_request_field_string_set_masked(field, TRUE);		purple_request_field_group_add_field(group, field);		if(xmlnode_get_child(query, "name")) {			field = purple_request_field_string_new("name", _("Name"),					purple_account_get_alias(js->gc->account), FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "email")) {			field = purple_request_field_string_new("email", _("E-mail"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "nick")) {			field = purple_request_field_string_new("nick", _("Nickname"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "first")) {			field = purple_request_field_string_new("first", _("First name"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "last")) {			field = purple_request_field_string_new("last", _("Last name"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "address")) {			field = purple_request_field_string_new("address", _("Address"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "city")) {			field = purple_request_field_string_new("city", _("City"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "state")) {			field = purple_request_field_string_new("state", _("State"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "zip")) {			field = purple_request_field_string_new("zip", _("Postal code"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "phone")) {			field = purple_request_field_string_new("phone", _("Phone"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "url")) {			field = purple_request_field_string_new("url", _("URL"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if(xmlnode_get_child(query, "date")) {			field = purple_request_field_string_new("date", _("Date"),					NULL, FALSE);			purple_request_field_group_add_field(group, field);		}		if((y = xmlnode_get_child(query, "instructions")))			instructions = xmlnode_get_data(y);		else			instructions = g_strdup(_("Please fill out the information below "						"to register your new account."));		purple_request_fields(js->gc, _("Register New XMPP Account"),				_("Register New XMPP Account"), instructions, fields,				_("Register"), G_CALLBACK(jabber_register_cb),				_("Cancel"), G_CALLBACK(jabber_register_cancel_cb),				purple_connection_get_account(js->gc), NULL, NULL,				js);		g_free(instructions);	}}void jabber_register_start(JabberStream *js){	JabberIq *iq;	iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register");	jabber_iq_send(iq);}void jabber_register_account(PurpleAccount *account){	PurpleConnection *gc = purple_account_get_connection(account);	JabberStream *js;	JabberBuddy *my_jb = NULL;	const char *connect_server = purple_account_get_string(account,			"connect_server", "");	const char *server;	js = gc->proto_data = g_new0(JabberStream, 1);	js->gc = gc;	js->registration = TRUE;	js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,			g_free, g_free);	js->disco_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,			g_free, g_free);	js->user = jabber_id_new(purple_account_get_username(account));	js->next_id = g_random_int();	if(!js->user) {		purple_connection_error(gc, _("Invalid XMPP ID"));		return;	}	js->write_buffer = purple_circ_buffer_new(512);	if(!js->user->resource) {		char *me;		js->user->resource = g_strdup("Home");		if(!js->user->node) {			js->user->node = js->user->domain;			js->user->domain = g_strdup("jabber.org");		}		me = g_strdup_printf("%s@%s/%s", js->user->node, js->user->domain,				js->user->resource);		purple_account_set_username(account, me);		g_free(me);	}	if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE)))		my_jb->subscription |= JABBER_SUB_BOTH;	server = connect_server[0] ? connect_server : js->user->domain;	jabber_stream_set_state(js, JABBER_STREAM_CONNECTING);	if(purple_account_get_bool(account, "old_ssl", FALSE)) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -