From 5866358adcd73220f556a39c53a6cf7f3a034887 Mon Sep 17 00:00:00 2001 From: Frank Wall Date: Fri, 11 Oct 2019 12:43:29 +0200 Subject: [PATCH] security/acme-client: allow stg/prd accounts simultaneously, fixes #1528 --- .../models/OPNsense/AcmeClient/AcmeClient.xml | 2 +- .../OPNsense/AcmeClient/Migrations/M1_6_0.php | 89 +++++++++++++++++++ .../OPNsense/AcmeClient/certhelper.php | 9 +- 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/Migrations/M1_6_0.php diff --git a/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml b/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml index a103fabb3..51ebbc0fe 100644 --- a/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml +++ b/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml @@ -1,6 +1,6 @@ //OPNsense/AcmeClient - 1.5.0 + 1.6.0 A secure Let's Encrypt plugin diff --git a/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/Migrations/M1_6_0.php b/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/Migrations/M1_6_0.php new file mode 100644 index 000000000..e54006abd --- /dev/null +++ b/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/Migrations/M1_6_0.php @@ -0,0 +1,89 @@ +settings->environment; + $dir = '/var/etc/acme-client/accounts/'; + + // Search accounts + foreach ($model->getNodeByReference('accounts.account')->iterateItems() as $account) { + $account_id = (string)$account->id; + $account_dir = "${dir}${account_id}"; + $new_account_dir = "${dir}${account_id}_${env}"; + + // Check if account directory exists + // Accounts that haven't been used yet don't need to be migrated. + if (is_dir($account_dir)) { + + // Check if account configuration can be found. + $account_file = "${account_dir}/account.conf"; + if (is_file($account_file)) { + + // Parse config file and modify path information + $account_conf = parse_ini_file($account_file); + foreach ($account_conf as $key => $value) { + switch ($key) { + case 'ACCOUNT_KEY_PATH': + $account_conf[$key] = "${new_account_dir}/account.key"; + break; + case 'ACCOUNT_JSON_PATH': + $account_conf[$key] = "${new_account_dir}/account.json"; + break; + case 'CA_CONF': + $account_conf[$key] = "${new_account_dir}/ca.conf"; + break; + } + } + + // Convert array back to ini file format + $new_account_conf = array(); + foreach($account_conf as $key => $value) + { + $new_account_conf[] = "${key}='${value}'"; + } + + // Write changes back to file + file_put_contents($account_file, implode("\r\n", $new_account_conf)); + chmod($account_file, 0600); + + // Finally, rename account directory + rename($account_dir, $new_account_dir); + } + } + } + } +} diff --git a/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/certhelper.php b/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/certhelper.php index 40f468fb4..8bde2c2f8 100755 --- a/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/certhelper.php +++ b/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/certhelper.php @@ -344,7 +344,8 @@ function run_acme_account_registration($acctObj, $certObj, $modelObj) $acme_args = eval_optional_acme_args(); // Collect account information - $account_conf_dir = "/var/etc/acme-client/accounts/" . $acctObj->id; + $acme_env = (string)$modelObj->settings->environment; + $account_conf_dir = "/var/etc/acme-client/accounts/" . $acctObj->id . "_${acme_env}"; $account_conf_file = $account_conf_dir . "/account.conf"; $account_key_file = $account_conf_dir . "/account.key"; $account_json_file = $account_conf_dir . "/account.json"; @@ -462,7 +463,8 @@ function run_acme_validation($certObj, $valObj, $acctObj) $modelObj = new OPNsense\AcmeClient\AcmeClient(); // Collect account information - $account_conf_dir = "/var/etc/acme-client/accounts/" . $acctObj->id; + $acme_env = (string)$modelObj->settings->environment; + $account_conf_dir = "/var/etc/acme-client/accounts/" . $acctObj->id . "_${acme_env}"; $account_conf_file = $account_conf_dir . "/account.conf"; // Generate certificate filenames @@ -1023,7 +1025,8 @@ function revoke_cert($certObj, $valObj, $acctObj) $acme_args = eval_optional_acme_args(); // Collect account information - $account_conf_dir = "/var/etc/acme-client/accounts/" . $acctObj->id; + $acme_env = (string)$modelObj->settings->environment; + $account_conf_dir = "/var/etc/acme-client/accounts/" . $acctObj->id . "_${acme_env}"; $account_conf_file = $account_conf_dir . "/account.conf"; // Generate certificate filenames