0
|
1 <?php
|
|
2
|
|
3 /**
|
|
4 +-------------------------------------------------------------------------+
|
|
5 | Key class for the Enigma Plugin |
|
|
6 | |
|
|
7 | Copyright (C) 2010-2015 The Roundcube Dev Team |
|
|
8 | |
|
|
9 | Licensed under the GNU General Public License version 3 or |
|
|
10 | any later version with exceptions for skins & plugins. |
|
|
11 | See the README file for a full license statement. |
|
|
12 | |
|
|
13 +-------------------------------------------------------------------------+
|
|
14 | Author: Aleksander Machniak <alec@alec.pl> |
|
|
15 +-------------------------------------------------------------------------+
|
|
16 */
|
|
17
|
|
18 class enigma_key
|
|
19 {
|
|
20 public $id;
|
|
21 public $name;
|
|
22 public $users = array();
|
|
23 public $subkeys = array();
|
|
24 public $reference;
|
|
25 public $password;
|
|
26
|
|
27 const TYPE_UNKNOWN = 0;
|
|
28 const TYPE_KEYPAIR = 1;
|
|
29 const TYPE_PUBLIC = 2;
|
|
30
|
|
31 const CAN_ENCRYPT = 1;
|
|
32 const CAN_SIGN = 2;
|
|
33 const CAN_CERTIFY = 4;
|
|
34 const CAN_AUTHENTICATE = 8;
|
|
35
|
|
36
|
|
37 /**
|
|
38 * Keys list sorting callback for usort()
|
|
39 */
|
|
40 static function cmp($a, $b)
|
|
41 {
|
|
42 return strcmp($a->name, $b->name);
|
|
43 }
|
|
44
|
|
45 /**
|
|
46 * Returns key type
|
|
47 */
|
|
48 function get_type()
|
|
49 {
|
|
50 if ($this->subkeys[0]->has_private)
|
|
51 return enigma_key::TYPE_KEYPAIR;
|
|
52 else if (!empty($this->subkeys[0]))
|
|
53 return enigma_key::TYPE_PUBLIC;
|
|
54
|
|
55 return enigma_key::TYPE_UNKNOWN;
|
|
56 }
|
|
57
|
|
58 /**
|
|
59 * Returns true if all user IDs are revoked
|
|
60 */
|
|
61 function is_revoked()
|
|
62 {
|
|
63 foreach ($this->subkeys as $subkey)
|
|
64 if (!$subkey->revoked)
|
|
65 return false;
|
|
66
|
|
67 return true;
|
|
68 }
|
|
69
|
|
70 /**
|
|
71 * Returns true if any user ID is valid
|
|
72 */
|
|
73 function is_valid()
|
|
74 {
|
|
75 foreach ($this->users as $user)
|
|
76 if ($user->valid)
|
|
77 return true;
|
|
78
|
|
79 return false;
|
|
80 }
|
|
81
|
|
82 /**
|
|
83 * Returns true if any of subkeys is not expired
|
|
84 */
|
|
85 function is_expired()
|
|
86 {
|
|
87 $now = time();
|
|
88
|
|
89 foreach ($this->subkeys as $subkey)
|
|
90 if (!$subkey->expires || $subkey->expires > $now)
|
|
91 return true;
|
|
92
|
|
93 return false;
|
|
94 }
|
|
95
|
|
96 /**
|
|
97 * Returns true if any of subkeys is a private key
|
|
98 */
|
|
99 function is_private()
|
|
100 {
|
|
101 $now = time();
|
|
102
|
|
103 foreach ($this->subkeys as $subkey)
|
|
104 if ($subkey->has_private)
|
|
105 return true;
|
|
106
|
|
107 return false;
|
|
108 }
|
|
109
|
|
110 /**
|
|
111 * Get key ID by user email
|
|
112 */
|
|
113 function find_subkey($email, $mode)
|
|
114 {
|
|
115 $now = time();
|
|
116
|
|
117 foreach ($this->users as $user) {
|
|
118 if (strcasecmp($user->email, $email) === 0 && $user->valid && !$user->revoked) {
|
|
119 foreach ($this->subkeys as $subkey) {
|
|
120 if (!$subkey->revoked && (!$subkey->expires || $subkey->expires > $now)) {
|
|
121 if ($subkey->usage & $mode) {
|
|
122 return $subkey;
|
|
123 }
|
|
124 }
|
|
125 }
|
|
126 }
|
|
127 }
|
|
128 }
|
|
129
|
|
130 /**
|
|
131 * Converts long ID or Fingerprint to short ID
|
|
132 * Crypt_GPG uses internal, but e.g. Thunderbird's Enigmail displays short ID
|
|
133 *
|
|
134 * @param string Key ID or fingerprint
|
|
135 * @return string Key short ID
|
|
136 */
|
|
137 static function format_id($id)
|
|
138 {
|
|
139 // E.g. 04622F2089E037A5 => 89E037A5
|
|
140
|
|
141 return substr($id, -8);
|
|
142 }
|
|
143
|
|
144 /**
|
|
145 * Formats fingerprint string
|
|
146 *
|
|
147 * @param string Key fingerprint
|
|
148 *
|
|
149 * @return string Formatted fingerprint (with spaces)
|
|
150 */
|
|
151 static function format_fingerprint($fingerprint)
|
|
152 {
|
|
153 if (!$fingerprint) {
|
|
154 return '';
|
|
155 }
|
|
156
|
|
157 $result = '';
|
|
158 for ($i=0; $i<40; $i++) {
|
|
159 if ($i % 4 == 0) {
|
|
160 $result .= ' ';
|
|
161 }
|
|
162 $result .= $fingerprint[$i];
|
|
163 }
|
|
164
|
|
165 return $result;
|
|
166 }
|
|
167 }
|