Browse code

Prüfe die Verwendbarkeit von PGP-Keys umgehend

Bernd Wurst authored on 13/03/2019 10:44:34
Showing 4 changed files
... ...
@@ -34,6 +34,9 @@ if (isset($_GET['id'])) {
34 34
         $result['status'] = 'found';
35 35
         $result['id'] = $id;
36 36
     }
37
+    if ($id && !test_pgp_key($_GET['id'])) {
38
+        $result['status'] = 'unusable';
39
+    }
37 40
     echo json_encode($result);
38 41
     die();
39 42
 }
... ...
@@ -32,9 +32,13 @@ function receive_pgpidcheck(result) {
32 32
     if (result.status == 'found') {
33 33
         $('#pgpid').val(result.id);
34 34
         $("#pgpid_feedback").html('<img src="../../images/ok.png" style="height: 16px; width: 16px;" />');
35
+    } else if (result.status == 'unusable') {
36
+        $('#pgpid').val(result.id);
37
+        $('#pgpkey').closest('tr').show();
38
+        $("#pgpid_feedback").html('<img src="../../images/error.png" style="height: 16px; width: 16px;" /><br>Es wurde ein Key gefunden, allerdings scheint dieser kaputt oder veraltet zu sein. Bitte geben Sie unten den kompletten aktuellen Key ein.');
35 39
     } else {
36 40
         $('#pgpkey').closest('tr').show();
37
-        $("#pgpid_feedback").html('<img src="../../images/error.png" style="height: 16px; width: 16px;" /><br>Es wurde kein PGP-Key zu dieser ID gefunden. Bitte geben Sie unten den kompletten Key ein.');
41
+        $("#pgpid_feedback").html('<img src="../../images/error.png" style="height: 16px; width: 16px;" /><br>Es konnte kein PGP-Key zu dieser ID vom Keyserver-Netzwerk bezogen werden. Bitte geben Sie unten den kompletten Key ein.');
38 42
     }
39 43
 }
40 44
 
... ...
@@ -42,7 +46,8 @@ function receive_pgpidcheck(result) {
42 46
 function receive_pgpid(result) {
43 47
     if (result.status == 'found' && ! $('#pgpid').val()) {
44 48
         $('#pgpid').val(result.id);
45
-        $("#pgpid_feedback").html('<img src="../../images/ok.png" style="height: 16px; width: 16px;" /><br>Es wurde ein PGP-Key auf einem Keyserver gefunden.');
49
+        $("#pgpid_feedback").html('<img src="../../images/ok.png" style="height: 16px; width: 16px;" /><br>Es wurde ein PGP-Key auf einem Keyserver gefunden. Bitte prüfen Sie, ob die ID korrekt ist und Sie auch den dazu passenden privaten Schlüssel besitzen.');
50
+        pgpid_change();
46 51
     }
47 52
 }
48 53
 
... ...
@@ -329,7 +329,9 @@ function search_pgp_key($search)
329 329
         return null;
330 330
     }
331 331
     $output = array();
332
-    exec('LC_ALL=C /usr/bin/gpg --batch --with-colons --keyserver hkp://pool.sks-keyservers.net --search-key '.escapeshellarg($search), $output);
332
+    $command = 'LC_ALL=C /usr/bin/gpg --batch --with-colons --keyserver hkps://hkps.pool.sks-keyservers.net --search-key '.escapeshellarg($search);
333
+    DEBUG($command);
334
+    exec($command, $output);
333 335
     DEBUG($output);
334 336
     $keys = array();
335 337
     foreach ($output as $row) {
... ...
@@ -358,12 +360,15 @@ function fetch_pgp_key($pgp_id)
358 360
 {
359 361
     $output = array();
360 362
     $ret = null;
361
-    DEBUG('/usr/bin/gpg --batch --keyserver hkp://pool.sks-keyservers.net --recv-key '.escapeshellarg($pgp_id));
362
-    exec('/usr/bin/gpg --batch --keyserver hkp://pool.sks-keyservers.net --recv-key '.escapeshellarg($pgp_id), $output, $ret);
363
+    $command = '/usr/bin/gpg --batch --keyserver hkps://hkps.pool.sks-keyservers.net --no-auto-check-trustdb --trust-model=always --recv-key '.escapeshellarg($pgp_id);
364
+    DEBUG($command);
365
+    exec($command, $output, $ret);
363 366
     DEBUG($output);
364 367
     DEBUG($ret);
365 368
     if ($ret == 0) {
366
-        exec('/usr/bin/gpg --batch --with-colons --list-keys '.escapeshellarg($pgp_id), $output);
369
+        $command = '/usr/bin/gpg --batch --with-colons --list-keys '.escapeshellarg($pgp_id);
370
+        DEBUG($command);
371
+        exec($command, $output);
367 372
         DEBUG($output);
368 373
         foreach ($output as $row) {
369 374
             if (substr($row, 0, 4) === 'fpr:') {
... ...
@@ -376,6 +381,26 @@ function fetch_pgp_key($pgp_id)
376 381
     return null;
377 382
 }
378 383
 
384
+function import_pgp_key($pgp_key) 
385
+{
386
+    $command = 'LC_ALL=C /usr/bin/gpg --batch --no-auto-check-trustdb --trust-model=always --import';
387
+    DEBUG($command);
388
+    $proc = popen($command, 'w');
389
+    fwrite($proc, $pgp_key);
390
+    $ret = pclose($proc);
391
+    DEBUG('Import des PGP-Keys: '.$ret);
392
+    return $ret === 0;
393
+}
394
+
395
+function test_pgp_key($pgp_id)
396
+{
397
+    $command = 'LC_ALL=C /usr/bin/gpg --batch --trust-model=always --encrypt --recipient '.escapeshellarg($pgp_id);
398
+    DEBUG($command);
399
+    $proc = popen($command, 'w');
400
+    $ret = pclose($proc);
401
+    DEBUG('Test des PGP-Key: '.$ret);
402
+    return $ret === 0;
403
+}
379 404
 
380 405
 function domainlist_by_contact($c)
381 406
 {
... ...
@@ -140,14 +140,20 @@ if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'delete') {
140 140
 
141 141
     if (isset($_REQUEST['usepgp']) && $_REQUEST['usepgp'] == 'yes' && isset($_REQUEST['pgpid'])) {
142 142
         $pgpid = preg_replace('/[^0-9a-fA-F]/', '', $_REQUEST['pgpid']);
143
-        DEBUG('PGP-ID: '.$pgpid.' / Länge: '.strlen($pgpid));
144
-        if (strlen($pgpid) == 8 || strlen($pgpid) == 16 || strlen($pgpid) == 40) {
145
-            $c['pgp_id'] = $_REQUEST['pgpid'];
146
-            if (isset($_REQUEST['pgpkey']) && $_REQUEST['pgpkey']) {
147
-                $c['pgp_key'] = $_REQUEST['pgpkey'];
148
-            }
143
+        DEBUG('PGP-ID: '.$pgpid);
144
+        if (isset($_REQUEST['pgpkey']) && $_REQUEST['pgpkey']) {
145
+            DEBUG('Key angegeben, wird importiert');
146
+            $c['pgp_id'] = $pgpid;
147
+            import_pgp_key($_REQUEST['pgpkey']);
148
+            $c['pgp_key'] = $_REQUEST['pgpkey'];
149 149
         } else {
150
-            warning('Ihre PGP-ID wurde nicht übernommen, da sie syntaktisch falsch erscheint');
150
+            DEBUG('Kein Key, wird vom Keyserver geholt!');
151
+            $c['pgp_id'] = fetch_pgp_key($pgpid);
152
+        }
153
+        if (!test_pgp_key($c['pgp_id'])) {
154
+            $c['pgp_id'] = null;
155
+            $c['pgp_key'] = null;
156
+            warning('Ihr PGP-Key wurde nicht übernommen, da er nicht gültig zu sein scheint. Bitte geben Sie im Zweifel die vollständige Key-ID (Fingerprint) und einen Key in der ASCII-Form ein.');
151 157
         }
152 158
     } else {
153 159
         $c['pgp_id'] = null;