diff options
Diffstat (limited to 'program/lib/Crypt/GPG/DecryptStatusHandler.php')
| -rw-r--r-- | program/lib/Crypt/GPG/DecryptStatusHandler.php | 344 | 
1 files changed, 0 insertions, 344 deletions
| diff --git a/program/lib/Crypt/GPG/DecryptStatusHandler.php b/program/lib/Crypt/GPG/DecryptStatusHandler.php deleted file mode 100644 index 67c0dd74b..000000000 --- a/program/lib/Crypt/GPG/DecryptStatusHandler.php +++ /dev/null @@ -1,344 +0,0 @@ -<?php - -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * Crypt_GPG is a package to use GnuPG from PHP - * - * This file contains an object that handles GnuPG's status output for the - * decrypt operation. - * - * PHP version 5 - * - * LICENSE: - * - * This library is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of the - * License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * @category  Encryption - * @package   Crypt_GPG - * @author    Michael Gauthier <mike@silverorange.com> - * @copyright 2008-2013 silverorange - * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version   CVS: $Id$ - * @link      http://pear.php.net/package/Crypt_GPG - * @link      http://www.gnupg.org/ - */ - -/** - * Crypt_GPG base class - */ -require_once 'Crypt/GPG.php'; - -/** - * Crypt_GPG exception classes - */ -require_once 'Crypt/GPG/Exceptions.php'; - - -/** - * Status line handler for the decrypt operation - * - * This class is used internally by Crypt_GPG and does not need be used - * directly. See the {@link Crypt_GPG} class for end-user API. - * - * This class is responsible for sending the passphrase commands when required - * by the {@link Crypt_GPG::decrypt()} method. See <b>doc/DETAILS</b> in the - * {@link http://www.gnupg.org/download/ GnuPG distribution} for detailed - * information on GnuPG's status output for the decrypt operation. - * - * This class is also responsible for parsing error status and throwing a - * meaningful exception in the event that decryption fails. - * - * @category  Encryption - * @package   Crypt_GPG - * @author    Michael Gauthier <mike@silverorange.com> - * @copyright 2008-2013 silverorange - * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link      http://pear.php.net/package/Crypt_GPG - * @link      http://www.gnupg.org/ - */ -class Crypt_GPG_DecryptStatusHandler -{ -    // {{{ protected properties - -    /** -     * Keys used to decrypt -     * -     * The array is of the form: -     * <code> -     * array( -     *   $key_id => array( -     *     'fingerprint' => $fingerprint, -     *     'passphrase'  => $passphrase -     *   ) -     * ); -     * </code> -     * -     * @var array -     */ -    protected $keys = array(); - -    /** -     * Engine used to which passphrases are passed -     * -     * @var Crypt_GPG_Engine -     */ -    protected $engine = null; - -    /** -     * The id of the current sub-key used for decryption -     * -     * @var string -     */ -    protected $currentSubKey = ''; - -    /** -     * Whether or not decryption succeeded -     * -     * If the message is only signed (compressed) and not encrypted, this is -     * always true. If the message is encrypted, this flag is set to false -     * until we know the decryption succeeded. -     * -     * @var boolean -     */ -    protected $decryptionOkay = true; - -    /** -     * Whether or not there was no data for decryption -     * -     * @var boolean -     */ -    protected $noData = false; - -    /** -     * Keys for which the passhprase is missing -     * -     * This contains primary user ids indexed by sub-key id and is used to -     * create helpful exception messages. -     * -     * @var array -     */ -    protected $missingPassphrases = array(); - -    /** -     * Keys for which the passhprase is incorrect -     * -     * This contains primary user ids indexed by sub-key id and is used to -     * create helpful exception messages. -     * -     * @var array -     */ -    protected $badPassphrases = array(); - -    /** -     * Keys that can be used to decrypt the data but are missing from the -     * keychain -     * -     * This is an array with both the key and value being the sub-key id of -     * the missing keys. -     * -     * @var array -     */ -    protected $missingKeys = array(); - -    // }}} -    // {{{ __construct() - -    /** -     * Creates a new decryption status handler -     * -     * @param Crypt_GPG_Engine $engine the GPG engine to which passphrases are -     *                                 passed. -     * @param array            $keys   the decryption keys to use. -     */ -    public function __construct(Crypt_GPG_Engine $engine, array $keys) -    { -        $this->engine = $engine; -        $this->keys   = $keys; -    } - -    // }}} -    // {{{ handle() - -    /** -     * Handles a status line -     * -     * @param string $line the status line to handle. -     * -     * @return void -     */ -    public function handle($line) -    { -        $tokens = explode(' ', $line); -        switch ($tokens[0]) { -        case 'ENC_TO': -            // Now we know the message is encrypted. Set flag to check if -            // decryption succeeded. -            $this->decryptionOkay = false; - -            // this is the new key message -            $this->currentSubKeyId = $tokens[1]; -            break; - -        case 'NEED_PASSPHRASE': -            // send passphrase to the GPG engine -            $subKeyId = $tokens[1]; -            if (array_key_exists($subKeyId, $this->keys)) { -                $passphrase = $this->keys[$subKeyId]['passphrase']; -                $this->engine->sendCommand($passphrase); -            } else { -                $this->engine->sendCommand(''); -            } -            break; - -        case 'USERID_HINT': -            // remember the user id for pretty exception messages -            $this->badPassphrases[$tokens[1]] -                = implode(' ', array_splice($tokens, 2)); - -            break; - -        case 'GOOD_PASSPHRASE': -            // if we got a good passphrase, remove the key from the list of -            // bad passphrases. -            unset($this->badPassphrases[$this->currentSubKeyId]); -            break; - -        case 'MISSING_PASSPHRASE': -            $this->missingPassphrases[$this->currentSubKeyId] -                = $this->currentSubKeyId; - -            break; - -        case 'NO_SECKEY': -            // note: this message is also received if there are multiple -            // recipients and a previous key had a correct passphrase. -            $this->missingKeys[$tokens[1]] = $tokens[1]; -            break; - -        case 'NODATA': -            $this->noData = true; -            break; - -        case 'DECRYPTION_OKAY': -            // If the message is encrypted, this is the all-clear signal. -            $this->decryptionOkay = true; -            break; -        } -    } - -    // }}} -    // {{{ throwException() - -    /** -     * Takes the final status of the decrypt operation and throws an -     * appropriate exception -     * -     * If decryption was successful, no exception is thrown. -     * -     * @return void -     * -     * @throws Crypt_GPG_KeyNotFoundException if the private key needed to -     *         decrypt the data is not in the user's keyring. -     * -     * @throws Crypt_GPG_NoDataException if specified data does not contain -     *         GPG encrypted data. -     * -     * @throws Crypt_GPG_BadPassphraseException if a required passphrase is -     *         incorrect or if a required passphrase is not specified. See -     *         {@link Crypt_GPG::addDecryptKey()}. -     * -     * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. -     *         Use the <i>debug</i> option and file a bug report if these -     *         exceptions occur. -     */ -    public function throwException() -    { -        $code = Crypt_GPG::ERROR_NONE; - -        if (!$this->decryptionOkay) { -            if (count($this->badPassphrases) > 0) { -                $code = Crypt_GPG::ERROR_BAD_PASSPHRASE; -            } elseif (count($this->missingKeys) > 0) { -                $code = Crypt_GPG::ERROR_KEY_NOT_FOUND; -            } else { -                $code = Crypt_GPG::ERROR_UNKNOWN; -            } -        } elseif ($this->noData) { -            $code = Crypt_GPG::ERROR_NO_DATA; -        } - -        switch ($code) { -        case Crypt_GPG::ERROR_NONE: -            break; - -        case Crypt_GPG::ERROR_KEY_NOT_FOUND: -            if (count($this->missingKeys) > 0) { -                $keyId = reset($this->missingKeys); -            } else { -                $keyId = ''; -            } -            throw new Crypt_GPG_KeyNotFoundException( -                'Cannot decrypt data. No suitable private key is in the ' . -                'keyring. Import a suitable private key before trying to ' . -                'decrypt this data.', -                $code, -                $keyId -            ); -        case Crypt_GPG::ERROR_BAD_PASSPHRASE: -            $badPassphrases = array_diff_key( -                $this->badPassphrases, -                $this->missingPassphrases -            ); - -            $missingPassphrases = array_intersect_key( -                $this->badPassphrases, -                $this->missingPassphrases -            ); - -            $message =  'Cannot decrypt data.'; -            if (count($badPassphrases) > 0) { -                $message = ' Incorrect passphrase provided for keys: "' . -                    implode('", "', $badPassphrases) . '".'; -            } -            if (count($missingPassphrases) > 0) { -                $message = ' No passphrase provided for keys: "' . -                    implode('", "', $badPassphrases) . '".'; -            } - -            throw new Crypt_GPG_BadPassphraseException( -                $message, -                $code, -                $badPassphrases, -                $missingPassphrases -            ); -        case Crypt_GPG::ERROR_NO_DATA: -            throw new Crypt_GPG_NoDataException( -                'Cannot decrypt data. No PGP encrypted data was found in '. -                'the provided data.', -                $code -            ); -        default: -            throw new Crypt_GPG_Exception( -                'Unknown error decrypting data.', -                $code -            ); -        } -    } - -    // }}} -} - -?> | 
