X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=class%2Fmime%2FRfc822Header.class.php;h=e809797660a0b6fd7d386f6f3be659bce6c4bbeb;hb=8755fbdb5031cf3b9e3d5f1171e20d73fd5036fa;hp=ca5ade5e8b6d8859cd7c1fd9f15061ed8e8435b2;hpb=8b53b4baaffc18ebc700b46ee28cbc2c7046916a;p=squirrelmail.git diff --git a/class/mime/Rfc822Header.class.php b/class/mime/Rfc822Header.class.php index ca5ade5e..e8097976 100644 --- a/class/mime/Rfc822Header.class.php +++ b/class/mime/Rfc822Header.class.php @@ -3,24 +3,26 @@ /** * Rfc822Header.class.php * - * Copyright (c) 2003 The SquirrelMail Project Team + * Copyright (c) 2003-2004 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * This contains functions needed to handle mime messages. * - * $Id$ + * @version $Id$ + * @package squirrelmail */ -/* - * rdc822_header class +/** * input: header_string or array + * @package squirrelmail */ class Rfc822Header { - var $date = '', + var $date = -1, $subject = '', $from = array(), $sender = '', $reply_to = array(), + $mail_followup_to = array(), $to = array(), $cc = array(), $bcc = array(), @@ -34,6 +36,8 @@ class Rfc822Header { $priority = 3, $dnt = '', $encoding = '', + $content_id = '', + $content_desc = '', $mlist = array(), $more_headers = array(); /* only needed for constructing headers in smtp.php */ @@ -41,12 +45,12 @@ class Rfc822Header { if (is_array($hdr)) { $hdr = implode('', $hdr); } - /* First we unfold the header */ - $hdr = trim(str_replace(array("\r\n\t", "\r\n "),array('', ''), $hdr)); + /* First we replace \r\n by \n and unfold the header */ + $hdr = trim(str_replace(array("\r\n", "\n\t", "\n "),array("\n", ' ', ' '), $hdr)); /* Now we can make a new header array with */ /* each element representing a headerline */ - $hdr = explode("\r\n" , $hdr); + $hdr = explode("\n" , $hdr); foreach ($hdr as $line) { $pos = strpos($line, ':'); if ($pos > 0) { @@ -125,6 +129,9 @@ class Rfc822Header { case 'reply-to': $this->reply_to = $this->parseAddress($value, true); break; + case 'mail-followup-to': + $this->mail_followup_to = $this->parseAddress($value, true); + break; case 'to': $this->to = $this->parseAddress($value, true); break; @@ -164,6 +171,16 @@ class Rfc822Header { $value = $this->stripComments($value); $this->parseDisposition($value); break; + case 'content-transfer-encoding': + $this->encoding = $value; + break; + case 'content-description': + $this->content_desc = $value; + break; + case 'content-id': + $value = $this->stripComments($value); + $this->content_id = $value; + break; case 'user-agent': case 'x-mailer': $this->xmailer = $value; @@ -176,11 +193,11 @@ class Rfc822Header { $this->mlist('post', $value); break; case 'list-reply': - $value = $this->stripComments($value); + $value = $this->stripComments($value); $this->mlist('reply', $value); break; case 'list-subscribe': - $value = $this->stripComments($value); + $value = $this->stripComments($value); $this->mlist('subscribe', $value); break; case 'list-unsubscribe': @@ -210,7 +227,6 @@ class Rfc822Header { function getAddressTokens($address) { $aTokens = array(); - $aAddress = array(); $aSpecials = array('(' ,'<' ,',' ,';' ,':'); $aReplace = array(' (',' <',' ,',' ;',' :'); $address = str_replace($aSpecials,$aReplace,$address); @@ -230,7 +246,7 @@ class Rfc822Header { $i = $iEnd; } $sToken = str_replace($aReplace, $aSpecials,$sToken); - $aTokens[] = $sToken; + if ($sToken) $aTokens[] = $sToken; break; case '"': $iEnd = strpos($address,$cChar,$i+1); @@ -306,11 +322,11 @@ class Rfc822Header { array_pop($aTokens); // create token and add it again $sNewToken = $prevToken . $sNextToken; - $aTokens[] = $sNewToken; + if($sNewToken) $aTokens[] = $sNewToken; } } $sToken = str_replace($aReplace, $aSpecials,$sToken); - $aTokens[] = $sToken; + if ($sToken) $aTokens[] = $sToken; break; case ',': case ':': @@ -342,7 +358,7 @@ class Rfc822Header { } if (count($aStack)) { $sPersonal = trim(implode('',$aStack)); - } else { + } else { $sPersonal = ''; } if (!$sPersonal && count($aComment)) { @@ -370,18 +386,18 @@ class Rfc822Header { } /* - * parseAddress: recursive function for parsing address strings and store + * parseAddress: recursive function for parsing address strings and store * them in an address stucture object. * input: $address = string * $ar = boolean (return array instead of only the * first element) * $addr_ar = array with parsed addresses // obsolete * $group = string // obsolete - * $host = string (default domainname in case of + * $host = string (default domainname in case of * addresses without a domainname) * $lookup = callback function (for lookup address * strings which are probably nicks - * (without @ ) ) + * (without @ ) ) * output: array with addressstructure objects or only one * address_structure object. * personal name: encoded: =?charset?Q|B?string?= @@ -395,7 +411,7 @@ class Rfc822Header { function parseAddress($address,$ar=false,$aAddress=array(),$sGroup='',$sHost='',$lookup=false) { $aTokens = $this->getAddressTokens($address); - $sPersonal = $sEmail = $sComment = $sGroup = ''; + $sPersonal = $sEmail = $sGroup = ''; $aStack = $aComment = array(); foreach ($aTokens as $sToken) { $cChar = $sToken{0}; @@ -404,7 +420,7 @@ class Rfc822Header { case '=': case '"': case ' ': - $aStack[] = $sToken; + $aStack[] = $sToken; break; case '(': $aComment[] = substr($sToken,1,-1); @@ -415,7 +431,7 @@ class Rfc822Header { $oAddr = end($aAddress); if(!$oAddr || ((isset($oAddr)) && !$oAddr->mailbox && !$oAddr->personal)) { $sEmail = $sGroup . ':;'; - } + } $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup); $sGroup = ''; $aStack = $aComment = array(); @@ -424,7 +440,7 @@ class Rfc822Header { case ',': $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup); break; - case ':': + case ':': $sGroup = trim(implode(' ',$aStack)); $sGroup = preg_replace('/\s+/',' ',$sGroup); $aStack = array(); @@ -434,7 +450,7 @@ class Rfc822Header { break; case '>': /* skip */ - break; + break; default: $aStack[] = $sToken; break; } } @@ -473,20 +489,20 @@ class Rfc822Header { if ($sHost && $oAddr->mailbox) { $oAddr->host = $sHost; } - } + } } if (!$aAddrBookAddress && $oAddr->mailbox) { $aProcessedAddress[] = $oAddr; } else { - $aProcessedAddress = array_merge($aProcessedAddress,$aAddrBookAddress); + $aProcessedAddress = array_merge($aProcessedAddress,$aAddrBookAddress); } } - if ($ar) { + if ($ar) { return $aProcessedAddress; } else { return $aProcessedAddress[0]; } - } + } function parseContentType($value) { $pos = strpos($value, ';'); @@ -507,37 +523,39 @@ class Rfc822Header { } $this->content_type = $content_type; } - + /* RFC2184 */ - function processParameters($aParameters) { + function processParameters($aParameters) { $aResults = array(); - $aCharset = array(); - // handle multiline parameters + $aCharset = array(); + // handle multiline parameters foreach($aParameters as $key => $value) { - if ($iPos = strpos($key,'*')) { - $sKey = substr($key,0,$iPos); - if (!isset($aResults[$sKey])) { - $aResults[$sKey] = $value; - if (substr($key,-1) == '*') { // parameter contains language/charset info - $aCharset[] = $sKey; - } - } else { - $aResults[$sKey] .= $value; - } - } + if ($iPos = strpos($key,'*')) { + $sKey = substr($key,0,$iPos); + if (!isset($aResults[$sKey])) { + $aResults[$sKey] = $value; + if (substr($key,-1) == '*') { // parameter contains language/charset info + $aCharset[] = $sKey; + } + } else { + $aResults[$sKey] .= $value; + } + } else { + $aResults[$key] = $value; + } } - foreach ($aCharset as $key) { - $value = $aResults[$key]; - // extract the charset & language - $charset = substr($value,0,strpos($value,"'")); - $value = substr($value,strlen($charset)+1); - $language = substr($value,0,strpos($value,"'")); - $value = substr($value,strlen($charset)+1); - // FIX ME What's the status of charset decode with language information ???? - $value = charset_decode($charset,$value); - $aResults[$key] = $value; - } - return $aResults; + foreach ($aCharset as $key) { + $value = $aResults[$key]; + // extract the charset & language + $charset = substr($value,0,strpos($value,"'")); + $value = substr($value,strlen($charset)+1); + $language = substr($value,0,strpos($value,"'")); + $value = substr($value,strlen($charset)+1); + // FIX ME What's the status of charset decode with language information ???? + $value = charset_decode($charset,$value); + $aResults[$key] = $value; + } + return $aResults; } function parseProperties($value) { @@ -549,7 +567,7 @@ class Rfc822Header { if ($pos > 0) { $key = trim(substr($prop, 0, $pos)); $val = trim(substr($prop, $pos+1)); - if ($val{0} == '"') { + if (strlen($val) > 0 && $val{0} == '"') { $val = substr($val, 1, -1); } $propResultArray[$key] = $val; @@ -602,7 +620,7 @@ class Rfc822Header { if (is_array($arr)) { foreach($arr as $arg) { if ($this->getAddr_s($arg, $separator, $encoded)) { - $s .= $separator . $result; + $s .= $separator; } } $s = ($s ? substr($s, 2) : $s); @@ -666,14 +684,13 @@ class Rfc822Header { } return $arr; } - + function findAddress($address, $recurs = false) { $result = false; if (is_array($address)) { $i=0; foreach($address as $argument) { $match = $this->findAddress($argument, true); - $last = end($match); if ($match[1]) { return $i; } else { @@ -681,7 +698,7 @@ class Rfc822Header { $result = $i; } } - ++$i; + ++$i; } } else { if (!is_array($this->cc)) $this->cc = array(); @@ -721,7 +738,7 @@ class Rfc822Header { return true; } else { return false; - } + } } //exit; return $result; @@ -734,4 +751,4 @@ class Rfc822Header { } } -?> +?> \ No newline at end of file