Exemple #1
0
	extern int little_endian_sha1_hash(t_hash * hashout, unsigned int size, void const * datain)
	{
		bn_int value;
		unsigned int i;
		sha1_hash(hashout, size, datain);
		for (i = 0; i < 5; i++)
		{
			bn_int_nset(&value, (*hashout)[i]);
			(*hashout)[i] = bn_int_get(value);
		}
		return 0;
	}
Exemple #2
0
	extern char const * little_endian_hash_get_str(t_hash const hash)
	{
		bn_int value;
		t_hash be_hash;
		unsigned int i;
		for (i = 0; i < 5; i++)
		{
			bn_int_nset(&value, hash[i]);
			be_hash[i] = bn_int_get(value);
		}
		return hash_get_str(be_hash);
	}
Exemple #3
0
extern int tracker_send_report(t_addrlist const * laddrs)
{
    t_addr const *     addrl;
    t_elem const *     currl;
    t_addr const *     addrt;
    t_elem const *     currt;
    t_trackpacket      packet;
    struct utsname     utsbuf;
    struct sockaddr_in tempaddr;
    t_laddr_info *     laddr_info;
    char               tempa[64];
    char               tempb[64];

    if (addrlist_get_length(track_servers)>0)
    {
        std::memset(&packet,0,sizeof(packet));
	bn_short_nset(&packet.packet_version,(unsigned short)TRACK_VERSION);
	/* packet.port is set below */
	bn_int_nset(&packet.flags, 0);
	std::strncpy((char *)packet.server_location,
		prefs_get_location(),
		sizeof(packet.server_location));
	bn_byte_set(&packet.server_location[sizeof(packet.server_location)-1],'\0');
	std::strncpy((char *)packet.software,
		PVPGN_SOFTWARE,
		sizeof(packet.software));
	bn_byte_set(&packet.software[sizeof(packet.software)-1],'\0');
	std::strncpy((char *)packet.version,
		PVPGN_VERSION,
		sizeof(packet.version));
	bn_byte_set(&packet.version[sizeof(packet.version)-1],'\0');
	std::strncpy((char *)packet.server_desc,
		prefs_get_description(),
		sizeof(packet.server_desc));
	bn_byte_set(&packet.server_desc[sizeof(packet.server_desc)-1],'\0');
	std::strncpy((char *)packet.server_url,
		prefs_get_url(),
		sizeof(packet.server_url));
	bn_byte_set(&packet.server_url[sizeof(packet.server_url)-1],'\0');
	std::strncpy((char *)packet.contact_name,
		prefs_get_contact_name(),
		sizeof(packet.contact_name));
	bn_byte_set(&packet.contact_name[sizeof(packet.contact_name)-1],'\0');
	std::strncpy((char *)packet.contact_email,
		prefs_get_contact_email(),
		sizeof(packet.contact_email));
	bn_byte_set(&packet.contact_email[sizeof(packet.contact_email)-1],'\0');
	bn_int_nset(&packet.users,connlist_login_get_length());
	bn_int_nset(&packet.channels,channellist_get_length());
	bn_int_nset(&packet.games,gamelist_get_length());
	bn_int_nset(&packet.uptime,server_get_uptime());
	bn_int_nset(&packet.total_logins,connlist_total_logins());
	bn_int_nset(&packet.total_games,gamelist_total_games());

	if (uname(&utsbuf)<0)
	{
	    eventlog(eventlog_level_warn,__FUNCTION__,"could not get platform info (uname: %s)",pstrerror(errno));
	    std::strncpy((char *)packet.platform,"",sizeof(packet.platform));
	}
	else
	{
	    std::strncpy((char *)packet.platform,
		    utsbuf.sysname,
		    sizeof(packet.platform));
	    bn_byte_set(&packet.platform[sizeof(packet.platform)-1],'\0');
	}

	LIST_TRAVERSE_CONST(laddrs,currl)
	{
	    addrl = (t_addr*)elem_get_data(currl);

	    if (!(laddr_info = (t_laddr_info*)addr_get_data(addrl).p))
	    {
		eventlog(eventlog_level_error,__FUNCTION__,"address data is NULL");
		continue;
	    }
	    if (laddr_info->type!=laddr_type_bnet)
		continue; /* don't report IRC, telnet, and other non-game ports */

	    bn_short_nset(&packet.port,addr_get_port(addrl));

	    LIST_TRAVERSE_CONST(track_servers,currt)
	    {
		addrt = (t_addr*)elem_get_data(currt);

		std::memset(&tempaddr,0,sizeof(tempaddr));
		tempaddr.sin_family = PSOCK_AF_INET;
		tempaddr.sin_port = htons(addr_get_port(addrt));
		tempaddr.sin_addr.s_addr = htonl(addr_get_ip(addrt));

		if (!addr_get_addr_str(addrl,tempa,sizeof(tempa)))
		    std::strcpy(tempa,"x.x.x.x:x");
		if (!addr_get_addr_str(addrt,tempb,sizeof(tempb)))
		    std::strcpy(tempa,"x.x.x.x:x");
		/* eventlog(eventlog_level_debug,__FUNCTION__,"sending tracking info from %s to %s",tempa,tempb); */

		if (psock_sendto(laddr_info->usocket,&packet,sizeof(packet),0,(struct sockaddr *)&tempaddr,(psock_t_socklen)sizeof(tempaddr))<0)
		    eventlog(eventlog_level_warn,__FUNCTION__,"could not send tracking information from %s to %s (psock_sendto: %s)",tempa,tempb,pstrerror(errno));
	    }
Exemple #4
0
static int message_bnet_format(t_packet * packet, t_message_type type, t_connection * me, t_connection * dst, char const * text, unsigned int dstflags)
{
    if (!packet)
    {
	eventlog(eventlog_level_error,"message_bnet_format","got NULL packet");
	return -1;
    }
    
    if (text && text[0]=='\0')
        text = " "; /* empty messages crash some clients, just send whitespace */
    
    packet_set_size(packet,sizeof(t_server_message));
    packet_set_type(packet,SERVER_MESSAGE);
    bn_int_set(&packet->u.server_message.unknown1,SERVER_MESSAGE_UNKNOWN1);
    bn_int_nset(&packet->u.server_message.player_ip,SERVER_MESSAGE_PLAYER_IP_DUMMY);
    bn_int_set(&packet->u.server_message.unknown3,SERVER_MESSAGE_UNKNOWN3);
    
    switch (type)
    {
    case message_type_adduser:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_ADDUSER);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * playerinfo;
    	char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    if (!(playerinfo = conn_get_playerinfo(me)))
			playerinfo = "";
	    packet_append_string(packet,playerinfo);
	}
	break;
    case message_type_join:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_JOIN);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * playerinfo;
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    if (!(playerinfo = conn_get_playerinfo(me)))
			playerinfo = "";
	    packet_append_string(packet,playerinfo); /* FIXME: should we just send "" here instead of playerinfo? */
	}
	break;
    case message_type_part:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_PART);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    packet_append_string(packet,"");
	}
	break;
    case message_type_whisper:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (dstflags&MF_X)
	    return -1; /* player is ignored */
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_WHISPER);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    case message_type_talk:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (dstflags&MF_X)
	    return -1; /* player is ignored */
 	bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_TALK);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    case message_type_broadcast:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (dstflags&MF_X)
	    return -1; /* player is ignored */
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_BROADCAST);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    case message_type_channel:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_CHANNEL);
	{
	    t_channel const * channel;
	    
	    if (!(channel = conn_get_channel(me)))
		bn_int_set(&packet->u.server_message.flags,0);
	    else
		bn_int_set(&packet->u.server_message.flags,cflags_to_bncflags(channel_get_flags(channel)));
	}
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatname(me)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    case message_type_userflags:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_USERFLAGS);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * playerinfo;
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    if (!(playerinfo = conn_get_playerinfo(me)))
			playerinfo = "";
#if 0 /* FIXME: which is correct? does it depend on the client type? */
	    packet_append_string(packet,"");
#else
	    packet_append_string(packet,playerinfo);
#endif
	}
	break;
    case message_type_whisperack:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_WHISPERACK);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    case message_type_channelfull: /* FIXME */
        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_CHANNELFULL);
	bn_int_set(&packet->u.server_message.flags,0);
	bn_int_set(&packet->u.server_message.latency,0);
	packet_append_string(packet,"");
	packet_append_string(packet,"");
	break;
    case message_type_channeldoesnotexist:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_CHANNELDOESNOTEXIST);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    tname = conn_get_chatname(me);
	    packet_append_string(packet,tname);
	    conn_unget_chatname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    case message_type_channelrestricted: /* FIXME */
        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_CHANNELRESTRICTED);
	bn_int_set(&packet->u.server_message.flags,0);
	bn_int_set(&packet->u.server_message.latency,0);
	packet_append_string(packet,"");
	packet_append_string(packet,"");
	break;
    case message_type_info:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_INFO);
	bn_int_set(&packet->u.server_message.flags,0);
	bn_int_set(&packet->u.server_message.latency,0);
	packet_append_string(packet,"");
	packet_append_string(packet,text);
	break;
    case message_type_error:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_ERROR);
	bn_int_set(&packet->u.server_message.flags,0);
	bn_int_set(&packet->u.server_message.latency,0);
	packet_append_string(packet,"");
	packet_append_string(packet,text);
	break;
    case message_type_emote:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_bnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (dstflags&MF_X)
	    return -1; /* player is ignored */
    bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_EMOTE);
	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);
	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */
	    	return -1;
	    packet_append_string(packet,tname);
	    conn_unget_chatcharname(me,tname);
	    packet_append_string(packet,text);
	}
	break;
    default:
	eventlog(eventlog_level_error,"message_bnet_format","got bad message type %d",(int)type);
	return -1;
    }
    
    return 0;
}