Removed legacy OMB. Use OStatus for remote profiles.
This commit is contained in:
parent
e7a4ccb7b5
commit
fcba540a14
|
@ -131,8 +131,6 @@ class ApiAccountUpdateProfileAction extends ApiAuthAction
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
common_broadcast_profile($profile);
|
|
||||||
|
|
||||||
$twitter_user = $this->twitterUserArray($profile, true);
|
$twitter_user = $this->twitterUserArray($profile, true);
|
||||||
|
|
||||||
if ($this->format == 'xml') {
|
if ($this->format == 'xml') {
|
||||||
|
|
|
@ -97,8 +97,6 @@ class ApiAccountUpdateProfileImageAction extends ApiAuthAction
|
||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
$profile->setOriginal($filename);
|
$profile->setOriginal($filename);
|
||||||
|
|
||||||
common_broadcast_profile($profile);
|
|
||||||
|
|
||||||
$twitter_user = $this->twitterUserArray($profile, true);
|
$twitter_user = $this->twitterUserArray($profile, true);
|
||||||
|
|
||||||
if ($this->format == 'xml') {
|
if ($this->format == 'xml') {
|
||||||
|
|
|
@ -386,7 +386,6 @@ class AvatarsettingsAction extends SettingsAction
|
||||||
$this->mode = 'upload';
|
$this->mode = 'upload';
|
||||||
// TRANS: Success message for having updated a user avatar.
|
// TRANS: Success message for having updated a user avatar.
|
||||||
$this->showForm(_('Avatar updated.'), true);
|
$this->showForm(_('Avatar updated.'), true);
|
||||||
common_broadcast_profile($profile);
|
|
||||||
} else {
|
} else {
|
||||||
// TRANS: Error displayed on the avatar upload page if the avatar could not be updated for an unknown reason.
|
// TRANS: Error displayed on the avatar upload page if the avatar could not be updated for an unknown reason.
|
||||||
$this->showForm(_('Failed updating avatar.'));
|
$this->showForm(_('Failed updating avatar.'));
|
||||||
|
|
|
@ -427,7 +427,6 @@ class ProfilesettingsAction extends SettingsAction
|
||||||
|
|
||||||
$user->query('COMMIT');
|
$user->query('COMMIT');
|
||||||
Event::handle('EndProfileSaveForm', array($this));
|
Event::handle('EndProfileSaveForm', array($this));
|
||||||
common_broadcast_profile($profile);
|
|
||||||
|
|
||||||
// TRANS: Confirmation shown when user profile settings are saved.
|
// TRANS: Confirmation shown when user profile settings are saved.
|
||||||
$this->showForm(_('Settings saved.'), true);
|
$this->showForm(_('Settings saved.'), true);
|
||||||
|
|
|
@ -35,8 +35,7 @@ if (!defined('STATUSNET')) {
|
||||||
/**
|
/**
|
||||||
* Subscription action
|
* Subscription action
|
||||||
*
|
*
|
||||||
* Subscribing to a profile. Does not work for OMB 0.1 remote subscriptions,
|
* Subscribing to a profile. Likely to work for OStatus profiles.
|
||||||
* but may work for other remote subscription protocols, like OStatus.
|
|
||||||
*
|
*
|
||||||
* Takes parameters:
|
* Takes parameters:
|
||||||
*
|
*
|
||||||
|
|
|
@ -1376,7 +1376,7 @@ class Profile extends Managed_DataObject
|
||||||
$profile = null;
|
$profile = null;
|
||||||
|
|
||||||
if (Event::handle('StartGetProfileFromURI', array($uri, &$profile))) {
|
if (Event::handle('StartGetProfileFromURI', array($uri, &$profile))) {
|
||||||
// Get a local user or remote (OMB 0.1) profile
|
// Get a local user
|
||||||
$user = User::getKV('uri', $uri);
|
$user = User::getKV('uri', $uri);
|
||||||
if (!empty($user)) {
|
if (!empty($user)) {
|
||||||
$profile = $user->getProfile();
|
$profile = $user->getProfile();
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008, 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Table Definition for remote_profile
|
|
||||||
*/
|
|
||||||
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
|
|
||||||
|
|
||||||
class Remote_profile extends Managed_DataObject
|
|
||||||
{
|
|
||||||
###START_AUTOCODE
|
|
||||||
/* the code below is auto generated do not remove the above tag */
|
|
||||||
|
|
||||||
public $__table = 'remote_profile'; // table name
|
|
||||||
public $id; // int(4) primary_key not_null
|
|
||||||
public $uri; // varchar(255) unique_key
|
|
||||||
public $postnoticeurl; // varchar(255)
|
|
||||||
public $updateprofileurl; // varchar(255)
|
|
||||||
public $created; // datetime() not_null
|
|
||||||
public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP
|
|
||||||
|
|
||||||
/* the code above is auto generated do not remove the tag below */
|
|
||||||
###END_AUTOCODE
|
|
||||||
|
|
||||||
function hasRight($right)
|
|
||||||
{
|
|
||||||
$profile = Profile::getKV($this->id);
|
|
||||||
if ($profile) {
|
|
||||||
return $profile->hasright($right);
|
|
||||||
} else {
|
|
||||||
// TRANS: Exception thrown when a right for a non-existing user profile is checked.
|
|
||||||
throw new Exception(_("Missing profile."));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function schemaDef()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
'description' => 'remote people (OMB)',
|
|
||||||
'fields' => array(
|
|
||||||
'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'),
|
|
||||||
'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'),
|
|
||||||
'postnoticeurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL we use for posting notices'),
|
|
||||||
'updateprofileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL we use for updates to this profile'),
|
|
||||||
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
|
|
||||||
'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
|
|
||||||
),
|
|
||||||
'primary key' => array('id'),
|
|
||||||
'unique keys' => array(
|
|
||||||
'remote_profile_uri_key' => array('uri'),
|
|
||||||
),
|
|
||||||
'foreign keys' => array(
|
|
||||||
'remote_profile_id_fkey' => array('profile', array('id' => 'id')),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -34,7 +34,6 @@ $classes = array('Schema_version',
|
||||||
'Avatar',
|
'Avatar',
|
||||||
'Sms_carrier',
|
'Sms_carrier',
|
||||||
'User',
|
'User',
|
||||||
'Remote_profile',
|
|
||||||
'Subscription',
|
'Subscription',
|
||||||
'Group_join_queue',
|
'Group_join_queue',
|
||||||
'Subscription_queue',
|
'Subscription_queue',
|
||||||
|
|
|
@ -770,12 +770,6 @@ class SubCommand extends Command
|
||||||
|
|
||||||
$target = $this->getProfile($this->other);
|
$target = $this->getProfile($this->other);
|
||||||
|
|
||||||
$remote = Remote_profile::getKV('id', $target->id);
|
|
||||||
if ($remote) {
|
|
||||||
// TRANS: Command exception text shown when trying to subscribe to an OMB profile using the subscribe command.
|
|
||||||
throw new CommandException(_("Can't subscribe to OMB profiles by command."));
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Subscription::start($this->user->getProfile(), $target);
|
Subscription::start($this->user->getProfile(), $target);
|
||||||
// TRANS: Text shown after having subscribed to another user successfully.
|
// TRANS: Text shown after having subscribed to another user successfully.
|
||||||
|
|
|
@ -300,8 +300,6 @@ $default =
|
||||||
'location' =>
|
'location' =>
|
||||||
array('share' => 'user', // whether to share location; 'always', 'user', 'never'
|
array('share' => 'user', // whether to share location; 'always', 'user', 'never'
|
||||||
'sharedefault' => false),
|
'sharedefault' => false),
|
||||||
'omb' =>
|
|
||||||
array('timeout' => 5), // HTTP request timeout in seconds when contacting remote hosts for OMB updates
|
|
||||||
'logincommand' =>
|
'logincommand' =>
|
||||||
array('disabled' => true),
|
array('disabled' => true),
|
||||||
'plugins' =>
|
'plugins' =>
|
||||||
|
|
|
@ -259,16 +259,12 @@ abstract class Installer
|
||||||
*/
|
*/
|
||||||
function validateSiteProfile()
|
function validateSiteProfile()
|
||||||
{
|
{
|
||||||
$fail = false;
|
if (empty($this->siteProfile)) {
|
||||||
|
|
||||||
$sprofile = $this->siteProfile;
|
|
||||||
|
|
||||||
if (empty($sprofile)) {
|
|
||||||
$this->updateStatus("No site profile selected.", true);
|
$this->updateStatus("No site profile selected.", true);
|
||||||
$fail = true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !$fail;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -563,6 +559,8 @@ abstract class Installer
|
||||||
*/
|
*/
|
||||||
function doInstall()
|
function doInstall()
|
||||||
{
|
{
|
||||||
|
global $config;
|
||||||
|
|
||||||
$this->updateStatus("Initializing...");
|
$this->updateStatus("Initializing...");
|
||||||
ini_set('display_errors', 1);
|
ini_set('display_errors', 1);
|
||||||
error_reporting(E_ALL);
|
error_reporting(E_ALL);
|
||||||
|
@ -572,9 +570,15 @@ abstract class Installer
|
||||||
if (!defined('STATUSNET')) {
|
if (!defined('STATUSNET')) {
|
||||||
define('STATUSNET', true);
|
define('STATUSNET', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once INSTALLDIR . '/lib/framework.php';
|
require_once INSTALLDIR . '/lib/framework.php';
|
||||||
StatusNet::initDefaults($this->server, $this->path);
|
StatusNet::initDefaults($this->server, $this->path);
|
||||||
|
|
||||||
|
if ($this->siteProfile == "singleuser") {
|
||||||
|
// Until we use ['site']['profile']==='singleuser' everywhere
|
||||||
|
$config['singleuser']['enabled'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->db = $this->setupDatabase();
|
$this->db = $this->setupDatabase();
|
||||||
if (!$this->db) {
|
if (!$this->db) {
|
||||||
|
|
|
@ -136,7 +136,6 @@ class Snapshot
|
||||||
$tables = array('user',
|
$tables = array('user',
|
||||||
'notice',
|
'notice',
|
||||||
'subscription',
|
'subscription',
|
||||||
'remote_profile',
|
|
||||||
'user_group');
|
'user_group');
|
||||||
|
|
||||||
foreach ($tables as $table) {
|
foreach ($tables as $table) {
|
||||||
|
|
15
lib/util.php
15
lib/util.php
|
@ -1513,21 +1513,6 @@ function common_enqueue_notice($notice)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Legacy function to broadcast profile updates to OMB remote subscribers.
|
|
||||||
*
|
|
||||||
* XXX: This probably needs killing, but there are several bits of code
|
|
||||||
* that broadcast profile changes that need to be dealt with. AFAIK
|
|
||||||
* this function is only used for OMB. -z
|
|
||||||
*
|
|
||||||
* Since this may be slow with a lot of subscribers or bad remote sites,
|
|
||||||
* this is run through the background queues if possible.
|
|
||||||
*/
|
|
||||||
function common_broadcast_profile(Profile $profile)
|
|
||||||
{
|
|
||||||
Event::handle('BroadcastProfile', array($profile));
|
|
||||||
}
|
|
||||||
|
|
||||||
function common_profile_url($nickname)
|
function common_profile_url($nickname)
|
||||||
{
|
{
|
||||||
return common_local_url('showstream', array('nickname' => $nickname),
|
return common_local_url('showstream', array('nickname' => $nickname),
|
||||||
|
|
|
@ -633,7 +633,6 @@ class ProfileDetailSettingsAction extends ProfileSettingsAction
|
||||||
}
|
}
|
||||||
|
|
||||||
Event::handle('EndProfileSaveForm', array($this));
|
Event::handle('EndProfileSaveForm', array($this));
|
||||||
common_broadcast_profile($profile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,381 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* OpenMicroBlogging plugin - add OpenMicroBloggin 0.1 support to
|
|
||||||
* StatusNet.
|
|
||||||
*
|
|
||||||
* Note: the OpenMicroBlogging protocol has been deprecated in favor of OStatus.
|
|
||||||
* This plugin is provided for backwards compatibility and experimentation.
|
|
||||||
*
|
|
||||||
* Please see the README and the OStatus plugin.
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @category Sample
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Zach Copley
|
|
||||||
* @copyright 2011 StatusNet, Inc.
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
|
|
||||||
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/');
|
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
|
||||||
// This check helps protect against security problems;
|
|
||||||
// your code file can't be executed directly from the web.
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OMB plugin main class
|
|
||||||
*
|
|
||||||
* Depends on: WebFinger plugin
|
|
||||||
*
|
|
||||||
* @category Integration
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Zach Copley <zach@status.net>
|
|
||||||
* @copyright 2011 StatusNet, Inc.
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class OMBPlugin extends Plugin
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Map URLs to actions
|
|
||||||
*
|
|
||||||
* @param Net_URL_Mapper $m path-to-action mapper
|
|
||||||
*
|
|
||||||
* @return boolean hook value; true means continue processing, false means stop.
|
|
||||||
*/
|
|
||||||
function onRouterInitialized($m)
|
|
||||||
{
|
|
||||||
$bare = array(
|
|
||||||
'requesttoken',
|
|
||||||
'accesstoken',
|
|
||||||
'userauthorization',
|
|
||||||
'postnotice',
|
|
||||||
'updateprofile',
|
|
||||||
'finishremotesubscribe'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($bare as $action) {
|
|
||||||
$m->connect(
|
|
||||||
'index.php?action=' . $action, array('action' => $action)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// exceptional
|
|
||||||
|
|
||||||
$m->connect('main/remote', array('action' => 'remotesubscribe'));
|
|
||||||
$m->connect(
|
|
||||||
'main/remote?nickname=:nickname',
|
|
||||||
array('action' => 'remotesubscribe'),
|
|
||||||
array('nickname' => '[A-Za-z0-9_-]+')
|
|
||||||
);
|
|
||||||
|
|
||||||
$m->connect(
|
|
||||||
'xrds',
|
|
||||||
array('action' => 'xrds', 'nickname' => $nickname)
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Put saved notices into the queue for OMB distribution
|
|
||||||
*
|
|
||||||
* @param Notice $notice the notice to broadcast
|
|
||||||
* @param array $transports queuehandler's list of transports
|
|
||||||
* @return boolean true if queing was successful
|
|
||||||
*/
|
|
||||||
function onStartEnqueueNotice($notice, &$transports)
|
|
||||||
{
|
|
||||||
if ($notice->isLocal()) {
|
|
||||||
if ($notice->inScope(null)) {
|
|
||||||
array_unshift($transports, 'omb');
|
|
||||||
common_log(
|
|
||||||
LOG_INFO, "Notice {$notice->id} queued for OMB processing"
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// Note: We don't do privacy-controlled OMB updates.
|
|
||||||
common_log(
|
|
||||||
LOG_NOTICE,
|
|
||||||
"Not queueing notice {$notice->id} for OMB because of "
|
|
||||||
. "privacy; scope = {$notice->scope}",
|
|
||||||
__FILE__
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
common_log(
|
|
||||||
LOG_NOTICE,
|
|
||||||
"Not queueing notice {$notice->id} for OMB because it's not "
|
|
||||||
. "local.",
|
|
||||||
__FILE__
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up queue handlers for outgoing OMB pushes
|
|
||||||
*
|
|
||||||
* @param QueueManager $qm
|
|
||||||
* @return boolean hook return
|
|
||||||
*/
|
|
||||||
function onEndInitializeQueueManager(QueueManager $qm)
|
|
||||||
{
|
|
||||||
// Prepare outgoing distributions after notice save.
|
|
||||||
$qm->connect('omb', 'OmbQueueHandler');
|
|
||||||
$qm->connect('profile', 'ProfileQueueHandler');
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return OMB remote profile, if any
|
|
||||||
*
|
|
||||||
* @param Profile $profile
|
|
||||||
* @param string $uri
|
|
||||||
* @return boolen false if there's a remote profile
|
|
||||||
*/
|
|
||||||
function onStartGetProfileUri($profile, &$uri)
|
|
||||||
{
|
|
||||||
$remote = Remote_profile::getKV('id', $this->id);
|
|
||||||
if (!empty($remote)) {
|
|
||||||
$uri = $remote->uri;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We can't initiate subscriptions for a remote OMB profile; don't show
|
|
||||||
* subscribe button
|
|
||||||
*
|
|
||||||
* @param type $action
|
|
||||||
*/
|
|
||||||
function onStartShowProfileListSubscribeButton($action)
|
|
||||||
{
|
|
||||||
$remote = Remote_profile::getKV('id', $action->profile->id);
|
|
||||||
if (empty($remote)) {
|
|
||||||
false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check for illegal subscription attempts
|
|
||||||
*
|
|
||||||
* @param Profile $profile subscriber
|
|
||||||
* @param Profile $other subscribee
|
|
||||||
* @return hook return value
|
|
||||||
*/
|
|
||||||
function onStartSubscribe(Profile $profile, Profile $other)
|
|
||||||
{
|
|
||||||
// OMB 0.1 doesn't have a mechanism for local-server-
|
|
||||||
// originated subscription.
|
|
||||||
|
|
||||||
$omb01 = Remote_profile::getKV('id', $other->id);
|
|
||||||
|
|
||||||
if (!empty($omb01)) {
|
|
||||||
throw new ClientException(
|
|
||||||
// TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
_m('You cannot subscribe to an OMB 0.1 '
|
|
||||||
. 'remote profile with this action.'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Throw an error if someone tries to tag a remote profile
|
|
||||||
*
|
|
||||||
* @param Profile $tagger_profile profile of the tagger
|
|
||||||
* @param Profile $tagged_profile profile of the taggee
|
|
||||||
* @param string $tag
|
|
||||||
*
|
|
||||||
* @return true
|
|
||||||
*/
|
|
||||||
function onStartTagProfile($tagger_profile, $tagged_profile, $tag)
|
|
||||||
{
|
|
||||||
// OMB 0.1 doesn't have a mechanism for local-server-
|
|
||||||
// originated tag.
|
|
||||||
|
|
||||||
$omb01 = Remote_profile::getKV('id', $tagged_profile->id);
|
|
||||||
|
|
||||||
if (!empty($omb01)) {
|
|
||||||
$this->clientError(
|
|
||||||
// TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
_m('You cannot list an OMB 0.1 '
|
|
||||||
.'remote profile with this action.')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check to make sure we're not tryng to untag an OMB profile
|
|
||||||
*
|
|
||||||
* // XXX: Should this ever happen?
|
|
||||||
*
|
|
||||||
* @param Profile_tag $ptag the profile tag
|
|
||||||
*/
|
|
||||||
function onUntagProfile($ptag)
|
|
||||||
{
|
|
||||||
// OMB 0.1 doesn't have a mechanism for local-server-
|
|
||||||
// originated tag.
|
|
||||||
|
|
||||||
$omb01 = Remote_profile::getKV('id', $ptag->tagged);
|
|
||||||
|
|
||||||
if (!empty($omb01)) {
|
|
||||||
$this->clientError(
|
|
||||||
// TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
_m('You cannot (un)list an OMB 0.1 '
|
|
||||||
. 'remote profile with this action.')
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove old OMB subscription tokens
|
|
||||||
*
|
|
||||||
* @param Profile $profile subscriber
|
|
||||||
* @param Profile $other subscribee
|
|
||||||
* @return hook return value
|
|
||||||
*/
|
|
||||||
function onEndUnsubscribe(Profile $profile, Profile $other)
|
|
||||||
{
|
|
||||||
$sub = Subscription::pkeyGet(
|
|
||||||
array('subscriber' => $profile->id, 'subscribed' => $other->id)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!empty($sub->token)) {
|
|
||||||
|
|
||||||
$token = new Token();
|
|
||||||
|
|
||||||
$token->tok = $sub->token;
|
|
||||||
|
|
||||||
if ($token->find(true)) {
|
|
||||||
|
|
||||||
$result = $token->delete();
|
|
||||||
|
|
||||||
if (!$result) {
|
|
||||||
common_log_db_error($token, 'DELETE', __FILE__);
|
|
||||||
throw new Exception(
|
|
||||||
// TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
_m('Could not delete subscription OMB token.')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
common_log(
|
|
||||||
LOG_ERR,
|
|
||||||
"Couldn't find credentials with token {$token->tok}",
|
|
||||||
__FILE__
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for an OMB remote profile by URI
|
|
||||||
*
|
|
||||||
* @param string $uri remote profile URI
|
|
||||||
* @param Profile $profile the profile to set
|
|
||||||
* @return boolean hook value
|
|
||||||
*/
|
|
||||||
function onStartGetProfileFromURI($uri, &$profile)
|
|
||||||
{
|
|
||||||
$remote_profile = Remote_profile::getKV('uri', $uri);
|
|
||||||
if (!empty($remote_profile)) {
|
|
||||||
$profile = Profile::getKV('id', $remote_profile->profile_id);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return OMB remote profiles as well as regular profiles
|
|
||||||
* in helper
|
|
||||||
*
|
|
||||||
* @param type $profile
|
|
||||||
* @param type $uri
|
|
||||||
*/
|
|
||||||
function onStartCommonProfileURI($profile, &$uri)
|
|
||||||
{
|
|
||||||
$remote = Remote_profile::getKV($profile->id);
|
|
||||||
if ($remote) {
|
|
||||||
$uri = $remote->uri;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Broadcast a profile over OMB
|
|
||||||
*
|
|
||||||
* @param Profile $profile to broadcast
|
|
||||||
* @return false
|
|
||||||
*/
|
|
||||||
function onBroadcastProfile($profile) {
|
|
||||||
$qm = QueueManager::get();
|
|
||||||
$qm->enqueue($profile, "profile");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function onStartProfileRemoteSubscribe($out, $profile)
|
|
||||||
{
|
|
||||||
$out->elementStart('li', 'entity_subscribe');
|
|
||||||
$url = common_local_url('remotesubscribe',
|
|
||||||
array('nickname' => $this->profile->nickname));
|
|
||||||
$out->element('a', array('href' => $url,
|
|
||||||
'class' => 'entity_remote_subscribe'),
|
|
||||||
// TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
_m('BUTTON','Subscribe'));
|
|
||||||
$out->elementEnd('li');
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin version info
|
|
||||||
*
|
|
||||||
* @param array $versions
|
|
||||||
* @return boolean hook value
|
|
||||||
*/
|
|
||||||
function onPluginVersion(&$versions)
|
|
||||||
{
|
|
||||||
$versions[] = array(
|
|
||||||
'name' => 'OpenMicroBlogging',
|
|
||||||
'version' => STATUSNET_VERSION,
|
|
||||||
'author' => 'Zach Copley',
|
|
||||||
'homepage' => 'http://status.net/wiki/Plugin:Sample',
|
|
||||||
// TRANS: Plugin description.
|
|
||||||
'rawdescription' => _m('A sample plugin to show basics of development for new hackers.')
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
OMB (OpenMicroBlogging) plugin
|
|
||||||
==============================
|
|
||||||
|
|
||||||
This plugin encapsulates OpenMicroBlogging 0.1 functionality. OMB was the
|
|
||||||
original federation protocol for StatusNet, but has been deprecated
|
|
||||||
in favor of OStatus (see the OStatus plugin). This plugin is provided for
|
|
||||||
backward-compatibility with older sites, and for posterity.
|
|
||||||
|
|
||||||
External libraries
|
|
||||||
------------------
|
|
||||||
|
|
||||||
This is provided with the plugin, but you may wish to use a newer version of
|
|
||||||
the library, if and when it becomes available.
|
|
||||||
|
|
||||||
- libomb. a library for implementing OpenMicroBlogging 0.1
|
|
||||||
http://gitorious.org/libomb
|
|
||||||
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
[TODO]
|
|
||||||
|
|
||||||
Offline Processing
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Note: once you have a sizable number of users, sending OMB messages whenever
|
|
||||||
someone posts a message can really slow down your site; it may cause posting
|
|
||||||
to timeout. You may wish to enable queuing and handle OMB communication
|
|
||||||
offline. See the "queues and daemons" section of the main StatusNet README.
|
|
|
@ -1,69 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Access token class
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_provider.php';
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Access token class
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class AccesstokenAction extends Action
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Class handler
|
|
||||||
*
|
|
||||||
* @param array $args query arguments
|
|
||||||
*
|
|
||||||
* @return nothing
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
try {
|
|
||||||
$srv = new OMB_Service_Provider(null, omb_oauth_datastore(),
|
|
||||||
omb_oauth_server());
|
|
||||||
$srv->writeAccessToken();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->serverError($e->getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,158 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Handler for remote subscription finish callback
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
**/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_consumer.php';
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for remote subscription finish callback
|
|
||||||
*
|
|
||||||
* When a remote user subscribes a local user, a redirect to this action is
|
|
||||||
* issued after the remote user authorized their service to subscribe.
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package Laconica
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@controlyourself.ca>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://laconi.ca/
|
|
||||||
*/
|
|
||||||
class FinishremotesubscribeAction extends Action
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Class handler.
|
|
||||||
*
|
|
||||||
* @param array $args query arguments
|
|
||||||
*
|
|
||||||
* @return nothing
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
|
|
||||||
/* Restore session data. RemotesubscribeAction should have stored
|
|
||||||
this entry. */
|
|
||||||
$service = unserialize($_SESSION['oauth_authorization_request']);
|
|
||||||
|
|
||||||
if (!$service) {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile and an unexpected response is received.
|
|
||||||
$this->clientError(_('Not expecting this response!'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
common_debug('stored request: '. print_r($service, true), __FILE__);
|
|
||||||
|
|
||||||
/* Create user objects for both users. Do it early for request
|
|
||||||
validation. */
|
|
||||||
$user = User::getKV('uri', $service->getListeneeURI());
|
|
||||||
|
|
||||||
if (!$user) {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile that does not exist.
|
|
||||||
$this->clientError(_('User being listened to does not exist.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$other = User::getKV('uri', $service->getListenerURI());
|
|
||||||
|
|
||||||
if ($other) {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile that is a local profile.
|
|
||||||
$this->clientError(_('You can use the local subscription!'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$remote = Remote_profile::getKV('uri', $service->getListenerURI());
|
|
||||||
if ($remote) {
|
|
||||||
// Note remote profile may not have been saved yet.
|
|
||||||
// @fixme not convinced this is correct at all!
|
|
||||||
|
|
||||||
$profile = Profile::getKV($remote->id);
|
|
||||||
|
|
||||||
if ($user->hasBlocked($profile)) {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile that is blocked form subscribing to.
|
|
||||||
$this->clientError(_('That user has blocked you from subscribing.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform the handling itself via libomb. */
|
|
||||||
try {
|
|
||||||
$service->finishAuthorization();
|
|
||||||
} catch (OAuthException $e) {
|
|
||||||
if ($e->getMessage() == 'The authorized token does not equal the ' .
|
|
||||||
'submitted token.') {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile without providing an authorised token.
|
|
||||||
$this->clientError(_('You are not authorized.'));
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile and conversion of the request token to access token fails.
|
|
||||||
$this->clientError(_('Could not convert request token to ' .
|
|
||||||
'access token.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (OMB_RemoteServiceException $e) {
|
|
||||||
// TRANS: Client error displayed when subscribing to a remote profile fails because of an unsupported version of the OMB protocol.
|
|
||||||
$this->clientError(_('Remote service uses unknown version of ' .
|
|
||||||
'OMB protocol.'));
|
|
||||||
return;
|
|
||||||
} catch (Exception $e) {
|
|
||||||
common_debug('Got exception ' . print_r($e, true), __FILE__);
|
|
||||||
$this->clientError($e->getMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The service URLs are not accessible from datastore, so setting them
|
|
||||||
after insertion of the profile. */
|
|
||||||
$remote = Remote_profile::getKV('uri', $service->getListenerURI());
|
|
||||||
$orig_remote = clone($remote);
|
|
||||||
|
|
||||||
$remote->postnoticeurl =
|
|
||||||
$service->getServiceURI(OMB_ENDPOINT_POSTNOTICE);
|
|
||||||
$remote->updateprofileurl =
|
|
||||||
$service->getServiceURI(OMB_ENDPOINT_UPDATEPROFILE);
|
|
||||||
|
|
||||||
if (!$remote->update($orig_remote)) {
|
|
||||||
// TRANS: Server error displayed when subscribing to a remote profile fails because the remote profile could not be updated.
|
|
||||||
$this->serverError(_('Error updating remote profile.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the session data. */
|
|
||||||
unset($_SESSION['oauth_authorization_request']);
|
|
||||||
|
|
||||||
/* If we show subscriptions in reverse chronological order, the new one
|
|
||||||
should show up close to the top of the page. */
|
|
||||||
common_redirect(common_local_url('subscribers', array('nickname' =>
|
|
||||||
$user->nickname)),
|
|
||||||
303);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,109 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Handle postnotice action
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_provider.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for postnotice action
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class PostnoticeAction extends Action
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* For initializing members of the class.
|
|
||||||
*
|
|
||||||
* @param array $argarray misc. arguments
|
|
||||||
*
|
|
||||||
* @return boolean true
|
|
||||||
*/
|
|
||||||
function prepare($argarray)
|
|
||||||
{
|
|
||||||
StatusNet::setApi(true); // Send smaller error pages
|
|
||||||
|
|
||||||
parent::prepare($argarray);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$this->checkNotice();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->clientError($e->getMessage());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
try {
|
|
||||||
$srv = new OMB_Service_Provider(null, omb_oauth_datastore(),
|
|
||||||
omb_oauth_server());
|
|
||||||
$srv->handlePostNotice();
|
|
||||||
} catch (OMB_RemoteServiceException $rse) {
|
|
||||||
$msg = $rse->getMessage();
|
|
||||||
if (preg_match('/Revoked accesstoken/', $msg) ||
|
|
||||||
preg_match('/No subscriber/', $msg)) {
|
|
||||||
$this->clientError($msg, 403);
|
|
||||||
} else {
|
|
||||||
$this->clientError($msg);
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->serverError($e->getMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkNotice()
|
|
||||||
{
|
|
||||||
$content = common_shorten_links($_POST['omb_notice_content']);
|
|
||||||
if (Notice::contentTooLong($content)) {
|
|
||||||
// TRANS: Client error displayed if the notice posted has too many characters.
|
|
||||||
$this->clientError(_('Invalid notice content.'), 400);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$license = $_POST['omb_notice_license'];
|
|
||||||
$site_license = common_config('license', 'url');
|
|
||||||
if ($license && !common_compatible_license($license, $site_license)) {
|
|
||||||
// TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
|
|
||||||
// TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
|
|
||||||
throw new Exception(sprintf(_('Notice license "%1$s" is not ' .
|
|
||||||
'compatible with site license "%2$s".'),
|
|
||||||
$license, $site_license));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,224 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Handler for remote subscription
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011 StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
**/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_consumer.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/profile.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for remote subscription
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class RemotesubscribeAction extends Action
|
|
||||||
{
|
|
||||||
var $nickname;
|
|
||||||
var $profile_url;
|
|
||||||
var $err;
|
|
||||||
|
|
||||||
function prepare($args)
|
|
||||||
{
|
|
||||||
parent::prepare($args);
|
|
||||||
|
|
||||||
if (common_logged_in()) {
|
|
||||||
// TRANS: Client error displayed when using remote subscribe for a local entity.
|
|
||||||
$this->clientError(_('You can use the local subscription!'));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->nickname = $this->trimmed('nickname');
|
|
||||||
$this->profile_url = $this->trimmed('profile_url');
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
||||||
/* Use a session token for CSRF protection. */
|
|
||||||
$token = $this->trimmed('token');
|
|
||||||
if (!$token || $token != common_session_token()) {
|
|
||||||
// TRANS: Client error displayed when the session token does not match or is not given.
|
|
||||||
$this->showForm(_('There was a problem with your session token. '.
|
|
||||||
'Try again, please.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$this->remoteSubscription();
|
|
||||||
} else {
|
|
||||||
$this->showForm();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showForm($err=null)
|
|
||||||
{
|
|
||||||
$this->err = $err;
|
|
||||||
$this->showPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
function showPageNotice()
|
|
||||||
{
|
|
||||||
if ($this->err) {
|
|
||||||
$this->element('div', 'error', $this->err);
|
|
||||||
} else {
|
|
||||||
// TRANS: Page notice for remote subscribe. This message contains Markdown links.
|
|
||||||
// TRANS: Ensure to keep the correct markup of [link description](link).
|
|
||||||
$inst = _('To subscribe, you can [login](%%action.login%%),' .
|
|
||||||
' or [register](%%action.register%%) a new ' .
|
|
||||||
' account. If you already have an account ' .
|
|
||||||
' on a [compatible microblogging site](%%doc.openmublog%%), ' .
|
|
||||||
' enter your profile URL below.');
|
|
||||||
$output = common_markup_to_html($inst);
|
|
||||||
$this->elementStart('div', 'instructions');
|
|
||||||
$this->raw($output);
|
|
||||||
$this->elementEnd('div');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function title()
|
|
||||||
{
|
|
||||||
// TRANS: Page title for Remote subscribe.
|
|
||||||
return _('Remote subscribe');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showContent()
|
|
||||||
{
|
|
||||||
/* The id 'remotesubscribe' conflicts with the
|
|
||||||
button on profile page. */
|
|
||||||
$this->elementStart('form', array('id' => 'form_remote_subscribe',
|
|
||||||
'method' => 'post',
|
|
||||||
'class' => 'form_settings',
|
|
||||||
'action' => common_local_url('remotesubscribe')));
|
|
||||||
$this->elementStart('fieldset');
|
|
||||||
// TRANS: Field legend on page for remote subscribe.
|
|
||||||
$this->element('legend', _('Subscribe to a remote user'));
|
|
||||||
$this->hidden('token', common_session_token());
|
|
||||||
|
|
||||||
$this->elementStart('ul', 'form_data');
|
|
||||||
$this->elementStart('li');
|
|
||||||
// TRANS: Field label on page for remote subscribe.
|
|
||||||
$this->input('nickname', _('User nickname'), $this->nickname,
|
|
||||||
// TRANS: Field title on page for remote subscribe.
|
|
||||||
_('Nickname of the user you want to follow.'));
|
|
||||||
$this->elementEnd('li');
|
|
||||||
$this->elementStart('li');
|
|
||||||
// TRANS: Field label on page for remote subscribe.
|
|
||||||
$this->input('profile_url', _('Profile URL'), $this->profile_url,
|
|
||||||
// TRANS: Field title on page for remote subscribe.
|
|
||||||
_('URL of your profile on another compatible microblogging service.'));
|
|
||||||
$this->elementEnd('li');
|
|
||||||
$this->elementEnd('ul');
|
|
||||||
// TRANS: Button text on page for remote subscribe.
|
|
||||||
$this->submit('submit', _m('BUTTON','Subscribe'));
|
|
||||||
$this->elementEnd('fieldset');
|
|
||||||
$this->elementEnd('form');
|
|
||||||
}
|
|
||||||
|
|
||||||
function remoteSubscription()
|
|
||||||
{
|
|
||||||
if (!$this->nickname) {
|
|
||||||
// TRANS: Form validation error on page for remote subscribe when no user was provided.
|
|
||||||
$this->showForm(_('No such user.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$user = User::getKV('nickname', $this->nickname);
|
|
||||||
|
|
||||||
$this->profile_url = $this->trimmed('profile_url');
|
|
||||||
|
|
||||||
if (!$this->profile_url) {
|
|
||||||
// TRANS: Form validation error on page for remote subscribe when no user profile was found.
|
|
||||||
$this->showForm(_('No such user.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!common_valid_http_url($this->profile_url)) {
|
|
||||||
// TRANS: Form validation error on page for remote subscribe when an invalid profile URL was provided.
|
|
||||||
$this->showForm(_('Invalid profile URL (bad format).'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$service = new OMB_Service_Consumer($this->profile_url,
|
|
||||||
common_root_url(),
|
|
||||||
omb_oauth_datastore());
|
|
||||||
} catch (OMB_InvalidYadisException $e) {
|
|
||||||
// TRANS: Form validation error on page for remote subscribe when no the provided profile URL
|
|
||||||
// TRANS: does not contain expected data.
|
|
||||||
$this->showForm(_('Not a valid profile URL (no YADIS document or ' .
|
|
||||||
'invalid XRDS defined).'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($service->getServiceURI(OAUTH_ENDPOINT_REQUEST) ==
|
|
||||||
common_local_url('requesttoken') ||
|
|
||||||
User::getKV('uri', $service->getRemoteUserURI())) {
|
|
||||||
// TRANS: Form validation error on page for remote subscribe.
|
|
||||||
$this->showForm(_('That is a local profile! Login to subscribe.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$service->requestToken();
|
|
||||||
} catch (OMB_RemoteServiceException $e) {
|
|
||||||
// TRANS: Form validation error on page for remote subscribe when the remote service is not providing a request token.
|
|
||||||
$this->showForm(_('Could not get a request token.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create an OMB_Profile from $user. */
|
|
||||||
$profile = $user->getProfile();
|
|
||||||
if (!$profile) {
|
|
||||||
common_log_db_error($user, 'SELECT', __FILE__);
|
|
||||||
// TRANS: Error message displayed when referring to a user without a profile.
|
|
||||||
$this->serverError(_('User has no profile.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$target_url = $service->requestAuthorization(
|
|
||||||
profile_to_omb_profile($user->uri, $profile),
|
|
||||||
common_local_url('finishremotesubscribe'));
|
|
||||||
|
|
||||||
common_ensure_session();
|
|
||||||
|
|
||||||
$_SESSION['oauth_authorization_request'] = serialize($service);
|
|
||||||
|
|
||||||
/* Redirect to the remote service for authorization. */
|
|
||||||
common_redirect($target_url, 303);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Request token action class.
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_provider.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request token action class.
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class RequesttokenAction extends Action
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Is read only?
|
|
||||||
*
|
|
||||||
* @return boolean false
|
|
||||||
*/
|
|
||||||
function isReadOnly()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class handler.
|
|
||||||
*
|
|
||||||
* @param array $args array of arguments
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
try {
|
|
||||||
$srv = new OMB_Service_Provider(null, omb_oauth_datastore(),
|
|
||||||
omb_oauth_server());
|
|
||||||
$srv->writeRequestToken();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->serverError($e->getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,94 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Handle an updateprofile action
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_provider.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an updateprofile action
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package Laconica
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@controlyourself.ca>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://laconi.ca/
|
|
||||||
*/
|
|
||||||
class UpdateprofileAction extends Action
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* For initializing members of the class.
|
|
||||||
*
|
|
||||||
* @param array $argarray misc. arguments
|
|
||||||
*
|
|
||||||
* @return boolean true
|
|
||||||
*/
|
|
||||||
function prepare($argarray)
|
|
||||||
{
|
|
||||||
StatusNet::setApi(true); // Send smaller error pages
|
|
||||||
|
|
||||||
parent::prepare($argarray);
|
|
||||||
$license = $_POST['omb_listenee_license'];
|
|
||||||
$site_license = common_config('license', 'url');
|
|
||||||
if (!common_compatible_license($license, $site_license)) {
|
|
||||||
// TRANS: Client error displayed when trying to update profile with an incompatible license.
|
|
||||||
// TRANS: %1$s is the license incompatible with site license %2$s.
|
|
||||||
$this->clientError(sprintf(_('Listenee stream license "%1$s" is not '.
|
|
||||||
'compatible with site license "%2$s".'),
|
|
||||||
$license, $site_license));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$srv = new OMB_Service_Provider(null, omb_oauth_datastore(),
|
|
||||||
omb_oauth_server());
|
|
||||||
$srv->handleUpdateProfile();
|
|
||||||
} catch (OMB_RemoteServiceException $rse) {
|
|
||||||
$msg = $rse->getMessage();
|
|
||||||
if (preg_match('/Revoked accesstoken/', $msg) ||
|
|
||||||
preg_match('/No subscriber/', $msg)) {
|
|
||||||
$this->clientError($msg, 403);
|
|
||||||
} else {
|
|
||||||
$this->clientError($msg);
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->serverError($e->getMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,371 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Let the user authorize a remote subscription request
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_provider.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/profile.php';
|
|
||||||
define('TIMESTAMP_THRESHOLD', 300);
|
|
||||||
|
|
||||||
// @todo FIXME: Missing documentation.
|
|
||||||
class UserauthorizationAction extends Action
|
|
||||||
{
|
|
||||||
var $error;
|
|
||||||
var $params;
|
|
||||||
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
||||||
/* Use a session token for CSRF protection. */
|
|
||||||
$token = $this->trimmed('token');
|
|
||||||
if (!$token || $token != common_session_token()) {
|
|
||||||
$srv = $this->getStoredParams();
|
|
||||||
// TRANS: Client error displayed when the session token does not match or is not given.
|
|
||||||
$this->showForm($srv->getRemoteUser(), _('There was a problem ' .
|
|
||||||
'with your session token. Try again, ' .
|
|
||||||
'please.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* We've shown the form, now post user's choice. */
|
|
||||||
$this->sendAuthorization();
|
|
||||||
} else {
|
|
||||||
if (!common_logged_in()) {
|
|
||||||
/* Go log in, and then come back. */
|
|
||||||
common_set_returnto($_SERVER['REQUEST_URI']);
|
|
||||||
|
|
||||||
common_redirect(common_local_url('login'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$user = common_current_user();
|
|
||||||
$profile = $user->getProfile();
|
|
||||||
if (!$profile) {
|
|
||||||
common_log_db_error($user, 'SELECT', __FILE__);
|
|
||||||
// TRANS: Error message displayed when referring to a user without a profile.
|
|
||||||
$this->serverError(_('User has no profile.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: If no token is passed the user should get a prompt to enter
|
|
||||||
it according to OAuth Core 1.0. */
|
|
||||||
try {
|
|
||||||
$this->validateOmb();
|
|
||||||
$srv = new OMB_Service_Provider(
|
|
||||||
profile_to_omb_profile($user->uri, $profile),
|
|
||||||
omb_oauth_datastore());
|
|
||||||
|
|
||||||
$remote_user = $srv->handleUserAuth();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->clearParams();
|
|
||||||
$this->clientError($e->getMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->storeParams($srv);
|
|
||||||
$this->showForm($remote_user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showForm($params, $error=null)
|
|
||||||
{
|
|
||||||
$this->params = $params;
|
|
||||||
$this->error = $error;
|
|
||||||
$this->showPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
function title()
|
|
||||||
{
|
|
||||||
// TRANS: Page title.
|
|
||||||
return _('Authorize subscription');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showPageNotice()
|
|
||||||
{
|
|
||||||
// TRANS: Page notice on "Authorize subscription" page.
|
|
||||||
$this->element('p', null, _('Please check these details to make sure '.
|
|
||||||
'that you want to subscribe to this ' .
|
|
||||||
'user’s notices. If you didn’t just ask ' .
|
|
||||||
'to subscribe to someone’s notices, '.
|
|
||||||
'click "Reject".'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function showContent()
|
|
||||||
{
|
|
||||||
$params = $this->params;
|
|
||||||
|
|
||||||
$nickname = $params->getNickname();
|
|
||||||
$profile = $params->getProfileURL();
|
|
||||||
$license = $params->getLicenseURL();
|
|
||||||
$fullname = $params->getFullname();
|
|
||||||
$homepage = $params->getHomepage();
|
|
||||||
$bio = $params->getBio();
|
|
||||||
$location = $params->getLocation();
|
|
||||||
$avatar = $params->getAvatarURL();
|
|
||||||
|
|
||||||
$this->elementStart('div', 'entity_profile vcard');
|
|
||||||
|
|
||||||
if ($avatar) {
|
|
||||||
$this->element('img', array('src' => $avatar,
|
|
||||||
'class' => 'photo avatar entity_depiction',
|
|
||||||
'width' => AVATAR_PROFILE_SIZE,
|
|
||||||
'height' => AVATAR_PROFILE_SIZE,
|
|
||||||
'alt' => $nickname));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TRANS: Label for nickname on user authorisation page.
|
|
||||||
$this->element('div', 'entity_nickname', _('Nickname'));
|
|
||||||
|
|
||||||
$hasFN = ($fullname !== '') ? 'nickname' : 'fn nickname';
|
|
||||||
|
|
||||||
// XXX: why are these raw() instead of escaped...?
|
|
||||||
|
|
||||||
$this->elementStart('a', array('href' => $profile,
|
|
||||||
'class' => 'url '.$hasFN));
|
|
||||||
$this->raw($nickname);
|
|
||||||
$this->elementEnd('a');
|
|
||||||
|
|
||||||
if (!is_null($fullname)) {
|
|
||||||
$this->elementStart('div', 'fn entity_fn');
|
|
||||||
$this->raw($fullname);
|
|
||||||
$this->elementEnd('div');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($location)) {
|
|
||||||
$this->elementStart('div', 'label entity_location');
|
|
||||||
$this->raw($location);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($homepage)) {
|
|
||||||
$this->elementStart('a', array('href' => $homepage,
|
|
||||||
'class' => 'url entity_url'));
|
|
||||||
$this->raw($homepage);
|
|
||||||
$this->elementEnd('a');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($bio)) {
|
|
||||||
$this->elementStart('div', 'note entity_note');
|
|
||||||
$this->raw($bio);
|
|
||||||
$this->elementEnd('dd');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($license)) {
|
|
||||||
$this->element('a', array('href' => $license,
|
|
||||||
'class' => 'license entity_license'),
|
|
||||||
$license);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->elementEnd('div');
|
|
||||||
|
|
||||||
$this->elementStart('div', 'entity_actions');
|
|
||||||
$this->elementStart('ul');
|
|
||||||
$this->elementStart('li', 'entity_subscribe');
|
|
||||||
$this->elementStart('form', array('method' => 'post',
|
|
||||||
'id' => 'userauthorization',
|
|
||||||
'class' => 'form_user_authorization',
|
|
||||||
'name' => 'userauthorization',
|
|
||||||
'action' => common_local_url(
|
|
||||||
'userauthorization')));
|
|
||||||
$this->hidden('token', common_session_token());
|
|
||||||
|
|
||||||
$this->submit('accept',
|
|
||||||
// TRANS: Button text on Authorise Subscription page.
|
|
||||||
_m('BUTTON','Accept'), 'submit accept', null,
|
|
||||||
// TRANS: Title for button on Authorise Subscription page.
|
|
||||||
_('Subscribe to this user.'));
|
|
||||||
$this->submit('reject',
|
|
||||||
// TRANS: Button text on Authorise Subscription page.
|
|
||||||
_m('BUTTON','Reject'), 'submit reject', null,
|
|
||||||
// TRANS: Title for button on Authorise Subscription page.
|
|
||||||
_('Reject this subscription.'));
|
|
||||||
$this->elementEnd('form');
|
|
||||||
$this->elementEnd('li');
|
|
||||||
$this->elementEnd('ul');
|
|
||||||
$this->elementEnd('div');
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendAuthorization()
|
|
||||||
{
|
|
||||||
$srv = $this->getStoredParams();
|
|
||||||
|
|
||||||
if (is_null($srv)) {
|
|
||||||
// TRANS: Client error displayed for an empty authorisation request.
|
|
||||||
$this->clientError(_('No authorization request!'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$accepted = $this->arg('accept');
|
|
||||||
try {
|
|
||||||
list($val, $token) = $srv->continueUserAuth($accepted);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->clientError($e->getMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ($val !== false) {
|
|
||||||
common_redirect($val, 303);
|
|
||||||
} elseif ($accepted) {
|
|
||||||
$this->showAcceptMessage($token);
|
|
||||||
} else {
|
|
||||||
$this->showRejectMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showAcceptMessage($tok)
|
|
||||||
{
|
|
||||||
// TRANS: Accept message header from Authorise subscription page.
|
|
||||||
common_show_header(_('Subscription authorized'));
|
|
||||||
$this->element('p', null,
|
|
||||||
// TRANS: Accept message text from Authorise subscription page.
|
|
||||||
_('The subscription has been authorized, but no '.
|
|
||||||
'callback URL was passed. Check with the site\'s ' .
|
|
||||||
'instructions for details on how to authorize the ' .
|
|
||||||
'subscription. Your subscription token is:'));
|
|
||||||
$this->element('blockquote', 'token', $tok);
|
|
||||||
common_show_footer();
|
|
||||||
}
|
|
||||||
|
|
||||||
function showRejectMessage()
|
|
||||||
{
|
|
||||||
// TRANS: Reject message header from Authorise subscription page.
|
|
||||||
common_show_header(_('Subscription rejected'));
|
|
||||||
$this->element('p', null,
|
|
||||||
// TRANS: Reject message from Authorise subscription page.
|
|
||||||
_('The subscription has been rejected, but no '.
|
|
||||||
'callback URL was passed. Check with the site\'s ' .
|
|
||||||
'instructions for details on how to fully reject ' .
|
|
||||||
'the subscription.'));
|
|
||||||
common_show_footer();
|
|
||||||
}
|
|
||||||
|
|
||||||
function storeParams($params)
|
|
||||||
{
|
|
||||||
common_ensure_session();
|
|
||||||
$_SESSION['userauthorizationparams'] = serialize($params);
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearParams()
|
|
||||||
{
|
|
||||||
common_ensure_session();
|
|
||||||
unset($_SESSION['userauthorizationparams']);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getStoredParams()
|
|
||||||
{
|
|
||||||
common_ensure_session();
|
|
||||||
$params = unserialize($_SESSION['userauthorizationparams']);
|
|
||||||
return $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function validateOmb()
|
|
||||||
{
|
|
||||||
$listener = $_GET['omb_listener'];
|
|
||||||
$listenee = $_GET['omb_listenee'];
|
|
||||||
$nickname = $_GET['omb_listenee_nickname'];
|
|
||||||
$profile = $_GET['omb_listenee_profile'];
|
|
||||||
|
|
||||||
$user = User::getKV('uri', $listener);
|
|
||||||
if (!$user) {
|
|
||||||
// TRANS: Exception thrown when no valid user is found for an authorisation request.
|
|
||||||
// TRANS: %s is a listener URI.
|
|
||||||
throw new Exception(sprintf(_('Listener URI "%s" not found here.'),
|
|
||||||
$listener));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen($listenee) > 255) {
|
|
||||||
// TRANS: Exception thrown when listenee URI is too long for an authorisation request.
|
|
||||||
// TRANS: %s is a listenee URI.
|
|
||||||
throw new Exception(sprintf(_('Listenee URI "%s" is too long.'),
|
|
||||||
$listenee));
|
|
||||||
}
|
|
||||||
|
|
||||||
$other = User::getKV('uri', $listenee);
|
|
||||||
if ($other) {
|
|
||||||
// TRANS: Exception thrown when listenee URI is a local user for an authorisation request.
|
|
||||||
// TRANS: %s is a listenee URI.
|
|
||||||
throw new Exception(sprintf(_('Listenee URI "%s" is a local user.'),
|
|
||||||
$listenee));
|
|
||||||
}
|
|
||||||
|
|
||||||
$remote = Remote_profile::getKV('uri', $listenee);
|
|
||||||
if ($remote) {
|
|
||||||
$sub = new Subscription();
|
|
||||||
$sub->subscriber = $user->id;
|
|
||||||
$sub->subscribed = $remote->id;
|
|
||||||
if ($sub->find(true)) {
|
|
||||||
// TRANS: Exception thrown when already subscribed.
|
|
||||||
throw new Exception('You are already subscribed to this user.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($profile == common_profile_url($nickname)) {
|
|
||||||
// TRANS: Exception thrown when profile URL is a local user for an authorisation request.
|
|
||||||
// TRANS: %s is a profile URL.
|
|
||||||
throw new Exception(sprintf(_('Profile URL "%s" is for a local user.'),
|
|
||||||
$profile));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$license = $_GET['omb_listenee_license'];
|
|
||||||
$site_license = common_config('license', 'url');
|
|
||||||
if (!common_compatible_license($license, $site_license)) {
|
|
||||||
// TRANS: Exception thrown when licenses are not compatible for an authorisation request.
|
|
||||||
// TRANS: %1$s is the license for the listenee, %2$s is the license for "this" StatusNet site.
|
|
||||||
throw new Exception(sprintf(_('Listenee stream license "%1$s" is not ' .
|
|
||||||
'compatible with site license "%2$s".'),
|
|
||||||
$license, $site_license));
|
|
||||||
}
|
|
||||||
|
|
||||||
$avatar = $_GET['omb_listenee_avatar'];
|
|
||||||
if ($avatar) {
|
|
||||||
if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
|
|
||||||
// TRANS: Exception thrown when avatar URL is invalid for an authorisation request.
|
|
||||||
// TRANS: %s is an avatar URL.
|
|
||||||
throw new Exception(sprintf(_('Avatar URL "%s" is not valid.'),
|
|
||||||
$avatar));
|
|
||||||
}
|
|
||||||
$size = @getimagesize($avatar);
|
|
||||||
if (!$size) {
|
|
||||||
// TRANS: Exception thrown when avatar URL could not be read for an authorisation request.
|
|
||||||
// TRANS: %s is an avatar URL.
|
|
||||||
throw new Exception(sprintf(_('Cannot read avatar URL "%s".'),
|
|
||||||
$avatar));
|
|
||||||
}
|
|
||||||
if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
|
|
||||||
IMAGETYPE_PNG))) {
|
|
||||||
// TRANS: Exception thrown when avatar URL return an invalid image type for an authorisation request.
|
|
||||||
// TRANS: %s is an avatar URL.
|
|
||||||
throw new Exception(sprintf(_('Wrong image type for avatar URL '.
|
|
||||||
'"%s".'), $avatar));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,139 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* XRDS for OpenMicroBlogging
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../lib/omb.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/service_provider.php';
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/xrds_mapper.php';
|
|
||||||
require_once dirname(__FILE__) . '/../lib/xrdsoutputter.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XRDS for OpenMicroBlogging
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Robin Millette <millette@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class XrdsAction extends Action
|
|
||||||
{
|
|
||||||
var $user;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is read only?
|
|
||||||
*
|
|
||||||
* @return boolean true
|
|
||||||
*/
|
|
||||||
function isReadOnly()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function prepare($args)
|
|
||||||
{
|
|
||||||
parent::prepare($args);
|
|
||||||
$nickname = $this->trimmed('nickname');
|
|
||||||
$this->user = User::getKV('nickname', $nickname);
|
|
||||||
if (!$this->user) {
|
|
||||||
// TRANS: Client error displayed providing a non-existing nickname.
|
|
||||||
$this->clientError(_('No such user.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class handler.
|
|
||||||
*
|
|
||||||
* @param array $args query arguments
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
$xrdsOutputter = new XRDSOutputter();
|
|
||||||
$xrdsOutputter->startXRDS();
|
|
||||||
|
|
||||||
Event::handle('StartUserXRDS', array($this,&$xrdsOutputter));
|
|
||||||
|
|
||||||
//oauth
|
|
||||||
$xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
|
|
||||||
'xml:id' => 'oauth',
|
|
||||||
'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
|
|
||||||
'version' => '2.0'));
|
|
||||||
$xrdsOutputter->element('Type', null, 'xri://$xrds*simple');
|
|
||||||
$xrdsOutputter->showXrdsService(OAUTH_ENDPOINT_REQUEST,
|
|
||||||
common_local_url('requesttoken'),
|
|
||||||
array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY, OAUTH_HMAC_SHA1),
|
|
||||||
null,
|
|
||||||
$this->user->uri);
|
|
||||||
$xrdsOutputter->showXrdsService( OAUTH_ENDPOINT_AUTHORIZE,
|
|
||||||
common_local_url('userauthorization'),
|
|
||||||
array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY, OAUTH_HMAC_SHA1));
|
|
||||||
$xrdsOutputter->showXrdsService(OAUTH_ENDPOINT_ACCESS,
|
|
||||||
common_local_url('accesstoken'),
|
|
||||||
array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY, OAUTH_HMAC_SHA1));
|
|
||||||
$xrdsOutputter->showXrdsService(OAUTH_ENDPOINT_RESOURCE,
|
|
||||||
null,
|
|
||||||
array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY, OAUTH_HMAC_SHA1));
|
|
||||||
$xrdsOutputter->elementEnd('XRD');
|
|
||||||
|
|
||||||
//omb
|
|
||||||
$xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
|
|
||||||
'xml:id' => 'omb',
|
|
||||||
'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
|
|
||||||
'version' => '2.0'));
|
|
||||||
$xrdsOutputter->element('Type', null, 'xri://$xrds*simple');
|
|
||||||
$xrdsOutputter->showXrdsService(OMB_ENDPOINT_POSTNOTICE,
|
|
||||||
common_local_url('postnotice'));
|
|
||||||
$xrdsOutputter->showXrdsService(OMB_ENDPOINT_UPDATEPROFILE,
|
|
||||||
common_local_url('updateprofile'));
|
|
||||||
$xrdsOutputter->elementEnd('XRD');
|
|
||||||
|
|
||||||
Event::handle('EndUserXRDS', array($this,&$xrdsOutputter));
|
|
||||||
|
|
||||||
//misc
|
|
||||||
$xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
|
|
||||||
'version' => '2.0'));
|
|
||||||
$xrdsOutputter->showXrdsService(OAUTH_DISCOVERY,
|
|
||||||
'#oauth');
|
|
||||||
$xrdsOutputter->showXrdsService(OMB_VERSION,
|
|
||||||
'#omb');
|
|
||||||
$xrdsOutputter->elementEnd('XRD');
|
|
||||||
|
|
||||||
$xrdsOutputter->endXRDS();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'xrds_mapper.php';
|
|
||||||
require_once 'constants.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Map XRDS actions to URLs using base URLs
|
|
||||||
*
|
|
||||||
* This class realizes a simple mapping of action URIs to handler URLs. The
|
|
||||||
* target URLs are constructed using a base URL.
|
|
||||||
*/
|
|
||||||
class OMB_Base_URL_XRDS_Mapper implements OMB_XRDS_Mapper
|
|
||||||
{
|
|
||||||
protected $urls;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* Initialize the XRDS mapper with base URLs for OAuth and OMB endpoints.
|
|
||||||
*
|
|
||||||
* @param string $oauth_base The base URL for OAuth endpoints
|
|
||||||
* @param string $omb_base The base URL for OMB endpoints
|
|
||||||
*/
|
|
||||||
public function __construct($oauth_base, $omb_base)
|
|
||||||
{
|
|
||||||
$this->urls = array(
|
|
||||||
OAUTH_ENDPOINT_REQUEST => $oauth_base . 'requesttoken',
|
|
||||||
OAUTH_ENDPOINT_AUTHORIZE => $oauth_base . 'userauthorization',
|
|
||||||
OAUTH_ENDPOINT_ACCESS => $oauth_base . 'accesstoken',
|
|
||||||
OMB_ENDPOINT_POSTNOTICE => $omb_base . 'postnotice',
|
|
||||||
OMB_ENDPOINT_UPDATEPROFILE => $omb_base . 'updateprofile');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch an URL for a specified action
|
|
||||||
*
|
|
||||||
* Returns the action URL for an action specified by the endpoint URI.
|
|
||||||
*
|
|
||||||
* @param string $action The endpoint URI
|
|
||||||
*
|
|
||||||
* @return string The action URL
|
|
||||||
*/
|
|
||||||
public function getURL($action)
|
|
||||||
{
|
|
||||||
return $this->urls[$action];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,59 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Constants for libomb
|
|
||||||
*
|
|
||||||
* This file contains constant definitions for libomb. The defined constants
|
|
||||||
* are service and namespace URIs for OAuth and OMB as used in XRDS.
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The OMB constants.
|
|
||||||
*/
|
|
||||||
|
|
||||||
define('OMB_VERSION_01', 'http://openmicroblogging.org/protocol/0.1');
|
|
||||||
|
|
||||||
/* The OMB version supported by this libomb version. */
|
|
||||||
define('OMB_VERSION', OMB_VERSION_01);
|
|
||||||
|
|
||||||
define('OMB_ENDPOINT_UPDATEPROFILE', OMB_VERSION . '/updateProfile');
|
|
||||||
define('OMB_ENDPOINT_POSTNOTICE', OMB_VERSION . '/postNotice');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The OAuth constants.
|
|
||||||
*/
|
|
||||||
|
|
||||||
define('OAUTH_NAMESPACE', 'http://oauth.net/core/1.0/');
|
|
||||||
|
|
||||||
define('OAUTH_ENDPOINT_REQUEST', OAUTH_NAMESPACE.'endpoint/request');
|
|
||||||
define('OAUTH_ENDPOINT_AUTHORIZE', OAUTH_NAMESPACE.'endpoint/authorize');
|
|
||||||
define('OAUTH_ENDPOINT_ACCESS', OAUTH_NAMESPACE.'endpoint/access');
|
|
||||||
define('OAUTH_ENDPOINT_RESOURCE', OAUTH_NAMESPACE.'endpoint/resource');
|
|
||||||
|
|
||||||
define('OAUTH_AUTH_HEADER', OAUTH_NAMESPACE.'parameters/auth-header');
|
|
||||||
define('OAUTH_POST_BODY', OAUTH_NAMESPACE.'parameters/post-body');
|
|
||||||
|
|
||||||
define('OAUTH_HMAC_SHA1', OAUTH_NAMESPACE.'signature/HMAC-SHA1');
|
|
||||||
|
|
||||||
define('OAUTH_DISCOVERY', 'http://oauth.net/discovery/1.0');
|
|
||||||
?>
|
|
|
@ -1,212 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'OAuth.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data access interface
|
|
||||||
*
|
|
||||||
* This interface specifies data access methods libomb needs. It should be
|
|
||||||
* implemented by libomb users. OMB_Datastore is libomb’s main interface to the
|
|
||||||
* application’s data. Objects corresponding to this interface are used in
|
|
||||||
* OMB_Service_Provider and OMB_Service_Consumer.
|
|
||||||
*
|
|
||||||
* Note that it’s implemented as a class since OAuthDataStore is as well a
|
|
||||||
* class, though only declaring methods.
|
|
||||||
*
|
|
||||||
* OMB_Datastore extends OAuthDataStore with two OAuth-related methods for token
|
|
||||||
* revoking and authorizing and all OMB-related methods.
|
|
||||||
* Refer to OAuth.php for a complete specification of OAuth-related methods.
|
|
||||||
*
|
|
||||||
* It is the user’s duty to signal and handle errors. libomb does not check
|
|
||||||
* return values nor handle exceptions. It is suggested to use exceptions.
|
|
||||||
* Note that lookup_token and getProfile return null if the requested object
|
|
||||||
* is not available. This is NOT an error and should not raise an exception.
|
|
||||||
* Same applies for lookup_nonce which returns a boolean value. These methods
|
|
||||||
* may nevertheless throw an exception, for example in case of a storage errors.
|
|
||||||
*
|
|
||||||
* Most of the parameters passed to these methods are unescaped and unverified
|
|
||||||
* user input. Therefore they should be handled with extra care to avoid
|
|
||||||
* security problems like SQL injections.
|
|
||||||
*/
|
|
||||||
class OMB_Datastore extends OAuthDataStore
|
|
||||||
{
|
|
||||||
|
|
||||||
/*********
|
|
||||||
* OAUTH *
|
|
||||||
*********/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Revoke specified OAuth token
|
|
||||||
*
|
|
||||||
* Revokes the authorization token specified by $token_key.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $token_key The key of the token to be revoked
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function revoke_token($token_key)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Authorize specified OAuth token
|
|
||||||
*
|
|
||||||
* Authorizes the authorization token specified by $token_key.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $token_key The key of the token to be authorized
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function authorize_token($token_key)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********
|
|
||||||
* OMB *
|
|
||||||
*********/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get profile by identifying URI
|
|
||||||
*
|
|
||||||
* Returns an OMB_Profile object representing the OMB profile identified by
|
|
||||||
* $identifier_uri.
|
|
||||||
* Returns null if there is no such OMB profile.
|
|
||||||
* Throws exceptions in case of other error.
|
|
||||||
*
|
|
||||||
* @param string $identifier_uri The OMB identifier URI specifying the
|
|
||||||
* requested profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Profile The corresponding profile
|
|
||||||
*/
|
|
||||||
public function getProfile($identifier_uri)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save passed profile
|
|
||||||
*
|
|
||||||
* Stores the OMB profile $profile. Overwrites an existing entry.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param OMB_Profile $profile The OMB profile which should be saved
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function saveProfile($profile)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save passed notice
|
|
||||||
*
|
|
||||||
* Stores the OMB notice $notice. The datastore may change the passed
|
|
||||||
* notice. This might by necessary for URIs depending on a database key.
|
|
||||||
* Note that it is the user’s duty to present a mechanism for his
|
|
||||||
* OMB_Datastore to appropriately change his OMB_Notice.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param OMB_Notice &$notice The OMB notice which should be saved
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function saveNotice(&$notice)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get subscriptions of a given profile
|
|
||||||
*
|
|
||||||
* Returns an array containing subscription informations for the specified
|
|
||||||
* profile. Every array entry should in turn be an array with keys
|
|
||||||
* 'uri´: The identifier URI of the subscriber
|
|
||||||
* 'token´: The subscribe token
|
|
||||||
* 'secret´: The secret token
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $subscribed_user_uri The OMB identifier URI specifying the
|
|
||||||
* subscribed profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return mixed An array containing the subscriptions or 0 if no
|
|
||||||
* subscription has been found.
|
|
||||||
*/
|
|
||||||
public function getSubscriptions($subscribed_user_uri)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a subscription
|
|
||||||
*
|
|
||||||
* Deletes the subscription from $subscriber_uri to $subscribed_user_uri.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $subscriber_uri The OMB identifier URI specifying the
|
|
||||||
* subscribing profile
|
|
||||||
*
|
|
||||||
* @param string $subscribed_user_uri The OMB identifier URI specifying the
|
|
||||||
* subscribed profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function deleteSubscription($subscriber_uri, $subscribed_user_uri)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save a subscription
|
|
||||||
*
|
|
||||||
* Saves the subscription from $subscriber_uri to $subscribed_user_uri.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $subscriber_uri The OMB identifier URI specifying
|
|
||||||
* the subscribing profile
|
|
||||||
*
|
|
||||||
* @param string $subscribed_user_uri The OMB identifier URI specifying
|
|
||||||
* the subscribed profile
|
|
||||||
* @param OAuthToken $token The access token
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function saveSubscription($subscriber_uri, $subscribed_user_uri,
|
|
||||||
$token)
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,104 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'Validate.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper functions for libomb
|
|
||||||
*
|
|
||||||
* This class contains helper functions for libomb.
|
|
||||||
*/
|
|
||||||
class OMB_Helper
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Non-scalar constants
|
|
||||||
*
|
|
||||||
* The set of OMB and OAuth Services an OMB Server has to implement.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static $OMB_SERVICES = array(OMB_ENDPOINT_UPDATEPROFILE,
|
|
||||||
OMB_ENDPOINT_POSTNOTICE);
|
|
||||||
public static $OAUTH_SERVICES = array(OAUTH_ENDPOINT_REQUEST,
|
|
||||||
OAUTH_ENDPOINT_AUTHORIZE,
|
|
||||||
OAUTH_ENDPOINT_ACCESS);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate URL
|
|
||||||
*
|
|
||||||
* Basic URL validation. Currently http, https, ftp and gopher are supported
|
|
||||||
* schemes.
|
|
||||||
*
|
|
||||||
* @param string $url The URL which is to be validated.
|
|
||||||
*
|
|
||||||
* @return bool Whether URL is valid.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public static function validateURL($url)
|
|
||||||
{
|
|
||||||
return Validate::uri($url, array('allowed_schemes' => array('http',
|
|
||||||
'https', 'gopher', 'ftp')));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate Media type
|
|
||||||
*
|
|
||||||
* Basic Media type validation. Checks for valid maintype and correct
|
|
||||||
* format.
|
|
||||||
*
|
|
||||||
* @param string $mediatype The Media type which is to be validated.
|
|
||||||
*
|
|
||||||
* @return bool Whether media type is valid.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public static function validateMediaType($mediatype)
|
|
||||||
{
|
|
||||||
return preg_match('/^(\w+)\/([\w\d-+.]+)$/', $mediatype, $subtypes) > 0
|
|
||||||
&&
|
|
||||||
in_array(strtolower($subtypes[1]), array('application', 'audio',
|
|
||||||
'image', 'message', 'model', 'multipart', 'text', 'video'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove escaping from request parameters
|
|
||||||
*
|
|
||||||
* Neutralise the evil effects of magic_quotes_gpc in the current request.
|
|
||||||
* This is used before handing a request off to OAuthRequest::from_request.
|
|
||||||
* Many thanks to Ciaran Gultnieks for this fix.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public static function removeMagicQuotesFromRequest()
|
|
||||||
{
|
|
||||||
if (get_magic_quotes_gpc() === 1) {
|
|
||||||
$_POST = array_map('stripslashes', $_POST);
|
|
||||||
$_GET = array_map('stripslashes', $_GET);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,52 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Exception stating that a passed parameter is invalid
|
|
||||||
*
|
|
||||||
* This exception is raised when a parameter does not obey the OMB standard.
|
|
||||||
*/
|
|
||||||
class OMB_InvalidParameterException extends Exception
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* Creates a new exception based on a parameter name, value, and object
|
|
||||||
* type.
|
|
||||||
*
|
|
||||||
* @param string $value The wrong value passed
|
|
||||||
* @param string $type The object type the parameter belongs to;
|
|
||||||
* Currently OMB uses profiles and notices
|
|
||||||
* @param string $parameter The name of the parameter the wrong value has
|
|
||||||
* been passed for
|
|
||||||
*/
|
|
||||||
public function __construct($value, $type, $parameter)
|
|
||||||
{
|
|
||||||
parent::__construct("Invalid value ‘${value}’ for parameter " .
|
|
||||||
"‘${parameter}’ in $type");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Exception stating that a requested url does not resolve to a valid yadis
|
|
||||||
*
|
|
||||||
* This exception is raised when OMB_Service is not able to discover a valid
|
|
||||||
* yadis location with XRDS.
|
|
||||||
*/
|
|
||||||
class OMB_InvalidYadisException extends Exception
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,294 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'invalidparameterexception.php';
|
|
||||||
require_once 'Validate.php';
|
|
||||||
require_once 'helper.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OMB Notice representation
|
|
||||||
*
|
|
||||||
* This class represents an OMB notice.
|
|
||||||
*
|
|
||||||
* Do not call the setters with null values. Instead, if you want to delete a
|
|
||||||
* field, pass an empty string. The getters will return null for empty fields.
|
|
||||||
*/
|
|
||||||
class OMB_Notice
|
|
||||||
{
|
|
||||||
protected $author;
|
|
||||||
protected $uri;
|
|
||||||
protected $content;
|
|
||||||
protected $url;
|
|
||||||
protected $license_url; /* url is an own addition for clarification. */
|
|
||||||
protected $seealso_url; /* url is an own addition for clarification. */
|
|
||||||
protected $seealso_disposition;
|
|
||||||
protected $seealso_mediatype;
|
|
||||||
protected $seealso_license_url; /* url is an addition for clarification. */
|
|
||||||
|
|
||||||
/* The notice as OMB param array. Cached and rebuild on usage.
|
|
||||||
false while outdated. */
|
|
||||||
protected $param_array;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for OMB_Notice
|
|
||||||
*
|
|
||||||
* Initializes the OMB_Notice object with author, uri and content.
|
|
||||||
* These parameters are mandatory for postNotice.
|
|
||||||
*
|
|
||||||
* @param object $author An OMB_Profile object representing the author of
|
|
||||||
* the notice.
|
|
||||||
* @param string $uri The notice URI as defined by the OMB. A unique and
|
|
||||||
* never changing identifier for a notice.
|
|
||||||
* @param string $content The content of the notice. 140 chars recommended,
|
|
||||||
* but there is no limit.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function __construct($author, $uri, $content)
|
|
||||||
{
|
|
||||||
$this->content = $content;
|
|
||||||
if (is_null($author)) {
|
|
||||||
throw new OMB_InvalidParameterException('', 'notice', 'omb_listenee');
|
|
||||||
}
|
|
||||||
$this->author = $author;
|
|
||||||
|
|
||||||
if (!Validate::uri($uri)) {
|
|
||||||
throw new OMB_InvalidParameterException($uri, 'notice', 'omb_notice');
|
|
||||||
}
|
|
||||||
$this->uri = $uri;
|
|
||||||
|
|
||||||
$this->param_array = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the notice as array
|
|
||||||
*
|
|
||||||
* Returns an array which contains the whole notice as array. The array is
|
|
||||||
* cached and only rebuilt on changes of the notice.
|
|
||||||
* Empty optional values are not passed.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return array The notice as parameter array
|
|
||||||
*/
|
|
||||||
public function asParameters()
|
|
||||||
{
|
|
||||||
if ($this->param_array !== false) {
|
|
||||||
return $this->param_array;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->param_array = array(
|
|
||||||
'omb_notice' => $this->uri,
|
|
||||||
'omb_notice_content' => $this->content);
|
|
||||||
|
|
||||||
if (!is_null($this->url))
|
|
||||||
$this->param_array['omb_notice_url'] = $this->url;
|
|
||||||
|
|
||||||
if (!is_null($this->license_url))
|
|
||||||
$this->param_array['omb_notice_license'] = $this->license_url;
|
|
||||||
|
|
||||||
if (!is_null($this->seealso_url)) {
|
|
||||||
$this->param_array['omb_seealso'] = $this->seealso_url;
|
|
||||||
|
|
||||||
/* This is actually a free interpretation of the OMB standard. We
|
|
||||||
assume that additional seealso parameters are not of any use if
|
|
||||||
seealso itself is not set. */
|
|
||||||
if (!is_null($this->seealso_disposition))
|
|
||||||
$this->param_array['omb_seealso_disposition'] =
|
|
||||||
$this->seealso_disposition;
|
|
||||||
|
|
||||||
if (!is_null($this->seealso_mediatype))
|
|
||||||
$this->param_array['omb_seealso_mediatype'] =
|
|
||||||
$this->seealso_mediatype;
|
|
||||||
|
|
||||||
if (!is_null($this->seealso_license_url))
|
|
||||||
$this->param_array['omb_seealso_license'] =
|
|
||||||
$this->seealso_license_url;
|
|
||||||
}
|
|
||||||
return $this->param_array;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build an OMB_Notice object from array
|
|
||||||
*
|
|
||||||
* Builds an OMB_Notice object from the passed parameters array. The array
|
|
||||||
* MUST provide a notice URI and content. The array fields HAVE TO be named
|
|
||||||
* according to the OMB standard, i. e. omb_notice_* and omb_seealso_*.
|
|
||||||
* Values are handled as not passed if the corresponding array fields are
|
|
||||||
* not set or the empty string.
|
|
||||||
*
|
|
||||||
* @param object $author An OMB_Profile object representing the author
|
|
||||||
* of the notice.
|
|
||||||
* @param string $parameters An array containing the notice parameters.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @returns OMB_Notice The built OMB_Notice.
|
|
||||||
*/
|
|
||||||
public static function fromParameters($author, $parameters)
|
|
||||||
{
|
|
||||||
$notice = new OMB_Notice($author, $parameters['omb_notice'],
|
|
||||||
$parameters['omb_notice_content']);
|
|
||||||
|
|
||||||
if (isset($parameters['omb_notice_url'])) {
|
|
||||||
$notice->setURL($parameters['omb_notice_url']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters['omb_notice_license'])) {
|
|
||||||
$notice->setLicenseURL($parameters['omb_notice_license']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters['omb_seealso'])) {
|
|
||||||
$notice->setSeealsoURL($parameters['omb_seealso']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters['omb_seealso_disposition'])) {
|
|
||||||
$notice->setSeealsoDisposition($parameters['omb_seealso_disposition']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters['omb_seealso_mediatype'])) {
|
|
||||||
$notice->setSeealsoMediatype($parameters['omb_seealso_mediatype']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters['omb_seealso_license'])) {
|
|
||||||
$notice->setSeealsoLicenseURL($parameters['omb_seealso_license']);
|
|
||||||
}
|
|
||||||
return $notice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAuthor()
|
|
||||||
{
|
|
||||||
return $this->author;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getIdentifierURI()
|
|
||||||
{
|
|
||||||
return $this->uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getContent()
|
|
||||||
{
|
|
||||||
return $this->content;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getURL()
|
|
||||||
{
|
|
||||||
return $this->url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLicenseURL()
|
|
||||||
{
|
|
||||||
return $this->license_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSeealsoURL()
|
|
||||||
{
|
|
||||||
return $this->seealso_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSeealsoDisposition()
|
|
||||||
{
|
|
||||||
return $this->seealso_disposition;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSeealsoMediatype()
|
|
||||||
{
|
|
||||||
return $this->seealso_mediatype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSeealsoLicenseURL()
|
|
||||||
{
|
|
||||||
return $this->seealso_license_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setURL($url)
|
|
||||||
{
|
|
||||||
$this->setVal('notice_url', $url, 'OMB_Helper::validateURL', 'url');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLicenseURL($license_url)
|
|
||||||
{
|
|
||||||
$this->setVal('license', $license_url, 'OMB_Helper::validateURL',
|
|
||||||
'license_url');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setSeealsoURL($seealso_url)
|
|
||||||
{
|
|
||||||
$this->setVal('seealso', $seealso_url, 'OMB_Helper::validateURL',
|
|
||||||
'seealso_url');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setSeealsoDisposition($seealso_disposition)
|
|
||||||
{
|
|
||||||
$this->setVal('seealso_disposition', $seealso_disposition,
|
|
||||||
'OMB_Notice::validateDisposition');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function validateDisposition($str)
|
|
||||||
{
|
|
||||||
return in_array($str, array('link', 'inline'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setSeealsoMediatype($seealso_mediatype)
|
|
||||||
{
|
|
||||||
$this->setVal('seealso_mediatype', $seealso_mediatype,
|
|
||||||
'OMB_Helper::validateMediaType');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setSeealsoLicenseURL($seealso_license_url)
|
|
||||||
{
|
|
||||||
$this->setVal('seealso_license', $seealso_license_url,
|
|
||||||
'OMB_Helper::validateURL', 'seealso_license_url');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a value
|
|
||||||
*
|
|
||||||
* Updates a value specified by a parameter name and the new value.
|
|
||||||
*
|
|
||||||
* @param string $param The parameter name according to OMB
|
|
||||||
* @param string $value The new value
|
|
||||||
* @param callback $validator A validator function for the parameter
|
|
||||||
* @param string $field The name of the field in OMB_Notice
|
|
||||||
* @param bool $force Whether null values should be checked as well
|
|
||||||
*/
|
|
||||||
protected function setVal($param, $value, $validator, $field = null,
|
|
||||||
$force = false)
|
|
||||||
{
|
|
||||||
if (is_null($field)) {
|
|
||||||
$field = $param;
|
|
||||||
}
|
|
||||||
if ($value === '' && !$force) {
|
|
||||||
$value = null;
|
|
||||||
} elseif (!call_user_func($validator, $value)) {
|
|
||||||
throw new OMB_InvalidParameterException($value, 'notice', $param);
|
|
||||||
}
|
|
||||||
if ($this->$field !== $value) {
|
|
||||||
$this->$field = $value;
|
|
||||||
$this->param_array = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,209 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'Auth/Yadis/Yadis.php';
|
|
||||||
require_once 'unsupportedserviceexception.php';
|
|
||||||
require_once 'invalidyadisexception.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OMB XRDS representation
|
|
||||||
*
|
|
||||||
* This class represents a Yadis XRDS file for OMB. It adds some useful methods to
|
|
||||||
* Auth_Yadis_XRDS.
|
|
||||||
*/
|
|
||||||
class OMB_Yadis_XRDS extends Auth_Yadis_XRDS
|
|
||||||
{
|
|
||||||
|
|
||||||
protected $fetcher;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an instance from URL
|
|
||||||
*
|
|
||||||
* Constructs an OMB_Yadis_XRDS object from a given URL. A full Yadis
|
|
||||||
* discovery is performed on the URL and the XRDS is parsed.
|
|
||||||
* Throws an OMB_InvalidYadisException when no Yadis is discovered or the
|
|
||||||
* detected XRDS file is broken.
|
|
||||||
*
|
|
||||||
* @param string $url The URL on which Yadis discovery
|
|
||||||
* should be performed on
|
|
||||||
* @param Auth_Yadis_HTTPFetcher $fetcher A fetcher used to get HTTP
|
|
||||||
* resources
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Yadis_XRDS The initialized object representing the given
|
|
||||||
* resource
|
|
||||||
*/
|
|
||||||
public static function fromYadisURL($url, $fetcher)
|
|
||||||
{
|
|
||||||
/* Perform a Yadis discovery. */
|
|
||||||
$yadis = Auth_Yadis_Yadis::discover($url, $fetcher);
|
|
||||||
if ($yadis->failed) {
|
|
||||||
throw new OMB_InvalidYadisException($url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse the XRDS file. */
|
|
||||||
$xrds = OMB_Yadis_XRDS::parseXRDS($yadis->response_text);
|
|
||||||
if ($xrds === null) {
|
|
||||||
throw new OMB_InvalidYadisException($url);
|
|
||||||
}
|
|
||||||
$xrds->fetcher = $fetcher;
|
|
||||||
return $xrds;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a specific service
|
|
||||||
*
|
|
||||||
* Returns the Auth_Yadis_Service object corresponding to the given service
|
|
||||||
* URI.
|
|
||||||
* Throws an OMB_UnsupportedServiceException if the service is not
|
|
||||||
* available.
|
|
||||||
*
|
|
||||||
* @param string $service URI specifier of the requested service
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return Auth_Yadis_Service The object representing the requested service
|
|
||||||
*/
|
|
||||||
public function getService($service)
|
|
||||||
{
|
|
||||||
$match = $this->services(array(create_function('$s',
|
|
||||||
"return in_array('$service', \$s->getTypes());")));
|
|
||||||
if ($match === array()) {
|
|
||||||
throw new OMB_UnsupportedServiceException($service);
|
|
||||||
}
|
|
||||||
return $match[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a specific XRD
|
|
||||||
*
|
|
||||||
* Returns the OMB_Yadis_XRDS object corresponding to the given URI.
|
|
||||||
* Throws an OMB_UnsupportedServiceException if the XRD is not available.
|
|
||||||
* Note that getXRD tries to resolve external XRD parts as well.
|
|
||||||
*
|
|
||||||
* @param string $uri URI specifier of the requested XRD
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Yadis_XRDS The object representing the requested XRD
|
|
||||||
*/
|
|
||||||
public function getXRD($uri)
|
|
||||||
{
|
|
||||||
$nexthash = strpos($uri, '#');
|
|
||||||
if ($nexthash === false) {
|
|
||||||
throw new OMB_InvalidYadisException("‘$uri’ does not specify a " .
|
|
||||||
'valid XML node.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($nexthash > 0) {
|
|
||||||
$cururi = substr($uri, 0, $nexthash);
|
|
||||||
$nexturi = substr($uri, $nexthash);
|
|
||||||
return OMB_Yadis_XRDS::fromYadisURL($cururi, $this->fetcher)
|
|
||||||
->getXRD($nexturi);
|
|
||||||
}
|
|
||||||
|
|
||||||
$id = substr($uri, 1);
|
|
||||||
foreach ($this->allXrdNodes as $node) {
|
|
||||||
$attrs = $this->parser->attributes($node);
|
|
||||||
if (array_key_exists('xml:id', $attrs) && $attrs['xml:id'] == $id) {
|
|
||||||
/* Trick the constructor into thinking this is the only node. */
|
|
||||||
$bogus_nodes = array($node);
|
|
||||||
return new OMB_Yadis_XRDS($this->parser, $bogus_nodes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new OMB_UnsupportedServiceException($uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse an XML string containing a XRDS document
|
|
||||||
*
|
|
||||||
* Parses an XML string (XRDS document) and returns either an
|
|
||||||
* Auth_Yadis_XRDS object or null, depending on whether the XRDS XML is
|
|
||||||
* valid.
|
|
||||||
* This method is just copy and paste from the parent class to select the
|
|
||||||
* correct constructor.
|
|
||||||
*
|
|
||||||
* @param string $xml_string An XRDS XML string
|
|
||||||
* @param array $extra_ns_map Additional namespace declarations
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return mixed An instance of OMB_Yadis_XRDS or null,
|
|
||||||
* depending on the validity of $xml_string
|
|
||||||
*/
|
|
||||||
public static function parseXRDS($xml_string, $extra_ns_map = null)
|
|
||||||
{
|
|
||||||
$_null = null;
|
|
||||||
|
|
||||||
if (!$xml_string) {
|
|
||||||
return $_null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$parser = Auth_Yadis_getXMLParser();
|
|
||||||
|
|
||||||
$ns_map = Auth_Yadis_getNSMap();
|
|
||||||
|
|
||||||
if ($extra_ns_map && is_array($extra_ns_map)) {
|
|
||||||
$ns_map = array_merge($ns_map, $extra_ns_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!($parser && $parser->init($xml_string, $ns_map))) {
|
|
||||||
return $_null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to get root element.
|
|
||||||
$root = $parser->evalXPath('/xrds:XRDS[1]');
|
|
||||||
if (!$root) {
|
|
||||||
return $_null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_array($root)) {
|
|
||||||
$root = $root[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
$attrs = $parser->attributes($root);
|
|
||||||
|
|
||||||
if (array_key_exists('xmlns:xrd', $attrs) &&
|
|
||||||
$attrs['xmlns:xrd'] != Auth_Yadis_XMLNS_XRDS) {
|
|
||||||
return $_null;
|
|
||||||
} else if (array_key_exists('xmlns', $attrs) &&
|
|
||||||
preg_match('/xri/', $attrs['xmlns']) &&
|
|
||||||
$attrs['xmlns'] != Auth_Yadis_XMLNS_XRD_2_0) {
|
|
||||||
return $_null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the last XRD node.
|
|
||||||
$xrd_nodes = $parser->evalXPath('/xrds:XRDS[1]/xrd:XRD');
|
|
||||||
|
|
||||||
if (!$xrd_nodes) {
|
|
||||||
return $_null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$xrds = new OMB_Yadis_XRDS($parser, $xrd_nodes);
|
|
||||||
return $xrds;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,150 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'xrds_writer.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write OMB-specific XRDS using XMLWriter
|
|
||||||
*
|
|
||||||
* This class writes the XRDS file announcing the OMB server. It uses XMLWriter.
|
|
||||||
* An instance of OMB_Plain_XRDS_Writer should be passed to
|
|
||||||
* OMB_Service_Provider->writeXRDS.
|
|
||||||
*/
|
|
||||||
class OMB_Plain_XRDS_Writer implements OMB_XRDS_Writer
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Write XRDS using XMLWriter
|
|
||||||
*
|
|
||||||
* Outputs a XRDS document specifying an OMB service.
|
|
||||||
*
|
|
||||||
* @param OMB_profile $user The target user for the OMB service
|
|
||||||
* @param OMB_XRDS_Mapper $mapper An OMB_XRDS_Mapper providing endpoint URLs
|
|
||||||
*/
|
|
||||||
public function writeXRDS($user, $mapper)
|
|
||||||
{
|
|
||||||
header('Content-Type: application/xrds+xml');
|
|
||||||
$xw = new XMLWriter();
|
|
||||||
$xw->openURI('php://output');
|
|
||||||
$xw->setIndent(true);
|
|
||||||
|
|
||||||
$xw->startDocument('1.0', 'UTF-8');
|
|
||||||
$this->_writeFullElement($xw, 'XRDS', array('xmlns' => 'xri://$xrds'), array(
|
|
||||||
array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
|
|
||||||
'xml:id' => 'oauth',
|
|
||||||
'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
|
|
||||||
'version' => '2.0'), array(
|
|
||||||
array('Type', null, 'xri://$xrds*simple'),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OAUTH_ENDPOINT_REQUEST),
|
|
||||||
array('URI', null, $mapper->getURL(OAUTH_ENDPOINT_REQUEST)),
|
|
||||||
array('Type', null, OAUTH_AUTH_HEADER),
|
|
||||||
array('Type', null, OAUTH_POST_BODY),
|
|
||||||
array('Type', null, OAUTH_HMAC_SHA1),
|
|
||||||
array('LocalID', null, $user->getIdentifierURI())
|
|
||||||
)),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OAUTH_ENDPOINT_AUTHORIZE),
|
|
||||||
array('URI', null, $mapper->getURL(OAUTH_ENDPOINT_AUTHORIZE)),
|
|
||||||
array('Type', null, OAUTH_AUTH_HEADER),
|
|
||||||
array('Type', null, OAUTH_POST_BODY),
|
|
||||||
array('Type', null, OAUTH_HMAC_SHA1)
|
|
||||||
)),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OAUTH_ENDPOINT_ACCESS),
|
|
||||||
array('URI', null, $mapper->getURL(OAUTH_ENDPOINT_ACCESS)),
|
|
||||||
array('Type', null, OAUTH_AUTH_HEADER),
|
|
||||||
array('Type', null, OAUTH_POST_BODY),
|
|
||||||
array('Type', null, OAUTH_HMAC_SHA1)
|
|
||||||
)),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OAUTH_ENDPOINT_RESOURCE),
|
|
||||||
array('Type', null, OAUTH_AUTH_HEADER),
|
|
||||||
array('Type', null, OAUTH_POST_BODY),
|
|
||||||
array('Type', null, OAUTH_HMAC_SHA1)
|
|
||||||
))
|
|
||||||
)),
|
|
||||||
array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
|
|
||||||
'xml:id' => 'omb',
|
|
||||||
'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
|
|
||||||
'version' => '2.0'), array(
|
|
||||||
array('Type', null, 'xri://$xrds*simple'),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OMB_ENDPOINT_POSTNOTICE),
|
|
||||||
array('URI', null, $mapper->getURL(OMB_ENDPOINT_POSTNOTICE))
|
|
||||||
)),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OMB_ENDPOINT_UPDATEPROFILE),
|
|
||||||
array('URI', null, $mapper->getURL(OMB_ENDPOINT_UPDATEPROFILE))
|
|
||||||
))
|
|
||||||
)),
|
|
||||||
array('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
|
|
||||||
'version' => '2.0'), array(
|
|
||||||
array('Type', null, 'xri://$xrds*simple'),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OAUTH_DISCOVERY),
|
|
||||||
array('URI', null, '#oauth')
|
|
||||||
)),
|
|
||||||
array('Service', null, array(
|
|
||||||
array('Type', null, OMB_VERSION),
|
|
||||||
array('URI', null, '#omb')
|
|
||||||
))
|
|
||||||
))));
|
|
||||||
$xw->endDocument();
|
|
||||||
$xw->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a complex XML element
|
|
||||||
*
|
|
||||||
* Outputs a XML element with attributes and content.
|
|
||||||
*
|
|
||||||
* @param XMLWriter $xw The XMLWriter used to output the element
|
|
||||||
* @param string $tag The tag name
|
|
||||||
* @param array|null $attributes A map of XML attributes
|
|
||||||
* @param array|string $content The content of the element; either an
|
|
||||||
* array of child nodes each specified by a
|
|
||||||
* three entry-array ($tag, $attributes,
|
|
||||||
* $content) or a string
|
|
||||||
*/
|
|
||||||
private function _writeFullElement($xw, $tag, $attributes, $content)
|
|
||||||
{
|
|
||||||
$xw->startElement($tag);
|
|
||||||
if (!is_null($attributes)) {
|
|
||||||
foreach ($attributes as $name => $value) {
|
|
||||||
$xw->writeAttribute($name, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_array($content)) {
|
|
||||||
foreach ($content as $val) {
|
|
||||||
$this->_writeFullElement($xw, $val[0], $val[1], $val[2]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$xw->text($content);
|
|
||||||
}
|
|
||||||
$xw->fullEndElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,345 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'invalidparameterexception.php';
|
|
||||||
require_once 'Validate.php';
|
|
||||||
require_once 'helper.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OMB profile representation
|
|
||||||
*
|
|
||||||
* This class represents an OMB profile.
|
|
||||||
*
|
|
||||||
* Do not call the setters with null values. Instead, if you want to delete a
|
|
||||||
* field, pass an empty string. The getters will return null for empty fields.
|
|
||||||
*/
|
|
||||||
class OMB_Profile
|
|
||||||
{
|
|
||||||
protected $identifier_uri;
|
|
||||||
protected $profile_url;
|
|
||||||
protected $nickname;
|
|
||||||
protected $license_url;
|
|
||||||
protected $fullname;
|
|
||||||
protected $homepage;
|
|
||||||
protected $bio;
|
|
||||||
protected $location;
|
|
||||||
protected $avatar_url;
|
|
||||||
|
|
||||||
/* The profile as OMB param array. Cached and rebuild on usage.
|
|
||||||
false while outdated. */
|
|
||||||
protected $param_array;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for OMB_Profile
|
|
||||||
*
|
|
||||||
* Initializes the OMB_Profile object with an identifier uri.
|
|
||||||
*
|
|
||||||
* @param string $identifier_uri The profile URI as defined by the OMB;
|
|
||||||
* A unique and never changing identifier for
|
|
||||||
* a profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function __construct($identifier_uri)
|
|
||||||
{
|
|
||||||
if (!Validate::uri($identifier_uri)) {
|
|
||||||
throw new OMB_InvalidParameterException($identifier_uri, 'profile',
|
|
||||||
'omb_listenee or omb_listener');
|
|
||||||
}
|
|
||||||
$this->identifier_uri = $identifier_uri;
|
|
||||||
$this->param_array = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the profile as array
|
|
||||||
*
|
|
||||||
* Returns an array which contains the whole profile as array.
|
|
||||||
* The array is cached and only rebuilt on changes of the profile.
|
|
||||||
*
|
|
||||||
* @param string $prefix The common prefix to the key for all parameters
|
|
||||||
* @param bool $force_all Specifies whether empty fields should be added
|
|
||||||
* to the array as well; This is necessary to
|
|
||||||
* clear fields via updateProfile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return array The profile as parameter array
|
|
||||||
*/
|
|
||||||
public function asParameters($prefix, $force_all = false)
|
|
||||||
{
|
|
||||||
if ($this->param_array === false) {
|
|
||||||
$this->param_array = array('' => $this->identifier_uri);
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->profile_url)) {
|
|
||||||
$this->param_array['_profile'] = $this->profile_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->homepage)) {
|
|
||||||
$this->param_array['_homepage'] = $this->homepage;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->nickname)) {
|
|
||||||
$this->param_array['_nickname'] = $this->nickname;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->license_url)) {
|
|
||||||
$this->param_array['_license'] = $this->license_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->fullname)) {
|
|
||||||
$this->param_array['_fullname'] = $this->fullname;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->bio)) {
|
|
||||||
$this->param_array['_bio'] = $this->bio;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->location)) {
|
|
||||||
$this->param_array['_location'] = $this->location;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($force_all || !is_null($this->avatar_url)) {
|
|
||||||
$this->param_array['_avatar'] = $this->avatar_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
$ret = array();
|
|
||||||
foreach ($this->param_array as $k => $v) {
|
|
||||||
$ret[$prefix . $k] = $v;
|
|
||||||
}
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build an OMB_Profile object from array
|
|
||||||
*
|
|
||||||
* Builds an OMB_Profile object from the passed parameters array. The
|
|
||||||
* array MUST provide a profile URI. The array fields HAVE TO be named
|
|
||||||
* according to the OMB standard. The prefix (omb_listener or omb_listenee)
|
|
||||||
* is passed as a parameter.
|
|
||||||
*
|
|
||||||
* @param string $parameters An array containing the profile parameters
|
|
||||||
* @param string $prefix The common prefix of the profile parameter keys
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @returns OMB_Profile The built OMB_Profile
|
|
||||||
*/
|
|
||||||
public static function fromParameters($parameters, $prefix)
|
|
||||||
{
|
|
||||||
if (!isset($parameters[$prefix])) {
|
|
||||||
throw new OMB_InvalidParameterException('', 'profile', $prefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile = new OMB_Profile($parameters[$prefix]);
|
|
||||||
$profile->updateFromParameters($parameters, $prefix);
|
|
||||||
return $profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update from array
|
|
||||||
*
|
|
||||||
* Updates from the passed parameters array. The array does not have to
|
|
||||||
* provide a profile URI. The array fields HAVE TO be named according to the
|
|
||||||
* OMB standard. The prefix (omb_listener or omb_listenee) is passed as a
|
|
||||||
* parameter.
|
|
||||||
*
|
|
||||||
* @param string $parameters An array containing the profile parameters
|
|
||||||
* @param string $prefix The common prefix of the profile parameter keys
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function updateFromParameters($parameters, $prefix)
|
|
||||||
{
|
|
||||||
if (isset($parameters[$prefix.'_profile'])) {
|
|
||||||
$this->setProfileURL($parameters[$prefix.'_profile']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_license'])) {
|
|
||||||
$this->setLicenseURL($parameters[$prefix.'_license']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_nickname'])) {
|
|
||||||
$this->setNickname($parameters[$prefix.'_nickname']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_fullname'])) {
|
|
||||||
$this->setFullname($parameters[$prefix.'_fullname']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_homepage'])) {
|
|
||||||
$this->setHomepage($parameters[$prefix.'_homepage']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_bio'])) {
|
|
||||||
$this->setBio($parameters[$prefix.'_bio']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_location'])) {
|
|
||||||
$this->setLocation($parameters[$prefix.'_location']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($parameters[$prefix.'_avatar'])) {
|
|
||||||
$this->setAvatarURL($parameters[$prefix.'_avatar']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getIdentifierURI()
|
|
||||||
{
|
|
||||||
return $this->identifier_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getProfileURL()
|
|
||||||
{
|
|
||||||
return $this->profile_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getHomepage()
|
|
||||||
{
|
|
||||||
return $this->homepage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNickname()
|
|
||||||
{
|
|
||||||
return $this->nickname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLicenseURL()
|
|
||||||
{
|
|
||||||
return $this->license_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFullname()
|
|
||||||
{
|
|
||||||
return $this->fullname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getBio()
|
|
||||||
{
|
|
||||||
return $this->bio;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLocation()
|
|
||||||
{
|
|
||||||
return $this->location;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAvatarURL()
|
|
||||||
{
|
|
||||||
return $this->avatar_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setProfileURL($profile_url)
|
|
||||||
{
|
|
||||||
$this->setVal('profile', $profile_url, 'OMB_Helper::validateURL',
|
|
||||||
'profile_url');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setNickname($nickname)
|
|
||||||
{
|
|
||||||
$this->setVal('nickname', $nickname, 'OMB_Profile::validateNickname',
|
|
||||||
'nickname', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLicenseURL($license_url)
|
|
||||||
{
|
|
||||||
$this->setVal('license', $license_url, 'OMB_Helper::validateURL',
|
|
||||||
'license_url');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setFullname($fullname)
|
|
||||||
{
|
|
||||||
$this->setVal('fullname', $fullname, 'OMB_Profile::validate255');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setHomepage($homepage)
|
|
||||||
{
|
|
||||||
$this->setVal('homepage', $homepage, 'OMB_Helper::validateURL');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setBio($bio)
|
|
||||||
{
|
|
||||||
$this->setVal('bio', $bio, 'OMB_Profile::validate140');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLocation($location)
|
|
||||||
{
|
|
||||||
$this->setVal('location', $location, 'OMB_Profile::validate255');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setAvatarURL($avatar_url)
|
|
||||||
{
|
|
||||||
$this->setVal('avatar', $avatar_url, 'OMB_Helper::validateURL',
|
|
||||||
'avatar_url');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function validate255($str)
|
|
||||||
{
|
|
||||||
return Validate::string($str, array('max_length' => 255));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function validate140($str)
|
|
||||||
{
|
|
||||||
return Validate::string($str, array('max_length' => 140));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function validateNickname($str)
|
|
||||||
{
|
|
||||||
return Validate::string($str,
|
|
||||||
array('min_length' => 1,
|
|
||||||
'max_length' => 64,
|
|
||||||
'format' => VALIDATE_NUM . VALIDATE_ALPHA));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a value
|
|
||||||
*
|
|
||||||
* Updates a value specified by a parameter name and the new value.
|
|
||||||
*
|
|
||||||
* @param string $param The parameter name according to OMB
|
|
||||||
* @param string $value The new value
|
|
||||||
* @param callback $validator A validator function for the parameter
|
|
||||||
* @param string $field The name of the field in OMB_Profile
|
|
||||||
* @param bool $force Whether null values should be checked as well
|
|
||||||
*/
|
|
||||||
protected function setVal($param, $value, $validator, $field = null,
|
|
||||||
$force = false)
|
|
||||||
{
|
|
||||||
if (is_null($field)) {
|
|
||||||
$field = $param;
|
|
||||||
}
|
|
||||||
if ($value === '' && !$force) {
|
|
||||||
$value = null;
|
|
||||||
} elseif (!call_user_func($validator, $value)) {
|
|
||||||
throw new OMB_InvalidParameterException($value, 'profile', $param);
|
|
||||||
}
|
|
||||||
if ($this->$field !== $value) {
|
|
||||||
$this->$field = $value;
|
|
||||||
$this->param_array = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,73 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Exception stating that the remote service had a failure
|
|
||||||
*
|
|
||||||
* This exception is raised when a remote service failed to return a valid
|
|
||||||
* response to a request or send a valid request.
|
|
||||||
*/
|
|
||||||
class OMB_RemoteServiceException extends Exception
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Create exception from Yadis response
|
|
||||||
*
|
|
||||||
* Creates an exception from a passed yadis result.
|
|
||||||
*
|
|
||||||
* @param string $request_uri The target URI for the failed
|
|
||||||
* request
|
|
||||||
* @param Auth_Yadis_HTTPResponse $result The result of the failed
|
|
||||||
* request
|
|
||||||
*
|
|
||||||
* @return OMB_RemoteServiceException A new exception
|
|
||||||
*/
|
|
||||||
public static function fromYadis($request_uri, $result)
|
|
||||||
{
|
|
||||||
if ($result->status == 200) {
|
|
||||||
$err = 'Got wrong response ' . $result->body;
|
|
||||||
} else {
|
|
||||||
$err = 'Got error code ' . $result->status . ' with response ' .
|
|
||||||
$result->body;
|
|
||||||
}
|
|
||||||
return OMB_RemoteServiceException::forRequest($request_uri, $err);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create exception for a call to a resource
|
|
||||||
*
|
|
||||||
* Creates an exception for a given error message and target URI.
|
|
||||||
*
|
|
||||||
* @param string $action_uri The target URI for the failed request
|
|
||||||
* @param string $failure An error message
|
|
||||||
*
|
|
||||||
* @return OMB_RemoteServiceException A new exception
|
|
||||||
*/
|
|
||||||
public static function forRequest($action_uri, $failure)
|
|
||||||
{
|
|
||||||
return new OMB_RemoteServiceException("Handler for $action_uri: $failure");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,461 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'Validate.php';
|
|
||||||
require_once 'Auth/Yadis/Yadis.php';
|
|
||||||
require_once 'OAuth.php';
|
|
||||||
require_once 'constants.php';
|
|
||||||
require_once 'helper.php';
|
|
||||||
require_once 'omb_yadis_xrds.php';
|
|
||||||
require_once 'profile.php';
|
|
||||||
require_once 'remoteserviceexception.php';
|
|
||||||
require_once 'unsupportedserviceexception.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OMB service representation
|
|
||||||
*
|
|
||||||
* This class represents a complete remote OMB service. It provides discovery
|
|
||||||
* and execution of the service’s methods.
|
|
||||||
*/
|
|
||||||
class OMB_Service_Consumer
|
|
||||||
{
|
|
||||||
protected $url; /* The service URL */
|
|
||||||
protected $services; /* An array of strings mapping service URI to
|
|
||||||
service URL */
|
|
||||||
|
|
||||||
protected $token; /* An OAuthToken */
|
|
||||||
|
|
||||||
protected $listener_uri; /* The URI identifying the listener, i. e. the
|
|
||||||
remote user. */
|
|
||||||
|
|
||||||
protected $listenee_uri; /* The URI identifying the listenee, i. e. the
|
|
||||||
local user during an auth request. */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* According to OAuth Core 1.0, an user authorization request is no
|
|
||||||
* full-blown OAuth request. nonce, timestamp, consumer_key and signature
|
|
||||||
* are not needed in this step. See http://laconi.ca/trac/ticket/827 for
|
|
||||||
* more informations.
|
|
||||||
*
|
|
||||||
* Since Laconica up to version 0.7.2 performs a full OAuth request check, a
|
|
||||||
* correct request would fail.
|
|
||||||
*/
|
|
||||||
public $performLegacyAuthRequest = true;
|
|
||||||
|
|
||||||
/* Helper stuff we are going to need. */
|
|
||||||
protected $fetcher;
|
|
||||||
protected $oauth_consumer;
|
|
||||||
protected $datastore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for OMB_Service_Consumer
|
|
||||||
*
|
|
||||||
* Initializes an OMB_Service_Consumer object representing the OMB service
|
|
||||||
* specified by $service_url. Performs a complete service discovery using
|
|
||||||
* Yadis.
|
|
||||||
* Throws OMB_UnsupportedServiceException if XRDS file does not specify a
|
|
||||||
* complete OMB service.
|
|
||||||
*
|
|
||||||
* @param string $service_url The URL of the service
|
|
||||||
* @param string $consumer_url An URL representing the consumer
|
|
||||||
* @param OMB_Datastore $datastore An instance of a class implementing
|
|
||||||
* OMB_Datastore
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function __construct ($service_url, $consumer_url, $datastore)
|
|
||||||
{
|
|
||||||
$this->url = $service_url;
|
|
||||||
$this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
|
|
||||||
$this->datastore = $datastore;
|
|
||||||
$this->oauth_consumer = new OAuthConsumer($consumer_url, '');
|
|
||||||
|
|
||||||
$xrds = OMB_Yadis_XRDS::fromYadisURL($service_url, $this->fetcher);
|
|
||||||
|
|
||||||
/* Detect our services. This performs a validation as well, since
|
|
||||||
getService und getXRD throw exceptions on failure. */
|
|
||||||
$this->services = array();
|
|
||||||
|
|
||||||
foreach (array(OAUTH_DISCOVERY => OMB_Helper::$OAUTH_SERVICES,
|
|
||||||
OMB_VERSION => OMB_Helper::$OMB_SERVICES)
|
|
||||||
as $service_root => $targetservices) {
|
|
||||||
$uris = $xrds->getService($service_root)->getURIs();
|
|
||||||
$xrd = $xrds->getXRD($uris[0]);
|
|
||||||
foreach ($targetservices as $targetservice) {
|
|
||||||
$yadis_service = $xrd->getService($targetservice);
|
|
||||||
if ($targetservice == OAUTH_ENDPOINT_REQUEST) {
|
|
||||||
$localid =
|
|
||||||
$yadis_service->getElements('xrd:LocalID');
|
|
||||||
$this->listener_uri =
|
|
||||||
$yadis_service->parser->content($localid[0]);
|
|
||||||
}
|
|
||||||
$uris = $yadis_service->getURIs();
|
|
||||||
$this->services[$targetservice] = $uris[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the handler URI for a service
|
|
||||||
*
|
|
||||||
* Returns the URI the remote web service has specified for the given
|
|
||||||
* service.
|
|
||||||
*
|
|
||||||
* @param string $service The URI identifying the service
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return string The service handler URI
|
|
||||||
*/
|
|
||||||
public function getServiceURI($service)
|
|
||||||
{
|
|
||||||
return $this->services[$service];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the remote user’s URI
|
|
||||||
*
|
|
||||||
* Returns the URI of the remote user, i. e. the listener.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return string The remote user’s URI
|
|
||||||
*/
|
|
||||||
public function getRemoteUserURI()
|
|
||||||
{
|
|
||||||
return $this->listener_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the listenee’s URI
|
|
||||||
*
|
|
||||||
* Returns the URI of the user being subscribed to, i. e. the local user.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return string The local user’s URI
|
|
||||||
*/
|
|
||||||
public function getListeneeURI()
|
|
||||||
{
|
|
||||||
return $this->listenee_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request a request token
|
|
||||||
*
|
|
||||||
* Performs a token request on the service. Returns an OAuthToken on success.
|
|
||||||
* Throws an exception if the request fails.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OAuthToken An unauthorized request token
|
|
||||||
*/
|
|
||||||
public function requestToken()
|
|
||||||
{
|
|
||||||
/* Set the token to null just in case the user called setToken. */
|
|
||||||
$this->token = null;
|
|
||||||
|
|
||||||
$result = $this->performAction(OAUTH_ENDPOINT_REQUEST,
|
|
||||||
array('omb_listener' => $this->listener_uri));
|
|
||||||
if ($result->status != 200) {
|
|
||||||
throw OMB_RemoteServiceException::fromYadis(OAUTH_ENDPOINT_REQUEST,
|
|
||||||
$result);
|
|
||||||
}
|
|
||||||
parse_str($result->body, $return);
|
|
||||||
if (!isset($return['oauth_token']) ||
|
|
||||||
!isset($return['oauth_token_secret'])) {
|
|
||||||
throw OMB_RemoteServiceException::fromYadis(OAUTH_ENDPOINT_REQUEST,
|
|
||||||
$result);
|
|
||||||
}
|
|
||||||
$this->setToken($return['oauth_token'], $return['oauth_token_secret']);
|
|
||||||
return $this->token;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request authorization
|
|
||||||
*
|
|
||||||
* Returns an URL which equals to an authorization request. The end user
|
|
||||||
* should be redirected to this location to perform authorization.
|
|
||||||
* The $finish_url should be a local resource which invokes
|
|
||||||
* OMB_Consumer::finishAuthorization on request.
|
|
||||||
*
|
|
||||||
* @param OMB_Profile $profile An OMB_Profile object representing the
|
|
||||||
* soon-to-be subscribed (i. e. local) user
|
|
||||||
* @param string $finish_url Target location after successful
|
|
||||||
* authorization
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return string An URL representing an authorization request
|
|
||||||
*/
|
|
||||||
public function requestAuthorization($profile, $finish_url)
|
|
||||||
{
|
|
||||||
if ($this->performLegacyAuthRequest) {
|
|
||||||
$params = $profile->asParameters('omb_listenee',
|
|
||||||
false);
|
|
||||||
$params['omb_listener'] = $this->listener_uri;
|
|
||||||
$params['oauth_callback'] = $finish_url;
|
|
||||||
|
|
||||||
$url = $this->prepareAction(OAUTH_ENDPOINT_AUTHORIZE, $params,
|
|
||||||
'GET')->to_url();
|
|
||||||
} else {
|
|
||||||
$params = array('oauth_callback' => $finish_url,
|
|
||||||
'oauth_token' => $this->token->key,
|
|
||||||
'omb_version' => OMB_VERSION,
|
|
||||||
'omb_listener' => $this->listener_uri);
|
|
||||||
|
|
||||||
$params = array_merge($profile->asParameters('omb_listenee', false),
|
|
||||||
$params);
|
|
||||||
|
|
||||||
/* Build result URL. */
|
|
||||||
$url = $this->services[OAUTH_ENDPOINT_AUTHORIZE] .
|
|
||||||
(strrpos($url, '?') === false ? '?' : '&');
|
|
||||||
foreach ($params as $k => $v) {
|
|
||||||
$url .= OAuthUtil::urlencode_rfc3986($k) . '=' .
|
|
||||||
OAuthUtil::urlencode_rfc3986($v) . '&';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->listenee_uri = $profile->getIdentifierURI();
|
|
||||||
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finish authorization
|
|
||||||
*
|
|
||||||
* Finish the subscription process by converting the received and authorized
|
|
||||||
* request token into an access token. After that, the subscriber’s profile
|
|
||||||
* and the subscription are stored in the database.
|
|
||||||
* Expects an OAuthRequest in query parameters.
|
|
||||||
* Throws exceptions on failure.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function finishAuthorization()
|
|
||||||
{
|
|
||||||
OMB_Helper::removeMagicQuotesFromRequest();
|
|
||||||
$req = OAuthRequest::from_request();
|
|
||||||
if ($req->get_parameter('oauth_token') != $this->token->key) {
|
|
||||||
/* That’s not the token I wanted to get authorized. */
|
|
||||||
throw new OAuthException('The authorized token does not equal ' .
|
|
||||||
'the submitted token.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($req->get_parameter('omb_version') != OMB_VERSION) {
|
|
||||||
throw new OMB_RemoteServiceException('The remote service uses an ' .
|
|
||||||
'unsupported OMB version');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Construct the profile to validate it. */
|
|
||||||
|
|
||||||
/* Fix OMB bug. Listener URI is not passed. */
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
||||||
$params = $_POST;
|
|
||||||
} else {
|
|
||||||
$params = $_GET;
|
|
||||||
}
|
|
||||||
$params['omb_listener'] = $this->listener_uri;
|
|
||||||
|
|
||||||
$listener = OMB_Profile::fromParameters($params, 'omb_listener');
|
|
||||||
|
|
||||||
/* Ask the remote service to convert the authorized request token into
|
|
||||||
an access token. */
|
|
||||||
|
|
||||||
$result = $this->performAction(OAUTH_ENDPOINT_ACCESS, array());
|
|
||||||
if ($result->status != 200) {
|
|
||||||
throw new OAuthException('Could not get access token');
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_str($result->body, $return);
|
|
||||||
if (!isset($return['oauth_token']) ||
|
|
||||||
!isset($return['oauth_token_secret'])) {
|
|
||||||
throw new OAuthException('Could not get access token');
|
|
||||||
}
|
|
||||||
$this->setToken($return['oauth_token'], $return['oauth_token_secret']);
|
|
||||||
|
|
||||||
/* Subscription is finished and valid. Now store the new subscriber and
|
|
||||||
the subscription in the database. */
|
|
||||||
|
|
||||||
$this->datastore->saveProfile($listener);
|
|
||||||
$this->datastore->saveSubscription($this->listener_uri,
|
|
||||||
$this->listenee_uri,
|
|
||||||
$this->token);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the URI identifying the listener
|
|
||||||
*
|
|
||||||
* Returns the URI for the OMB user who tries to subscribe or already has
|
|
||||||
* subscribed our user. This method is a workaround for a serious OMB flaw:
|
|
||||||
* The Listener URI is not passed in the finishauthorization call.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return string the listener’s URI
|
|
||||||
*/
|
|
||||||
public function getListenerURI()
|
|
||||||
{
|
|
||||||
return $this->listener_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inform the service about a profile update
|
|
||||||
*
|
|
||||||
* Sends an updated profile to the service.
|
|
||||||
*
|
|
||||||
* @param OMB_Profile $profile The profile that has changed
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function updateProfile($profile)
|
|
||||||
{
|
|
||||||
$params = $profile->asParameters('omb_listenee', true);
|
|
||||||
$this->performOMBAction(OMB_ENDPOINT_UPDATEPROFILE, $params,
|
|
||||||
$profile->getIdentifierURI());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inform the service about a new notice
|
|
||||||
*
|
|
||||||
* Sends a notice to the service.
|
|
||||||
*
|
|
||||||
* @param OMB_Notice $notice The notice
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function postNotice($notice)
|
|
||||||
{
|
|
||||||
$params = $notice->asParameters();
|
|
||||||
$params['omb_listenee'] = $notice->getAuthor()->getIdentifierURI();
|
|
||||||
$this->performOMBAction(OMB_ENDPOINT_POSTNOTICE, $params,
|
|
||||||
$params['omb_listenee']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the token member variable
|
|
||||||
*
|
|
||||||
* Initializes the token based on given token and secret token.
|
|
||||||
*
|
|
||||||
* @param string $token The token
|
|
||||||
* @param string $secret The secret token
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function setToken($token, $secret)
|
|
||||||
{
|
|
||||||
$this->token = new OAuthToken($token, $secret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare an OAuthRequest object
|
|
||||||
*
|
|
||||||
* Creates an OAuthRequest object mapping the request specified by the
|
|
||||||
* parameters.
|
|
||||||
*
|
|
||||||
* @param string $action_uri The URI specifying the target service
|
|
||||||
* @param array $params Additional parameters for the service call
|
|
||||||
* @param string $method The HTTP method used to call the service
|
|
||||||
* ('POST' or 'GET', usually)
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*
|
|
||||||
* @return OAuthRequest the prepared request
|
|
||||||
*/
|
|
||||||
protected function prepareAction($action_uri, $params, $method)
|
|
||||||
{
|
|
||||||
$url = $this->services[$action_uri];
|
|
||||||
|
|
||||||
$url_params = array();
|
|
||||||
parse_str(parse_url($url, PHP_URL_QUERY), $url_params);
|
|
||||||
|
|
||||||
/* Add OMB version. */
|
|
||||||
$url_params['omb_version'] = OMB_VERSION;
|
|
||||||
|
|
||||||
/* Add user-defined parameters. */
|
|
||||||
$url_params = array_merge($url_params, $params);
|
|
||||||
|
|
||||||
$req = OAuthRequest::from_consumer_and_token($this->oauth_consumer,
|
|
||||||
$this->token, $method,
|
|
||||||
$url, $url_params);
|
|
||||||
|
|
||||||
/* Sign the request. */
|
|
||||||
$req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(),
|
|
||||||
$this->oauth_consumer, $this->token);
|
|
||||||
|
|
||||||
return $req;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform a service call
|
|
||||||
*
|
|
||||||
* Creates an OAuthRequest object and execute the mapped call as POST
|
|
||||||
* request.
|
|
||||||
*
|
|
||||||
* @param string $action_uri The URI specifying the target service
|
|
||||||
* @param array $params Additional parameters for the service call
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*
|
|
||||||
* @return Auth_Yadis_HTTPResponse The POST request response
|
|
||||||
*/
|
|
||||||
protected function performAction($action_uri, $params)
|
|
||||||
{
|
|
||||||
$req = $this->prepareAction($action_uri, $params, 'POST');
|
|
||||||
|
|
||||||
/* Return result page. */
|
|
||||||
return $this->fetcher->post($req->get_normalized_http_url(),
|
|
||||||
$req->to_postdata(), array());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform an OMB action
|
|
||||||
*
|
|
||||||
* Executes an OMB action – as of OMB 0.1, it’s one of updateProfile and
|
|
||||||
* postNotice.
|
|
||||||
*
|
|
||||||
* @param string $action_uri The URI specifying the target service
|
|
||||||
* @param array $params Additional parameters for the service call
|
|
||||||
* @param string $listenee_uri The URI identifying the local user for whom
|
|
||||||
* the action is performed
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function performOMBAction($action_uri, $params, $listenee_uri)
|
|
||||||
{
|
|
||||||
$result = $this->performAction($action_uri, $params);
|
|
||||||
if ($result->status == 403) {
|
|
||||||
/* The remote user unsubscribed us. */
|
|
||||||
$this->datastore->deleteSubscription($this->listener_uri,
|
|
||||||
$listenee_uri);
|
|
||||||
} else if ($result->status != 200 ||
|
|
||||||
strpos($result->body, 'omb_version=' . OMB_VERSION) === false) {
|
|
||||||
/* The server signaled an error or sent an incorrect response. */
|
|
||||||
throw OMB_RemoteServiceException::fromYadis($action_uri, $result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,461 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once 'constants.php';
|
|
||||||
require_once 'helper.php';
|
|
||||||
require_once 'notice.php';
|
|
||||||
require_once 'remoteserviceexception.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OMB service realization
|
|
||||||
*
|
|
||||||
* This class realizes a complete, simple OMB service.
|
|
||||||
*/
|
|
||||||
class OMB_Service_Provider
|
|
||||||
{
|
|
||||||
protected $user; /* An OMB_Profile representing the user */
|
|
||||||
protected $datastore; /* AN OMB_Datastore */
|
|
||||||
|
|
||||||
protected $remote_user; /* An OMB_Profile representing the remote user
|
|
||||||
during the authorization process */
|
|
||||||
|
|
||||||
protected $oauth_server; /* An OAuthServer; should only be accessed via
|
|
||||||
getOAuthServer. */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize an OMB_Service_Provider object
|
|
||||||
*
|
|
||||||
* Constructs an OMB_Service_Provider instance that provides OMB services
|
|
||||||
* referring to a particular user.
|
|
||||||
*
|
|
||||||
* @param OMB_Profile $user An OMB_Profile; mandatory for XRDS
|
|
||||||
* output, user auth handling and OMB
|
|
||||||
* action performing
|
|
||||||
* @param OMB_Datastore $datastore An OMB_Datastore; mandatory for
|
|
||||||
* everything but XRDS output
|
|
||||||
* @param OAuthServer $oauth_server An OAuthServer; used for token writing
|
|
||||||
* and OMB action handling; will use
|
|
||||||
* default value if not set
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function __construct ($user = null, $datastore = null,
|
|
||||||
$oauth_server = null)
|
|
||||||
{
|
|
||||||
$this->user = $user;
|
|
||||||
$this->datastore = $datastore;
|
|
||||||
$this->oauth_server = $oauth_server;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the remote user during user authorization
|
|
||||||
*
|
|
||||||
* Returns an OMB_Profile representing the remote user during the user
|
|
||||||
* authorization request.
|
|
||||||
*
|
|
||||||
* @return OMB_Profile The remote user
|
|
||||||
*/
|
|
||||||
public function getRemoteUser()
|
|
||||||
{
|
|
||||||
return $this->remote_user;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a XRDS document
|
|
||||||
*
|
|
||||||
* Writes a XRDS document specifying the OMB service. Optionally uses a
|
|
||||||
* given object of a class implementing OMB_XRDS_Writer for output. Else
|
|
||||||
* OMB_Plain_XRDS_Writer is used.
|
|
||||||
*
|
|
||||||
* @param OMB_XRDS_Mapper $xrds_mapper An object mapping actions to URLs
|
|
||||||
* @param OMB_XRDS_Writer $xrds_writer Optional; The OMB_XRDS_Writer used to
|
|
||||||
* write the XRDS document
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return mixed Depends on the used OMB_XRDS_Writer; OMB_Plain_XRDS_Writer
|
|
||||||
* returns nothing.
|
|
||||||
*/
|
|
||||||
public function writeXRDS($xrds_mapper, $xrds_writer = null)
|
|
||||||
{
|
|
||||||
if ($xrds_writer == null) {
|
|
||||||
require_once 'plain_xrds_writer.php';
|
|
||||||
$xrds_writer = new OMB_Plain_XRDS_Writer();
|
|
||||||
}
|
|
||||||
return $xrds_writer->writeXRDS($this->user, $xrds_mapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Echo a request token
|
|
||||||
*
|
|
||||||
* Outputs an unauthorized request token for the query found in $_GET or
|
|
||||||
* $_POST.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function writeRequestToken()
|
|
||||||
{
|
|
||||||
OMB_Helper::removeMagicQuotesFromRequest();
|
|
||||||
echo $this->getOAuthServer()->fetch_request_token(
|
|
||||||
OAuthRequest::from_request());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an user authorization request.
|
|
||||||
*
|
|
||||||
* Parses an authorization request. This includes OAuth and OMB
|
|
||||||
* verification.
|
|
||||||
* Throws exceptions on failures. Returns an OMB_Profile object representing
|
|
||||||
* the remote user.
|
|
||||||
*
|
|
||||||
* The OMB_Profile passed to the constructor of OMB_Service_Provider should
|
|
||||||
* not represent the user specified in the authorization request, but the
|
|
||||||
* one currently logged in to the service. This condition being satisfied,
|
|
||||||
* handleUserAuth will check whether the listener specified in the request
|
|
||||||
* is identical to the logged in user.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Profile The profile of the soon-to-be subscribed, i. e.
|
|
||||||
* remote user
|
|
||||||
*/
|
|
||||||
public function handleUserAuth()
|
|
||||||
{
|
|
||||||
OMB_Helper::removeMagicQuotesFromRequest();
|
|
||||||
|
|
||||||
/* Verify the request token. */
|
|
||||||
|
|
||||||
$this->token = $this->datastore->lookup_token(null, "request",
|
|
||||||
$_GET['oauth_token']);
|
|
||||||
if (is_null($this->token)) {
|
|
||||||
throw new OAuthException('The given request token has not been ' .
|
|
||||||
'issued by this service.');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Verify the OMB part. */
|
|
||||||
|
|
||||||
if ($_GET['omb_version'] !== OMB_VERSION) {
|
|
||||||
throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE,
|
|
||||||
'Wrong OMB version ' .
|
|
||||||
$_GET['omb_version']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($_GET['omb_listener'] !== $this->user->getIdentifierURI()) {
|
|
||||||
throw OMB_RemoteServiceException::forRequest(OAUTH_ENDPOINT_AUTHORIZE,
|
|
||||||
'Wrong OMB listener ' .
|
|
||||||
$_GET['omb_listener']);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (array('omb_listenee', 'omb_listenee_profile',
|
|
||||||
'omb_listenee_nickname', 'omb_listenee_license') as $param) {
|
|
||||||
if (!isset($_GET[$param]) || is_null($_GET[$param])) {
|
|
||||||
throw OMB_RemoteServiceException::forRequest(
|
|
||||||
OAUTH_ENDPOINT_AUTHORIZE,
|
|
||||||
"Required parameter '$param' not found");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store given callback for later use. */
|
|
||||||
if (isset($_GET['oauth_callback']) && $_GET['oauth_callback'] !== '') {
|
|
||||||
$this->callback = $_GET['oauth_callback'];
|
|
||||||
if (!OMB_Helper::validateURL($this->callback)) {
|
|
||||||
throw OMB_RemoteServiceException::forRequest(
|
|
||||||
OAUTH_ENDPOINT_AUTHORIZE,
|
|
||||||
'Invalid callback URL specified');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->remote_user = OMB_Profile::fromParameters($_GET, 'omb_listenee');
|
|
||||||
|
|
||||||
return $this->remote_user;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Continue the OAuth dance after user authorization
|
|
||||||
*
|
|
||||||
* Performs the appropriate actions after user answered the authorization
|
|
||||||
* request.
|
|
||||||
*
|
|
||||||
* @param bool $accepted Whether the user granted authorization
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return array A two-component array with the values:
|
|
||||||
* - callback The callback URL or null if none given
|
|
||||||
* - token The authorized request token or null if not
|
|
||||||
* authorized.
|
|
||||||
*/
|
|
||||||
public function continueUserAuth($accepted)
|
|
||||||
{
|
|
||||||
$callback = $this->callback;
|
|
||||||
if (!$accepted) {
|
|
||||||
$this->datastore->revoke_token($this->token->key);
|
|
||||||
$this->token = null;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
$this->datastore->authorize_token($this->token->key);
|
|
||||||
$this->datastore->saveProfile($this->remote_user);
|
|
||||||
$this->datastore->saveSubscription($this->user->getIdentifierURI(),
|
|
||||||
$this->remote_user->getIdentifierURI(),
|
|
||||||
$this->token);
|
|
||||||
|
|
||||||
if (!is_null($this->callback)) {
|
|
||||||
/* Callback wants to get some informations as well. */
|
|
||||||
$params = $this->user->asParameters('omb_listener', false);
|
|
||||||
|
|
||||||
$params['oauth_token'] = $this->token->key;
|
|
||||||
$params['omb_version'] = OMB_VERSION;
|
|
||||||
|
|
||||||
$callback .= (parse_url($this->callback, PHP_URL_QUERY) ? '&' : '?');
|
|
||||||
foreach ($params as $k => $v) {
|
|
||||||
$callback .= OAuthUtil::urlencode_rfc3986($k) . '=' .
|
|
||||||
OAuthUtil::urlencode_rfc3986($v) . '&';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return array($callback, $this->token);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Echo an access token
|
|
||||||
*
|
|
||||||
* Outputs an access token for the query found in $_POST. OMB 0.1 specifies
|
|
||||||
* that the access token request has to be a POST even if OAuth allows GET
|
|
||||||
* as well.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function writeAccessToken()
|
|
||||||
{
|
|
||||||
OMB_Helper::removeMagicQuotesFromRequest();
|
|
||||||
echo $this->getOAuthServer()->fetch_access_token(
|
|
||||||
OAuthRequest::from_request('POST'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an updateprofile request
|
|
||||||
*
|
|
||||||
* Handles an updateprofile request posted to this service. Updates the
|
|
||||||
* profile through the OMB_Datastore.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Profile The updated profile
|
|
||||||
*/
|
|
||||||
public function handleUpdateProfile()
|
|
||||||
{
|
|
||||||
list($req, $profile) = $this->handleOMBRequest(OMB_ENDPOINT_UPDATEPROFILE);
|
|
||||||
$profile->updateFromParameters($req->get_parameters(), 'omb_listenee');
|
|
||||||
$this->datastore->saveProfile($profile);
|
|
||||||
$this->finishOMBRequest();
|
|
||||||
return $profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle a postnotice request
|
|
||||||
*
|
|
||||||
* Handles a postnotice request posted to this service. Saves the notice
|
|
||||||
* through the OMB_Datastore.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Notice The received notice
|
|
||||||
*/
|
|
||||||
public function handlePostNotice()
|
|
||||||
{
|
|
||||||
list($req, $profile) = $this->handleOMBRequest(OMB_ENDPOINT_POSTNOTICE);
|
|
||||||
|
|
||||||
$notice = OMB_Notice::fromParameters($profile, $req->get_parameters());
|
|
||||||
$this->datastore->saveNotice($notice);
|
|
||||||
$this->finishOMBRequest();
|
|
||||||
|
|
||||||
return $notice;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an OMB request
|
|
||||||
*
|
|
||||||
* Performs common OMB request handling.
|
|
||||||
*
|
|
||||||
* @param string $uri The URI defining the OMB endpoint being served
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*
|
|
||||||
* @return array(OAuthRequest, OMB_Profile)
|
|
||||||
*/
|
|
||||||
protected function handleOMBRequest($uri)
|
|
||||||
{
|
|
||||||
OMB_Helper::removeMagicQuotesFromRequest();
|
|
||||||
$req = OAuthRequest::from_request('POST');
|
|
||||||
$listenee = $req->get_parameter('omb_listenee');
|
|
||||||
|
|
||||||
try {
|
|
||||||
list($consumer, $token) = $this->getOAuthServer()->verify_request($req);
|
|
||||||
} catch (OAuthException $e) {
|
|
||||||
header('HTTP/1.1 403 Forbidden');
|
|
||||||
throw OMB_RemoteServiceException::forRequest($uri,
|
|
||||||
'Revoked accesstoken for ' . $listenee);
|
|
||||||
}
|
|
||||||
|
|
||||||
$version = $req->get_parameter('omb_version');
|
|
||||||
if ($version !== OMB_VERSION) {
|
|
||||||
header('HTTP/1.1 400 Bad Request');
|
|
||||||
throw OMB_RemoteServiceException::forRequest($uri,
|
|
||||||
'Wrong OMB version ' . $version);
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile = $this->datastore->getProfile($listenee);
|
|
||||||
if (is_null($profile)) {
|
|
||||||
header('HTTP/1.1 400 Bad Request');
|
|
||||||
throw OMB_RemoteServiceException::forRequest($uri,
|
|
||||||
'Unknown remote profile ' . $listenee);
|
|
||||||
}
|
|
||||||
|
|
||||||
$subscribers = $this->datastore->getSubscriptions($listenee);
|
|
||||||
if (count($subscribers) === 0) {
|
|
||||||
header('HTTP/1.1 403 Forbidden');
|
|
||||||
throw OMB_RemoteServiceException::forRequest($uri,
|
|
||||||
'No subscriber for ' . $listenee);
|
|
||||||
}
|
|
||||||
|
|
||||||
return array($req, $profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finishes an OMB request handling
|
|
||||||
*
|
|
||||||
* Performs common OMB request handling finishing.
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function finishOMBRequest()
|
|
||||||
{
|
|
||||||
header('HTTP/1.1 200 OK');
|
|
||||||
header('Content-type: text/plain');
|
|
||||||
/* There should be no clutter but the version. */
|
|
||||||
echo "omb_version=" . OMB_VERSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return an OAuthServer
|
|
||||||
*
|
|
||||||
* Checks whether the OAuthServer is null. If so, initializes it with a
|
|
||||||
* default value. Returns the OAuth server.
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function getOAuthServer()
|
|
||||||
{
|
|
||||||
if (is_null($this->oauth_server)) {
|
|
||||||
$this->oauth_server = new OAuthServer($this->datastore);
|
|
||||||
$this->oauth_server->add_signature_method(
|
|
||||||
new OAuthSignatureMethod_HMAC_SHA1());
|
|
||||||
}
|
|
||||||
return $this->oauth_server;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Publish a notice
|
|
||||||
*
|
|
||||||
* Posts an OMB notice. This includes storing the notice and posting it to
|
|
||||||
* subscribed users.
|
|
||||||
*
|
|
||||||
* @param OMB_Notice $notice The new notice
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return array An array mapping subscriber URIs to the exception posting
|
|
||||||
* to them has raised; Empty array if no exception occured
|
|
||||||
*/
|
|
||||||
public function postNotice($notice)
|
|
||||||
{
|
|
||||||
$uri = $this->user->getIdentifierURI();
|
|
||||||
|
|
||||||
/* $notice is passed by reference and may change. */
|
|
||||||
$this->datastore->saveNotice($notice);
|
|
||||||
$subscribers = $this->datastore->getSubscriptions($uri);
|
|
||||||
|
|
||||||
/* No one to post to. */
|
|
||||||
if (is_null($subscribers)) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'service_consumer.php';
|
|
||||||
|
|
||||||
$err = array();
|
|
||||||
foreach ($subscribers as $subscriber) {
|
|
||||||
try {
|
|
||||||
$service = new OMB_Service_Consumer($subscriber['uri'], $uri,
|
|
||||||
$this->datastore);
|
|
||||||
$service->setToken($subscriber['token'], $subscriber['secret']);
|
|
||||||
$service->postNotice($notice);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$err[$subscriber['uri']] = $e;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Publish a profile update
|
|
||||||
*
|
|
||||||
* Posts the current profile as an OMB profile update. This includes
|
|
||||||
* updating the stored profile and posting it to subscribed users.
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return array An array mapping subscriber URIs to the exception posting
|
|
||||||
* to them has raised; Empty array if no exception occured
|
|
||||||
*/
|
|
||||||
public function updateProfile()
|
|
||||||
{
|
|
||||||
$uri = $this->user->getIdentifierURI();
|
|
||||||
|
|
||||||
$this->datastore->saveProfile($this->user);
|
|
||||||
$subscribers = $this->datastore->getSubscriptions($uri);
|
|
||||||
|
|
||||||
/* No one to post to. */
|
|
||||||
if (is_null($subscribers)) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'service_consumer.php';
|
|
||||||
|
|
||||||
$err = array();
|
|
||||||
foreach ($subscribers as $subscriber) {
|
|
||||||
try {
|
|
||||||
$service = new OMB_Service_Consumer($subscriber['uri'], $uri,
|
|
||||||
$this->datastore);
|
|
||||||
$service->setToken($subscriber['token'], $subscriber['secret']);
|
|
||||||
$service->updateProfile($this->user);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$err[$subscriber['uri']] = $e;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $err;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Exception stating that a requested service is not available
|
|
||||||
*
|
|
||||||
* This exception is raised when OMB_Service is asked to call a service the
|
|
||||||
* remote server does not provide.
|
|
||||||
*/
|
|
||||||
class OMB_UnsupportedServiceException extends Exception
|
|
||||||
{
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,47 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Map XRDS actions to URLs
|
|
||||||
*
|
|
||||||
* This interface specifies classes which write the XRDS file announcing
|
|
||||||
* the OMB server. An instance of an implementing class should be passed to
|
|
||||||
* OMB_Service_Provider->writeXRDS.
|
|
||||||
*/
|
|
||||||
interface OMB_XRDS_Mapper
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Fetch an URL for a specified action
|
|
||||||
*
|
|
||||||
* Returns the action URL for an action specified by the endpoint URI.
|
|
||||||
*
|
|
||||||
* @param string $action The endpoint URI
|
|
||||||
*
|
|
||||||
* @return string The action URL
|
|
||||||
*/
|
|
||||||
public function getURL($action);
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,46 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This file is part of libomb
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* LICENSE: This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @package OMB
|
|
||||||
* @author Adrian Lang <mail@adrianlang.de>
|
|
||||||
* @license http://www.gnu.org/licenses/agpl.html GNU AGPL 3.0
|
|
||||||
* @version 0.1a-20090828
|
|
||||||
* @link http://adrianlang.de/libomb
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write OMB-specific XRDS
|
|
||||||
*
|
|
||||||
* This interface specifies classes which write the XRDS file announcing
|
|
||||||
* the OMB server. An instance of an implementing class should be passed to
|
|
||||||
* OMB_Service_Provider->writeXRDS.
|
|
||||||
*/
|
|
||||||
interface OMB_XRDS_Writer
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Write XRDS
|
|
||||||
*
|
|
||||||
* Outputs a XRDS document specifying an OMB service.
|
|
||||||
*
|
|
||||||
* @param OMB_profile $user The target user for the OMB service
|
|
||||||
* @param OMB_XRDS_Mapper $mapper An OMB_XRDS_Mapper providing endpoint URLs
|
|
||||||
*/
|
|
||||||
public function writeXRDS($user, $mapper);
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,235 +0,0 @@
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
$dir = dirname(__FILE__);
|
|
||||||
|
|
||||||
require_once $dir . '/../extlib/libomb/constants.php';
|
|
||||||
require_once $dir . '/../extlib/libomb/service_consumer.php';
|
|
||||||
require_once $dir . '/../extlib/libomb/notice.php';
|
|
||||||
require_once $dir . '/../extlib/libomb/profile.php';
|
|
||||||
require_once INSTALLDIR . '/extlib/Auth/Yadis/Yadis.php';
|
|
||||||
|
|
||||||
function omb_oauth_consumer()
|
|
||||||
{
|
|
||||||
// Don't try to make this static. Leads to issues in
|
|
||||||
// multi-site setups - Z
|
|
||||||
return new OAuthConsumer(common_root_url(), '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function omb_oauth_server()
|
|
||||||
{
|
|
||||||
static $server = null;
|
|
||||||
if (is_null($server)) {
|
|
||||||
$server = new OAuthServer(omb_oauth_datastore());
|
|
||||||
$server->add_signature_method(omb_hmac_sha1());
|
|
||||||
}
|
|
||||||
return $server;
|
|
||||||
}
|
|
||||||
|
|
||||||
function omb_oauth_datastore()
|
|
||||||
{
|
|
||||||
static $store = null;
|
|
||||||
if (is_null($store)) {
|
|
||||||
$store = new OMBOAuthDataStore();
|
|
||||||
}
|
|
||||||
return $store;
|
|
||||||
}
|
|
||||||
|
|
||||||
function omb_hmac_sha1()
|
|
||||||
{
|
|
||||||
static $hmac_method = null;
|
|
||||||
if (is_null($hmac_method)) {
|
|
||||||
$hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
|
|
||||||
}
|
|
||||||
return $hmac_method;
|
|
||||||
}
|
|
||||||
|
|
||||||
function omb_broadcast_notice($notice)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$omb_notice = notice_to_omb_notice($notice);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
// @fixme we should clean up or highlight the problem item
|
|
||||||
common_log(LOG_ERR, 'Invalid OMB outgoing notice for notice ' . $notice->id);
|
|
||||||
common_log(LOG_ERR, 'Error status '.$e);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get remote users subscribed to this profile. */
|
|
||||||
$rp = new Remote_profile();
|
|
||||||
|
|
||||||
$rp->query('SELECT remote_profile.*, secret, token ' .
|
|
||||||
'FROM subscription JOIN remote_profile ' .
|
|
||||||
'ON subscription.subscriber = remote_profile.id ' .
|
|
||||||
'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
|
|
||||||
|
|
||||||
$posted = array();
|
|
||||||
|
|
||||||
while ($rp->fetch()) {
|
|
||||||
if (isset($posted[$rp->postnoticeurl])) {
|
|
||||||
/* We already posted to this url. */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
common_debug('Posting to ' . $rp->postnoticeurl, __FILE__);
|
|
||||||
|
|
||||||
/* Post notice. */
|
|
||||||
$service = new StatusNet_OMB_Service_Consumer(
|
|
||||||
array(OMB_ENDPOINT_POSTNOTICE => $rp->postnoticeurl),
|
|
||||||
$rp->uri);
|
|
||||||
try {
|
|
||||||
$service->setToken($rp->token, $rp->secret);
|
|
||||||
$service->postNotice($omb_notice);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
common_log(LOG_ERR, 'Failed posting to ' . $rp->postnoticeurl);
|
|
||||||
common_log(LOG_ERR, 'Error status '.$e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$posted[$rp->postnoticeurl] = true;
|
|
||||||
|
|
||||||
common_debug('Finished to ' . $rp->postnoticeurl, __FILE__);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function omb_broadcast_profile($profile)
|
|
||||||
{
|
|
||||||
$user = User::getKV('id', $profile->id);
|
|
||||||
|
|
||||||
if (!$user) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile = $user->getProfile();
|
|
||||||
|
|
||||||
$omb_profile = profile_to_omb_profile($user->uri, $profile, true);
|
|
||||||
|
|
||||||
/* Get remote users subscribed to this profile. */
|
|
||||||
$rp = new Remote_profile();
|
|
||||||
|
|
||||||
$rp->query('SELECT remote_profile.*, secret, token ' .
|
|
||||||
'FROM subscription JOIN remote_profile ' .
|
|
||||||
'ON subscription.subscriber = remote_profile.id ' .
|
|
||||||
'WHERE subscription.subscribed = ' . $profile->id . ' ');
|
|
||||||
|
|
||||||
$posted = array();
|
|
||||||
|
|
||||||
while ($rp->fetch()) {
|
|
||||||
if (isset($posted[$rp->updateprofileurl])) {
|
|
||||||
/* We already posted to this url. */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
common_debug('Posting to ' . $rp->updateprofileurl, __FILE__);
|
|
||||||
|
|
||||||
/* Update profile. */
|
|
||||||
$service = new StatusNet_OMB_Service_Consumer(
|
|
||||||
array(OMB_ENDPOINT_UPDATEPROFILE => $rp->updateprofileurl),
|
|
||||||
$rp->uri);
|
|
||||||
try {
|
|
||||||
$service->setToken($rp->token, $rp->secret);
|
|
||||||
$service->updateProfile($omb_profile);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
common_log(LOG_ERR, 'Failed posting to ' . $rp->updateprofileurl);
|
|
||||||
common_log(LOG_ERR, 'Error status '.$e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$posted[$rp->updateprofileurl] = true;
|
|
||||||
|
|
||||||
common_debug('Finished to ' . $rp->updateprofileurl, __FILE__);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
class StatusNet_OMB_Service_Consumer extends OMB_Service_Consumer {
|
|
||||||
public function __construct($urls, $listener_uri=null)
|
|
||||||
{
|
|
||||||
$this->services = $urls;
|
|
||||||
$this->datastore = omb_oauth_datastore();
|
|
||||||
$this->oauth_consumer = omb_oauth_consumer();
|
|
||||||
$this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
|
|
||||||
$this->fetcher->timeout = intval(common_config('omb', 'timeout'));
|
|
||||||
$this->listener_uri = $listener_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function profile_to_omb_profile($uri, $profile, $force = false)
|
|
||||||
{
|
|
||||||
$omb_profile = new OMB_Profile($uri);
|
|
||||||
$omb_profile->setNickname($profile->nickname);
|
|
||||||
$omb_profile->setLicenseURL(common_config('license', 'url'));
|
|
||||||
if (!is_null($profile->fullname)) {
|
|
||||||
$omb_profile->setFullname($profile->fullname);
|
|
||||||
} elseif ($force) {
|
|
||||||
$omb_profile->setFullname('');
|
|
||||||
}
|
|
||||||
if (!is_null($profile->homepage)) {
|
|
||||||
$omb_profile->setHomepage($profile->homepage);
|
|
||||||
} elseif ($force) {
|
|
||||||
$omb_profile->setHomepage('');
|
|
||||||
}
|
|
||||||
if (!is_null($profile->bio)) {
|
|
||||||
$omb_profile->setBio($profile->bio);
|
|
||||||
} elseif ($force) {
|
|
||||||
$omb_profile->setBio('');
|
|
||||||
}
|
|
||||||
if (!is_null($profile->location)) {
|
|
||||||
$omb_profile->setLocation($profile->location);
|
|
||||||
} elseif ($force) {
|
|
||||||
$omb_profile->setLocation('');
|
|
||||||
}
|
|
||||||
if (!is_null($profile->profileurl)) {
|
|
||||||
$omb_profile->setProfileURL($profile->profileurl);
|
|
||||||
} elseif ($force) {
|
|
||||||
$omb_profile->setProfileURL('');
|
|
||||||
}
|
|
||||||
|
|
||||||
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
|
|
||||||
if ($avatar) {
|
|
||||||
$omb_profile->setAvatarURL($avatar->url);
|
|
||||||
} elseif ($force) {
|
|
||||||
$omb_profile->setAvatarURL('');
|
|
||||||
}
|
|
||||||
return $omb_profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
function notice_to_omb_notice($notice)
|
|
||||||
{
|
|
||||||
/* Create an OMB_Notice for $notice. */
|
|
||||||
$user = User::getKV('id', $notice->profile_id);
|
|
||||||
|
|
||||||
if (!$user) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile = $user->getProfile();
|
|
||||||
|
|
||||||
$omb_notice = new OMB_Notice(profile_to_omb_profile($user->uri, $profile),
|
|
||||||
$notice->uri,
|
|
||||||
$notice->content);
|
|
||||||
$omb_notice->setURL(common_local_url('shownotice', array('notice' =>
|
|
||||||
$notice->id)));
|
|
||||||
$omb_notice->setLicenseURL(common_config('license', 'url'));
|
|
||||||
|
|
||||||
return $omb_notice;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,502 +0,0 @@
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011 StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../extlib/libomb/datastore.php';
|
|
||||||
|
|
||||||
// @todo FIXME: Class documentation missing.
|
|
||||||
class OMBOAuthDataStore extends OAuthDataStore
|
|
||||||
{
|
|
||||||
// We keep a record of who's contacted us
|
|
||||||
function lookup_consumer($consumer_key)
|
|
||||||
{
|
|
||||||
$con = Consumer::getKV('consumer_key', $consumer_key);
|
|
||||||
if (!$con) {
|
|
||||||
$con = new Consumer();
|
|
||||||
$con->consumer_key = $consumer_key;
|
|
||||||
$con->seed = common_random_hexstr(16);
|
|
||||||
$con->created = common_sql_now();
|
|
||||||
if (!$con->insert()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new OAuthConsumer($con->consumer_key, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function lookup_token($consumer, $token_type, $token_key)
|
|
||||||
{
|
|
||||||
$t = new Token();
|
|
||||||
if (!is_null($consumer)) {
|
|
||||||
$t->consumer_key = $consumer->key;
|
|
||||||
}
|
|
||||||
$t->tok = $token_key;
|
|
||||||
$t->type = ($token_type == 'access') ? 1 : 0;
|
|
||||||
if ($t->find(true)) {
|
|
||||||
return new OAuthToken($t->tok, $t->secret);
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://oauth.net/core/1.0/#nonce
|
|
||||||
// "The Consumer SHALL then generate a Nonce value that is unique for
|
|
||||||
// all requests with that timestamp."
|
|
||||||
// XXX: It's not clear why the token is here
|
|
||||||
function lookup_nonce($consumer, $token, $nonce, $timestamp)
|
|
||||||
{
|
|
||||||
$n = new Nonce();
|
|
||||||
$n->consumer_key = $consumer->key;
|
|
||||||
$n->ts = common_sql_date($timestamp);
|
|
||||||
$n->nonce = $nonce;
|
|
||||||
if ($n->find(true)) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$n->created = common_sql_now();
|
|
||||||
$n->insert();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function new_request_token($consumer)
|
|
||||||
{
|
|
||||||
$t = new Token();
|
|
||||||
$t->consumer_key = $consumer->key;
|
|
||||||
$t->tok = common_random_hexstr(16);
|
|
||||||
$t->secret = common_random_hexstr(16);
|
|
||||||
$t->type = 0; // request
|
|
||||||
$t->state = 0; // unauthorized
|
|
||||||
$t->created = common_sql_now();
|
|
||||||
if (!$t->insert()) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return new OAuthToken($t->tok, $t->secret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// defined in OAuthDataStore, but not implemented anywhere
|
|
||||||
function fetch_request_token($consumer)
|
|
||||||
{
|
|
||||||
return $this->new_request_token($consumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
function new_access_token($token, $consumer)
|
|
||||||
{
|
|
||||||
common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
|
|
||||||
$rt = new Token();
|
|
||||||
$rt->consumer_key = $consumer->key;
|
|
||||||
$rt->tok = $token->key;
|
|
||||||
$rt->type = 0; // request
|
|
||||||
if ($rt->find(true) && $rt->state == 1) { // authorized
|
|
||||||
common_debug('request token found.', __FILE__);
|
|
||||||
$at = new Token();
|
|
||||||
$at->consumer_key = $consumer->key;
|
|
||||||
$at->tok = common_random_hexstr(16);
|
|
||||||
$at->secret = common_random_hexstr(16);
|
|
||||||
$at->type = 1; // access
|
|
||||||
$at->created = common_sql_now();
|
|
||||||
if (!$at->insert()) {
|
|
||||||
$e = $at->_lastError;
|
|
||||||
common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
common_debug('access token "'.$at->tok.'" inserted', __FILE__);
|
|
||||||
// burn the old one
|
|
||||||
$orig_rt = clone($rt);
|
|
||||||
$rt->state = 2; // used
|
|
||||||
if (!$rt->update($orig_rt)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
common_debug('request token "'.$rt->tok.'" updated', __FILE__);
|
|
||||||
// Update subscription
|
|
||||||
// XXX: mixing levels here
|
|
||||||
$sub = Subscription::getKV('token', $rt->tok);
|
|
||||||
if (!$sub) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
common_debug('subscription for request token found', __FILE__);
|
|
||||||
$orig_sub = clone($sub);
|
|
||||||
$sub->token = $at->tok;
|
|
||||||
$sub->secret = $at->secret;
|
|
||||||
if (!$sub->update($orig_sub)) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
common_debug('subscription updated to use access token', __FILE__);
|
|
||||||
return new OAuthToken($at->tok, $at->secret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// defined in OAuthDataStore, but not implemented anywhere
|
|
||||||
function fetch_access_token($consumer)
|
|
||||||
{
|
|
||||||
return $this->new_access_token($consumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Revoke specified OAuth token
|
|
||||||
*
|
|
||||||
* Revokes the authorization token specified by $token_key.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $token_key The token to be revoked
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
**/
|
|
||||||
public function revoke_token($token_key) {
|
|
||||||
$rt = new Token();
|
|
||||||
$rt->tok = $token_key;
|
|
||||||
$rt->type = 0;
|
|
||||||
$rt->state = 0;
|
|
||||||
if (!$rt->find(true)) {
|
|
||||||
throw new Exception('Tried to revoke unknown token');
|
|
||||||
}
|
|
||||||
if (!$rt->delete()) {
|
|
||||||
throw new Exception('Failed to delete revoked token');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Authorize specified OAuth token
|
|
||||||
*
|
|
||||||
* Authorizes the authorization token specified by $token_key.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $token_key The token to be authorized
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
**/
|
|
||||||
public function authorize_token($token_key) {
|
|
||||||
$rt = new Token();
|
|
||||||
$rt->tok = $token_key;
|
|
||||||
$rt->type = 0;
|
|
||||||
$rt->state = 0;
|
|
||||||
if (!$rt->find(true)) {
|
|
||||||
throw new Exception('Tried to authorize unknown token');
|
|
||||||
}
|
|
||||||
$orig_rt = clone($rt);
|
|
||||||
$rt->state = 1; # Authorized but not used
|
|
||||||
if (!$rt->update($orig_rt)) {
|
|
||||||
throw new Exception('Failed to authorize token');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get profile by identifying URI
|
|
||||||
*
|
|
||||||
* Returns an OMB_Profile object representing the OMB profile identified by
|
|
||||||
* $identifier_uri.
|
|
||||||
* Returns null if there is no such OMB profile.
|
|
||||||
* Throws exceptions in case of other error.
|
|
||||||
*
|
|
||||||
* @param string $identifier_uri The OMB identifier URI specifying the
|
|
||||||
* requested profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return OMB_Profile The corresponding profile
|
|
||||||
**/
|
|
||||||
public function getProfile($identifier_uri) {
|
|
||||||
/* getProfile is only used for remote profiles by libomb.
|
|
||||||
@TODO: Make it work with local ones anyway. */
|
|
||||||
$remote = Remote_profile::getKV('uri', $identifier_uri);
|
|
||||||
if (!$remote) throw new Exception('No such remote profile');
|
|
||||||
$profile = Profile::getKV('id', $remote->id);
|
|
||||||
if (!$profile) throw new Exception('No profile for remote user');
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/omb.php';
|
|
||||||
return profile_to_omb_profile($identifier_uri, $profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save passed profile
|
|
||||||
*
|
|
||||||
* Stores the OMB profile $profile. Overwrites an existing entry.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param OMB_Profile $profile The OMB profile which should be saved
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
**/
|
|
||||||
public function saveProfile($omb_profile) {
|
|
||||||
if (common_profile_url($omb_profile->getNickname()) ==
|
|
||||||
$omb_profile->getProfileURL()) {
|
|
||||||
throw new Exception('Not implemented');
|
|
||||||
} else {
|
|
||||||
$remote = Remote_profile::getKV('uri', $omb_profile->getIdentifierURI());
|
|
||||||
|
|
||||||
if ($remote) {
|
|
||||||
$exists = true;
|
|
||||||
$profile = Profile::getKV($remote->id);
|
|
||||||
$orig_remote = clone($remote);
|
|
||||||
$orig_profile = clone($profile);
|
|
||||||
// XXX: compare current postNotice and updateProfile URLs to the ones
|
|
||||||
// stored in the DB to avoid (possibly...) above attack
|
|
||||||
} else {
|
|
||||||
$exists = false;
|
|
||||||
$remote = new Remote_profile();
|
|
||||||
$remote->uri = $omb_profile->getIdentifierURI();
|
|
||||||
$profile = new Profile();
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile->nickname = $omb_profile->getNickname();
|
|
||||||
$profile->profileurl = $omb_profile->getProfileURL();
|
|
||||||
|
|
||||||
$fullname = $omb_profile->getFullname();
|
|
||||||
$profile->fullname = is_null($fullname) ? '' : $fullname;
|
|
||||||
$homepage = $omb_profile->getHomepage();
|
|
||||||
$profile->homepage = is_null($homepage) ? '' : $homepage;
|
|
||||||
$bio = $omb_profile->getBio();
|
|
||||||
$profile->bio = is_null($bio) ? '' : $bio;
|
|
||||||
$location = $omb_profile->getLocation();
|
|
||||||
$profile->location = is_null($location) ? '' : $location;
|
|
||||||
|
|
||||||
if ($exists) {
|
|
||||||
$profile->update($orig_profile);
|
|
||||||
} else {
|
|
||||||
$profile->created = common_sql_now(); # current time
|
|
||||||
$id = $profile->insert();
|
|
||||||
if (!$id) {
|
|
||||||
// TRANS: Exception thrown when creating a new profile fails in OAuth store.
|
|
||||||
throw new Exception(_('Error inserting new profile.'));
|
|
||||||
}
|
|
||||||
$remote->id = $id;
|
|
||||||
}
|
|
||||||
|
|
||||||
$avatar_url = $omb_profile->getAvatarURL();
|
|
||||||
if ($avatar_url) {
|
|
||||||
if (!$this->add_avatar($profile, $avatar_url)) {
|
|
||||||
// TRANS: Exception thrown when creating a new avatar fails in OAuth store.
|
|
||||||
throw new Exception(_('Error inserting avatar.'));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Avatar::deleteFromProfile($profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($exists) {
|
|
||||||
if (!$remote->update($orig_remote)) {
|
|
||||||
// TRANS: Exception thrown when updating a remote profile fails in OAuth store.
|
|
||||||
throw new Exception(_('Error updating remote profile.'));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$remote->created = common_sql_now(); # current time
|
|
||||||
if (!$remote->insert()) {
|
|
||||||
// TRANS: Exception thrown when creating a remote profile fails in OAuth store.
|
|
||||||
throw new Exception(_('Error inserting remote profile.'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function add_avatar($profile, $url)
|
|
||||||
{
|
|
||||||
$temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
|
|
||||||
try {
|
|
||||||
copy($url, $temp_filename);
|
|
||||||
$imagefile = new ImageFile($profile->id, $temp_filename);
|
|
||||||
$filename = Avatar::filename($profile->id,
|
|
||||||
image_type_to_extension($imagefile->type),
|
|
||||||
null,
|
|
||||||
common_timestamp());
|
|
||||||
rename($temp_filename, Avatar::path($filename));
|
|
||||||
} catch (Exception $e) {
|
|
||||||
unlink($temp_filename);
|
|
||||||
throw $e;
|
|
||||||
}
|
|
||||||
return $profile->setOriginal($filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save passed notice
|
|
||||||
*
|
|
||||||
* Stores the OMB notice $notice. The datastore may change the passed notice.
|
|
||||||
* This might by neccessary for URIs depending on a database key. Note that
|
|
||||||
* it is the user’s duty to present a mechanism for his OMB_Datastore to
|
|
||||||
* appropriately change his OMB_Notice.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param OMB_Notice $notice The OMB notice which should be saved
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
**/
|
|
||||||
public function saveNotice(&$omb_notice) {
|
|
||||||
if (Notice::getKV('uri', $omb_notice->getIdentifierURI())) {
|
|
||||||
// TRANS: Exception thrown when a notice is denied because it has been sent before.
|
|
||||||
throw new Exception(_('Duplicate notice.'));
|
|
||||||
}
|
|
||||||
$author_uri = $omb_notice->getAuthor()->getIdentifierURI();
|
|
||||||
common_log(LOG_DEBUG, $author_uri, __FILE__);
|
|
||||||
$author = Remote_profile::getKV('uri', $author_uri);
|
|
||||||
if (!$author) {
|
|
||||||
$author = User::getKV('uri', $author_uri);
|
|
||||||
}
|
|
||||||
if (!$author) {
|
|
||||||
throw new Exception('No such user.');
|
|
||||||
}
|
|
||||||
|
|
||||||
common_log(LOG_DEBUG, print_r($author, true), __FILE__);
|
|
||||||
|
|
||||||
$notice = Notice::saveNew($author->id,
|
|
||||||
$omb_notice->getContent(),
|
|
||||||
'omb',
|
|
||||||
array('is_local' => Notice::REMOTE,
|
|
||||||
'uri' => $omb_notice->getIdentifierURI()));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get subscriptions of a given profile
|
|
||||||
*
|
|
||||||
* Returns an array containing subscription informations for the specified
|
|
||||||
* profile. Every array entry should in turn be an array with keys
|
|
||||||
* 'uri´: The identifier URI of the subscriber
|
|
||||||
* 'token´: The subscribe token
|
|
||||||
* 'secret´: The secret token
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $subscribed_user_uri The OMB identifier URI specifying the
|
|
||||||
* subscribed profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*
|
|
||||||
* @return mixed An array containing the subscriptions or 0 if no
|
|
||||||
* subscription has been found.
|
|
||||||
**/
|
|
||||||
public function getSubscriptions($subscribed_user_uri) {
|
|
||||||
$sub = new Subscription();
|
|
||||||
|
|
||||||
$user = $this->_getAnyProfile($subscribed_user_uri);
|
|
||||||
|
|
||||||
$sub->subscribed = $user->id;
|
|
||||||
|
|
||||||
if (!$sub->find(true)) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Since we do not use OMB_Service_Provider’s action methods, there
|
|
||||||
is no need to actually return the subscriptions. */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function _getAnyProfile($uri)
|
|
||||||
{
|
|
||||||
$user = Remote_profile::getKV('uri', $uri);
|
|
||||||
if (!$user) {
|
|
||||||
$user = User::getKV('uri', $uri);
|
|
||||||
}
|
|
||||||
if (!$user) {
|
|
||||||
throw new Exception('No such user.');
|
|
||||||
}
|
|
||||||
return $user;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a subscription
|
|
||||||
*
|
|
||||||
* Deletes the subscription from $subscriber_uri to $subscribed_user_uri.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $subscriber_uri The OMB identifier URI specifying the
|
|
||||||
* subscribing profile
|
|
||||||
*
|
|
||||||
* @param string $subscribed_user_uri The OMB identifier URI specifying the
|
|
||||||
* subscribed profile
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
**/
|
|
||||||
public function deleteSubscription($subscriber_uri, $subscribed_user_uri)
|
|
||||||
{
|
|
||||||
$sub = new Subscription();
|
|
||||||
|
|
||||||
$subscribed = $this->_getAnyProfile($subscribed_user_uri);
|
|
||||||
$subscriber = $this->_getAnyProfile($subscriber_uri);
|
|
||||||
|
|
||||||
$sub->subscribed = $subscribed->id;
|
|
||||||
$sub->subscriber = $subscriber->id;
|
|
||||||
|
|
||||||
$sub->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save a subscription
|
|
||||||
*
|
|
||||||
* Saves the subscription from $subscriber_uri to $subscribed_user_uri.
|
|
||||||
* Throws exceptions in case of error.
|
|
||||||
*
|
|
||||||
* @param string $subscriber_uri The OMB identifier URI specifying
|
|
||||||
* the subscribing profile
|
|
||||||
*
|
|
||||||
* @param string $subscribed_user_uri The OMB identifier URI specifying
|
|
||||||
* the subscribed profile
|
|
||||||
* @param OAuthToken $token The access token
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
**/
|
|
||||||
public function saveSubscription($subscriber_uri, $subscribed_user_uri,
|
|
||||||
$token)
|
|
||||||
{
|
|
||||||
$sub = new Subscription();
|
|
||||||
|
|
||||||
$subscribed = $this->_getAnyProfile($subscribed_user_uri);
|
|
||||||
$subscriber = $this->_getAnyProfile($subscriber_uri);
|
|
||||||
|
|
||||||
if (!$subscriber->hasRight(Right::SUBSCRIBE)) {
|
|
||||||
common_log(LOG_INFO, __METHOD__ . ": remote subscriber banned ($subscriber_uri subbing to $subscribed_user_uri)");
|
|
||||||
// TRANS: Error message displayed to a banned user when they try to subscribe.
|
|
||||||
return _('You have been banned from subscribing.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$sub->subscribed = $subscribed->id;
|
|
||||||
$sub->subscriber = $subscriber->id;
|
|
||||||
|
|
||||||
$sub_exists = $sub->find(true);
|
|
||||||
|
|
||||||
if ($sub_exists) {
|
|
||||||
$orig_sub = clone($sub);
|
|
||||||
} else {
|
|
||||||
$sub->created = common_sql_now();
|
|
||||||
}
|
|
||||||
|
|
||||||
$sub->token = $token->key;
|
|
||||||
$sub->secret = $token->secret;
|
|
||||||
|
|
||||||
if ($sub_exists) {
|
|
||||||
$result = $sub->update($orig_sub);
|
|
||||||
} else {
|
|
||||||
$result = $sub->insert();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$result) {
|
|
||||||
common_log_db_error($sub, ($sub_exists) ? 'UPDATE' : 'INSERT', __FILE__);
|
|
||||||
// TRANS: Exception thrown when creating a new subscription fails in OAuth store.
|
|
||||||
throw new Exception(_('Could not insert new subscription.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Notify user, if necessary. */
|
|
||||||
|
|
||||||
if ($subscribed instanceof User) {
|
|
||||||
mail_subscribe_notify_profile($subscribed,
|
|
||||||
Profile::getKV($subscriber->id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Queue handler for pushing new notices to OpenMicroBlogging subscribers.
|
|
||||||
*/
|
|
||||||
class OmbQueueHandler extends QueueHandler
|
|
||||||
{
|
|
||||||
|
|
||||||
function transport()
|
|
||||||
{
|
|
||||||
return 'omb';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @fixme doesn't currently report failure back to the queue manager
|
|
||||||
* because omb_broadcast_notice() doesn't report it to us
|
|
||||||
*/
|
|
||||||
function handle($notice)
|
|
||||||
{
|
|
||||||
if ($this->is_remote($notice)) {
|
|
||||||
common_log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
require_once(dirname(__FILE__) . '/omb.php');
|
|
||||||
omb_broadcast_notice($notice);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function is_remote($notice)
|
|
||||||
{
|
|
||||||
$user = User::getKV($notice->profile_id);
|
|
||||||
return is_null($user);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2010-2011, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @package QueueHandler
|
|
||||||
* @maintainer Brion Vibber <brion@status.net>
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ProfileQueueHandler extends QueueHandler
|
|
||||||
{
|
|
||||||
|
|
||||||
function transport()
|
|
||||||
{
|
|
||||||
return 'profile';
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle($profile)
|
|
||||||
{
|
|
||||||
if (!($profile instanceof Profile)) {
|
|
||||||
common_log(LOG_ERR, "Got a bogus profile, not broadcasting");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Event::handle('StartBroadcastProfile', array($profile))) {
|
|
||||||
require_once(dirname(__FILE__) . '/omb.php');
|
|
||||||
try {
|
|
||||||
omb_broadcast_profile($profile);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
common_log(LOG_ERR, "Failed sending OMB profiles: " . $e->getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Event::handle('EndBroadcastProfile', array($profile));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
# SOME DESCRIPTIVE TITLE.
|
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
|
||||||
# This file is distributed under the same license as the PACKAGE package.
|
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
||||||
#
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
#: actions/remotesubscribe.php:147 OMBPlugin.php:388
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
#: actions/userauthorization.php:202
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
#: actions/userauthorization.php:207
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
#: OMBPlugin.php:233
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
#: OMBPlugin.php:260
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
#: OMBPlugin.php:284
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
#: OMBPlugin.php:318
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
#: OMBPlugin.php:408
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
|
@ -1,58 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Breton (brezhoneg)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Y-M D
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: Breton <https://translatewiki.net/wiki/Portal:br>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: br\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Koumanantiñ"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Asantiñ"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Disteurel"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
|
@ -1,58 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Catalan (català)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Toniher
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: Catalan <https://translatewiki.net/wiki/Portal:ca>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: ca\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Subscriu"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Accepta"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rebutja"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
|
@ -1,61 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to German (Deutsch)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Alphakilo
|
|
||||||
# Author: Marcel083
|
|
||||||
# Author: PtM
|
|
||||||
# Author: Tiin
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: German <https://translatewiki.net/wiki/Portal:de>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: de\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Abonnieren"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Annehmen"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Ablehnen"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Sie können mit dieser Aktion kein OMB0.1 Profil abonnieren."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Du kannst mit dieser Aktion kein OMB-0.1-Profil auflisten."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Du kannst mit dieser Aktion kein OMB-0.1-Profil (ab)listen."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Konnte Abonnement-OMB-Token nicht löschen."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr "Ein Beispiel-Plugin Grundlagen der Entwicklung neuen Hacker zu zeigen."
|
|
|
@ -1,57 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Spanish (español)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Armando-Martin
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Suscribirse"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Aceptar"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rechazar"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "No es posible suscribirse a un perfil remoto OMB 0.1 con esta acción."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "No puede listar un perfil remoto OMB 0.1 con esta acción."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "No puede (des)listar un perfil remoto OMB 0.1 con esta acción."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "No se pudo eliminar el token de suscripción OMB."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Un complemento (plugin) de ejemplo para mostrar los principios básicos de "
|
|
||||||
"desarrollo a los nuevos programadores."
|
|
|
@ -1,60 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Basque (euskara)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: An13sa
|
|
||||||
# Author: Artsuaga
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: Basque <https://translatewiki.net/wiki/Portal:eu>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: eu\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Harpidetu"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Onartu"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Baztertu"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Ezin zaitezke OMB 0.1 hurruneko profilera harpidetu ekintza honekin."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Ezin duzu OMB 0.1 hurruneko profil bat zerrendatu ekintza honekin."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Ezin duzu OMB 0.1 hurruneko profil bat (des)zerrendatu ekintza honekin."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "OMB token harpidetza ezin da ezabatu."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr "Frogako plugin bat, hacker berriei garapen oinarriak erakusteko."
|
|
|
@ -1,62 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to French (français)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Gomoko
|
|
||||||
# Author: Od1n
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: French <https://translatewiki.net/wiki/Portal:fr>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: fr\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "S’abonner"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Accepter"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rejeter"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Impossible de s'abonner à un profil distant OMB 0.1 avec cette action."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Impossible de lister un profil distant OMB 0.1 avec cette action."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Impossible de (ne plus) lister un profil distant OMB 0.1 avec cette action."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Impossible de supprimer le jeton d'abonnement OMB."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Un exemple de plugin pour montrer les bases de développement pour les "
|
|
||||||
"nouveaux codeurs."
|
|
|
@ -1,60 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Galician (galego)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Toliño
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: Galician <https://translatewiki.net/wiki/Portal:gl>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: gl\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Subscribirse"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Aceptar"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rexeitar"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Non se pode subscribir a un perfil remoto OMB 0.1 con esta acción."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Non pode listar un perfil remoto OMB 0.1 con esta acción."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Non pode (des)listar un perfil remoto OMB 0.1 con esta acción."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Non se puido borrar o pase de subscrición OMB."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Un complemento de exemplo para mostrar os principios básicos de "
|
|
||||||
"desenvolvemento aos novos programadores."
|
|
|
@ -1,60 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Interlingua (interlingua)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: McDutchie
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: Interlingua <https://translatewiki.net/wiki/Portal:ia>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: ia\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Subscriber"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Acceptar"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rejectar"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Tu non pote subscriber te a un profilo remote OMB 0.1 con iste action."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Tu non pote listar un profilo remote OMB 0.1 con iste action."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Tu non pote (dis)listar un profilo remote OMB 0.1 con iste action."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Non poteva deler le indicio OMB del subscription."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Un plug-in de exemplo pro demonstrar le principios de disveloppamento pro "
|
|
||||||
"nove programmatores."
|
|
|
@ -1,63 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Italian (italiano)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: GreenFox
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Iscriviti"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Accetta"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rifiuta"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Non è possibile iscriversi ad un profilo remoto di tipo OMB 0.1 con questa "
|
|
||||||
"azione."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Non è possibile aggiungere alla lista un profilo remoto di tipo OMB 0.1 con "
|
|
||||||
"questa azione."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Non è possibile rimuovere dalla lista un profilo remoto di tipo OMB 0.1 con "
|
|
||||||
"questa azione."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Impossibile cancellare il token di iscrizione OMB dal server."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Un esempio di estensione per mostrare i fondamentali di sviluppo per i nuovi "
|
|
||||||
"programmatori"
|
|
|
@ -1,62 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Macedonian (македонски)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Bjankuloski06
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:22+0000\n"
|
|
||||||
"Language-Team: Macedonian <https://translatewiki.net/wiki/Portal:mk>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: mk\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Претплати се"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Прифати"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Одбиј"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Не можете да се претплатите на далечински профил OMB 0.1 со ова дејство."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr "Не можете да наведете далечински профил OMB 0.1 со ова дејство."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Не можете да наведете/отстраните од список далечински профил OMB 0.1 со ова "
|
|
||||||
"дејство."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Не можам да го избришам OMB-жетонот за претплата."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Приклучок-пример за основите на развојното програмирање за нови хакери."
|
|
|
@ -1,67 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Dutch (Nederlands)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: SPQRobin
|
|
||||||
# Author: Siebrand
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:23+0000\n"
|
|
||||||
"Language-Team: Dutch <https://translatewiki.net/wiki/Portal:nl>\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Language-Code: nl\n"
|
|
||||||
"X-Message-Group: #out-statusnet-plugin-omb\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Abonneren"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Aanvaarden"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Weigeren"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"U kunt via deze handeling niet abonneren op een extern OMB 1.0-profiel."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"U kunt een extern OMB 1.0-profiel niet opnemen in een lijst via deze "
|
|
||||||
"handeling."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"U kunt een extern OMB 1.0-profiel niet opnemen in of verwijderen uit een "
|
|
||||||
"lijst via deze handeling."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr ""
|
|
||||||
"Het was niet mogelijk om het OMB-token voor het abonnement te verwijderen."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Een voorbeeldplug-in om de basisprogrammeertechnieken te demonstreren aan "
|
|
||||||
"nieuwe ontwikkelaars."
|
|
|
@ -1,55 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Telugu (తెలుగు)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: Veeven
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:23+0000\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "చందాచేరు"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "అంగీకరించు"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "తిరస్కరించు"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
|
@ -1,63 +0,0 @@
|
||||||
# Translation of StatusNet - OMB to Tagalog (Tagalog)
|
|
||||||
# Exported from translatewiki.net
|
|
||||||
#
|
|
||||||
# Author: AnakngAraw
|
|
||||||
# --
|
|
||||||
# This file is distributed under the same license as the StatusNet package.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: StatusNet - OMB\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
|
|
||||||
"PO-Revision-Date: 2012-06-30 11:09:23+0000\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-POT-Import-Date: 2012-01-02 10:11:37+0000\n"
|
|
||||||
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
|
|
||||||
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
#. TRANS: Button text on page for remote subscribe.
|
|
||||||
#. TRANS: Link text for link that will subscribe to a remote profile.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Subscribe"
|
|
||||||
msgstr "Tumanggap ng sipi"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Accept"
|
|
||||||
msgstr "Tanggapin"
|
|
||||||
|
|
||||||
#. TRANS: Button text on Authorise Subscription page.
|
|
||||||
msgctxt "BUTTON"
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Tanggihan"
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Hindi ka makasisipi sa isang malayong balangkas ng 0.1 na OMB sa pamamagitan "
|
|
||||||
"ng galaw na ito."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
|
||||||
msgid "You cannot list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"Hindi mo maililista ang isang 0.1 na malayong balangkas ng OMB sa "
|
|
||||||
"pamamagitan ng galaw na ito."
|
|
||||||
|
|
||||||
#. TRANS: Client error displayed when trying to (un)list an OMB 0.1 remote profile.
|
|
||||||
msgid "You cannot (un)list an OMB 0.1 remote profile with this action."
|
|
||||||
msgstr ""
|
|
||||||
"(Hindi) mo maililista ang isang 0.1 na malayong balangkas ng OMB sa "
|
|
||||||
"pamamagitan ng galaw na ito."
|
|
||||||
|
|
||||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
|
||||||
msgid "Could not delete subscription OMB token."
|
|
||||||
msgstr "Hindi mabura ang panghalip na pagsipi ng OMB."
|
|
||||||
|
|
||||||
#. TRANS: Plugin description.
|
|
||||||
msgid "A sample plugin to show basics of development for new hackers."
|
|
||||||
msgstr ""
|
|
||||||
"Isang payak na pampasak upang maipakita ang mga saligan ng kaunlaran para sa "
|
|
||||||
"bagong mga mangunguha."
|
|
|
@ -1,131 +0,0 @@
|
||||||
#!/usr/bin/env php
|
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - a distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2008, 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
|
|
||||||
|
|
||||||
$shortoptions = 'i:n:a';
|
|
||||||
$longoptions = array('id=', 'nickname=', 'all');
|
|
||||||
|
|
||||||
$helptext = <<<END_OF_UPDATEOSTATUS_HELP
|
|
||||||
updateostatus.php [options]
|
|
||||||
update the OMB subscriptions of a user to use OStatus if possible
|
|
||||||
|
|
||||||
-i --id ID of user to update
|
|
||||||
-n --nickname nickname of the user to update
|
|
||||||
-a --all update all
|
|
||||||
|
|
||||||
END_OF_UPDATEOSTATUS_HELP;
|
|
||||||
|
|
||||||
require_once INSTALLDIR.'/scripts/commandline.inc';
|
|
||||||
|
|
||||||
try {
|
|
||||||
$user = null;
|
|
||||||
|
|
||||||
if (have_option('i', 'id')) {
|
|
||||||
$id = get_option_value('i', 'id');
|
|
||||||
$user = User::getKV('id', $id);
|
|
||||||
if (empty($user)) {
|
|
||||||
throw new Exception("Can't find user with id '$id'.");
|
|
||||||
}
|
|
||||||
updateOStatus($user);
|
|
||||||
} else if (have_option('n', 'nickname')) {
|
|
||||||
$nickname = get_option_value('n', 'nickname');
|
|
||||||
$user = User::getKV('nickname', $nickname);
|
|
||||||
if (empty($user)) {
|
|
||||||
throw new Exception("Can't find user with nickname '$nickname'.");
|
|
||||||
}
|
|
||||||
updateOStatus($user);
|
|
||||||
} else if (have_option('a', 'all')) {
|
|
||||||
$user = new User();
|
|
||||||
if ($user->find()) {
|
|
||||||
while ($user->fetch()) {
|
|
||||||
try {
|
|
||||||
updateOStatus($user);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
common_log(LOG_NOTICE, "Couldn't convert OMB subscriptions ".
|
|
||||||
"for {$user->nickname} to OStatus: " . $e->getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
show_help();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
print $e->getMessage()."\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateOStatus($user)
|
|
||||||
{
|
|
||||||
if (!have_option('q', 'quiet')) {
|
|
||||||
echo "{$user->nickname}...";
|
|
||||||
}
|
|
||||||
|
|
||||||
$up = $user->getProfile();
|
|
||||||
|
|
||||||
$sp = $up->getSubscribed();
|
|
||||||
|
|
||||||
$rps = array();
|
|
||||||
|
|
||||||
while ($sp->fetch()) {
|
|
||||||
$remote = Remote_profile::getKV('id', $sp->id);
|
|
||||||
|
|
||||||
if (!empty($remote)) {
|
|
||||||
$rps[] = clone($sp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!have_option('q', 'quiet')) {
|
|
||||||
echo count($rps) . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($rps as $rp) {
|
|
||||||
try {
|
|
||||||
if (!have_option('q', 'quiet')) {
|
|
||||||
echo "Checking {$rp->nickname}...";
|
|
||||||
}
|
|
||||||
|
|
||||||
$op = Ostatus_profile::ensureProfileURL($rp->profileurl);
|
|
||||||
|
|
||||||
if (empty($op)) {
|
|
||||||
echo "can't convert.\n";
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
if (!have_option('q', 'quiet')) {
|
|
||||||
echo "Converting...";
|
|
||||||
}
|
|
||||||
Subscription::start($up, $op->localProfile());
|
|
||||||
Subscription::cancel($up, $rp);
|
|
||||||
if (!have_option('q', 'quiet')) {
|
|
||||||
echo "done.\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
|
||||||
if (!have_option('q', 'quiet')) {
|
|
||||||
echo "fail.\n";
|
|
||||||
}
|
|
||||||
common_log(LOG_NOTICE, "Couldn't convert OMB subscription (" . $up->nickname . ", " . $rp->nickname .
|
|
||||||
") to OStatus: " . $e->getMessage());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -271,28 +271,6 @@ class TwitterImport
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for remote profile
|
|
||||||
$remote_pro = Remote_profile::getKV('uri', $profileurl);
|
|
||||||
|
|
||||||
if (!($remote_pro instanceof Remote_profile)) {
|
|
||||||
$remote_pro = new Remote_profile();
|
|
||||||
$remote_pro->id = $id;
|
|
||||||
$remote_pro->uri = $profileurl;
|
|
||||||
$remote_pro->created = common_sql_now();
|
|
||||||
|
|
||||||
try {
|
|
||||||
$rid = $remote_pro->insert();
|
|
||||||
if (empty($rid)) {
|
|
||||||
throw new Exception('Failed insert');
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
common_log(LOG_WARNING, __METHOD__ . " Couldn't save remote profile: " . $e->getMessage());
|
|
||||||
common_log_db_error($profile, 'INSERT', __FILE__);
|
|
||||||
$profile->query("ROLLBACK");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile->query("COMMIT");
|
$profile->query("COMMIT");
|
||||||
$this->updateAvatar($twuser, $profile);
|
$this->updateAvatar($twuser, $profile);
|
||||||
return $profile;
|
return $profile;
|
||||||
|
|
|
@ -52,11 +52,6 @@ function updateUserUrls()
|
||||||
|
|
||||||
updateProfileUrl($profile);
|
updateProfileUrl($profile);
|
||||||
updateAvatarUrls($profile);
|
updateAvatarUrls($profile);
|
||||||
|
|
||||||
// Broadcast for remote users
|
|
||||||
|
|
||||||
common_broadcast_profile($profile);
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
echo "Error updating URLs: " . $e->getMessage();
|
echo "Error updating URLs: " . $e->getMessage();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user