roundcubemail/plugins/enigma/lib/enigma_engine.php
private function parse_plain_encrypted(&$p, $body, $prefix = '')
    {
        if (!$this->rc->config->get('enigma_decryption', true)) {
            return;
        }

        $this->load_pgp_driver();
        $part = $p['structure'];

        // Decrypt
        $result = $this->pgp_decrypt($body, $signature);

        // Store decryption status
        $this->decryptions[$part->mime_id] = $result;

        // Store signature data for display
        if ($signature) {
            $this->signatures[$part->mime_id] = $signature;
        }

        // find parent part ID
        if (strpos($part->mime_id, '.')) {
            $items = explode('.', $part->mime_id);
            array_pop($items);
            $parent = implode('.', $items);
        }
        else {
            $parent = 0;
        }

        // Parse decrypted message
        if ($result === true) {
            $part->body          = $prefix . $body;
            $part->body_modified = true;

            // it maybe PGP signed inside, verify signature
            $this->parse_plain($p, $body);

            // Remember it was decrypted
            $this->encrypted_parts[] = $part->mime_id;

            // Inform the user that only a part of the body was encrypted
            if ($prefix) {
                $this->decryptions[$part->mime_id] = self::ENCRYPTED_PARTIALLY;
            }

            // Encrypted plain message may contain encrypted attachments
            // in such case attachments have .pgp extension and type application/octet-stream.
            // This is what happens when you select "Encrypt each attachment separately
            // and send the message using inline PGP" in Thunderbird's Enigmail.

            if ($p['object']->mime_parts[$parent]) {
                foreach ((array)$p['object']->mime_parts[$parent]->parts as $p) {
                    if ($p->disposition == 'attachment' && $p->mimetype == 'application/octet-stream'
                        && preg_match('/^(.*)\.pgp$/i', $p->filename, $m)
                    ) {
                        // modify filename
                        $p->filename = $m[1];
                        // flag the part, it will be decrypted when needed
                        $p->need_decryption = true;
                        // disable caching
                        $p->body_modified = true;
                    }
                }
            }
        }
        // decryption failed, but the message may have already
        // been cached with the modified parts (see above),
        // let's bring the original state back
        else if ($p['object']->mime_parts[$parent]) {
            foreach ((array)$p['object']->mime_parts[$parent]->parts as $p) {
                if ($p->need_decryption && !preg_match('/^(.*)\.pgp$/i', $p->filename, $m)) {
                    // modify filename
                    $p->filename .= '.pgp';
                    // flag the part, it will be decrypted when needed
                    unset($p->need_decryption);
                }
            }
        }
    }
private function parse_plain_encrypted(&$p, $body, $prefix = '')
    {
        if (!$this->rc->config->get('enigma_decryption', true)) {
            return;
        }

        $this->load_pgp_driver();
        $part = $p['structure'];

        // Decrypt
        $result = $this->pgp_decrypt($body, $signature);

        // Store decryption status
        $this->decryptions[$part->mime_id] = $result;

        // Store signature data for display
        if ($signature) {
            $this->signatures[$part->mime_id] = $signature;
        }

        // find parent part ID
        if (strpos($part->mime_id, '.')) {
            $items = explode('.', $part->mime_id);
            array_pop($items);
            $parent = implode('.', $items);
        }
        else {
            $parent = 0;
        }

        // Parse decrypted message
        if ($result === true) {
            $part->body          = $prefix . $body;
            $part->body_modified = true;

            // it maybe PGP signed inside, verify signature
            $this->parse_plain($p, $body);

            // Remember it was decrypted
            $this->encrypted_parts[] = $part->mime_id;

            // Inform the user that only a part of the body was encrypted
            if ($prefix) {
                $this->decryptions[$part->mime_id] = self::ENCRYPTED_PARTIALLY;
            }

            // Encrypted plain message may contain encrypted attachments
            // in such case attachments have .pgp extension and type application/octet-stream.
            // This is what happens when you select "Encrypt each attachment separately
            // and send the message using inline PGP" in Thunderbird's Enigmail.

            if ($p['object']->mime_parts[$parent]) {
                foreach ((array)$p['object']->mime_parts[$parent]->parts as $p) {
                    if ($p->disposition == 'attachment' && $p->mimetype == 'application/octet-stream'
                        && preg_match('/^(.*)\.pgp$/i', $p->filename, $m)
                    ) {
                        // modify filename
                        $p->filename = $m[1];
                        // flag the part, it will be decrypted when needed
                        $p->need_decryption = true;
                        // disable caching
                        $p->body_modified = true;
                    }
                }
            }
        }
        // decryption failed, but the message may have already
        // been cached with the modified parts (see above),
        // let's bring the original state back
        else if ($p['object']->mime_parts[$parent]) {
            foreach ((array)$p['object']->mime_parts[$parent]->parts as $p) {
                if ($p->need_decryption && !preg_match('/^(.*)\.pgp$/i', $p->filename, $m)) {
                    // modify filename
                    $p->filename .= '.pgp';
                    // flag the part, it will be decrypted when needed
                    unset($p->need_decryption);
                }
            }
        }
    }
private function parse_plain_encrypted ( & $ p , $ body , $ prefix = '' ) { if ( ! $ this -> rc -> config -> get ( 'enigma_decryption' , true ) ) { return ; } $ this -> load_pgp_driver ( ) ; $ part = $ p [ 'structure' ] ; // Decrypt $ result = $ this -> pgp_decrypt ( $ body , $ signature ) ; // Store decryption status $ this -> decryptions [ $ part -> mime_id ] = $ result ; // Store signature data for display if ( $ signature ) { $ this -> signatures [ $ part -> mime_id ] = $ signature ; } // find parent part ID if ( strpos ( $ part -> mime_id , '.' ) ) { $ items = explode ( '.' , $ part -> mime_id ) ; array_pop ( $ items ) ; $ parent = implode ( '.' , $ items ) ; } else { $ parent = 0 ; } // Parse decrypted message if ( $ result === true ) { $ part -> body = $ prefix . $ body ; $ part -> body_modified = true ; // it maybe PGP signed inside, verify signature $ this -> parse_plain ( $ p , $ body ) ; // Remember it was decrypted $ this -> encrypted_parts [ ] = $ part -> mime_id ; // Inform the user that only a part of the body was encrypted if ( $ prefix ) { $ this -> decryptions [ $ part -> mime_id ] = self :: ENCRYPTED_PARTIALLY ; } // Encrypted plain message may contain encrypted attachments // in such case attachments have .pgp extension and type application/octet-stream. // This is what happens when you select "Encrypt each attachment separately // and send the message using inline PGP" in Thunderbird's Enigmail. if ( $ p [ 'object' ] -> mime_parts [ $ parent ] ) { foreach ( ( array ) $ p [ 'object' ] -> mime_parts [ $ parent ] -> parts as $ p ) { if ( $ p -> disposition == 'attachment' && $ p -> mimetype == 'application/octet-stream' && preg_match ( '/^(.*)\.pgp$/i' , $ p -> filename , $ m ) ) { // modify filename $ p -> filename = $ m [ 1 ] ; // flag the part, it will be decrypted when needed $ p -> need_decryption = true ; // disable caching $ p -> body_modified = true ; } } } } // decryption failed, but the message may have already // been cached with the modified parts (see above), // let's bring the original state back else if ( $ p [ 'object' ] -> mime_parts [ $ parent ] ) { foreach ( ( array ) $ p [ 'object' ] -> mime_parts [ $ parent ] -> parts as $ p ) { if ( $ p -> need_decryption && ! preg_match ( '/^(.*)\.pgp$/i' , $ p -> filename , $ m ) ) { // modify filename $ p -> filename .= '.pgp' ; // flag the part, it will be decrypted when needed unset ( $ p -> need_decryption ) ; } } } }
Handler for plain encrypted message.

@param array  Reference to hook's parameters
@param string Message (part) body
@param string Body prefix (additional text before the encrypted block)
Handler for plain encrypted message .