Files
server/usr/share/psa-horde/imp/lib/Basic/Smime.php
2026-01-07 20:52:11 +01:00

214 lines
6.6 KiB
PHP

<?php
/**
* Copyright 2002-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @category Horde
* @copyright 2002-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* S/MIME display.
*
* @author Mike Cochrane <mike@graftonhall.co.nz>
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2002-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Basic_Smime extends IMP_Basic_Base
{
/**
* @var IMP_Crypt_Smime
*/
protected $_smime;
/**
*/
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;
}
}
/**
*/
static public function url(array $opts = array())
{
return Horde::url('basic.php')->add('page', 'smime');
}
/**
* Generate import key dialog.
*
* @param string $target Action ID for the UI screen.
*/
protected function _importKeyDialog($target)
{
global $notification, $page_output, $registry;
$page_output->topbar = $page_output->sidebar = false;
$page_output->addInlineScript(array(
'$$("INPUT.horde-cancel").first().observe("click", function() { window.close(); })'
), true);
$this->title = _("Import Personal S/MIME Certificate");
/* Need to use regular status notification - AJAX notifications won't
* show in popup windows. */
if ($registry->getView() == Horde_Registry::VIEW_DYNAMIC) {
$notification->detach('status');
$notification->attach('status');
}
$view = new Horde_View(array(
'templatePath' => IMP_TEMPLATES . '/smime'
));
$view->addHelper('Text');
$view->reload = $this->vars->reload;
$view->selfurl = self::url();
$view->target = $target;
$this->output = $view->render('import_key');
}
/**
* Reload the window.
*/
protected function _reloadWindow()
{
echo Horde::wrapInlineScript(array(
'opener.focus();'.
'opener.location.href="' . base64_decode($this->vars->reload) . '";',
'window.close();'
));
exit;
}
/**
* Output text in a window.
*
* @param string $name The window name.
* @param string $msg The text contents.
* @param boolean $html $msg is HTML format?
*/
protected function _textWindowOutput($name, $msg, $html = false)
{
$GLOBALS['browser']->downloadHeaders($name, 'text/' . ($html ? 'html' : 'plain') . '; charset=' . 'UTF-8', true, strlen($msg));
echo $msg;
exit;
}
/**
* Print certificate information.
*
* @param string $cert The S/MIME certificate.
*/
protected function _printCertInfo($cert = '')
{
$cert_info = $this->_smime->certToHTML($cert);
$this->_textWindowOutput(
_("S/MIME Key Information"),
empty($cert_info) ? _("Invalid key") : $cert_info,
!empty($cert_info)
);
}
/**
* Attempt to import a key from form/uploaded data.
*
* @param string $key Key string.
*
* @return string The key contents.
* @throws Horde_Browser_Exception
*/
protected function _getImportKey($key)
{
if (!empty($key)) {
return $key;
}
$GLOBALS['browser']->wasFileUploaded('upload_key', _("key"));
return file_get_contents($_FILES['upload_key']['tmp_name']);
}
}