diff options
Diffstat (limited to 'ext/imap/php_imap.c')
| -rw-r--r-- | ext/imap/php_imap.c | 220 | 
1 files changed, 101 insertions, 119 deletions
diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index 88d005b4db..e06bc7b5d7 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -583,8 +583,6 @@ PHP_MINIT_FUNCTION(imap)  	return SUCCESS;  } -/* {{{ proto int imap_open(string mailbox, string user, string password [, int options]) -   Open an IMAP stream to a mailbox */  void imap_do_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)  {  	pval *mailbox; @@ -792,7 +790,7 @@ PHP_FUNCTION(imap_open)  /* }}} */  /* {{{ proto int imap_popen(string mailbox, string user, string password [, int options]) -   Open an IMAP stream to a mailbox */ +   Open a persistant IMAP stream to a mailbox */  PHP_FUNCTION(imap_popen)  {  #ifdef OP_RELOGIN @@ -805,7 +803,7 @@ PHP_FUNCTION(imap_popen)  /* }}} */  /* {{{ proto int imap_reopen(int stream_id, string mailbox [, int options]) -   Reopen IMAP stream to new mailbox */ +   Reopen an IMAP stream to a new mailbox */  PHP_FUNCTION(imap_reopen)  {  	pval *streamind; @@ -851,7 +849,7 @@ PHP_FUNCTION(imap_reopen)  /* }}} */  /* {{{ proto int imap_append(int stream_id, string folder, string message [, string flags]) -   Append a string message to a specified mailbox */ +   Append a new message to a specified mailbox */  PHP_FUNCTION(imap_append)  {  	pval *streamind,*folder, *message,*flags; @@ -883,7 +881,6 @@ PHP_FUNCTION(imap_append)  		RETURN_FALSE;  	}  } -  /* }}} */  /* {{{ proto int imap_num_msg(int stream_id) @@ -959,7 +956,7 @@ PHP_FUNCTION(imap_num_recent)  /* }}} */  /* {{{ proto int imap_expunge(int stream_id) -   Delete all messages marked for deletion */ +   Permanently delete all messages marked for deletion */  PHP_FUNCTION(imap_expunge)  {  	pval *streamind; @@ -1108,9 +1105,8 @@ PHP_FUNCTION(imap_body)  }  /* }}} */ -  /* {{{ proto string imap_fetchtext_full(int stream_id, int msg_no [, int options]) -   Read the body of a message */ +   Read the full text of a message */  PHP_FUNCTION(imap_fetchtext_full)  {  	pval *streamind, * msgno, *flags; @@ -1394,7 +1390,6 @@ PHP_FUNCTION(imap_list_full)  	efree(delim);  	IMAPG(folderlist_style) = FLIST_ARRAY;		/* reset to default */  } -  /* }}} */  /* {{{ proto array imap_scan(int stream_id, string ref, string pattern, string content) @@ -1477,7 +1472,6 @@ PHP_FUNCTION(imap_check)  		RETURN_FALSE;  	}  } -  /* }}} */  /* {{{ proto int imap_delete(int stream_id, int msg_no [, int flags]) @@ -1539,7 +1533,7 @@ PHP_FUNCTION(imap_undelete)  /* }}} */  /* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]]) -   Read the header of the message */ +   Read the headers of the message */  PHP_FUNCTION(imap_headerinfo)  {  	pval *streamind, *msgno, *fromlength, *subjectlength, *defaulthost; @@ -1696,7 +1690,7 @@ PHP_FUNCTION(imap_lsub)  /* }}} */  /* {{{ proto array imap_getsubscribed(int stream_id, string ref, string pattern) -   Return a list of subscribed mailboxes */ +   Return a list of subscribed mailboxes, in the same format as imap_getmailboxes() */  /* Author: CJH */  PHP_FUNCTION(imap_lsub_full)  { @@ -2078,8 +2072,6 @@ PHP_FUNCTION(imap_rfc822_parse_adrlist)  }  /* }}} */ - -  /* {{{ proto string imap_utf8(string string)     Convert a string to UTF-8 */  PHP_FUNCTION(imap_utf8) @@ -2425,8 +2417,6 @@ PHP_FUNCTION(imap_utf7_encode)  #undef B64  #undef UNB64 - -  /* {{{ proto int imap_setflag_full(int stream_id, string sequence, string flag [, int options])     Sets flags on messages */  PHP_FUNCTION(imap_setflag_full) @@ -2802,7 +2792,7 @@ PHP_FUNCTION(imap_bodystruct)  /* }}} */  /* {{{ proto array imap_fetch_overview(int stream_id, int msg_no) -   Read an overview of the information in the headers of the given message */  +   Read an overview of the information in the headers of the given message sequence */   PHP_FUNCTION(imap_fetch_overview)  {   	pval *streamind, *sequence, *pflags; @@ -2886,7 +2876,6 @@ PHP_FUNCTION(imap_fetch_overview)  		}  	}  } -  /* }}} */  /* {{{ proto string imap_mail_compose(array envelope, array body) @@ -3248,7 +3237,7 @@ PHP_FUNCTION(imap_mail)  #endif  /* {{{ proto array imap_search(int stream_id, string criteria [, long flags]) -   Return a list of messages matching the criteria */ +   Return a list of messages matching the given criteria */  PHP_FUNCTION(imap_search)  {  	pval *streamind, *criteria, *search_flags; @@ -3294,15 +3283,10 @@ PHP_FUNCTION(imap_search)  	}  	mail_free_messagelist(&IMAPG(imap_messages));  } -  /* }}} */  /* {{{ proto array imap_alerts(void) -   Returns an array of all IMAP alerts that have been generated */ -/* Returns an array of all IMAP alerts that have been generated either -   since the last page load, or since the last imap_alerts() call, -   whichever came last. The alert stack is cleared after imap_alerts() -   is called. */ +   Returns an array of all IMAP alerts that have been generated since the last page load or since the last imap_alerts() call, whichever came last. The alert stack is cleared after imap_alerts() is called. */  /* Author: CJH */  PHP_FUNCTION(imap_alerts)  { @@ -3312,7 +3296,7 @@ PHP_FUNCTION(imap_alerts)  	if (arg_count > 0) {  		WRONG_PARAM_COUNT; -	} +	}   	if (IMAPG(imap_alertstack) == NIL) {  		RETURN_FALSE; @@ -3330,10 +3314,7 @@ PHP_FUNCTION(imap_alerts)  /* }}} */  /* {{{ proto array imap_errors(void) -   Returns an array of all IMAP errors generated */ -/* Returns an array of all IMAP errors generated either since the last -   page load, or since the last imap_errors() call, whichever came -   last. The error stack is cleared after imap_errors() is called. */ +   Returns an array of all IMAP errors generated since the last  page load, or since the last imap_errors() call, whichever came last. The error stack is cleared after imap_errors() is called. */  /* Author: CJH */  PHP_FUNCTION(imap_errors)  { @@ -3387,6 +3368,95 @@ PHP_FUNCTION(imap_last_error)  }  /* }}} */ +/* {{{ proto array imap_mime_header_decode(string str) +   Decode mime header element in accordance with RFC 2047 and return array of objects containing 'charset' encoding and decoded 'text' */ +PHP_FUNCTION(imap_mime_header_decode) +{ +	zval **str,*myobject; +	char *string,*charset,encoding,*text,*decode; +	long charset_token,encoding_token,end_token,end,offset=0,i; +	unsigned long newlength; + +	if (ARG_COUNT(ht) != 1 || zend_get_parameters_ex(1, &str) == FAILURE) { +		WRONG_PARAM_COUNT; +	} + +	convert_to_string_ex(str); + +	if (array_init(return_value) == FAILURE) { +		RETURN_FALSE; +	} + +	string=(*str)->value.str.val; +	end=(*str)->value.str.len; +			 +	if((charset=((char *)emalloc((end+1)*2)))) { +		text=&charset[end+1]; +		while(offset<end) {													// Reached end of the string? +			if((charset_token=php_memnstr(&string[offset],"=?",2,string+end))) {		// Is there anything encoded in the string? +				charset_token-=(unsigned long)string; +				if(offset!=charset_token) {										// Is there anything before the encoded data? +					// Retrieve unencoded data that is found at the beginning +					memcpy(text,&string[offset],charset_token-offset); +					text[charset_token-offset]=0x00; +					MAKE_STD_ZVAL(myobject); +					object_init(myobject); +					add_property_string(myobject,"charset","default",1); +					add_property_string(myobject,"text",text,1); +					zend_hash_next_index_insert(return_value->value.ht,(void *)&myobject,sizeof(zval *),NULL); +				} +				if((encoding_token=php_memnstr(&string[charset_token+2],"?",1,string+end))) {			// Find token for encoding +					encoding_token-=(unsigned long)string; +					if((end_token=php_memnstr(&string[encoding_token+1],"?=",2,string+end))) {		// Find token for end of encoded data +						end_token-=(unsigned long)string; +						memcpy(charset,&string[charset_token+2],encoding_token-(charset_token+2));	// Extract charset encoding +						charset[encoding_token-(charset_token+2)]=0x00; +						encoding=string[encoding_token+1];										// Extract encoding from string +						memcpy(text,&string[encoding_token+3],end_token-(encoding_token+3));		// Extract text +						text[end_token-(encoding_token+3)]=0x00; +						decode=text; +						if(encoding=='q' || encoding=='Q') {										// Decode 'q' encoded data +							for(i=0;text[i]!=0x00;i++) if(text[i]=='_') text[i]=' ';							// Replace all *_' with space. +							decode = (char *) rfc822_qprint((unsigned char *) text, strlen(text),&newlength); +						} +						if(encoding=='b' || encoding=='B') decode = (char *) rfc822_base64((unsigned char *) text, strlen(text),&newlength); // Decode 'B' encoded data +						MAKE_STD_ZVAL(myobject); +						object_init(myobject); +						add_property_string(myobject,"charset",charset,1); +						add_property_string(myobject,"text",decode,1); +						zend_hash_next_index_insert(return_value->value.ht,(void *)&myobject,sizeof(zval *),NULL); +						 +						offset+=end_token+2; +						if(string[offset]==' ' && string[offset+1]=='=' && string[offset+2]=='?') offset++;	// Remove required space between encoded segments +						continue;								// Iterate the loop again please. +					} +				} +			} else { +				// Just some tweaking to optimize the code, and get the end statements work in a general manner. +				// If we end up here we didn't find a position for "charset_token", +				// so we need to set it to the start of the yet unextracted data. +				charset_token=offset; +			} +			// Return the rest of the data as unencoded, as it was either unencoded or was missing separators +			// which rendered the the remainder of the string impossible for us to decode. +			memcpy(text,&string[charset_token],end-charset_token);		// Extract unencoded text from string +			text[end-charset_token]=0x00; +			MAKE_STD_ZVAL(myobject); +			object_init(myobject); +			add_property_string(myobject,"charset","default",1); +			add_property_string(myobject,"text",text,1); +			zend_hash_next_index_insert(return_value->value.ht,(void *)&myobject,sizeof(zval *),NULL); +			 +			offset=end;	// We have reached the end of the string. +		} +		efree(charset); +	} else { +		php_error(E_WARNING, "Unable to allocate temporary memory buffer for imap_mime_header_decode"); +		RETURN_FALSE; +	} +} +/* }}} */ +  /* Support Functions */  void _php_imap_parse_address (ADDRESS *addresslist, char *fulladdress, pval *paddress) @@ -3867,91 +3937,3 @@ long mm_diskerror(MAILSTREAM *stream,long errcode,long serious)  void mm_fatal(char *str)  {  } - -/* {{{ proto array imap_mime_header_decode(string str) -   Decode mime header element in accordance with RFC 2047 and return array of objects containing 'charset' encoding and decoded 'text' */ -PHP_FUNCTION(imap_mime_header_decode) -{ -	zval **str,*myobject; -	char *string,*charset,encoding,*text,*decode; -	long charset_token,encoding_token,end_token,end,offset=0,i; -	unsigned long newlength; - -	if (ARG_COUNT(ht) != 1 || zend_get_parameters_ex(1, &str) == FAILURE) { -		WRONG_PARAM_COUNT; -	} - -	convert_to_string_ex(str); - -	if (array_init(return_value) == FAILURE) { -		RETURN_FALSE; -	} - -	string=(*str)->value.str.val; -	end=(*str)->value.str.len; -			 -	if((charset=((char *)emalloc((end+1)*2)))) { -		text=&charset[end+1]; -		while(offset<end) {													// Reached end of the string? -			if((charset_token=php_memnstr(&string[offset],"=?",2,string+end))) {		// Is there anything encoded in the string? -				charset_token-=(unsigned long)string; -				if(offset!=charset_token) {										// Is there anything before the encoded data? -					// Retrieve unencoded data that is found at the beginning -					memcpy(text,&string[offset],charset_token-offset); -					text[charset_token-offset]=0x00; -					MAKE_STD_ZVAL(myobject); -					object_init(myobject); -					add_property_string(myobject,"charset","default",1); -					add_property_string(myobject,"text",text,1); -					zend_hash_next_index_insert(return_value->value.ht,(void *)&myobject,sizeof(zval *),NULL); -				} -				if((encoding_token=php_memnstr(&string[charset_token+2],"?",1,string+end))) {			// Find token for encoding -					encoding_token-=(unsigned long)string; -					if((end_token=php_memnstr(&string[encoding_token+1],"?=",2,string+end))) {		// Find token for end of encoded data -						end_token-=(unsigned long)string; -						memcpy(charset,&string[charset_token+2],encoding_token-(charset_token+2));	// Extract charset encoding -						charset[encoding_token-(charset_token+2)]=0x00; -						encoding=string[encoding_token+1];										// Extract encoding from string -						memcpy(text,&string[encoding_token+3],end_token-(encoding_token+3));		// Extract text -						text[end_token-(encoding_token+3)]=0x00; -						decode=text; -						if(encoding=='q' || encoding=='Q') {										// Decode 'q' encoded data -							for(i=0;text[i]!=0x00;i++) if(text[i]=='_') text[i]=' ';							// Replace all *_' with space. -							decode = (char *) rfc822_qprint((unsigned char *) text, strlen(text),&newlength); -						} -						if(encoding=='b' || encoding=='B') decode = (char *) rfc822_base64((unsigned char *) text, strlen(text),&newlength); // Decode 'B' encoded data -						MAKE_STD_ZVAL(myobject); -						object_init(myobject); -						add_property_string(myobject,"charset",charset,1); -						add_property_string(myobject,"text",decode,1); -						zend_hash_next_index_insert(return_value->value.ht,(void *)&myobject,sizeof(zval *),NULL); -						 -						offset+=end_token+2; -						if(string[offset]==' ' && string[offset+1]=='=' && string[offset+2]=='?') offset++;	// Remove required space between encoded segments -						continue;								// Iterate the loop again please. -					} -				} -			} else { -				// Just some tweaking to optimize the code, and get the end statements work in a general manner. -				// If we end up here we didn't find a position for "charset_token", -				// so we need to set it to the start of the yet unextracted data. -				charset_token=offset; -			} -			// Return the rest of the data as unencoded, as it was either unencoded or was missing separators -			// which rendered the the remainder of the string impossible for us to decode. -			memcpy(text,&string[charset_token],end-charset_token);		// Extract unencoded text from string -			text[end-charset_token]=0x00; -			MAKE_STD_ZVAL(myobject); -			object_init(myobject); -			add_property_string(myobject,"charset","default",1); -			add_property_string(myobject,"text",text,1); -			zend_hash_next_index_insert(return_value->value.ht,(void *)&myobject,sizeof(zval *),NULL); -			 -			offset=end;	// We have reached the end of the string. -		} -		efree(charset); -	} else { -		php_error(E_WARNING, "Unable to allocate temporary memory buffer for imap_mime_header_decode"); -		RETURN_FALSE; -	} -}  | 
