Browse code

Status der letsencrypt-Option in diversen Situationen korrekt setzen

Bernd Wurst authored on30/11/2015 13:17:38
Showing2 changed files
... ...
@@ -48,12 +48,23 @@ function cert_details($id)
48 48
   $id = (int) $id;
49 49
   $uid = (int) $_SESSION['userinfo']['uid'];
50 50
   
51
-  $result = db_query("SELECT id, lastchange, valid_from, valid_until, subject, cn, cert, `key` FROM vhosts.certs WHERE uid=:uid AND id=:id", array(":uid" => $uid, ":id" => $id));
51
+  $result = db_query("SELECT id, lastchange, valid_from, valid_until, subject, cn, chain, cert, `key` FROM vhosts.certs WHERE uid=:uid AND id=:id", array(":uid" => $uid, ":id" => $id));
52 52
   if ($result->rowCount() != 1)
53 53
     system_failure("Ungültiges Zertifikat #{$id}");
54 54
   return $result->fetch();
55 55
 }
56 56
 
57
+function cert_is_letsencrypt($id)
58
+{
59
+  $details = cert_details($id);
60
+  if (strstr($details['subject'], 'happy hacker fake CA') ||
61
+      strstr($details['subject'], "Let's Encrypt Authority X1") ||
62
+      $details['chain'] == 18) {
63
+    return true;
64
+  }
65
+  return false;
66
+}
67
+
57 68
 
58 69
 function csr_details($id)
59 70
 {
... ...
@@ -213,15 +213,30 @@ if ($_GET['action'] == 'edit')
213 213
       array_push($new_options, $op);
214 214
     }
215 215
   }
216
-  if ($aliaswww){
216
+  if ($aliaswww) {
217 217
     array_push($new_options, 'aliaswww');
218 218
   }
219
-  if ($cert == -1) {
219
+  $letsencrypt = ($cert == 0 ? false : ($cert == -1 || cert_is_letsencrypt($cert)));
220
+
221
+  if ($letsencrypt) {
220 222
     array_push($new_options, 'letsencrypt');
221 223
     if ($vhost['cert'] != 0) {
222
-      # FIXME: Wenn der User manuell von einem gültigen Cert auf "letsencrypt" umgestellt hat, 
224
+      # Wenn der User manuell von einem gültigen Cert auf "letsencrypt" umgestellt hat, 
223 225
       # dann sollte das alte Cert noch so lange eingetragen bleiben bis das neue da ist.
224
-      $cert = $vhost['cert']
226
+      $cert = $vhost['cert'];
227
+    } elseif ($cert > 0) {
228
+      # Das Cert was der user gewählt hat, ist von Lets encrypt
229
+      # tu nix, $cert ist schon korrekt
230
+    } else {
231
+      # Wenn vorher kein Zertifikat aktiv war, dann setze jetzt auch keines. 
232
+      # Der letsencrypt-Automatismus macht das dann schon.
233
+      $cert = 0;
234
+    }
235
+  } else {
236
+    # Wenn kein Letsencrypt gewünscht ist, entferne die Letsencrypt-Option
237
+    $key = array_search('letsencrypt',$new_options);
238
+    if ($key !== false) {
239
+      unset($new_options[$key]);
225 240
     }
226 241
   }
227 242