Mercurial > pidgin
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; |