Пример #1
0
int session_event_status(Session *s,int status,uin_t uin,char *desc,
				int more,uint32_t ip,uint16_t port,uint32_t version){
int oldstat;
int available;
char *ujid;
char *show;
Contact *c;

	c=user_get_contact(s->user,uin,FALSE);
	if (c==NULL) {
/*		debug(L_("%s got notification from unknown contact %i. Converting to subscription request."),s->user->jid,uin);
		ujid=jid_build(uin);
		presence_send_subscribe(s->s,ujid,s->user->jid);
		g_free(ujid);
*/		debug(L_("%s got notification from unknown contact %i."),s->user->jid,uin);
	       	return 0;
	}
	if (!c->got_probe && c->subscribe!=SUB_TO && c->subscribe!=SUB_BOTH) {
		debug(L_("%s got notification from contact %i, whose presence was not requested. Ignoring."),s->user->jid,uin);
	       	return 0;
	}

	available=status_gg_to_jabber(status,&show,&desc);
	oldstat=user_get_contact_status(s->user,uin);
	user_set_contact_status(s->user,status,uin,desc,more,ip,port,version);

	if (!available && oldstat==-1)
		ujid=jid_build(uin);
	else
		ujid=jid_build_full(uin);

	presence_send(s->s,ujid,s->user->jid,available,show,desc,0);
	g_free(ujid);
	return 0;
}
Пример #2
0
Session *session_get_by_jid(const char *jid,Stream *stream,int delay_login){
Session *s;
User *u;
char *njid;
GList *it;

	g_assert(sessions_jid!=NULL);
	debug(L_("Looking up session for '%s'"),jid);
	njid=jid_normalized(jid,0);
	if (njid==NULL){
		g_message(L_("Bad JID: '%s'"),jid);
		return NULL;
	}

	debug(L_("Using '%s' as key"),njid);
	s=(Session *)g_hash_table_lookup(sessions_jid,(gpointer)njid);
	g_free(njid);
	if (s) return s;
	debug(L_("Session not found"));
	if (!stream) return NULL;
	u=user_get_by_jid(jid);
	if (!u) return NULL;

	debug(L_("User loaded, processing his subscriptions."));
	for(it=g_list_first(u->contacts);it;it=g_list_next(it)){
		Contact *c;
		char *c_jid;
		c=(Contact *)it->data;
		if (c->subscribe == SUB_UNDEFINED) {
			c_jid=jid_build(c->uin);
			presence_send_subscribe(stream,c_jid,u->jid);
			g_free(c_jid);
		}
		else if (c->subscribe == SUB_FROM || c->subscribe == SUB_BOTH){
			c_jid=jid_build(c->uin);
			presence_send_probe(stream,c_jid,u->jid);
			g_free(c_jid);
		}
	}
	debug(L_("Creating new session"));
	return session_create(u,jid,NULL,NULL,stream,delay_login);
}
Пример #3
0
void get_roster_done(Session *s,struct gg_event *e){
char **results;
char *body=NULL;
char *jid;
xmlnode roster;
xmlnode msg;
xmlnode n;
int i;

	if(!e->event.userlist.reply){
		message_send(s->s,NULL,s->user->jid,1,_("Roster empty."),0);
		return;
	}

	message_send(s->s,NULL,s->user->jid,0,_("Roster received."),0);

	msg=xmlnode_new_tag("message");
	jid=jid_my_registered();
	xmlnode_put_attrib(msg,"from",jid);
	g_free(jid);

	xmlnode_put_attrib(msg,"to",s->user->jid);
	n=xmlnode_insert_tag(msg,"body");
	roster=xmlnode_insert_tag(msg,"x");
	xmlnode_put_attrib(roster,"xmlns","jabber:x:roster");

	body=g_strdup("");
	results=g_strsplit(e->event.userlist.reply,"\r\n",0);
	for(i=0;results[i];i++){
		char **cinfo;
		char *t,*jid;
		char *name=NULL;
		int j,uin;
		xmlnode item,tag;

		cinfo=g_strsplit(results[i],";",0);
		for(j=0;cinfo[j];j++);
		if (j<7){
			g_strfreev(cinfo);
			continue;
		}

		uin=atoi(cinfo[6]);
		item=xmlnode_insert_tag(roster,"item");

		t=g_strconcat(body,"\n",NULL);
		g_free(body);
		body=t;

		t=g_strdup_printf("%sUin: %u\n",body,uin);
		g_free(body);
		body=t;

		if (cinfo[2] && cinfo[2][0]){
			t=g_strdup_printf("%sNick: %s\n",body,cinfo[2]);
			g_free(body);
			body=t;
			if (name==NULL) name=g_strdup(cinfo[2]);
		}
		if (cinfo[0] && cinfo[0][0]){
			t=g_strdup_printf("%sFirst name: %s\n",body,cinfo[0]);
			g_free(body);
			body=t;
			if (name==NULL) name=g_strdup(cinfo[0]);
		}
		if (cinfo[1] && cinfo[1][0]){
			t=g_strdup_printf("%sLast name: %s\n",body,cinfo[1]);
			g_free(body);
			body=t;
			if (name==NULL) name=g_strdup(cinfo[1]);
		}
		if (cinfo[3] && cinfo[3][0]){
			t=g_strdup_printf("%sDisplay: %s\n",body,cinfo[3]);
			g_free(body);
			body=t;
			if (name) g_free(name);
			name=g_strdup(cinfo[3]);
		}
		if (cinfo[4] && cinfo[4][0]){
			t=g_strdup_printf("%sPhone: %s\n",body,cinfo[4]);
			g_free(body);
			body=t;
		}
		if (cinfo[5] && cinfo[5][0]){
			t=g_strdup_printf("%sGroup: %s\n",body,cinfo[5]);
			g_free(body);
			body=t;
			tag=xmlnode_insert_tag(item,"group");
			xmlnode_insert_cdata(n,string_from_gg(cinfo[5]),-1);
		}
		if (cinfo[7] && cinfo[7][0]){
			t=g_strdup_printf("%sE-mail: %s\n",body,cinfo[7]);
			g_free(body);
			body=t;
		}

		jid=jid_build(uin);
		xmlnode_put_attrib(item,"jid",jid);
		g_free(jid);
		if (name==NULL) name=g_strdup_printf("%u",uin);
		xmlnode_put_attrib(item,"name",string_from_gg(name));
		g_free(name);
		g_strfreev(cinfo);
	}
	g_strfreev(results);
	xmlnode_insert_cdata(n,string_from_gg(body),-1);

	stream_write(s->s,msg);
	xmlnode_free(msg);
}
Пример #4
0
int presence_probe(struct stream_s *stream,const char *from,const char *to){
Session *s;
User *u;
Contact *c;
uin_t uin;
int status;
int available;
char *show,*stat,*jid;
GList *it;
GTime timestamp;

	s=session_get_by_jid(from,NULL,0);
	if (jid_is_me(to)){
		if (s){
			if (!s->connected){
				presence_send(stream,to,from,0,NULL,"Disconnected",0);
			}
			else{
				Resource *r=session_get_cur_resource(s);
				if (r) presence_send(stream,NULL,s->user->jid,s->user->invisible?-1:r->available,
							r->show,r->status,0);
			}
			return 0;
		}
		else if (user_get_by_jid(from)) {
			presence_send(stream, to, from, 0,
				       		NULL, "Not logged in", 0);
		}
		else {
			presence_send_unsubscribed(stream, NULL, from);
		}
		return 0;
	}

	if (!jid_is_my(to)){
 		presence_send_unsubscribed(stream,to,from);
		return -1;
	}

	if (s) u=s->user;
	else u=user_get_by_jid(from);

	if (!u){
		presence_send_unsubscribed(stream,to,from);
		return -1;
	}

	uin=jid_get_uin(to);

	/* create the contact: if we got 'prope' the user has it on his 
	 * contact list, do not change that */
	c = user_get_contact(u, uin, TRUE);
	if (!c) {
	       	return -1;
	}

	c->got_probe=TRUE;

	if (s) session_update_contact(s,c);	

	status=0;
	stat=NULL;
	timestamp=0;
	for(it=u->contacts;it;it=it->next){
		Contact *c=(Contact *)it->data;

		if (c && c->uin==uin){
			status=c->status;
			timestamp=c->last_update;
			stat=c->status_desc;
		}
	}
	if (!status){
		// user not found on userlist?
		presence_send_unsubscribed(stream,to,from);
		return -1;
	}
	if (status==-1) return 0; /* Not known yet */

	available=status_gg_to_jabber(status,&show,&stat);

	if (available) jid=jid_build_full(uin);
	else jid=jid_build(uin);
	
	presence_send(stream,jid,u->jid,available,show,stat,timestamp);

	g_free(jid);
	
	return 0;
}