$profile->whereAdd('uri LIKE "%' . $profile->escape($q) . '%"');
$profile->query();
+ $validate = new Validate();
+
if ($profile->N == 0) {
try {
- if (Validate::email($q)) {
+ if ($validate->email($q)) {
$oprofile = Ostatus_profile::ensureWebfinger($q);
- } else if (Validate::uri($q)) {
+ } else if ($validate->uri($q)) {
$oprofile = Ostatus_profile::ensureProfileURL($q);
} else {
// TRANS: Exception in OStatus when invalid URI was entered.
{
$matches = array();
- // Webfinger matches: @user@example.com
- if (preg_match_all('!(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\-?\w+\.)*\w+(?:\w+\-\w+)*\.\w+)!',
+ $wmatches = array();
+ // Webfinger matches: @user@example.com or even @user--one.george_orwell@1984.biz
+ if (preg_match_all('!(?:^|\s+)@((?:\w+[\w\-\_\.]?)*(?:[\w\-\_\.]*\w+)@(?:\w+\-?\w+\.)*\w+(?:\w+\-\w+)*\.\w+)!',
$text,
$wmatches,
PREG_OFFSET_CAPTURE)) {
foreach ($wmatches[1] as $wmatch) {
list($target, $pos) = $wmatch;
$this->log(LOG_INFO, "Checking webfinger '$target'");
+ $profile = null;
try {
$oprofile = Ostatus_profile::ensureWebfinger($target);
- if ($oprofile instanceof Ostatus_profile && !$oprofile->isGroup()) {
- $profile = $oprofile->localProfile();
- $matches[$pos] = array('mentioned' => array($profile),
- 'type' => 'mention',
- 'text' => $target,
- 'position' => $pos,
- 'url' => $profile->getUrl());
+ if (!$oprofile instanceof Ostatus_profile || !$oprofile->isPerson()) {
+ continue;
}
+ $profile = $oprofile->localProfile();
+ } catch (OStatusShadowException $e) {
+ // This means we got a local user in the webfinger lookup
+ $profile = $e->profile;
} catch (Exception $e) {
$this->log(LOG_ERR, "Webfinger check failed: " . $e->getMessage());
+ continue;
+ }
+
+ assert($profile instanceof Profile);
+
+ $text = !empty($profile->nickname) && mb_strlen($profile->nickname) < mb_strlen($target)
+ ? $profile->getNickname() // TODO: we could do getFancyName() or getFullname() here
+ : $target;
+ $url = $profile->getUri();
+ if (!common_valid_http_url($url)) {
+ $url = $profile->getUrl();
}
+ $matches[$pos] = array('mentioned' => array($profile),
+ 'type' => 'mention',
+ 'text' => $text,
+ 'position' => $pos,
+ 'length' => mb_strlen($target),
+ 'url' => $url);
}
}
// Profile matches: @example.com/mublog/user
- if (preg_match_all('!(?:^|\s+)@((?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+(?:/\w+)+)!',
+ if (preg_match_all('!(?:^|\s+)@((?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+(?:/\w+)*)!',
$text,
$wmatches,
PREG_OFFSET_CAPTURE)) {
$oprofile = Ostatus_profile::ensureProfileURL($url);
if ($oprofile instanceof Ostatus_profile && !$oprofile->isGroup()) {
$profile = $oprofile->localProfile();
+ $text = !empty($profile->nickname) && mb_strlen($profile->nickname) < mb_strlen($target) ?
+ $profile->nickname : $target;
$matches[$pos] = array('mentioned' => array($profile),
'type' => 'mention',
- 'text' => $target,
+ 'text' => $text,
'position' => $pos,
+ 'length' => mb_strlen($target),
'url' => $profile->getUrl());
break;
}
return null;
}
+ function onEndProfileSettingsActions($out) {
+ $siteName = common_config('site', 'name');
+ $js = 'navigator.registerContentHandler("application/vnd.mozilla.maybe.feed", "'.addslashes(common_local_url('ostatussub', null, array('profile' => '%s'))).'", "'.addslashes($siteName).'")';
+ $out->elementStart('li');
+ $out->element('a',
+ array('href' => 'javascript:'.$js),
+ // TRANS: Option in profile settings to add this instance to Firefox as a feedreader
+ _('Add to Firefox as feedreader'));
+ $out->elementEnd('li');
+ }
+
/**
* Make sure necessary tables are filled out.
*/
function onStartGetProfileFromURI($uri, &$profile)
{
// Don't want to do Web-based discovery on our own server,
- // so we check locally first.
+ // so we check locally first. This duplicates the functionality
+ // in the Profile class, since the plugin always runs before
+ // that local lookup, but since we return false it won't run double.
$user = User::getKV('uri', $uri);
-
- if (!empty($user)) {
+ if ($user instanceof User) {
$profile = $user->getProfile();
return false;
+ } else {
+ $group = User_group::getKV('uri', $uri);
+ if ($group instanceof User_group) {
+ $profile = $group->getProfile();
+ return false;
+ }
}
// Now, check remotely
-
try {
$oprofile = Ostatus_profile::ensureProfileURI($uri);
$profile = $oprofile->localProfile();
public function onGetLocalAttentions(Profile $actor, array $attention_uris, array &$mentions, array &$groups)
{
- list($mentions, $groups) = Ostatus_profile::filterAttention($actor, $attention_uris);
+ list($groups, $mentions) = Ostatus_profile::filterAttention($actor, $attention_uris);
}
// FIXME: Maybe this shouldn't be so authoritative that it breaks other remote profile lookups?
$client = new HTTPClient();
$client->setBody($envxml);
$response = $client->post($endpoint_uri, $headers);
- } catch (HTTP_Request2_Exception $e) {
+ } catch (Exception $e) {
common_log(LOG_ERR, "Salmon post to $endpoint_uri failed: " . $e->getMessage());
return false;
}