Issue #1527720 by Gábor Hojtsy: Fixed OpenID language matching finds least specific instead of most specific match.

8.0.x
catch 2012-04-17 12:23:52 +09:00
parent b5973cd97d
commit f6cb088ed4
2 changed files with 49 additions and 14 deletions

View File

@ -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;
}
}
}

View File

@ -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.'));
}
}