From 19c4ba578d5f27323cc3b27aa481ae53c64c9fcb Mon Sep 17 00:00:00 2001
From: Andjelko Horvat <comel@vingd.com>
Date: Fri, 9 Sep 2011 13:40:01 +0000
Subject: [PATCH] lib/SimpleSAML/XHTML/Template.php: available languages check
 (issue 435).

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@2897 44740490-163a-0410-bde0-09ae8108e29a
---
 lib/SimpleSAML/XHTML/Template.php | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/lib/SimpleSAML/XHTML/Template.php b/lib/SimpleSAML/XHTML/Template.php
index 6a01396f5..f5245596c 100644
--- a/lib/SimpleSAML/XHTML/Template.php
+++ b/lib/SimpleSAML/XHTML/Template.php
@@ -18,6 +18,7 @@ class SimpleSAML_XHTML_Template {
 
 	private $configuration = null;
 	private $template = 'default.php';
+	private $availableLanguages = array('en');
 	private $language = null;
 	
 	private $langtext = array();
@@ -49,6 +50,8 @@ class SimpleSAML_XHTML_Template {
 		$this->template = $template;
 		
 		$this->data['baseurlpath'] = $this->configuration->getBaseURL();
+
+		$this->availableLanguages = $this->configuration->getArray('language.available', array('en'));
 		
 		if (isset($_GET['language'])) {
 			$this->setLanguage($_GET['language']);
@@ -74,8 +77,10 @@ class SimpleSAML_XHTML_Template {
 	 * @param $language    Language code for the language to set.
 	 */
 	public function setLanguage($language) {
-		$this->language = $language;
-		SimpleSAML_XHTML_Template::setLanguageCookie($language);
+		if (in_array($language, $this->availableLanguages, TRUE)) {
+			$this->language = $language;
+			SimpleSAML_XHTML_Template::setLanguageCookie($language);
+		}
 	}
 
 	/**
@@ -94,7 +99,7 @@ class SimpleSAML_XHTML_Template {
 
 		// Language is provided in a stored COOKIE
 		$languageCookie = SimpleSAML_XHTML_Template::getLanguageCookie();
-		if ($languageCookie !== NULL) {
+		if ($languageCookie !== NULL && in_array($languageCookie, $this->availableLanguages, TRUE)) {
 			$this->language = $languageCookie;
 			return $languageCookie;
 		}
@@ -117,7 +122,6 @@ class SimpleSAML_XHTML_Template {
 	 *         languages in the header were available.
 	 */
 	private function getHTTPLanguage() {
-		$availableLanguages = $this->configuration->getArray('language.available', array('en'));
 		$languageScore = SimpleSAML_Utilities::getAcceptLanguage();
 
 		/* For now we only use the default language map. We may use a configurable language map
@@ -136,7 +140,7 @@ class SimpleSAML_XHTML_Template {
 				$language = $languageMap[$language];
 			}
 
-			if(!in_array($language, $availableLanguages, TRUE)) {
+			if(!in_array($language, $this->availableLanguages, TRUE)) {
 				/* Skip this language - we don't have it. */
 				continue;
 			}
@@ -167,10 +171,9 @@ class SimpleSAML_XHTML_Template {
 	 * Returns a list of all available languages.
 	 */
 	private function getLanguageList() {
-		$availableLanguages = $this->configuration->getArray('language.available', array('en'));
 		$thisLang = $this->getLanguage();
 		$lang = array();
-		foreach ($availableLanguages AS $nl) {
+		foreach ($this->availableLanguages AS $nl) {
 			$lang[$nl] = ($nl == $thisLang);
 		}
 		return $lang;
@@ -651,11 +654,14 @@ class SimpleSAML_XHTML_Template {
 	 * @return string|NULL  The language, or NULL if unset.
 	 */
 	public static function getLanguageCookie() {
+		$config = SimpleSAML_Configuration::getInstance();
+		$availableLanguages = $config->getArray('language.available', array('en'));
 
-		if (!isset($_COOKIE['language'])) {
-			return NULL;
+		if (isset($_COOKIE['language']) && in_array((string)$_COOKIE['language'], $availableLanguages, TRUE)) {
+			return (string)$_COOKIE['language'];
 		}
-		return (string)$_COOKIE['language'];
+
+		return NULL;
 	}
 
 
@@ -667,7 +673,10 @@ class SimpleSAML_XHTML_Template {
 	public static function setLanguageCookie($language) {
 		assert('is_string($language)');
 
-		if (headers_sent()) {
+		$config = SimpleSAML_Configuration::getInstance();
+		$availableLanguages = $config->getArray('language.available', array('en'));
+
+		if (!in_array($language, $availableLanguages, TRUE) || headers_sent()) {
 			return;
 		}
 		setcookie('language', $language, time()+60*60*24*900, '/');
-- 
GitLab