diff --git a/admin/tool/mobile/classes/api.php b/admin/tool/mobile/classes/api.php index 02027bd4054..a60b8f6b95c 100644 --- a/admin/tool/mobile/classes/api.php +++ b/admin/tool/mobile/classes/api.php @@ -206,6 +206,12 @@ class api { $identityprovidersdata = \auth_plugin_base::prepare_identity_providers_for_output($identityproviders, $OUTPUT); if (!empty($identityprovidersdata)) { $settings['identityproviders'] = $identityprovidersdata; + // Clean URLs to avoid breaking Web Services. + // We can't do it in prepare_identity_providers_for_output() because it may break the web output. + foreach ($settings['identityproviders'] as &$ip) { + $ip['url'] = (!empty($ip['url'])) ? clean_param($ip['url'], PARAM_URL) : ''; + $ip['iconurl'] = (!empty($ip['iconurl'])) ? clean_param($ip['iconurl'], PARAM_URL) : ''; + } } // If age is verified, return also the admin contact details. diff --git a/admin/tool/mobile/tests/externallib_test.php b/admin/tool/mobile/tests/externallib_test.php index f3d1815eec2..f68d8d0ce26 100644 --- a/admin/tool/mobile/tests/externallib_test.php +++ b/admin/tool/mobile/tests/externallib_test.php @@ -99,6 +99,7 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase { ); $this->assertEquals($expected, $result); + $this->setAdminUser(); // Change some values. set_config('registerauth', 'email'); $authinstructions = 'Something with html tags'; @@ -112,6 +113,18 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase { set_config('lang', 'a_b'); // Set invalid lang. set_config('disabledfeatures', 'myoverview', 'tool_mobile'); + // Enable couple of issuers. + $issuer = \core\oauth2\api::create_standard_issuer('google'); + $irecord = $issuer->to_record(); + $irecord->clientid = 'mock'; + $irecord->clientsecret = 'mock'; + core\oauth2\api::update_issuer($irecord); + + set_config('hostname', 'localhost', 'auth_cas'); + set_config('auth_logo', 'http://invalidurl.com//invalid/', 'auth_cas'); + + set_config('auth', 'oauth2,cas'); + list($authinstructions, $notusedformat) = external_format_text($authinstructions, FORMAT_MOODLE, $context->id); $expected['registerauth'] = 'email'; $expected['authinstructions'] = $authinstructions; @@ -133,7 +146,26 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase { $result = external::get_public_config(); $result = external_api::clean_returnvalue(external::get_public_config_returns(), $result); + // First check providers. + $identityproviders = $result['identityproviders']; + unset($result['identityproviders']); + + $this->assertEquals('Google', $identityproviders[0]['name']); + $this->assertEquals($irecord->image, $identityproviders[0]['iconurl']); + $this->assertContains($CFG->wwwroot, $identityproviders[0]['url']); + + $this->assertEquals('CAS', $identityproviders[1]['name']); + $this->assertEmpty($identityproviders[1]['iconurl']); + $this->assertContains($CFG->wwwroot, $identityproviders[1]['url']); + $this->assertEquals($expected, $result); + + // Change providers img. + $newurl = 'validimage.png'; + set_config('auth_logo', $newurl, 'auth_cas'); + $result = external::get_public_config(); + $result = external_api::clean_returnvalue(external::get_public_config_returns(), $result); + $this->assertContains($newurl, $result['identityproviders'][1]['iconurl']); } /**