From f6cb088ed491fe881b072e702987313a219ba765 Mon Sep 17 00:00:00 2001 From: catch Date: Tue, 17 Apr 2012 12:23:52 +0900 Subject: [PATCH] =?UTF-8?q?Issue=20#1527720=20by=20G=C3=A1bor=20Hojtsy:=20?= =?UTF-8?q?Fixed=20OpenID=20language=20matching=20finds=20least=20specific?= =?UTF-8?q?=20instead=20of=20most=20specific=20match.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/modules/openid/openid.module | 17 +++++++----- core/modules/openid/openid.test | 46 ++++++++++++++++++++++++++----- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/core/modules/openid/openid.module b/core/modules/openid/openid.module index a3df38fe52e..141a3ab3a05 100644 --- a/core/modules/openid/openid.module +++ b/core/modules/openid/openid.module @@ -255,21 +255,24 @@ function openid_form_user_register_form_alter(&$form, &$form_state) { // preferred langugage is "en-GB", we look for "en-gb" (Drupal's language // codes are lower-case) or fall back to "en". $parts = preg_split('/[_-]/', strtolower($language)); - $candidate_languages[] = $parts[0]; + $candidate_langcodes[] = $parts[0]; if (count($parts) > 1) { - $candidate_languages[] = $parts[0] . '-' . $parts[1]; + $candidate_langcodes[] = $parts[0] . '-' . $parts[1]; } if (count($parts) > 2) { - $candidate_languages[] = $parts[0] . '-' . $parts[2]; - $candidate_languages[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2]; + $candidate_langcodes[] = $parts[0] . '-' . $parts[2]; + $candidate_langcodes[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2]; } $enabled_languages = language_list(TRUE); // Iterate over the generated permutations starting with the longest (most // specific) strings. - foreach (array_reverse($candidate_languages) as $candidate_language) { - if (isset($enabled_languages[$candidate_language])) { + foreach (array_reverse($candidate_langcodes) as $candidate_langcode) { + if (isset($enabled_languages[$candidate_langcode])) { $form['locale']['preferred_langcode']['#type'] = 'hidden'; - $form['locale']['preferred_langcode']['#value'] = $candidate_language; + $form['locale']['preferred_langcode']['#value'] = $candidate_langcode; + // Skip the rest of the foreach to not overwrite the specific + // language we found. + break; } } } diff --git a/core/modules/openid/openid.test b/core/modules/openid/openid.test index 7a4c9cf1fe9..24e643fb866 100644 --- a/core/modules/openid/openid.test +++ b/core/modules/openid/openid.test @@ -453,7 +453,8 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { } function setUp() { - parent::setUp('openid', 'openid_test'); + // Add language module too to test with some non-built-in languages. + parent::setUp('openid', 'openid_test', 'language'); variable_set('user_register', USER_REGISTER_VISITORS); } @@ -469,10 +470,23 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { variable_set('openid_test_response', array( 'openid.sreg.nickname' => 'john', 'openid.sreg.email' => 'john@example.com', - 'openid.sreg.language' => 'en-GB', + 'openid.sreg.language' => 'pt-BR', 'openid.sreg.timezone' => 'Europe/London', )); + // Save Portuguese and Portuguese, Portugal as optional languages. The + // process should pick 'pt' based on the sreg.language being 'pt-BR' + // (and falling back on least specific language given no pt-br available + // locally). + $language = (object) array( + 'langcode' => 'pt', + ); + language_save($language); + $language = (object) array( + 'langcode' => 'pt-pt', + ); + language_save($language); + // Use a User-supplied Identity that is the URL of an XRDS document. $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE)); $this->submitLoginForm($identity); @@ -484,7 +498,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { $this->assertTrue($user, t('User was registered with right username.')); $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.')); $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.')); - $this->assertEqual($user->preferred_langcode, 'en', t('User was registered with right language.')); + $this->assertEqual($user->preferred_langcode, 'pt', t('User was registered with right language.')); $this->assertFalse($user->data, t('No additional user info was saved.')); $this->submitLoginForm($identity); @@ -513,10 +527,17 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { variable_set('openid_test_response', array( 'openid.sreg.nickname' => 'john', 'openid.sreg.email' => 'john@example.com', - 'openid.sreg.language' => 'en-GB', + 'openid.sreg.language' => 'pt-BR', 'openid.sreg.timezone' => 'Europe/London', )); + // Save Portuguese, Brazil as an optional language. The process should pick + // 'pt-br' based on the sreg.language later. + $language = (object) array( + 'langcode' => 'pt-br', + ); + language_save($language); + // Use a User-supplied Identity that is the URL of an XRDS document. $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE)); $this->submitLoginForm($identity); @@ -526,7 +547,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { $this->assertTrue($user, t('User was registered with right username.')); $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.')); $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.')); - $this->assertEqual($user->preferred_langcode, 'en', t('User was registered with right language.')); + $this->assertEqual($user->preferred_langcode, 'pt-br', t('User was registered with right language.')); $this->assertFalse($user->data, t('No additional user info was saved.')); $this->drupalLogout(); @@ -644,9 +665,20 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { 'openid.ext123.type.timezone' => 'http://axschema.org/pref/timezone', 'openid.ext123.value.timezone' => 'Europe/London', 'openid.ext123.type.language' => 'http://axschema.org/pref/language', - 'openid.ext123.value.language' => 'en-GB', + 'openid.ext123.value.language' => 'pt-PT', )); + // Save Portuguese and Portuguese, Portugal as optional languages. The + // process should pick 'pt-pt' as the more specific language. + $language = (object) array( + 'langcode' => 'pt', + ); + language_save($language); + $language = (object) array( + 'langcode' => 'pt-pt', + ); + language_save($language); + // Use a User-supplied Identity that is the URL of an XRDS document. $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE)); $this->submitLoginForm($identity); @@ -656,7 +688,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase { $this->assertTrue($user, t('User was registered with right username.')); $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.')); $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.')); - $this->assertEqual($user->preferred_langcode, 'en', t('User was registered with right language.')); + $this->assertEqual($user->preferred_langcode, 'pt-pt', t('User was registered with right language.')); } }