icq_response.c
上传用户:ai20ln
上传日期:2007-01-05
资源大小:79k
文件大小:15k
源码类别:

ICQ/即时通讯

开发平台:

Unix_Linux

  1. #include "datatype.h"
  2. #include "micq.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #ifdef _WIN32
  7.   #include <winsock2.h>
  8. #else
  9.   #include <netinet/in.h>
  10.   #include <unistd.h>
  11.   #include <netdb.h>
  12. #endif
  13. #include <time.h>
  14. #include <string.h>
  15. void Display_Rand_User( SOK_T sok, BYTE *data, DWORD len )
  16. {
  17.    if ( len == 37 ) {
  18.       M_print( "nRandom User :t%dn", Chars_2_DW( &data[0] ) );
  19.       M_print( "IP          :t%d.%d.%d.%dn", data[4], data[5], data[6], data[7]  );
  20.       M_print( "Port        :t%dn", Chars_2_DW( &data[8] ) );
  21.       M_print( "IP2         :t%d.%d.%d.%dn", data[12], data[13], data[14], data[15]  );
  22.       M_print( "Connection  :t%sn", data[16] == 4 ? "Peer-to-Peer" : "Server Only" );
  23.       M_print( "Status      :t" );
  24.       Print_Status( Chars_2_DW( &data[17] ) );
  25.       M_print( "nTCP version :t%dn", Chars_2_Word( &data[21] ) );
  26.       if ( Verbose > 1 ) {
  27.  Hex_Dump( data, len );
  28.       }
  29.       send_info_req( sok, Chars_2_DW( data ) );
  30.       send_ext_info_req( sok, Chars_2_DW( data ) );
  31.    } else {
  32.       M_print( "No Random User Foundn" );
  33.    }
  34. }
  35. void Recv_Message( int sok, BYTE * pak )
  36. {
  37.    RECV_MESSAGE_PTR r_mesg;
  38.    M_print( "n" );
  39.    r_mesg = ( RECV_MESSAGE_PTR )pak;
  40.    last_recv_uin = Chars_2_DW( r_mesg->uin );
  41.    Print_UIN_Name( Chars_2_DW( r_mesg->uin ) );
  42.    M_print( ":anDate %d/%d/%dt%d:%02d GMTn", r_mesg->month, r_mesg->day, 
  43.             Chars_2_Word( r_mesg->year ), r_mesg->hour ,  r_mesg->minute );
  44.             
  45.    M_print( "Type : %d t Len : %dn", Chars_2_Word( r_mesg->type ),
  46.        Chars_2_Word( r_mesg->len ) );
  47.    Do_Msg( sok, Chars_2_Word( r_mesg->type ), Chars_2_Word( r_mesg->len ), ( r_mesg->len + 2 ), last_recv_uin ); 
  48.    
  49. /*   M_print( MESSCOL "%sn" NOCOL, ((char *) &r_mesg->len) + 2 );*/
  50. /*   ack_srv( sok, Chars_2_Word( pak.head.seq ) ); */
  51. }
  52. /************************************************
  53. This is called when a user goes offline
  54. *************************************************/
  55. void User_Offline( int sok, BYTE * pak )
  56. {
  57.    int remote_uin;
  58.    int index;
  59.    remote_uin = Chars_2_DW( &pak[0] );
  60.    M_print( "n" );
  61.    M_print( CONTACTCOL );
  62.    index = Print_UIN_Name( remote_uin );
  63.    M_print( NOCOL );
  64.    M_print( " logged off.t" );
  65.    Time_Stamp();
  66.    M_print( "n" );
  67.    log_event("User logged off","",remote_uin);
  68.    if ( index != -1 )
  69.    {
  70.       Contacts[ index ].status = STATUS_OFFLINE;
  71.       Contacts[ index ].last_time = time( NULL );
  72.    }
  73. }
  74. void User_Online( int sok, BYTE * pak )
  75. {
  76.    int remote_uin, new_status;
  77.    int index;
  78.    remote_uin = Chars_2_DW( &pak[0] );
  79.    new_status = Chars_2_DW( &pak[17] );
  80.    
  81.    if ( Done_Login )
  82.    {
  83.       M_print( "n" );
  84.       M_print( CONTACTCOL );
  85.       index = Print_UIN_Name( remote_uin );
  86.       M_print( NOCOL );
  87.       if ( index != -1 )
  88.       {
  89.          Contacts[ index ].status = new_status;
  90.          Contacts[ index ].current_ip[0] =  pak[4];
  91.          Contacts[ index ].current_ip[1] =  pak[5];
  92.          Contacts[ index ].current_ip[2] =  pak[6];
  93.          Contacts[ index ].current_ip[3] =  pak[7];
  94.          Contacts[ index ].port = Chars_2_DW( &pak[8] );
  95.          Contacts[ index ].last_time = time( NULL );
  96.       }
  97.       M_print( " (" );
  98.       Print_Status( new_status );
  99.       M_print( ") logged on.t" );
  100.       Time_Stamp();
  101.       M_print( "n" );
  102.       log_event("User logged on","",remote_uin);
  103.       if ( Verbose )
  104.       {
  105.          M_print( "The IP address is %u.%u.%u.%un", pak[4], pak[5], pak[6], pak[7] );
  106.          M_print( "The "real" IP address is %u.%u.%u.%un", pak[12], pak[13], pak[14], pak[15] );
  107.  M_print( "%sn", pak[16] == 4 ? "Peer-to-Peer mode" : "Server Only Communication." );
  108.  M_print( "TCP ICQ version : %dn", Chars_2_Word( &pak[21] ) );
  109.  Hex_Dump( pak, 0x2B );
  110.       }
  111.    }
  112.    else
  113.    {
  114.       for ( index=0; index < Num_Contacts; index++ )
  115.       {
  116.          if ( Contacts[index].uin == remote_uin )
  117.          {
  118.             Contacts[ index ].status = new_status;
  119.             Contacts[ index ].current_ip[0] =  pak[4];
  120.             Contacts[ index ].current_ip[1] =  pak[5];
  121.             Contacts[ index ].current_ip[2] =  pak[6];
  122.             Contacts[ index ].current_ip[3] =  pak[7];
  123.             Contacts[ index ].port = Chars_2_DW( &pak[8] );
  124.             Contacts[ index ].last_time = time( NULL );
  125.             break;
  126.          }
  127.       }
  128.    }
  129. }
  130. void Status_Update( int sok, BYTE * pak )
  131. {
  132.    int remote_uin, new_status;
  133.    int index;
  134.    remote_uin = Chars_2_DW( &pak[0] );
  135.    new_status = Chars_2_DW( &pak[4] );
  136.    M_print( "n" );
  137.    M_print( CONTACTCOL );
  138.    index = Print_UIN_Name( remote_uin );
  139.    M_print( NOCOL );
  140.    if ( index != -1 )
  141.    {
  142.       Contacts[ index ].status = new_status;
  143.    }
  144.    M_print( " changed status to " );
  145.    Print_Status( new_status );
  146.    M_print( "t" );
  147.    Time_Stamp();
  148.    M_print( "n" );
  149.    
  150. }
  151. /* This procedure logins into the server with UIN and pass
  152.    on the socket sok and gives our ip and port.
  153.    It does NOT wait for any kind of a response.         */
  154. void Login( int sok, int UIN, char *pass, int ip, int port, DWORD status )
  155. {
  156.    net_icq_pak pak;
  157.    int size;
  158.    login_1 s1;
  159.    login_2 s2;
  160. struct sockaddr_in sin;  /* used to store inet addr stuff  */
  161.    
  162.    Word_2_Chars( pak.head.ver, ICQ_VER );
  163.    Word_2_Chars( pak.head.cmd, CMD_LOGIN );
  164.    Word_2_Chars( pak.head.seq, seq_num++ );
  165.    DW_2_Chars( pak.head.UIN, UIN );
  166.    
  167.    DW_2_Chars( s1.port, ntohs( port ) + 0x10000 );
  168.    Word_2_Chars( s1.len, strlen( pass ) + 1 );
  169.    DW_2_Chars( s1.time, time( NULL ) );  
  170.    
  171.    DW_2_Chars( s2.ip, ip );
  172.    sin.sin_addr.s_addr = Chars_2_DW( s2.ip );
  173.    DW_2_Chars( s2.status, status );
  174. /*   Word_2_Chars( s2.seq, seq_num++ );*/
  175.    
  176.    DW_2_Chars( s2.X1, LOGIN_X1_DEF );
  177.    s2.X2[0] = LOGIN_X2_DEF;
  178.    DW_2_Chars( s2.X3, LOGIN_X3_DEF );
  179.    DW_2_Chars( s2.X4, LOGIN_X4_DEF );
  180.    DW_2_Chars( s2.X5, LOGIN_X5_DEF );
  181.    
  182.    memcpy( pak.data, &s1, sizeof( s1 ) );
  183.    size = sizeof( s1 );
  184.    memcpy( &pak.data[size], pass, Chars_2_Word( s1.len ) );
  185.    size += Chars_2_Word( s1.len );
  186.    memcpy( &pak.data[size], &s2.X1, sizeof( s2.X1 ) );
  187.    size += sizeof( s2.X1 );
  188.    memcpy( &pak.data[size], &s2.ip, sizeof( s2.ip ) );
  189.    size += sizeof( s2.ip );
  190.    memcpy( &pak.data[size], &s2.X2, sizeof( s2.X2 ) );
  191.    size += sizeof( s2.X2 );
  192.    memcpy( &pak.data[size], &s2.status, sizeof( s2.status ) );
  193.    size += sizeof( s2.status );
  194.    memcpy( &pak.data[size], &s2.X3, sizeof( s2.X3 ) );
  195.    size += sizeof( s2.X3 );
  196. /*   memcpy( &pak.data[size], &s2.seq, sizeof( s2.seq ) );
  197. /   size += sizeof( s2.seq );*/
  198.    memcpy( &pak.data[size], &s2.X4, sizeof( s2.X4 ) );
  199.    size += sizeof( s2.X4 );
  200.    memcpy( &pak.data[size], &s2.X5, sizeof( s2.X5 ) );
  201.    size += sizeof( s2.X5 );
  202. #if ICQ_VER == 0x0004
  203.    last_cmd[ seq_num - 1 ] = Chars_2_Word( pak.head.cmd );
  204. #else
  205.    last_cmd[ seq_num - 2 ] = Chars_2_Word( pak.head.cmd );
  206. #endif
  207.    SOCKWRITE( sok, &(pak.head.ver), size + sizeof( pak.head )- 2 );
  208. /* This routine sends the aknowlegement cmd to the
  209.    server it appears that this must be done after
  210.    everything the server sends us                 */
  211. void ack_srv( int sok, int seq )
  212. {
  213.    net_icq_pak pak;
  214.    
  215.    Word_2_Chars( pak.head.ver, ICQ_VER );
  216.    Word_2_Chars( pak.head.cmd, CMD_ACK );
  217.    Word_2_Chars( pak.head.seq, seq );
  218.    DW_2_Chars( pak.head.UIN, UIN);
  219.    
  220.    SOCKWRITE( sok, &(pak.head.ver), sizeof( pak.head ) - 2 );
  221. }
  222. void Display_Info_Reply( int sok, BYTE * pak )
  223. {
  224.    char *tmp;
  225.    int len;
  226.    
  227.    M_print( SERVCOL "nInfo for %ldn", Chars_2_DW( &pak[0] ) );
  228.    len = Chars_2_Word( &pak[4] );
  229.    rus_conv( "wk", &pak[6] );
  230.    M_print( "Nick Name :t%sn", &pak[6] );
  231.    tmp = &pak[6 + len ];
  232.    len = Chars_2_Word( tmp );
  233.    rus_conv( "wk", tmp+2 );
  234.    M_print( "First name :t%sn", tmp+2 );
  235.    tmp += len + 2;
  236.    len = Chars_2_Word( tmp );
  237.    rus_conv( "wk", tmp+2 );
  238.    M_print( "Last name :t%sn", tmp+2 );
  239.    tmp += len + 2;
  240.    len = Chars_2_Word( tmp );
  241.    rus_conv( "wk", tmp+2 );
  242.    M_print( "Email Address :t%sn", tmp+2 );
  243.    tmp += len + 2;
  244.    if ( *tmp == 1 )
  245.    {
  246.       M_print( "No authorization needed." NOCOL "n" );
  247.    }
  248.    else
  249.    {
  250.       M_print( "Must request authorization." NOCOL "n" );
  251.    }
  252. /*   ack_srv( sok, Chars_2_Word( pak.head.seq ) ); */
  253. }
  254. void Display_Ext_Info_Reply( int sok, BYTE * pak )
  255. {
  256.    unsigned char *tmp;
  257.    int len;
  258.    M_print( SERVCOL "nMore Info for %ldn", Chars_2_DW( &pak[0] ) );
  259.    len = Chars_2_Word( &pak[4] );
  260.    rus_conv( "wk", &pak[6] );
  261.    M_print( "City         :t%sn", &pak[6] );
  262.    if ( Get_Country_Name( Chars_2_Word(&pak[6+len]) ) != NULL )
  263.       M_print( "Country      :t%sn",Get_Country_Name( Chars_2_Word(&pak[6+len]) ) );
  264.    else
  265.       M_print( "Country Code :t%dn", Chars_2_Word( &pak[6+len] ) );
  266.    M_print( "Time Zone    :tGMT %+dn", ((signed char) pak[len+8])>>1  );
  267.    tmp = &pak[9 + len ];
  268.    len = Chars_2_Word( tmp );
  269.    rus_conv( "wk", tmp+2 );
  270.    M_print( "State        :t%sn", tmp+2 );
  271.    if ( Chars_2_Word( tmp+2+len ) != 0xffff )
  272.       M_print( "Age          :t%dn", Chars_2_Word( tmp+2+len ) );
  273.    else
  274.       M_print( "Age          :tNot Enteredn");
  275.    if (*(tmp + len + 4) == 2 )
  276.       M_print( "Sex          :tMalen" );
  277.    else if (*(tmp + len + 4) == 1 )
  278.       M_print( "Sex          :tFemalen" );
  279.    else
  280. #ifdef FUNNY_MSGS
  281.       M_print( "Sex          :tYes please!n" );
  282. #else
  283.       M_print( "Sex          :tNot specifiedn" );
  284. #endif
  285.    tmp += len + 5;
  286.    len = Chars_2_Word( tmp );
  287.    rus_conv( "wk", tmp+2 );
  288.    M_print( "Phone Number :t%sn", tmp+2 );
  289.    tmp += len + 2;
  290.    len = Chars_2_Word( tmp );
  291.    rus_conv( "wk", tmp+2 );
  292.    M_print( "Home Page    :t%sn", tmp+2 );
  293.    tmp += len + 2;
  294.    len = Chars_2_Word( tmp );
  295.    rus_conv( "wk", tmp+2 );
  296.    M_print( "About        :n%sn", tmp+2 );
  297. /*   ack_srv( sok, Chars_2_Word( pak.head.seq ) ); */
  298. }
  299. void Display_Search_Reply( int sok, BYTE * pak )
  300. {
  301.    char *tmp;
  302.    int len;
  303.    M_print( SERVCOL "nUser found %ldn", Chars_2_DW( &pak[0] ) );
  304.    len = Chars_2_Word( &pak[4] );
  305.    rus_conv( "wk", &pak[6] );
  306.    M_print( "Nick Name :t%sn", &pak[6] );
  307.    tmp = &pak[6 + len ];
  308.    len = Chars_2_Word( tmp );
  309.    rus_conv( "wk", tmp+2 );
  310.    M_print( "First name :t%sn", tmp+2 );
  311.    tmp += len + 2;
  312.    len = Chars_2_Word( tmp );
  313.    rus_conv( "wk", tmp+2 );
  314.    M_print( "Last name :t%sn", tmp+2 );
  315.    tmp += len + 2;
  316.    len = Chars_2_Word( tmp );
  317.    rus_conv( "wk", tmp+2 );
  318.    M_print( "Email Address :t%sn", tmp+2 );
  319.    tmp += len + 2;
  320.    if ( *tmp == 1 )
  321.    {
  322.       M_print( "No authorization needed." NOCOL "n" );
  323.    }
  324.    else
  325.    {
  326.       M_print( "Must request authorization." NOCOL "n" );
  327.    }
  328. }
  329. void Do_Msg( SOK_T sok, DWORD type, WORD len, char * data, DWORD uin )
  330. {
  331.    char *tmp;
  332. int   x,m;
  333.    char message[1024];
  334.    char url_data[1024];
  335.    char url_desc[1024];
  336.    if ( type == USER_ADDED_MESS )
  337.    {
  338.       tmp = strchr( data, 'xFE' );
  339.       if ( tmp == NULL )
  340.       {
  341.          M_print( "Ack!!!!!!!  Bad packetn" );
  342.          return;
  343.       }
  344.       *tmp = 0;
  345.       M_print( CONTACTCOL "n%s" NOCOL " has added you to their contact list.n", data );
  346.       tmp++;
  347.       data = tmp;
  348.       tmp = strchr( tmp, 'xFE' );
  349.       if ( tmp == NULL )
  350.       {
  351.          M_print( "Ack!!!!!!!  Bad packetn" );
  352.          return;
  353.       }
  354.       *tmp = 0;
  355.       rus_conv ("wk",data);
  356.       M_print( "First name    : " MESSCOL "%s" NOCOL "n" , data );
  357.       tmp++;
  358.       data = tmp;
  359.       tmp = strchr( tmp, 'xFE' );
  360.       if ( tmp == NULL )
  361.       {
  362.          M_print( "Ack!!!!!!!  Bad packetn" );
  363.          return;
  364.       }
  365.       *tmp = 0;
  366.       rus_conv ("wk",data);
  367.       M_print( "Last name     : " MESSCOL "%s" NOCOL "n" , data );
  368.       tmp++;
  369.       data = tmp;
  370.       tmp = strchr( tmp, 'xFE' );
  371.       *tmp = 0;
  372.       rus_conv ("wk",data);
  373.       M_print( "Email address : " MESSCOL "%s" NOCOL "n" , data );
  374.    }
  375.    else if ( type == AUTH_REQ_MESS )
  376.    {
  377.       tmp = strchr( data, 'xFE' );
  378.       *tmp = 0;
  379.       M_print( CONTACTCOL "n%s" NOCOL " has requested your authorization to be added to their contact list.n", data );
  380.       tmp++;
  381.       data = tmp;
  382.       tmp = strchr( tmp, 'xFE' );
  383.       if ( tmp == NULL )
  384.       {
  385.          M_print( "Ack!!!!!!!  Bad packetn" );
  386.          return;
  387.       }
  388.       *tmp = 0;
  389.       rus_conv ("wk",data);
  390.       M_print( "First name    : " MESSCOL "%s" NOCOL "n" , data );
  391.       tmp++;
  392.       data = tmp;
  393.       tmp = strchr( tmp, 'xFE' );
  394.       if ( tmp == NULL )
  395.       {
  396.          M_print( "Ack!!!!!!!  Bad packetn" );
  397.          return;
  398.       }
  399.       *tmp = 0;
  400.       rus_conv ("wk",data);
  401.       M_print( "Last name     : " MESSCOL "%s" NOCOL "n" , data );
  402.       tmp++;
  403.       data = tmp;
  404.       tmp = strchr( tmp, 'xFE' );
  405.       if ( tmp == NULL )
  406.       {
  407.          M_print( "Ack!!!!!!!  Bad packetn" );
  408.          return;
  409.       }
  410.       *tmp = 0;
  411.       rus_conv ("wk",data);
  412.       M_print( "Email address : " MESSCOL "%s" NOCOL "n" , data );
  413.       tmp++;
  414.       data = tmp;
  415.       tmp = strchr( tmp, 'xFE' );
  416.       if ( tmp == NULL )
  417.       {
  418.          M_print( "Ack!!!!!!!  Bad packetn" );
  419.          return;
  420.       }
  421.       *tmp = 0;
  422.       tmp++;
  423.       data = tmp;
  424.       tmp = strchr( tmp, 'x00' );
  425.       if ( tmp == NULL )
  426.       {
  427.          M_print( "Ack!!!!!!!  Bad packetn" );
  428.          return;
  429.       }
  430.       *tmp = 0;
  431.       rus_conv ("wk",data);
  432.       M_print( "Reason : " MESSCOL "%s" NOCOL "n" , data );
  433.    }
  434.    else if (type == URL_MESS || type == MRURL_MESS)
  435.    {
  436.       tmp = strchr( data, 'xFE' );
  437.       if ( tmp == NULL )
  438.       {
  439.          M_print( "Ack!!!!!!!  Bad packetn" );
  440.          return;
  441.       }
  442.       *tmp = 0;
  443.       rus_conv ("wk",data);
  444.       strcpy (url_desc,data);
  445.       tmp++;
  446.       data = tmp;
  447.       rus_conv ("wk",data);
  448.       strcpy (url_data,data);
  449.       
  450.       sprintf (message,"Description: %s n                          URL: %s",url_desc,url_data);  
  451.       log_event("You received URL message",message,uin);
  452.       M_print( " URL Message.n Description: " MESSCOL "%s" NOCOL "n", url_desc );
  453.       M_print(               " URL        : " MESSCOL "%s" NOCOL "n", url_data );
  454.    }
  455. else if (type == CONTACT_MESS || type==MRCONTACT_MESS)
  456. {
  457.       tmp = strchr( data, 'xFE' );
  458.       *tmp = 0;
  459.       M_print( "nContact List.n" MESSCOL "============================================n" NOCOL "%d Contactsn", atoi(data) );
  460.       tmp++;
  461.       m = atoi(data);
  462.       for(x=0; m > x ; x++)
  463.       {
  464.          data = tmp;
  465.          tmp = strchr( tmp, 'xFE' );
  466.          *tmp = 0;
  467.          M_print( CONTACTCOL "%sttt", data );
  468.          tmp++;
  469.          data = tmp;
  470.          tmp = strchr( tmp, 'xFE' );
  471.          *tmp = 0;
  472.          M_print( MESSCOL "%s" NOCOL "n" , data );
  473.          tmp++;
  474.       }
  475. }
  476.    else
  477.    {
  478.       rus_conv ("wk",data);
  479.       log_event("You received instant message",data,uin);
  480.       M_print( MESSCOL "n%s", data );
  481.       M_print( NOCOL "n" );
  482.    }
  483. }