$rcert) {
if (($rcert['refid'] == $cert['refid']) || ($rcert['descr'] == $cert['descr'])) {
unset($crl['cert'][$id]);
if (count($crl['cert']) == 0) {
// Protect against accidentally switching the type to imported, for older CRLs
if (!isset($crl['method'])) {
$crl['method'] = "internal";
}
crl_update($crl);
} else {
crl_update($crl);
}
return true;
}
}
return false;
}
// openssl_crl_status messages from certs.inc
global $openssl_crl_status;
// prepare config types
if (!isset($config['ca']) || !is_array($config['ca'])) {
$config['ca'] = array();
}
if (!isset($config['cert']) || !is_array($config['cert'])) {
$config['cert'] = array();
}
if (!isset($config['crl']) || !is_array($config['crl'])) {
$config['crl'] = array();
}
$a_crl =& $config['crl'];
$thiscrl = false;
$act=null;
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// locate cert by refid, returns false when not found
if (isset($_GET['id'])) {
$thiscrl =& lookup_crl($_GET['id']);
if ($thiscrl !== false) {
$id = $_GET['id'];
}
}
if (isset($_GET['act'])) {
$act = $_GET['act'];
}
if ($act == "exp") {
crl_update($thiscrl);
$exp_name = urlencode("{$thiscrl['descr']}.crl");
$exp_data = base64_decode($thiscrl['text']);
$exp_size = strlen($exp_data);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$exp_name}");
header("Content-Length: $exp_size");
echo $exp_data;
exit;
} elseif ($act == "new") {
$pconfig = array();
$pconfig['descr'] = null;
$pconfig['crltext'] = null;
$pconfig['crlmethod'] = !empty($_GET['method']) ? $_GET['method'] : null;
$pconfig['caref'] = !empty($_GET['caref']) ? $_GET['caref'] : null;
$pconfig['lifetime'] = "9999";
$pconfig['serial'] = "0";
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pconfig = $_POST;
// locate cert by refid, returns false when not found
if (isset($_POST['id'])) {
$thiscrl =& lookup_crl($_POST['id']);
if ($thiscrl !== false) {
$id = $_POST['id'];
}
}
if (isset($_POST['act'])) {
$act = $_POST['act'];
}
if ($act == "del" && isset($id)) {
$name = $thiscrl['descr'];
if (is_openvpn_server_crl($id)) {
$savemsg = sprintf(gettext("Certificate Revocation List %s is in use and cannot be deleted"), $name) . "
";
} else {
foreach ($a_crl as $cid => $acrl) {
if ($acrl['refid'] == $thiscrl['refid']) {
unset($a_crl[$cid]);
}
}
write_config("Deleted CRL {$name}.");
header("Location: system_crlmanager.php");
exit;
}
} elseif ($act == "delcert" && isset($id)) {
if (!isset($thiscrl['cert']) || !is_array($thiscrl['cert'])) {
header("Location: system_crlmanager.php");
exit;
}
$found = false;
foreach ($thiscrl['cert'] as $acert) {
if ($acert['refid'] == $pconfig['certref']) {
$found = true;
$thiscert = $acert;
}
}
if (!$found) {
header("Location: system_crlmanager.php");
exit;
}
$name = $thiscert['descr'];
if (cert_unrevoke($thiscert, $thiscrl)) {
openvpn_refresh_crls();
write_config(sprintf(gettext("Deleted Certificate %s from CRL %s"), $name, $thiscrl['descr']));
header("Location: system_crlmanager.php");
exit;
} else {
$savemsg = sprintf(gettext("Failed to delete Certificate %s from CRL %s"), $name, $thiscrl['descr']) . "
";
}
$act="edit";
} elseif ($act == "addcert") {
$input_errors = array();
if (!isset($id)) {
header("Location: system_crlmanager.php");
exit;
}
// certref, crlref
$crl =& lookup_crl($id);
$cert = lookup_cert($pconfig['certref']);
if (empty($crl['caref']) || empty($cert['caref'])) {
$input_errors[] = gettext("Both the Certificate and CRL must be specified.");
}
if ($crl['caref'] != $cert['caref']) {
$input_errors[] = gettext("CA mismatch between the Certificate and CRL. Unable to Revoke.");
}
if (!is_crl_internal($crl)) {
$input_errors[] = gettext("Cannot revoke certificates for an imported/external CRL.");
}
if (!count($input_errors)) {
$reason = (empty($pconfig['crlreason'])) ? OCSP_REVOKED_STATUS_UNSPECIFIED : $pconfig['crlreason'];
cert_revoke($cert, $crl, $reason);
openvpn_refresh_crls();
write_config("Revoked cert {$cert['descr']} in CRL {$crl['descr']}.");
header("Location: system_crlmanager.php");
exit;
}
} else {
$input_errors = array();
$pconfig = $_POST;
/* input validation */
if (($pconfig['crlmethod'] == "existing") || ($act == "editimported")) {
$reqdfields = explode(" ", "descr crltext");
$reqdfieldsn = array(
gettext("Descriptive name"),
gettext("Certificate Revocation List data"));
} elseif ($pconfig['crlmethod'] == "internal") {
$reqdfields = explode(
" ",
"descr caref"
);
$reqdfieldsn = array(
gettext("Descriptive name"),
gettext("Certificate Authority"));
}
do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
/* save modifications */
if (count($input_errors) == 0) {
if (isset($id)) {
$crl =& $thiscrl;
} else {
$crl = array();
$crl['refid'] = uniqid();
}
foreach (array("descr", "caref", "crlmethod") as $fieldname) {
if (isset($pconfig[$fieldname])) {
$crl[$fieldname] = $pconfig[$fieldname];
}
}
if (($pconfig['crlmethod'] == "existing") || ($act == "editimported")) {
$crl['text'] = base64_encode($pconfig['crltext']);
}
if ($pconfig['crlmethod'] == "internal") {
$crl['serial'] = empty($pconfig['serial']) ? 9999 : $pconfig['serial'];
$crl['lifetime'] = empty($pconfig['lifetime']) ? 9999 : $pconfig['lifetime'];
$crl['cert'] = array();
}
if (!isset($id)) {
$a_crl[] = $crl;
}
write_config("Saved CRL {$crl['descr']}");
openvpn_refresh_crls();
header("Location: system_crlmanager.php");
exit;
}
}
}
legacy_html_escape_form_data($pconfig);
legacy_html_escape_form_data($thiscrl);
include("head.inc");
?>