Make WebFinger fancyurlfix configurable

This commit is contained in:
Mikael Nordfeldth 2016-02-21 20:05:32 +01:00
parent ce803f6d06
commit c67b89e56b
2 changed files with 50 additions and 41 deletions

View File

@ -36,10 +36,12 @@ class WebFingerPlugin extends Plugin
const OAUTH_AUTHORIZE_REL = 'http://apinamespace.org/oauth/authorize'; const OAUTH_AUTHORIZE_REL = 'http://apinamespace.org/oauth/authorize';
public $http_alias = false; public $http_alias = false;
public $fancyurlfix = true; // adds + interprets some extra aliases related to 'index.php/' URLs
public function initialize() public function initialize()
{ {
common_config_set('webfinger', 'http_alias', $this->http_alias); common_config_set('webfinger', 'http_alias', $this->http_alias);
common_config_set('webfinger', 'fancyurlfix', $this->fancyurlfix);
} }
public function onRouterInitialized($m) public function onRouterInitialized($m)
@ -104,25 +106,32 @@ class WebFingerPlugin extends Plugin
$user = User::getByUri($resource); $user = User::getByUri($resource);
$profile = $user->getProfile(); $profile = $user->getProfile();
} catch (NoResultException $e) { } catch (NoResultException $e) {
try { if (common_config('webfinger', 'fancyurlfix')) {
try { // if it's a /index.php/ url try {
// common_fake_local_fancy_url can throw an exception try { // if it's a /index.php/ url
$alt_url = common_fake_local_fancy_url($resource); // common_fake_local_fancy_url can throw an exception
} catch (Exception $e) { // let's try to create a fake local /index.php/ url $alt_url = common_fake_local_fancy_url($resource);
// this too if it can't do anything about the URL } catch (Exception $e) { // let's try to create a fake local /index.php/ url
$alt_url = common_fake_local_nonfancy_url($resource); // this too if it can't do anything about the URL
} $alt_url = common_fake_local_nonfancy_url($resource);
}
// and this will throw a NoResultException if not found // and this will throw a NoResultException if not found
$user = User::getByUri($alt_url); $user = User::getByUri($alt_url);
$profile = $user->getProfile(); $profile = $user->getProfile();
} catch (Exception $e) { } catch (Exception $e) {
// if our rewrite hack didn't work, try to get something by profile URL // apparently we didn't get any matches with that, so continue...
$profile = Profile::getKV('profileurl', $resource); }
} }
} }
} }
// if we still haven't found a match...
if (!$profile instanceof Profile) {
// if our rewrite hack didn't work, try to get something by profile URL
$profile = Profile::getKV('profileurl', $resource);
}
if ($profile instanceof Profile) { if ($profile instanceof Profile) {
$target = new WebFingerResource_Profile($profile); $target = new WebFingerResource_Profile($profile);
return false; // We got our target, stop handler execution return false; // We got our target, stop handler execution

View File

@ -47,33 +47,33 @@ abstract class WebFingerResource
// getUrl failed because no valid URL could be returned, just ignore it // getUrl failed because no valid URL could be returned, just ignore it
} }
/** if (common_config('webfinger', 'fancyurlfix')) {
* Here we add some hacky hotfixes for remote lookups that have been taught the /**
* (at least now) wrong URI but it's still obviously the same user. Such as: * Here we add some hacky hotfixes for remote lookups that have been taught the
* - https://site.example/user/1 even if the client requests https://site.example/index.php/user/1 * (at least now) wrong URI but it's still obviously the same user. Such as:
* - https://site.example/user/1 even if the client requests https://site.example//index.php/user/1 * - https://site.example/user/1 even if the client requests https://site.example/index.php/user/1
* - https://site.example/index.php/user/1 even if the client requests https://site.example/user/1 * - https://site.example/user/1 even if the client requests https://site.example//index.php/user/1
* - https://site.example/index.php/user/1 even if the client requests https://site.example///index.php/user/1 * - https://site.example/index.php/user/1 even if the client requests https://site.example/user/1
*/ * - https://site.example/index.php/user/1 even if the client requests https://site.example///index.php/user/1
*/
foreach(array_keys($aliases) as $alias) {
foreach(array_keys($aliases) as $alias) { try {
try { // get a "fancy url" version of the alias, even without index.php/
// get a "fancy url" version of the alias, even without index.php/ $alt_url = common_fake_local_fancy_url($alias);
$alt_url = common_fake_local_fancy_url($alias); // store this as well so remote sites can be sure we really are the same profile
// store this as well so remote sites can be sure we really are the same profile $aliases[$alt_url] = true;
$aliases[$alt_url] = true; } catch (Exception $e) {
} catch (Exception $e) { // Apparently we couldn't rewrite that, the $alias was as the function wanted it to be
// Apparently we couldn't rewrite that, the $alias was as the function wanted it to be }
}
try {
try { // get a non-"fancy url" version of the alias, i.e. add index.php/
// get a non-"fancy url" version of the alias, i.e. add index.php/ $alt_url = common_fake_local_nonfancy_url($alias);
$alt_url = common_fake_local_nonfancy_url($alias); // store this as well so remote sites can be sure we really are the same profile
// store this as well so remote sites can be sure we really are the same profile $aliases[$alt_url] = true;
$aliases[$alt_url] = true; } catch (Exception $e) {
} catch (Exception $e) { // Apparently we couldn't rewrite that, the $alias was as the function wanted it to be
// Apparently we couldn't rewrite that, the $alias was as the function wanted it to be }
} }
} }