From 002dfe36af4b1b1bb626ea6a266fd229db6dae27 Mon Sep 17 00:00:00 2001
From: Joost van Dijk <argine@xs4all.nl>
Date: Wed, 27 May 2015 14:25:21 +0200
Subject: [PATCH] add renewurl option to display certificate renewal link

---
 .../dictionaries/X509warning.definition.json  | 24 +++++++----
 .../dictionaries/X509warning.translation.json | 39 +++++++++++++----
 modules/authX509/docs/authX509.txt            |  6 ++-
 .../lib/Auth/Process/ExpiryWarning.php        | 43 +++++++++++--------
 modules/authX509/templates/X509warning.php    | 23 ++++++----
 modules/authX509/www/expirywarning.php        |  7 +--
 6 files changed, 95 insertions(+), 47 deletions(-)

diff --git a/modules/authX509/dictionaries/X509warning.definition.json b/modules/authX509/dictionaries/X509warning.definition.json
index 4770dcf2c..e74d30775 100644
--- a/modules/authX509/dictionaries/X509warning.definition.json
+++ b/modules/authX509/dictionaries/X509warning.definition.json
@@ -1,11 +1,17 @@
 {
-	"warning": {
-		"en": "Your certificate will expire in %days% days. Please renew your certificate in time."
-	},
-	"warning_header": {
-		"en": "Your certificate is about to expire."
-	},
-	"proceed": {
-		"en": "Proceed"
-	}
+  "warning": {
+    "en": "Your certificate will expire in %days% days."
+  },
+  "warning_header": {
+    "en": "Your certificate is about to expire."
+  },
+  "renew": {
+    "en": "Please renew your certificate in time."
+  },
+  "renew_url": {
+  "en": "Please  <a href='%renewurl%'>renew<\/a> your certificate in time."
+},
+  "proceed": {
+    "en": "Proceed"
+  }
 }
diff --git a/modules/authX509/dictionaries/X509warning.translation.json b/modules/authX509/dictionaries/X509warning.translation.json
index 11ac94b55..3472585eb 100644
--- a/modules/authX509/dictionaries/X509warning.translation.json
+++ b/modules/authX509/dictionaries/X509warning.translation.json
@@ -1,11 +1,32 @@
 {
-	"warning": {
-		"nl": "Je certificaat verloopt over %days% dagen. Vervang tijdig je certificaat."
-	},
-	"warning_header": {
-		"nl": "Je certificaat verloopt binnenkort."
-	},
-	"proceed": {
-		"nl": "Verder"
-	}
+  "warning": {
+    "nl": "Je certificaat verloopt over %days% dagen.",
+    "no": "Sertifikatet ditt vil utløpe om %days% dager.",
+    "da": "Dit certifikat udløber om %days% dage.",
+    "es": "Su certificado caduca en %days% dĂ­as."
+  },
+  "warning_header": {
+    "nl": "Je certificaat verloopt binnenkort.",
+    "no": "Sertifikatet ditt vil snart utløpe.",
+    "da": "Dit certifikat udløber om kort tid",
+    "es": "Su certificado está a punto de caducar."
+  },
+  "renew": {
+    "nl": "Vervang tijdig je certificaat.",
+    "no": "Vennligst forny sertifikatet ditt før det utløper.",
+    "da": "Forny venligst dit certifikat i tide.",
+    "es": "Por favor, renueve su certificado a tiempo."
+  },
+  "renew_url": {
+    "nl": "<a href='%renewurl%'>Vernieuw<\/a> tijdig je certificate.",
+    "no": "Vennligst <a href=‘%renewurl%’>forny<\/a> sertifikatet ditt før det utløper.",
+    "da": "<a href='%renewurl%'>Forny<\/a>, venligst dit certifikat før det udløber.",
+    "es": "Por favor, <a href=‘%renewurl%’>renueve<\/a> su certificado a tiempo."
+  },
+  "proceed": {
+    "nl": "Verder",
+    "no": "Fortsett",
+    "da": "Fortsæt",
+    "es": "Continuar"
+  }
 }
diff --git a/modules/authX509/docs/authX509.txt b/modules/authX509/docs/authX509.txt
index f37c8ee25..0f3d12621 100644
--- a/modules/authX509/docs/authX509.txt
+++ b/modules/authX509/docs/authX509.txt
@@ -116,7 +116,11 @@ Example:
      10 => array(
          'class' => 'authX509:ExpiryWarning',
          'warndaysbefore' => '30',
+         'renewurl' => 'https://myca.com/renew',
      ),
 
 Parameter `warndaysbefore` specifies the number of days the user's certificate needs to be valid before a warning is
-issued. The default is 30.
\ No newline at end of file
+issued. The default is 30.
+
+Parameter `renewurl` specifies the URL of your Certification Authority. If specified, the user is suggested to renew the
+certificate immediately.
diff --git a/modules/authX509/lib/Auth/Process/ExpiryWarning.php b/modules/authX509/lib/Auth/Process/ExpiryWarning.php
index f9dedf573..259228e77 100644
--- a/modules/authX509/lib/Auth/Process/ExpiryWarning.php
+++ b/modules/authX509/lib/Auth/Process/ExpiryWarning.php
@@ -17,6 +17,7 @@
 class sspmod_authX509_Auth_Process_ExpiryWarning extends SimpleSAML_Auth_ProcessingFilter {
 
     private $warndaysbefore = 30;
+    private $renewurl = null;
 
     /**
      * Initialize this filter.
@@ -35,23 +36,30 @@ class sspmod_authX509_Auth_Process_ExpiryWarning extends SimpleSAML_Auth_Process
                 throw new Exception('Invalid value for \'warndaysbefore\'-option to authX509::ExpiryWarning filter.');
             }
         }
+
+        if (array_key_exists('renewurl', $config)) {
+            $this->renewurl = $config['renewurl'];
+            if (!is_string($this->renewurl)) {
+                throw new Exception('Invalid value for \'renewurl\'-option to authX509::ExpiryWarning filter.');
+            }
+        }
     }
 
     /**
-	 * Process an authentication response.
-	 *
-	 * This function saves the state, and if necessary redirects the user to the page where the user
-	 * is informed about the expiry date of his/her certificate.
-	 *
-	 * @param array $state  The state of the response.
-	 */
-	public function process(&$state) {
-		assert('is_array($state)');
+     * Process an authentication response.
+     *
+     * This function saves the state, and if necessary redirects the user to the page where the user
+     * is informed about the expiry date of his/her certificate.
+     *
+     * @param array $state  The state of the response.
+     */
+    public function process(&$state) {
+        assert('is_array($state)');
 
-		if (isset($state['isPassive']) && $state['isPassive'] === TRUE) {
-			/* We have a passive request. Skip the warning. */
-			return;
-		}
+        if (isset($state['isPassive']) && $state['isPassive'] === TRUE) {
+            /* We have a passive request. Skip the warning. */
+            return;
+        }
 
         if (!isset($_SERVER['SSL_CLIENT_CERT']) ||
             ($_SERVER['SSL_CLIENT_CERT'] == '')) {
@@ -74,11 +82,12 @@ class sspmod_authX509_Auth_Process_ExpiryWarning extends SimpleSAML_Auth_Process
 
         SimpleSAML_Logger::warning('authX509: user certificate expires in ' . $daysleft . ' days');
         $state['daysleft'] = $daysleft;
+        $state['renewurl'] = $this->renewurl;
 
         /* Save state and redirect. */
-		$id = SimpleSAML_Auth_State::saveState($state, 'warning:expire');
-		$url = SimpleSAML_Module::getModuleURL('authX509/expirywarning.php');
-		\SimpleSAML\Utils\HTTP::redirectTrustedURL($url, array('StateId' => $id));
-	}
+        $id = SimpleSAML_Auth_State::saveState($state, 'warning:expire');
+        $url = SimpleSAML_Module::getModuleURL('authX509/expirywarning.php');
+        \SimpleSAML\Utils\HTTP::redirectTrustedURL($url, array('StateId' => $id));
+    }
 
 }
diff --git a/modules/authX509/templates/X509warning.php b/modules/authX509/templates/X509warning.php
index b391ddda2..496775065 100644
--- a/modules/authX509/templates/X509warning.php
+++ b/modules/authX509/templates/X509warning.php
@@ -14,6 +14,14 @@ $warning = $this->t('{authX509:X509warning:warning}', array(
     '%days%' => htmlspecialchars($this->data['daysleft']),
 ));
 
+if( $this->data['renewurl']) {
+    $warning .= " " . $this->t('{authX509:X509warning:renew_url}', array(
+        '%renewurl%' => $this->data['renewurl'],
+    ));
+} else {
+    $warning .= " " . $this->t('{authX509:X509warning:renew}');
+}
+
 $this->data['header'] = $this->t('{authX509:X509warning:warning_header}');
 $this->data['autofocus'] = 'proceedbutton';
 
@@ -23,19 +31,18 @@ $this->includeAtTemplateBase('includes/header.php');
 
 <form style="display: inline; margin: 0px; padding: 0px" action="<?php echo htmlspecialchars($this->data['target']); ?>">
 
-	<?php
-		// Embed hidden fields...
-		foreach ($this->data['data'] as $name => $value) {
-			echo('<input type="hidden" name="' . htmlspecialchars($name) . '" value="' . htmlspecialchars($value) . '" />');
-		}
-	?>
+    <?php
+        // Embed hidden fields...
+        foreach ($this->data['data'] as $name => $value) {
+            echo('<input type="hidden" name="' . htmlspecialchars($name) . '" value="' . htmlspecialchars($value) . '" />');
+        }
+    ?>
     <p><?php echo $warning; ?></p>
 
-	<input type="submit" name="proceed" id="proceedbutton" value="<?php echo htmlspecialchars($this->t('{authX509:X509warning:proceed}')) ?>" />
+    <input type="submit" name="proceed" id="proceedbutton" value="<?php echo htmlspecialchars($this->t('{authX509:X509warning:proceed}')) ?>" />
 
 </form>
 
 
 <?php
-
 $this->includeAtTemplateBase('includes/footer.php');
diff --git a/modules/authX509/www/expirywarning.php b/modules/authX509/www/expirywarning.php
index f09a425cc..200b76c9f 100644
--- a/modules/authX509/www/expirywarning.php
+++ b/modules/authX509/www/expirywarning.php
@@ -9,15 +9,15 @@
 SimpleSAML_Logger::info('AuthX509 - Showing expiry warning to user');
 
 if (!array_key_exists('StateId', $_REQUEST)) {
-	throw new SimpleSAML_Error_BadRequest('Missing required StateId query parameter.');
+    throw new SimpleSAML_Error_BadRequest('Missing required StateId query parameter.');
 }
 $id = $_REQUEST['StateId'];
 $state = SimpleSAML_Auth_State::loadState($id, 'warning:expire');
 
 
 if (array_key_exists('proceed', $_REQUEST)) {
-	/* The user has pressed the proceed-button. */
-	SimpleSAML_Auth_ProcessingChain::resumeProcessing($state);
+    /* The user has pressed the proceed-button. */
+    SimpleSAML_Auth_ProcessingChain::resumeProcessing($state);
 }
 
 $globalConfig = SimpleSAML_Configuration::getInstance();
@@ -26,4 +26,5 @@ $t = new SimpleSAML_XHTML_Template($globalConfig, 'authX509:X509warning.php');
 $t->data['target'] = SimpleSAML_Module::getModuleURL('authX509/expirywarning.php');
 $t->data['data'] = array('StateId' => $id);
 $t->data['daysleft'] = $state['daysleft'];
+$t->data['renewurl'] = $state['renewurl'];
 $t->show();
-- 
GitLab