OStatus: fix up remote join button on group profiles

This commit is contained in:
Brion Vibber 2010-03-03 14:06:05 -08:00
parent 4bad176088
commit 628338265c
2 changed files with 44 additions and 11 deletions

View File

@ -49,6 +49,8 @@ class OStatusPlugin extends Plugin
array('action' => 'ostatusinit')); array('action' => 'ostatusinit'));
$m->connect('main/ostatus?nickname=:nickname', $m->connect('main/ostatus?nickname=:nickname',
array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+')); array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+'));
$m->connect('main/ostatus?group=:group',
array('action' => 'ostatusinit'), array('group' => '[A-Za-z0-9_-]+'));
$m->connect('main/ostatussub', $m->connect('main/ostatussub',
array('action' => 'ostatussub')); array('action' => 'ostatussub'));
$m->connect('main/ostatusgroup', $m->connect('main/ostatusgroup',
@ -217,7 +219,7 @@ class OStatusPlugin extends Plugin
if (empty($cur)) { if (empty($cur)) {
// Add an OStatus subscribe // Add an OStatus subscribe
$url = common_local_url('ostatusinit', $url = common_local_url('ostatusinit',
array('nickname' => $group->nickname)); array('group' => $group->nickname));
$output->element('a', array('href' => $url, $output->element('a', array('href' => $url,
'class' => 'entity_remote_subscribe'), 'class' => 'entity_remote_subscribe'),
_m('Join')); _m('Join'));

View File

@ -29,6 +29,7 @@ class OStatusInitAction extends Action
{ {
var $nickname; var $nickname;
var $group;
var $profile; var $profile;
var $err; var $err;
@ -41,8 +42,9 @@ class OStatusInitAction extends Action
return false; return false;
} }
// Local user the remote wants to subscribe to // Local user or group the remote wants to subscribe to
$this->nickname = $this->trimmed('nickname'); $this->nickname = $this->trimmed('nickname');
$this->group = $this->trimmed('group');
// Webfinger or profile URL of the remote user // Webfinger or profile URL of the remote user
$this->profile = $this->trimmed('profile'); $this->profile = $this->trimmed('profile');
@ -89,25 +91,33 @@ class OStatusInitAction extends Action
function showContent() function showContent()
{ {
if ($this->group) {
$header = sprintf(_m('Join group %s'), $this->group);
$submit = _m('Join');
} else {
$header = sprintf(_m('Subscribe to %s'), $this->nickname);
$submit = _m('Subscribe');
}
$this->elementStart('form', array('id' => 'form_ostatus_connect', $this->elementStart('form', array('id' => 'form_ostatus_connect',
'method' => 'post', 'method' => 'post',
'class' => 'form_settings', 'class' => 'form_settings',
'action' => common_local_url('ostatusinit'))); 'action' => common_local_url('ostatusinit')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->element('legend', null, sprintf(_m('Subscribe to %s'), $this->nickname)); $this->element('legend', null, $header);
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li', array('id' => 'ostatus_nickname')); $this->elementStart('li', array('id' => 'ostatus_nickname'));
$this->input('nickname', _m('User nickname'), $this->nickname, $this->input('nickname', _m('User nickname'), $this->nickname,
_m('Nickname of the user you want to follow')); _m('Nickname of the user you want to follow'));
$this->hidden('group', $this->group); // pass-through for magic links
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li', array('id' => 'ostatus_profile')); $this->elementStart('li', array('id' => 'ostatus_profile'));
$this->input('profile', _m('Profile Account'), $this->profile, $this->input('profile', _m('Profile Account'), $this->profile,
_m('Your account id (i.e. user@identi.ca)')); _m('Your account id (i.e. user@identi.ca)'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('submit', _m('Subscribe')); $this->submit('submit', $submit);
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
@ -131,19 +141,17 @@ class OStatusInitAction extends Action
function connectWebfinger($acct) function connectWebfinger($acct)
{ {
$disco = new Discovery; $target_profile = $this->targetProfile();
$disco = new Discovery;
$result = $disco->lookup($acct); $result = $disco->lookup($acct);
if (!$result) { if (!$result) {
$this->clientError(_m("Couldn't look up OStatus account profile.")); $this->clientError(_m("Couldn't look up OStatus account profile."));
} }
foreach ($result->links as $link) { foreach ($result->links as $link) {
if ($link['rel'] == 'http://ostatus.org/schema/1.0/subscribe') { if ($link['rel'] == 'http://ostatus.org/schema/1.0/subscribe') {
// We found a URL - let's redirect! // We found a URL - let's redirect!
$user = User::staticGet('nickname', $this->nickname);
$target_profile = common_local_url('userbyid', array('id' => $user->id));
$url = Discovery::applyTemplate($link['template'], $target_profile); $url = Discovery::applyTemplate($link['template'], $target_profile);
common_log(LOG_INFO, "Sending remote subscriber $acct to $url"); common_log(LOG_INFO, "Sending remote subscriber $acct to $url");
common_redirect($url, 303); common_redirect($url, 303);
@ -155,8 +163,7 @@ class OStatusInitAction extends Action
function connectProfile($subscriber_profile) function connectProfile($subscriber_profile)
{ {
$user = User::staticGet('nickname', $this->nickname); $target_profile = $this->targetProfile();
$target_profile = common_local_url('userbyid', array('id' => $user->id));
// @fixme hack hack! We should look up the remote sub URL from XRDS // @fixme hack hack! We should look up the remote sub URL from XRDS
$suburl = preg_replace('!^(.*)/(.*?)$!', '$1/main/ostatussub', $subscriber_profile); $suburl = preg_replace('!^(.*)/(.*?)$!', '$1/main/ostatussub', $subscriber_profile);
@ -166,6 +173,30 @@ class OStatusInitAction extends Action
common_redirect($suburl, 303); common_redirect($suburl, 303);
} }
/**
* Build the canonical profile URI+URL of the requested user or group
*/
function targetProfile()
{
if ($this->nickname) {
$user = User::staticGet('nickname', $this->nickname);
if ($user) {
return common_local_url('userbyid', array('id' => $user->id));
} else {
$this->clientError("No such user.");
}
} else if ($this->group) {
$group = Local_group::staticGet('id', $this->group);
if ($group) {
return common_local_url('groupbyid', array('id' => $group->group_id));
} else {
$this->clientError("No such group.");
}
} else {
$this->clientError("No local user or group nickname provided.");
}
}
function title() function title()
{ {
return _m('OStatus Connect'); return _m('OStatus Connect');