diff options
-rw-r--r-- | lib/misc.c | 52 | ||||
-rw-r--r-- | lib/misc.h | 4 | ||||
-rw-r--r-- | protocols/msn/msn.h | 1 | ||||
-rw-r--r-- | protocols/msn/msn_util.c | 52 | ||||
-rw-r--r-- | protocols/msn/ns.c | 14 | ||||
-rw-r--r-- | protocols/msn/sb.c | 8 |
6 files changed, 64 insertions, 67 deletions
@@ -728,3 +728,55 @@ char **split_command_parts( char *command ) return cmd; } + +char *get_rfc822_header( char *text, char *header, int len ) +{ + int hlen = strlen( header ), i; + char *ret; + + if( len == 0 ) + len = strlen( text ); + + i = 0; + while( ( i + hlen ) < len ) + { + /* Maybe this is a bit over-commented, but I just hate this part... */ + if( g_strncasecmp( text + i, header, hlen ) == 0 ) + { + /* Skip to the (probable) end of the header */ + i += hlen; + + /* Find the first non-[: \t] character */ + while( i < len && ( text[i] == ':' || text[i] == ' ' || text[i] == '\t' ) ) i ++; + + /* Make sure we're still inside the string */ + if( i >= len ) return( NULL ); + + /* Save the position */ + ret = text + i; + + /* Search for the end of this line */ + while( i < len && text[i] != '\r' && text[i] != '\n' ) i ++; + + /* Make sure we're still inside the string */ + if( i >= len ) return( NULL ); + + /* Copy the found data */ + return( g_strndup( ret, text + i - ret ) ); + } + + /* This wasn't the header we were looking for, skip to the next line. */ + while( i < len && ( text[i] != '\r' && text[i] != '\n' ) ) i ++; + while( i < len && ( text[i] == '\r' || text[i] == '\n' ) ) i ++; + + /* End of headers? */ + if( ( i >= 4 && strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ) || + ( i >= 2 && ( strncmp( text + i - 2, "\n\n", 2 ) == 0 || + strncmp( text + i - 2, "\r\r", 2 ) == 0 ) ) ) + { + break; + } + } + + return( NULL ); +} @@ -64,11 +64,9 @@ G_MODULE_EXPORT struct ns_srv_reply **srv_lookup( char *service, char *protocol, G_MODULE_EXPORT void srv_free( struct ns_srv_reply **srv ); G_MODULE_EXPORT char *word_wrap( const char *msg, int line_len ); - G_MODULE_EXPORT gboolean ssl_sockerr_again( void *ssl ); - G_MODULE_EXPORT int md5_verify_password( char *password, char *hash ); - G_MODULE_EXPORT char **split_command_parts( char *command ); +G_MODULE_EXPORT char *get_rfc822_header( char *text, char *header, int len ); #endif diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index da9430ab..bf7cdfa8 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -233,7 +233,6 @@ int msn_logged_in( struct im_connection *ic ); int msn_buddy_list_add( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_, const char *group ); int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group ); void msn_buddy_ask( bee_user_t *bu ); -char *msn_findheader( char *text, char *header, int len ); char **msn_linesplit( char *line ); int msn_handler( struct msn_handler_data *h ); void msn_msgq_purge( struct im_connection *ic, GSList **list ); diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c index 7fa68915..d5a74a47 100644 --- a/protocols/msn/msn_util.c +++ b/protocols/msn/msn_util.c @@ -227,58 +227,6 @@ void msn_buddy_ask( bee_user_t *bu ) imcb_ask( bu->ic, buf, bla, msn_buddy_ask_yes, msn_buddy_ask_no ); } -char *msn_findheader( char *text, char *header, int len ) -{ - int hlen = strlen( header ), i; - char *ret; - - if( len == 0 ) - len = strlen( text ); - - i = 0; - while( ( i + hlen ) < len ) - { - /* Maybe this is a bit over-commented, but I just hate this part... */ - if( g_strncasecmp( text + i, header, hlen ) == 0 ) - { - /* Skip to the (probable) end of the header */ - i += hlen; - - /* Find the first non-[: \t] character */ - while( i < len && ( text[i] == ':' || text[i] == ' ' || text[i] == '\t' ) ) i ++; - - /* Make sure we're still inside the string */ - if( i >= len ) return( NULL ); - - /* Save the position */ - ret = text + i; - - /* Search for the end of this line */ - while( i < len && text[i] != '\r' && text[i] != '\n' ) i ++; - - /* Make sure we're still inside the string */ - if( i >= len ) return( NULL ); - - /* Copy the found data */ - return( g_strndup( ret, text + i - ret ) ); - } - - /* This wasn't the header we were looking for, skip to the next line. */ - while( i < len && ( text[i] != '\r' && text[i] != '\n' ) ) i ++; - while( i < len && ( text[i] == '\r' || text[i] == '\n' ) ) i ++; - - /* End of headers? */ - if( ( i >= 4 && strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ) || - ( i >= 2 && ( strncmp( text + i - 2, "\n\n", 2 ) == 0 || - strncmp( text + i - 2, "\r\r", 2 ) == 0 ) ) ) - { - break; - } - } - - return( NULL ); -} - /* *NOT* thread-safe, but that's not a problem for now... */ char **msn_linesplit( char *line ) { diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index e144a8d2..0fa49ecb 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -608,7 +608,7 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl { if( g_strcasecmp( cmd[1], "Hotmail" ) == 0 ) { - char *ct = msn_findheader( msg, "Content-Type:", msglen ); + char *ct = get_rfc822_header( msg, "Content-Type:", msglen ); if( !ct ) return( 1 ); @@ -621,8 +621,8 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl if( !body ) return( 1 ); - mtype = msn_findheader( body, "Type:", blen ); - arg1 = msn_findheader( body, "Arg1:", blen ); + mtype = get_rfc822_header( body, "Type:", blen ); + arg1 = get_rfc822_header( body, "Arg1:", blen ); if( mtype && strcmp( mtype, "1" ) == 0 ) { @@ -641,8 +641,8 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl { if( set_getbool( &ic->acc->set, "mail_notifications" ) ) { - char *inbox = msn_findheader( body, "Inbox-Unread:", blen ); - char *folders = msn_findheader( body, "Folders-Unread:", blen ); + char *inbox = get_rfc822_header( body, "Inbox-Unread:", blen ); + char *folders = get_rfc822_header( body, "Folders-Unread:", blen ); if( inbox && folders ) imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders ); @@ -655,8 +655,8 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl { if( set_getbool( &ic->acc->set, "mail_notifications" ) ) { - char *from = msn_findheader( body, "From-Addr:", blen ); - char *fromname = msn_findheader( body, "From:", blen ); + char *from = get_rfc822_header( body, "From-Addr:", blen ); + char *fromname = get_rfc822_header( body, "From:", blen ); if( from && fromname ) imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from ); diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c index 69114469..ccd65e49 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -681,7 +681,7 @@ static int msn_sb_message( struct msn_handler_data *handler, char *msg, int msgl if( strcmp( cmd[0], "MSG" ) == 0 ) { - char *ct = msn_findheader( msg, "Content-Type:", msglen ); + char *ct = get_rfc822_header( msg, "Content-Type:", msglen ); if( !ct ) return( 1 ); @@ -710,8 +710,8 @@ static int msn_sb_message( struct msn_handler_data *handler, char *msg, int msgl // Disable MSN ft support for now. else if( g_strncasecmp( ct, "text/x-msmsgsinvite", 19 ) == 0 ) { - char *command = msn_findheader( body, "Invitation-Command:", blen ); - char *cookie = msn_findheader( body, "Invitation-Cookie:", blen ); + char *command = get_rfc822_header( body, "Invitation-Command:", blen ); + char *cookie = get_rfc822_header( body, "Invitation-Cookie:", blen ); unsigned int icookie; g_free( ct ); @@ -749,7 +749,7 @@ static int msn_sb_message( struct msn_handler_data *handler, char *msg, int msgl } else if( g_strncasecmp( ct, "text/x-msmsgscontrol", 20 ) == 0 ) { - char *who = msn_findheader( msg, "TypingUser:", msglen ); + char *who = get_rfc822_header( msg, "TypingUser:", msglen ); if( who ) { |