Changeset 5192 in subversion


Ignore:
Timestamp:
Sep 8, 2011 4:31:13 AM (21 months ago)
Author:
alec
Message:
  • Fix new caching issue when broken/misleading object data was stored in database. The object must be cleaned up before storing in DB, because some code (out of rcube_message and rcube_imap classes) is changing objects data e.g. parts mimetype or body. Now it's become a problem because we're saving the object in cache at shutdown (after all modifications).
  • Make stored message object smaller by removing some redundant data.
Location:
trunk/roundcubemail/program/include
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/program/include/rcube_imap.php

    r5190 r5192  
    20002000 
    20012001        $struct = &$this->_structure_part($structure, 0, '', $headers); 
    2002         $struct->headers = get_object_vars($headers); 
    20032002 
    20042003        // don't trust given content-type 
    2005         if (empty($struct->parts) && !empty($struct->headers['ctype'])) { 
     2004        if (empty($struct->parts) && !empty($headers->ctype)) { 
    20062005            $struct->mime_id = '1'; 
    2007             $struct->mimetype = strtolower($struct->headers['ctype']); 
     2006            $struct->mimetype = strtolower($headers->ctype); 
    20082007            list($struct->ctype_primary, $struct->ctype_secondary) = explode('/', $struct->mimetype); 
    20092008        } 
  • trunk/roundcubemail/program/include/rcube_imap_cache.php

    r5190 r5192  
    889889        // Save current message from internal cache 
    890890        if ($message = $this->icache['message']) { 
    891             $object = $message['object']; 
    892             // remove body too big (>500kB) 
    893             if ($object->body && strlen($object->body) > 500 * 1024) 
    894                 $object->body = null; 
     891            // clean up some object's data 
     892            $object = $this->message_object_prepare($message['object']); 
    895893 
    896894            // calculate current md5 sum 
     
    905903    } 
    906904 
     905 
     906    /** 
     907     * Prepares message object to be stored in database. 
     908     */ 
     909    private function message_object_prepare($msg, $recursive = false) 
     910    { 
     911        // Remove body too big (>500kB) 
     912        if ($recursive || ($msg->body && strlen($msg->body) > 500 * 1024)) { 
     913            unset($msg->body); 
     914        } 
     915 
     916        // Fix mimetype which might be broken by some code when message is displayed 
     917        // Another solution would be to use object's copy in rcube_message class 
     918        // to prevent related issues, however I'm not sure which is better 
     919        if ($msg->mimetype) { 
     920            list($msg->ctype_primary, $msg->ctype_secondary) = explode('/', $msg->mimetype); 
     921        } 
     922 
     923        if (is_array($msg->structure->parts)) { 
     924            foreach ($msg->structure->parts as $idx => $part) { 
     925                $msg->structure->parts[$idx] = $this->message_object_prepare($part, true); 
     926            } 
     927        } 
     928 
     929        return $msg; 
     930    } 
    907931} 
Note: See TracChangeset for help on using the changeset viewer.