Mercurial > hg > rc1
diff plugins/enigma/lib/enigma_key.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/enigma/lib/enigma_key.php Thu Jan 04 15:50:29 2018 -0500 @@ -0,0 +1,167 @@ +<?php + +/** + +-------------------------------------------------------------------------+ + | Key class for the Enigma Plugin | + | | + | Copyright (C) 2010-2015 The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-------------------------------------------------------------------------+ + | Author: Aleksander Machniak <alec@alec.pl> | + +-------------------------------------------------------------------------+ +*/ + +class enigma_key +{ + public $id; + public $name; + public $users = array(); + public $subkeys = array(); + public $reference; + public $password; + + const TYPE_UNKNOWN = 0; + const TYPE_KEYPAIR = 1; + const TYPE_PUBLIC = 2; + + const CAN_ENCRYPT = 1; + const CAN_SIGN = 2; + const CAN_CERTIFY = 4; + const CAN_AUTHENTICATE = 8; + + + /** + * Keys list sorting callback for usort() + */ + static function cmp($a, $b) + { + return strcmp($a->name, $b->name); + } + + /** + * Returns key type + */ + function get_type() + { + if ($this->subkeys[0]->has_private) + return enigma_key::TYPE_KEYPAIR; + else if (!empty($this->subkeys[0])) + return enigma_key::TYPE_PUBLIC; + + return enigma_key::TYPE_UNKNOWN; + } + + /** + * Returns true if all user IDs are revoked + */ + function is_revoked() + { + foreach ($this->subkeys as $subkey) + if (!$subkey->revoked) + return false; + + return true; + } + + /** + * Returns true if any user ID is valid + */ + function is_valid() + { + foreach ($this->users as $user) + if ($user->valid) + return true; + + return false; + } + + /** + * Returns true if any of subkeys is not expired + */ + function is_expired() + { + $now = time(); + + foreach ($this->subkeys as $subkey) + if (!$subkey->expires || $subkey->expires > $now) + return true; + + return false; + } + + /** + * Returns true if any of subkeys is a private key + */ + function is_private() + { + $now = time(); + + foreach ($this->subkeys as $subkey) + if ($subkey->has_private) + return true; + + return false; + } + + /** + * Get key ID by user email + */ + function find_subkey($email, $mode) + { + $now = time(); + + foreach ($this->users as $user) { + if (strcasecmp($user->email, $email) === 0 && $user->valid && !$user->revoked) { + foreach ($this->subkeys as $subkey) { + if (!$subkey->revoked && (!$subkey->expires || $subkey->expires > $now)) { + if ($subkey->usage & $mode) { + return $subkey; + } + } + } + } + } + } + + /** + * Converts long ID or Fingerprint to short ID + * Crypt_GPG uses internal, but e.g. Thunderbird's Enigmail displays short ID + * + * @param string Key ID or fingerprint + * @return string Key short ID + */ + static function format_id($id) + { + // E.g. 04622F2089E037A5 => 89E037A5 + + return substr($id, -8); + } + + /** + * Formats fingerprint string + * + * @param string Key fingerprint + * + * @return string Formatted fingerprint (with spaces) + */ + static function format_fingerprint($fingerprint) + { + if (!$fingerprint) { + return ''; + } + + $result = ''; + for ($i=0; $i<40; $i++) { + if ($i % 4 == 0) { + $result .= ' '; + } + $result .= $fingerprint[$i]; + } + + return $result; + } +}