예제 #1
0
파일: Smime.php 프로젝트: DSNS-LAB/Dmail
 /**
  * Parse enveloped (encrypted) data.
  *
  * @return mixed  See self::_getEmbeddedMimeParts().
  */
 protected function _parseEnvelopedData()
 {
     $base_id = $this->_mimepart->getMimeId();
     /* Initialize inline data. */
     $status = new IMP_Mime_Status(_("The data in this part has been encrypted via S/MIME."));
     $status->icon('mime/encryption.png', 'S/MIME');
     $cache = $this->getConfigParam('imp_contents')->getViewCache();
     $cache->smime[$base_id] = array('status' => $status, 'wrap' => '');
     /* Is PGP active? */
     $this->_initSmime();
     if (empty($this->_impsmime)) {
         $status->addText(_("S/MIME support is not currently enabled so the data is unable to be decrypted."));
         return null;
     }
     if (!$this->_impsmime->getPersonalPrivateKey()) {
         $status->addText(_("No personal private key exists so the data is unable to be decrypted."));
         return null;
     }
     /* Make sure we have a passphrase. */
     $passphrase = $this->_impsmime->getPassphrase();
     if ($passphrase === false) {
         $imple = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Imple')->create('IMP_Ajax_Imple_PassphraseDialog', array('type' => 'smimePersonal'));
         $status->addText(Horde::link('#', '', '', '', '', '', '', array('id' => $imple->getDomId())) . _("You must enter the passphrase for your S/MIME private key to view this data.") . '</a>');
         return null;
     }
     $raw_text = $this->_getPartStream($this->_mimepart->getMimeId());
     try {
         $decrypted_data = $this->_impsmime->decryptMessage($this->_mimepart->replaceEOL($raw_text, Horde_Mime_Part::RFC_EOL));
     } catch (Horde_Exception $e) {
         $status->addText($e->getMessage());
         return null;
     }
     $cache->smime[$base_id]['wrap'] = 'mimePartWrapValid';
     $new_part = Horde_Mime_Part::parseMessage($decrypted_data, array('forcemime' => true));
     switch ($new_part->getType()) {
         case 'application/pkcs7-mime':
         case 'application/x-pkcs7-mime':
             $signed_data = $this->_getSmimeType($new_part) === 'signed-data';
             break;
         case 'multipart/signed':
             $signed_data = true;
             break;
         default:
             $signed_data = false;
             break;
     }
     if ($signed_data) {
         $hdrs = $this->getConfigParam('imp_contents')->getHeader();
         $data = new Horde_Stream_Temp();
         $data->add('From:' . $hdrs->getValue('from') . "\n" . $decrypted_data);
         $new_part->setMetadata('imp-smime-decrypt', $data);
         $new_part->setContents($decrypted_data, array('encoding' => 'binary'));
     }
     return $new_part;
 }
예제 #2
0
파일: Smime.php 프로젝트: jubinpatel/horde
 /**
  */
 protected function _init()
 {
     global $injector, $notification;
     $this->_smime = $injector->getInstance('IMP_Crypt_Smime');
     /* Run through the action handlers */
     switch ($this->vars->actionID) {
         case 'import_public_key':
             $this->_importKeyDialog('process_import_public_key');
             break;
         case 'process_import_public_key':
             try {
                 $publicKey = $this->_getImportKey($this->vars->import_key);
                 /* Add the public key to the storage system. */
                 $this->_smime->addPublicKey($publicKey);
                 $notification->push(_("S/MIME public key successfully added."), 'horde.success');
                 $this->_reloadWindow();
             } catch (Horde_Browser_Exception $e) {
                 $notification->push(_("No S/MIME public key imported."), 'horde.error');
             } catch (Horde_Exception $e) {
                 $notification->push($e);
             }
             $this->vars->actionID = 'import_public_key';
             $this->_importKeyDialog('process_import_public_key');
             break;
         case 'view_public_key':
         case 'info_public_key':
             try {
                 $key = $this->_smime->getPublicKey($this->vars->email);
             } catch (Horde_Exception $e) {
                 $key = $e->getMessage();
             }
             if ($this->vars->actionID == 'view_public_key') {
                 $this->_textWindowOutput('S/MIME Public Key', $key);
             }
             $this->_printCertInfo($key);
             break;
         case 'view_personal_public_key':
             $this->_textWindowOutput('S/MIME Personal Public Key', $this->_smime->getPersonalPublicKey());
             break;
         case 'info_personal_public_key':
             $this->_printCertInfo($this->_smime->getPersonalPublicKey());
             break;
         case 'view_personal_private_key':
             $this->_textWindowOutput('S/MIME Personal Private Key', $this->_smime->getPersonalPrivateKey());
             break;
         case 'import_personal_certs':
             $this->_importKeyDialog('process_import_personal_certs');
             break;
         case 'process_import_personal_certs':
             try {
                 $pkcs12 = $this->_getImportKey($this->vars->import_key);
                 $this->_smime->addFromPKCS12($pkcs12, $this->vars->upload_key_pass, $this->vars->upload_key_pk_pass);
                 $notification->push(_("S/MIME Public/Private Keypair successfully added."), 'horde.success');
                 $this->_reloadWindow();
             } catch (Horde_Browser_Exception $e) {
                 $notification->push(_("Personal S/MIME certificates NOT imported."), 'horde.error');
             } catch (Horde_Exception $e) {
                 $notification->push(_("Personal S/MIME certificates NOT imported: ") . $e->getMessage(), 'horde.error');
             }
             $this->vars->actionID = 'import_personal_certs';
             $this->_importKeyDialog('process_import_personal_certs');
             break;
     }
 }