Issue #1527720 by Gábor Hojtsy: Fixed OpenID language matching finds least specific instead of most specific match.
parent
b5973cd97d
commit
f6cb088ed4
|
@ -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
|
// preferred langugage is "en-GB", we look for "en-gb" (Drupal's language
|
||||||
// codes are lower-case) or fall back to "en".
|
// codes are lower-case) or fall back to "en".
|
||||||
$parts = preg_split('/[_-]/', strtolower($language));
|
$parts = preg_split('/[_-]/', strtolower($language));
|
||||||
$candidate_languages[] = $parts[0];
|
$candidate_langcodes[] = $parts[0];
|
||||||
if (count($parts) > 1) {
|
if (count($parts) > 1) {
|
||||||
$candidate_languages[] = $parts[0] . '-' . $parts[1];
|
$candidate_langcodes[] = $parts[0] . '-' . $parts[1];
|
||||||
}
|
}
|
||||||
if (count($parts) > 2) {
|
if (count($parts) > 2) {
|
||||||
$candidate_languages[] = $parts[0] . '-' . $parts[2];
|
$candidate_langcodes[] = $parts[0] . '-' . $parts[2];
|
||||||
$candidate_languages[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2];
|
$candidate_langcodes[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2];
|
||||||
}
|
}
|
||||||
$enabled_languages = language_list(TRUE);
|
$enabled_languages = language_list(TRUE);
|
||||||
// Iterate over the generated permutations starting with the longest (most
|
// Iterate over the generated permutations starting with the longest (most
|
||||||
// specific) strings.
|
// specific) strings.
|
||||||
foreach (array_reverse($candidate_languages) as $candidate_language) {
|
foreach (array_reverse($candidate_langcodes) as $candidate_langcode) {
|
||||||
if (isset($enabled_languages[$candidate_language])) {
|
if (isset($enabled_languages[$candidate_langcode])) {
|
||||||
$form['locale']['preferred_langcode']['#type'] = 'hidden';
|
$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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -453,7 +453,8 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
function setUp() {
|
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);
|
variable_set('user_register', USER_REGISTER_VISITORS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,10 +470,23 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
variable_set('openid_test_response', array(
|
variable_set('openid_test_response', array(
|
||||||
'openid.sreg.nickname' => 'john',
|
'openid.sreg.nickname' => 'john',
|
||||||
'openid.sreg.email' => 'john@example.com',
|
'openid.sreg.email' => 'john@example.com',
|
||||||
'openid.sreg.language' => 'en-GB',
|
'openid.sreg.language' => 'pt-BR',
|
||||||
'openid.sreg.timezone' => 'Europe/London',
|
'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.
|
// Use a User-supplied Identity that is the URL of an XRDS document.
|
||||||
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
|
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
|
||||||
$this->submitLoginForm($identity);
|
$this->submitLoginForm($identity);
|
||||||
|
@ -484,7 +498,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
$this->assertTrue($user, t('User was registered with right username.'));
|
$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->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->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->assertFalse($user->data, t('No additional user info was saved.'));
|
||||||
|
|
||||||
$this->submitLoginForm($identity);
|
$this->submitLoginForm($identity);
|
||||||
|
@ -513,10 +527,17 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
variable_set('openid_test_response', array(
|
variable_set('openid_test_response', array(
|
||||||
'openid.sreg.nickname' => 'john',
|
'openid.sreg.nickname' => 'john',
|
||||||
'openid.sreg.email' => 'john@example.com',
|
'openid.sreg.email' => 'john@example.com',
|
||||||
'openid.sreg.language' => 'en-GB',
|
'openid.sreg.language' => 'pt-BR',
|
||||||
'openid.sreg.timezone' => 'Europe/London',
|
'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.
|
// Use a User-supplied Identity that is the URL of an XRDS document.
|
||||||
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
|
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
|
||||||
$this->submitLoginForm($identity);
|
$this->submitLoginForm($identity);
|
||||||
|
@ -526,7 +547,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
$this->assertTrue($user, t('User was registered with right username.'));
|
$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->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->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->assertFalse($user->data, t('No additional user info was saved.'));
|
||||||
|
|
||||||
$this->drupalLogout();
|
$this->drupalLogout();
|
||||||
|
@ -644,9 +665,20 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
'openid.ext123.type.timezone' => 'http://axschema.org/pref/timezone',
|
'openid.ext123.type.timezone' => 'http://axschema.org/pref/timezone',
|
||||||
'openid.ext123.value.timezone' => 'Europe/London',
|
'openid.ext123.value.timezone' => 'Europe/London',
|
||||||
'openid.ext123.type.language' => 'http://axschema.org/pref/language',
|
'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.
|
// Use a User-supplied Identity that is the URL of an XRDS document.
|
||||||
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
|
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
|
||||||
$this->submitLoginForm($identity);
|
$this->submitLoginForm($identity);
|
||||||
|
@ -656,7 +688,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
|
||||||
$this->assertTrue($user, t('User was registered with right username.'));
|
$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->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->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.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue