diff --git a/admin_domains.php b/admin_domains.php index 0e7d4fbd..6517e2f4 100644 --- a/admin_domains.php +++ b/admin_domains.php @@ -2099,6 +2099,11 @@ if ($page == 'domains' || $page == 'overview') { } elseif ($page == 'domaindnseditor' && Settings::Get('system.dnsenabled') == '1') { require_once __DIR__.'/dns_editor.php'; + +} elseif ($page == 'sslcertificates') { + + require_once __DIR__.'/ssl_certificates.php'; + } function formatDomainEntry(&$row, &$idna_convert) diff --git a/customer_domains.php b/customer_domains.php index 6849c0e8..b78053c8 100644 --- a/customer_domains.php +++ b/customer_domains.php @@ -935,4 +935,9 @@ if ($page == 'overview') { } elseif ($page == 'domaindnseditor' && $userinfo['dnsenabled'] == '1' && Settings::Get('system.dnsenabled') == '1') { require_once __DIR__.'/dns_editor.php'; + +} elseif ($page == 'sslcertificates') { + + require_once __DIR__.'/ssl_certificates.php'; + } diff --git a/lib/navigation/00.froxlor.main.php b/lib/navigation/00.froxlor.main.php index 838042c5..faa3feec 100644 --- a/lib/navigation/00.froxlor.main.php +++ b/lib/navigation/00.froxlor.main.php @@ -95,6 +95,10 @@ return array( array( 'url' => 'customer_domains.php?page=domains', 'label' => $lng['menue']['domains']['settings'] + ), + array( + 'url' => 'customer_domains.php?page=sslcertificates', + 'label' => $lng['domains']['ssl_certificates'] ) ) ), @@ -200,6 +204,11 @@ return array( 'label' => $lng['admin']['domains'], 'required_resources' => 'domains' ), + array( + 'url' => 'admin_domains.php?page=sslcertificates', + 'label' => $lng['domains']['ssl_certificates'], + 'required_resources' => 'domains' + ), array( 'url' => 'admin_ipsandports.php?page=ipsandports', 'label' => $lng['admin']['ipsandports']['ipsandports'], diff --git a/lng/english.lng.php b/lng/english.lng.php index 6d2b9608..6859fd06 100644 --- a/lng/english.lng.php +++ b/lng/english.lng.php @@ -2051,3 +2051,7 @@ $lng['serversettings']['mail_smtp_auth'] = 'Enable SMTP authentication'; $lng['serversettings']['mail_smtp_port'] = 'TCP port to connect to'; $lng['serversettings']['mail_smtp_user'] = 'SMTP username'; $lng['serversettings']['mail_smtp_passwd'] = 'SMTP password'; +$lng['domains']['ssl_certificates'] = 'SSL certificates'; +$lng['domains']['ssl_certificate_removed'] = 'The certificate with the id #%s has been removed successfully'; +$lng['domains']['ssl_certificate_error'] = "Error reading certificate for domain: %s"; +$lng['domains']['no_ssl_certificates'] = "There are no domains with SSL certificate"; diff --git a/lng/german.lng.php b/lng/german.lng.php index a1ebeba4..fc6d9489 100644 --- a/lng/german.lng.php +++ b/lng/german.lng.php @@ -1702,3 +1702,7 @@ $lng['serversettings']['mail_smtp_auth'] = 'Nutze SMTP Authentifizierung'; $lng['serversettings']['mail_smtp_port'] = 'TCP Port für SMTP'; $lng['serversettings']['mail_smtp_user'] = 'SMTP Benutzer'; $lng['serversettings']['mail_smtp_passwd'] = 'SMTP Passwort'; +$lng['domains']['ssl_certificates'] = 'SSL Zertifikate'; +$lng['domains']['ssl_certificate_removed'] = 'Das Zertifikat mit der ID #%s wurde erfolgreich gelöscht.'; +$lng['domains']['ssl_certificate_error'] = "Fehler beim Lesen des Zertifikats für die Domain: %s"; +$lng['domains']['no_ssl_certificates'] = "Es wurden keine SSL-Zertifikate gefunden"; diff --git a/ssl_certificates.php b/ssl_certificates.php new file mode 100644 index 00000000..bfe81553 --- /dev/null +++ b/ssl_certificates.php @@ -0,0 +1,133 @@ + (2016-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Panel + * + */ + +// This file is being included in admin_domains and customer_domains + // and therefore does not need to require lib/init.php + +$del_stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_DOMAIN_SSL_SETTINGS . "` WHERE id = :id"); +$success_message = ""; + +// do the delete and then just showa success-message and the certificates list again +if ($action == 'delete') { + $id = isset($_GET['id']) ? (int) $_GET['id'] : 0; + if ($id > 0) { + Database::pexecute($del_stmt, array( + 'id' => $id + )); + $success_message = sprintf($lng['domains']['ssl_certificate_removed'], $id); + } +} + +$log->logAction(USR_ACTION, LOG_NOTICE, "viewed domains::ssl_certificates"); +$fields = array( + 'd.domain' => $lng['domains']['domainname'] +); +$paging = new paging($userinfo, TABLE_PANEL_DOMAIN_SSL_SETTINGS, $fields); + +// select all my (accessable) certificates +$certs_stmt_query = "SELECT s.*, d.domain, d.letsencrypt, c.customerid, c.loginname + FROM `" . TABLE_PANEL_DOMAIN_SSL_SETTINGS . "` s + LEFT JOIN `" . TABLE_PANEL_DOMAINS . "` d ON `d`.`id` = `s`.`domainid` + LEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` c ON `c`.`customerid` = `d`.`customerid` + WHERE "; + +$qry_params = array(); + +if (AREA == 'admin' && $userinfo['customers_see_all'] == '0') { + // admin with only customer-specific permissions + $certs_stmt_query .= "d.adminid = :adminid "; + $qry_params['adminid'] = $userinfo['adminid']; +} elseif (AREA == 'customer') { + // customer-area + $certs_stmt_query .= "d.customerid = :cid "; + $qry_params['cid'] = $userinfo['customerid']; +} else { + $certs_stmt_query .= "1 "; +} + +// sorting by domain-name +$certs_stmt_query .= $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit(); + +$certs_stmt = Database::prepare($certs_stmt_query); +Database::pexecute($certs_stmt, $qry_params); +$all_certs = $certs_stmt->fetchAll(PDO::FETCH_ASSOC); +$certificates = ""; + +if (count($all_certs) == 0) { + $message = $lng['domains']['no_ssl_certificates']; + $sortcode = ""; + $arrowcode = array('d.domain' => ''); + $searchcode = ""; + $pagingcode = ""; + eval("\$certificates.=\"" . getTemplate("ssl_certificates/certs_error", true) . "\";"); +} else { + $paging->setEntries(count($all_certs)); + $sortcode = $paging->getHtmlSortCode($lng); + $arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s); + $searchcode = $paging->getHtmlSearchCode($lng); + $pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s); + + foreach ($all_certs as $idx => $cert) { + if ($paging->checkDisplay($idx)) { + + if (empty($cert['domain']) || empty($cert['ssl_cert_file'])) { + // no domain found to the entry or empty entry - safely delete it from the DB + Database::pexecute($del_stmt, array( + 'id' => $cert['id'] + )); + continue; + } + + $cert_data = openssl_x509_parse($cert['ssl_cert_file']); + + $cert['domain'] = $idna_convert->encode($cert['domain']); + + $adminCustomerLink = ""; + if (AREA == 'admin') { + if (! empty($cert['loginname'])) { + $adminCustomerLink = ' (' . $cert['loginname'] . ')'; + } + } + + if ($cert_data) { + $validFrom = date('d.m.Y H:i:s', $cert_data['validFrom_time_t']); + $validTo = date('d.m.Y H:i:s', $cert_data['validTo_time_t']); + + $isValid = true; + if ($cert_data['validTo_time_t'] < time()) { + $isValid = false; + } + + $row = htmlentities_array($cert); + eval("\$certificates.=\"" . getTemplate("ssl_certificates/certs_cert", true) . "\";"); + } else { + $message = sprintf($lng['domains']['ssl_certificate_error'], $cert['domain']); + eval("\$certificates.=\"" . getTemplate("ssl_certificates/certs_error", true) . "\";"); + } + } else { + continue; + } + } +} +eval("echo \"" . getTemplate("ssl_certificates/certs_list", true) . "\";"); diff --git a/templates/Sparkle/ssl_certificates/certs_cert.tpl b/templates/Sparkle/ssl_certificates/certs_cert.tpl new file mode 100644 index 00000000..90d502fa --- /dev/null +++ b/templates/Sparkle/ssl_certificates/certs_cert.tpl @@ -0,0 +1,33 @@ +class="domain-expired"> + + {$row['domain']} + {$adminCustomerLink} + + + {$cert_data['subject']['CN']} + + + {$cert_data['issuer']['O']} + + + {$validFrom} + + + + {$validTo} + + + + + + {$lng['panel']['edit']} +   + + + {$lng['panel']['letsencrypt']} + + + {$lng['panel']['delete']} + + + diff --git a/templates/Sparkle/ssl_certificates/certs_error.tpl b/templates/Sparkle/ssl_certificates/certs_error.tpl new file mode 100644 index 00000000..e573c664 --- /dev/null +++ b/templates/Sparkle/ssl_certificates/certs_error.tpl @@ -0,0 +1,3 @@ + + {$message} + diff --git a/templates/Sparkle/ssl_certificates/certs_list.tpl b/templates/Sparkle/ssl_certificates/certs_list.tpl new file mode 100644 index 00000000..b474940e --- /dev/null +++ b/templates/Sparkle/ssl_certificates/certs_list.tpl @@ -0,0 +1,57 @@ + $header +
+
+

+   + {$lng['domains']['ssl_certificates']} +

+
+ + +
+
{$lng['success']['success']}
+
+ $success_message +
+
+
+ +
+ +
+ + + +
+ {$searchcode} +
+ + + + + + + + + + + + + + + + + + + + + + + {$certificates} + +
{$lng['domains']['domainname']} {$arrowcode['d.domain']}Certificate forIssuerValid fromValid until{$lng['panel']['options']}
{$pagingcode}
+
+ +
+
+$footer