comparison libpurple/protocols/mxit/protocol.c @ 30288:d9e94339ca3b

For safety, rather use g_strlcpy() and snprintf() where possible.
author andrew.victor@mxit.com
date Mon, 19 Jul 2010 09:52:08 +0000
parents c2b3bfb2fe35
children 8c586dbcae2d
comparison
equal deleted inserted replaced
30287:c2b3bfb2fe35 30288:d9e94339ca3b
443 packet->data = g_malloc0( datalen ); 443 packet->data = g_malloc0( datalen );
444 packet->cmd = cmd; 444 packet->cmd = cmd;
445 packet->headerlen = 0; 445 packet->headerlen = 0;
446 446
447 /* create generic packet header */ 447 /* create generic packet header */
448 hlen = sprintf( header, "id=%s%c", session->acc->username, CP_REC_TERM ); /* client msisdn */ 448 hlen = snprintf( header, sizeof( header ), "id=%s%c", session->acc->username, CP_REC_TERM ); /* client msisdn */
449 449
450 if ( session->http ) { 450 if ( session->http ) {
451 /* http connection only */ 451 /* http connection only */
452 hlen += sprintf( header + hlen, "s=" ); 452 hlen += sprintf( header + hlen, "s=" );
453 if ( session->http_sesid > 0 ) { 453 if ( session->http_sesid > 0 ) {
640 int datalen; 640 int datalen;
641 641
642 locale = purple_account_get_string( session->acc, MXIT_CONFIG_LOCALE, MXIT_DEFAULT_LOCALE ); 642 locale = purple_account_get_string( session->acc, MXIT_CONFIG_LOCALE, MXIT_DEFAULT_LOCALE );
643 643
644 /* convert the packet to a byte stream */ 644 /* convert the packet to a byte stream */
645 datalen = sprintf( data, "ms=%s%c%s%c%i%c%s%c" /* "ms"=password\1version\1maxreplyLen\1name\1 */ 645 datalen = snprintf( data, sizeof( data ),
646 "ms=%s%c%s%c%i%c%s%c" /* "ms"=password\1version\1maxreplyLen\1name\1 */
646 "%s%c%i%c%s%c%s%c" /* dateOfBirth\1gender\1location\1capabilities\1 */ 647 "%s%c%i%c%s%c%s%c" /* dateOfBirth\1gender\1location\1capabilities\1 */
647 "%s%c%i%c%s%c%s", /* dc\1features\1dialingcode\1locale */ 648 "%s%c%i%c%s%c%s", /* dc\1features\1dialingcode\1locale */
648 session->encpwd, CP_FLD_TERM, MXIT_CP_VERSION, CP_FLD_TERM, CP_MAX_FILESIZE, CP_FLD_TERM, profile->nickname, CP_FLD_TERM, 649 session->encpwd, CP_FLD_TERM, MXIT_CP_VERSION, CP_FLD_TERM, CP_MAX_FILESIZE, CP_FLD_TERM, profile->nickname, CP_FLD_TERM,
649 profile->birthday, CP_FLD_TERM, ( profile->male ) ? 1 : 0, CP_FLD_TERM, MXIT_DEFAULT_LOC, CP_FLD_TERM, MXIT_CP_CAP, CP_FLD_TERM, 650 profile->birthday, CP_FLD_TERM, ( profile->male ) ? 1 : 0, CP_FLD_TERM, MXIT_DEFAULT_LOC, CP_FLD_TERM, MXIT_CP_CAP, CP_FLD_TERM,
650 session->distcode, CP_FLD_TERM, MXIT_CP_FEATURES, CP_FLD_TERM, session->dialcode, CP_FLD_TERM, locale 651 session->distcode, CP_FLD_TERM, MXIT_CP_FEATURES, CP_FLD_TERM, session->dialcode, CP_FLD_TERM, locale
668 int datalen; 669 int datalen;
669 670
670 locale = purple_account_get_string( session->acc, MXIT_CONFIG_LOCALE, MXIT_DEFAULT_LOCALE ); 671 locale = purple_account_get_string( session->acc, MXIT_CONFIG_LOCALE, MXIT_DEFAULT_LOCALE );
671 672
672 /* convert the packet to a byte stream */ 673 /* convert the packet to a byte stream */
673 datalen = sprintf( data, "ms=%s%c%s%c%i%c" /* "ms"=password\1version\1getContacts\1 */ 674 datalen = snprintf( data, sizeof( data ),
675 "ms=%s%c%s%c%i%c" /* "ms"=password\1version\1getContacts\1 */
674 "%s%c%s%c%i%c" /* capabilities\1dc\1features\1 */ 676 "%s%c%s%c%i%c" /* capabilities\1dc\1features\1 */
675 "%s%c%s%c" /* dialingcode\1locale\1 */ 677 "%s%c%s%c" /* dialingcode\1locale\1 */
676 "%i%c%i%c%i", /* maxReplyLen\1protocolVer\1lastRosterUpdate */ 678 "%i%c%i%c%i", /* maxReplyLen\1protocolVer\1lastRosterUpdate */
677 session->encpwd, CP_FLD_TERM, MXIT_CP_VERSION, CP_FLD_TERM, 1, CP_FLD_TERM, 679 session->encpwd, CP_FLD_TERM, MXIT_CP_VERSION, CP_FLD_TERM, 1, CP_FLD_TERM,
678 MXIT_CP_CAP, CP_FLD_TERM, session->distcode, CP_FLD_TERM, MXIT_CP_FEATURES, CP_FLD_TERM, 680 MXIT_CP_CAP, CP_FLD_TERM, session->distcode, CP_FLD_TERM, MXIT_CP_FEATURES, CP_FLD_TERM,
709 markuped_msg = mxit_convert_markup_tx( msg, &msgtype ); 711 markuped_msg = mxit_convert_markup_tx( msg, &msgtype );
710 else 712 else
711 markuped_msg = g_strdup( msg ); 713 markuped_msg = g_strdup( msg );
712 714
713 /* convert the packet to a byte stream */ 715 /* convert the packet to a byte stream */
714 datalen = sprintf( data, "ms=%s%c%s%c%i%c%i", /* "ms"=jid\1msg\1type\1flags */ 716 datalen = snprintf( data, sizeof( data ),
717 "ms=%s%c%s%c%i%c%i", /* "ms"=jid\1msg\1type\1flags */
715 to, CP_FLD_TERM, markuped_msg, CP_FLD_TERM, msgtype, CP_FLD_TERM, CP_MSG_MARKUP | CP_MSG_EMOTICON 718 to, CP_FLD_TERM, markuped_msg, CP_FLD_TERM, msgtype, CP_FLD_TERM, CP_MSG_MARKUP | CP_MSG_EMOTICON
716 ); 719 );
717 720
718 /* free the resources */ 721 /* free the resources */
719 g_free( markuped_msg ); 722 g_free( markuped_msg );
735 { 738 {
736 char data[CP_MAX_PACKET]; 739 char data[CP_MAX_PACKET];
737 int datalen; 740 int datalen;
738 unsigned int i; 741 unsigned int i;
739 742
740 datalen = sprintf( data, "ms=%s%c%i", /* "ms="mxitid\1nr_attributes */ 743 datalen = snprintf( data, sizeof( data ),
744 "ms=%s%c%i", /* "ms="mxitid\1nr_attributes */
741 (username ? username : ""), CP_FLD_TERM, nr_attrib); 745 (username ? username : ""), CP_FLD_TERM, nr_attrib);
742 746
743 /* add attributes */ 747 /* add attributes */
744 for ( i = 0; i < nr_attrib; i++ ) 748 for ( i = 0; i < nr_attrib; i++ )
745 datalen += sprintf( data + datalen, "%c%s", CP_FLD_TERM, attribute[i] ); 749 datalen += sprintf( data + datalen, "%c%s", CP_FLD_TERM, attribute[i] );
765 unsigned int i; 769 unsigned int i;
766 770
767 parts = g_strsplit( attributes, "\01", ( MXIT_MAX_ATTRIBS * 3 ) ); 771 parts = g_strsplit( attributes, "\01", ( MXIT_MAX_ATTRIBS * 3 ) );
768 772
769 /* convert the packet to a byte stream */ 773 /* convert the packet to a byte stream */
770 datalen = sprintf( data, "ms=%s%c%i", /* "ms"=password\1nr_attibutes */ 774 datalen = snprintf( data, sizeof( data ),
775 "ms=%s%c%i", /* "ms"=password\1nr_attibutes */
771 ( password ) ? password : "", CP_FLD_TERM, nr_attrib 776 ( password ) ? password : "", CP_FLD_TERM, nr_attrib
772 ); 777 );
773 778
774 /* add attributes */ 779 /* add attributes */
775 for ( i = 1; i < nr_attrib * 3; i+=3 ) 780 for ( i = 1; i < nr_attrib * 3; i+=3 )
795 { 800 {
796 char data[CP_MAX_PACKET]; 801 char data[CP_MAX_PACKET];
797 int datalen; 802 int datalen;
798 803
799 /* convert the packet to a byte stream */ 804 /* convert the packet to a byte stream */
800 datalen = sprintf( data, "ms=%i%c", /* "ms"=show\1status */ 805 datalen = snprintf( data, sizeof( data ),
806 "ms=%i%c", /* "ms"=show\1status */
801 presence, CP_FLD_TERM 807 presence, CP_FLD_TERM
802 ); 808 );
803 809
804 /* append status message (if one is set) */ 810 /* append status message (if one is set) */
805 if ( statusmsg ) 811 if ( statusmsg )
820 { 826 {
821 char data[CP_MAX_PACKET]; 827 char data[CP_MAX_PACKET];
822 int datalen; 828 int datalen;
823 829
824 /* convert the packet to a byte stream */ 830 /* convert the packet to a byte stream */
825 datalen = sprintf( data, "ms=%i", /* "ms"=mood */ 831 datalen = snprintf( data, sizeof( data ),
832 "ms=%i", /* "ms"=mood */
826 mood 833 mood
827 ); 834 );
828 835
829 /* queue packet for transmission */ 836 /* queue packet for transmission */
830 mxit_queue_packet( session, data, datalen, CP_CMD_MOOD ); 837 mxit_queue_packet( session, data, datalen, CP_CMD_MOOD );
843 { 850 {
844 char data[CP_MAX_PACKET]; 851 char data[CP_MAX_PACKET];
845 int datalen; 852 int datalen;
846 853
847 /* convert the packet to a byte stream */ 854 /* convert the packet to a byte stream */
848 datalen = sprintf( data, "ms=%s%c%s%c%s%c%i%c%s", /* "ms"=group\1username\1alias\1type\1msg */ 855 datalen = snprintf( data, sizeof( data ),
856 "ms=%s%c%s%c%s%c%i%c%s", /* "ms"=group\1username\1alias\1type\1msg */
849 groupname, CP_FLD_TERM, username, CP_FLD_TERM, alias, 857 groupname, CP_FLD_TERM, username, CP_FLD_TERM, alias,
850 CP_FLD_TERM, MXIT_TYPE_MXIT, CP_FLD_TERM, "" 858 CP_FLD_TERM, MXIT_TYPE_MXIT, CP_FLD_TERM, ""
851 ); 859 );
852 860
853 /* queue packet for transmission */ 861 /* queue packet for transmission */
865 { 873 {
866 char data[CP_MAX_PACKET]; 874 char data[CP_MAX_PACKET];
867 int datalen; 875 int datalen;
868 876
869 /* convert the packet to a byte stream */ 877 /* convert the packet to a byte stream */
870 datalen = sprintf( data, "ms=%s", /* "ms"=username */ 878 datalen = snprintf( data, sizeof( data ),
879 "ms=%s", /* "ms"=username */
871 username 880 username
872 ); 881 );
873 882
874 /* queue packet for transmission */ 883 /* queue packet for transmission */
875 mxit_queue_packet( session, data, datalen, CP_CMD_REMOVE ); 884 mxit_queue_packet( session, data, datalen, CP_CMD_REMOVE );
887 { 896 {
888 char data[CP_MAX_PACKET]; 897 char data[CP_MAX_PACKET];
889 int datalen; 898 int datalen;
890 899
891 /* convert the packet to a byte stream */ 900 /* convert the packet to a byte stream */
892 datalen = sprintf( data, "ms=%s%c%s%c%s", /* "ms"=username\1group\1alias */ 901 datalen = snprintf( data, sizeof( data ),
902 "ms=%s%c%s%c%s", /* "ms"=username\1group\1alias */
893 username, CP_FLD_TERM, "", CP_FLD_TERM, alias 903 username, CP_FLD_TERM, "", CP_FLD_TERM, alias
894 ); 904 );
895 905
896 /* queue packet for transmission */ 906 /* queue packet for transmission */
897 mxit_queue_packet( session, data, datalen, CP_CMD_ALLOW ); 907 mxit_queue_packet( session, data, datalen, CP_CMD_ALLOW );
908 { 918 {
909 char data[CP_MAX_PACKET]; 919 char data[CP_MAX_PACKET];
910 int datalen; 920 int datalen;
911 921
912 /* convert the packet to a byte stream */ 922 /* convert the packet to a byte stream */
913 datalen = sprintf( data, "ms=%s", /* "ms"=username */ 923 datalen = snprintf( data, sizeof( data ),
924 "ms=%s", /* "ms"=username */
914 username 925 username
915 ); 926 );
916 927
917 /* queue packet for transmission */ 928 /* queue packet for transmission */
918 mxit_queue_packet( session, data, datalen, CP_CMD_DENY ); 929 mxit_queue_packet( session, data, datalen, CP_CMD_DENY );
931 { 942 {
932 char data[CP_MAX_PACKET]; 943 char data[CP_MAX_PACKET];
933 int datalen; 944 int datalen;
934 945
935 /* convert the packet to a byte stream */ 946 /* convert the packet to a byte stream */
936 datalen = sprintf( data, "ms=%s%c%s%c%s", /* "ms"=groupname\1username\1alias */ 947 datalen = snprintf( data, sizeof( data ),
948 "ms=%s%c%s%c%s", /* "ms"=groupname\1username\1alias */
937 groupname, CP_FLD_TERM, username, CP_FLD_TERM, alias 949 groupname, CP_FLD_TERM, username, CP_FLD_TERM, alias
938 ); 950 );
939 951
940 /* queue packet for transmission */ 952 /* queue packet for transmission */
941 mxit_queue_packet( session, data, datalen, CP_CMD_UPDATE ); 953 mxit_queue_packet( session, data, datalen, CP_CMD_UPDATE );
952 { 964 {
953 char data[CP_MAX_PACKET]; 965 char data[CP_MAX_PACKET];
954 int datalen; 966 int datalen;
955 967
956 /* convert the packet to a byte stream */ 968 /* convert the packet to a byte stream */
957 datalen = sprintf( data, "ms=%s", /* "ms"=splashId */ 969 datalen = snprintf( data, sizeof( data ),
970 "ms=%s", /* "ms"=splashId */
958 splashid 971 splashid
959 ); 972 );
960 973
961 /* queue packet for transmission */ 974 /* queue packet for transmission */
962 mxit_queue_packet( session, data, datalen, CP_CMD_SPLASHCLICK ); 975 mxit_queue_packet( session, data, datalen, CP_CMD_SPLASHCLICK );
977 int datalen; 990 int datalen;
978 991
979 purple_debug_info( MXIT_PLUGIN_ID, "mxit_send_msgevent: to=%s id=%s event=%i\n", to, id, event ); 992 purple_debug_info( MXIT_PLUGIN_ID, "mxit_send_msgevent: to=%s id=%s event=%i\n", to, id, event );
980 993
981 /* convert the packet to a byte stream */ 994 /* convert the packet to a byte stream */
982 datalen = sprintf( data, "ms=%s%c%s%c%i", /* "ms"=contactAddress \1 id \1 event */ 995 datalen = snprintf( data, sizeof( data ),
996 "ms=%s%c%s%c%i", /* "ms"=contactAddress \1 id \1 event */
983 to, CP_FLD_TERM, id, CP_FLD_TERM, event 997 to, CP_FLD_TERM, id, CP_FLD_TERM, event
984 ); 998 );
985 999
986 /* queue packet for transmission */ 1000 /* queue packet for transmission */
987 mxit_queue_packet( session, data, datalen, CP_CMD_MSGEVENT ); 1001 mxit_queue_packet( session, data, datalen, CP_CMD_MSGEVENT );
1001 char data[CP_MAX_PACKET]; 1015 char data[CP_MAX_PACKET];
1002 int datalen; 1016 int datalen;
1003 int i; 1017 int i;
1004 1018
1005 /* convert the packet to a byte stream */ 1019 /* convert the packet to a byte stream */
1006 datalen = sprintf( data, "ms=%s%c%i", /* "ms"=roomname\1nr_jids\1jid0\1..\1jidN */ 1020 datalen = snprintf( data, sizeof( data ),
1021 "ms=%s%c%i", /* "ms"=roomname\1nr_jids\1jid0\1..\1jidN */
1007 groupname, CP_FLD_TERM, nr_usernames 1022 groupname, CP_FLD_TERM, nr_usernames
1008 ); 1023 );
1009 1024
1010 /* add usernames */ 1025 /* add usernames */
1011 for ( i = 0; i < nr_usernames; i++ ) 1026 for ( i = 0; i < nr_usernames; i++ )
1030 char data[CP_MAX_PACKET]; 1045 char data[CP_MAX_PACKET];
1031 int datalen; 1046 int datalen;
1032 int i; 1047 int i;
1033 1048
1034 /* convert the packet to a byte stream */ 1049 /* convert the packet to a byte stream */
1035 datalen = sprintf( data, "ms=%s%c%i", /* "ms"=roomid\1nr_jids\1jid0\1..\1jidN */ 1050 datalen = snprintf( data, sizeof( data ),
1051 "ms=%s%c%i", /* "ms"=roomid\1nr_jids\1jid0\1..\1jidN */
1036 roomid, CP_FLD_TERM, nr_usernames 1052 roomid, CP_FLD_TERM, nr_usernames
1037 ); 1053 );
1038 1054
1039 /* add usernames */ 1055 /* add usernames */
1040 for ( i = 0; i < nr_usernames; i++ ) 1056 for ( i = 0; i < nr_usernames; i++ )
1454 } 1470 }
1455 1471
1456 /* build up a new contact info struct */ 1472 /* build up a new contact info struct */
1457 contact = g_new0( struct contact, 1 ); 1473 contact = g_new0( struct contact, 1 );
1458 1474
1459 strcpy( contact->username, rec->fields[0]->data ); 1475 g_strlcpy( contact->username, rec->fields[0]->data, sizeof( contact->username ) );
1460 mxit_strip_domain( contact->username ); /* remove dummy domain */ 1476 mxit_strip_domain( contact->username ); /* remove dummy domain */
1461 strcpy( contact->alias, rec->fields[1]->data ); 1477 g_strlcpy( contact->alias, rec->fields[1]->data, sizeof( contact->alias ) );
1462 contact->type = atoi( rec->fields[2]->data ); 1478 contact->type = atoi( rec->fields[2]->data );
1463 1479
1464 if ( rec->fcount >= 5 ) { 1480 if ( rec->fcount >= 5 ) {
1465 /* there is a personal invite message attached */ 1481 /* there is a personal invite message attached */
1466 contact->msg = strdup( rec->fields[4]->data ); 1482 contact->msg = strdup( rec->fields[4]->data );
1507 } 1523 }
1508 1524
1509 /* build up a new contact info struct */ 1525 /* build up a new contact info struct */
1510 contact = g_new0( struct contact, 1 ); 1526 contact = g_new0( struct contact, 1 );
1511 1527
1512 strcpy( contact->groupname, rec->fields[0]->data ); 1528 g_strlcpy( contact->groupname, rec->fields[0]->data, sizeof( contact->groupname ) );
1513 strcpy( contact->username, rec->fields[1]->data ); 1529 g_strlcpy( contact->username, rec->fields[1]->data, sizeof( contact->username ) );
1514 mxit_strip_domain( contact->username ); /* remove dummy domain */ 1530 mxit_strip_domain( contact->username ); /* remove dummy domain */
1515 strcpy( contact->alias, rec->fields[2]->data ); 1531 g_strlcpy( contact->alias, rec->fields[2]->data, sizeof( contact->alias ) );
1516 1532
1517 contact->presence = atoi( rec->fields[3]->data ); 1533 contact->presence = atoi( rec->fields[3]->data );
1518 contact->type = atoi( rec->fields[4]->data ); 1534 contact->type = atoi( rec->fields[4]->data );
1519 contact->mood = atoi( rec->fields[5]->data ); 1535 contact->mood = atoi( rec->fields[5]->data );
1520 1536
2016 if ( packet->errcode == MXIT_ERRCODE_REDIRECT ) { 2032 if ( packet->errcode == MXIT_ERRCODE_REDIRECT ) {
2017 mxit_perform_redirect( session, packet->errmsg ); 2033 mxit_perform_redirect( session, packet->errmsg );
2018 return 0; 2034 return 0;
2019 } 2035 }
2020 else { 2036 else {
2021 sprintf( errmsg, _( "Login error: %s (%i)" ), errdesc, packet->errcode ); 2037 snprintf( errmsg, sizeof( errmsg ), _( "Login error: %s (%i)" ), errdesc, packet->errcode );
2022 purple_connection_error( session->con, errmsg ); 2038 purple_connection_error( session->con, errmsg );
2023 return -1; 2039 return -1;
2024 } 2040 }
2025 case CP_CMD_LOGOUT : 2041 case CP_CMD_LOGOUT :
2026 sprintf( errmsg, _( "Logout error: %s (%i)" ), errdesc, packet->errcode ); 2042 snprintf( errmsg, sizeof( errmsg ), _( "Logout error: %s (%i)" ), errdesc, packet->errcode );
2027 purple_connection_error_reason( session->con, PURPLE_CONNECTION_ERROR_NAME_IN_USE, _( errmsg ) ); 2043 purple_connection_error_reason( session->con, PURPLE_CONNECTION_ERROR_NAME_IN_USE, _( errmsg ) );
2028 return -1; 2044 return -1;
2029 case CP_CMD_CONTACT : 2045 case CP_CMD_CONTACT :
2030 mxit_popup( PURPLE_NOTIFY_MSG_WARNING, _( "Contact Error" ), _( errdesc ) ); 2046 mxit_popup( PURPLE_NOTIFY_MSG_WARNING, _( "Contact Error" ), _( errdesc ) );
2031 break; 2047 break;