| 
									
										
										
										
											2008-05-26 11:13:32 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							| 
									
										
										
										
											2009-08-25 18:14:12 -04:00
										 |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * Copyright (C) 2008, 2009, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2008-05-26 11:13:32 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | 
					
						
							| 
									
										
										
										
											2008-05-26 11:13:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | require_once INSTALLDIR.'/lib/oauthstore.php'; | 
					
						
							|  |  |  | require_once 'OAuth.php'; | 
					
						
							|  |  |  | require_once 'libomb/constants.php'; | 
					
						
							|  |  |  | require_once 'libomb/service_consumer.php'; | 
					
						
							|  |  |  | require_once 'libomb/notice.php'; | 
					
						
							|  |  |  | require_once 'libomb/profile.php'; | 
					
						
							|  |  |  | require_once 'Auth/Yadis/Yadis.php'; | 
					
						
							| 
									
										
										
										
											2008-06-06 13:22:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | function omb_oauth_consumer() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-18 01:47:44 +00:00
										 |  |  |     // Don't try to make this static. Leads to issues in
 | 
					
						
							|  |  |  |     // multi-site setups - Z
 | 
					
						
							|  |  |  |     return new OAuthConsumer(common_root_url(), ''); | 
					
						
							| 
									
										
										
										
											2008-05-27 07:42:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | function omb_oauth_server() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     static $server = null; | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     if (is_null($server)) { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         $server = new OAuthServer(omb_oauth_datastore()); | 
					
						
							|  |  |  |         $server->add_signature_method(omb_hmac_sha1()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return $server; | 
					
						
							| 
									
										
										
										
											2008-05-30 10:23:24 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | function omb_oauth_datastore() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:21:29 -05:00
										 |  |  |     static $store = null; | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     if (is_null($store)) { | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |         $store = new StatusNetOAuthDataStore(); | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     } | 
					
						
							|  |  |  |     return $store; | 
					
						
							| 
									
										
										
										
											2008-06-04 14:51:31 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | function omb_hmac_sha1() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:21:29 -05:00
										 |  |  |     static $hmac_method = null; | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     if (is_null($hmac_method)) { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         $hmac_method = new OAuthSignatureMethod_HMAC_SHA1(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return $hmac_method; | 
					
						
							| 
									
										
										
										
											2008-06-02 13:42:49 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | function omb_broadcast_notice($notice) | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-06-03 07:43:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 15:21:51 -08:00
										 |  |  |     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; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-06-06 13:22:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     /* Get remote users subscribed to this profile. */ | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     $rp = new Remote_profile(); | 
					
						
							| 
									
										
										
										
											2008-09-04 20:47:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 18:07:21 -05:00
										 |  |  |     $rp->query('SELECT remote_profile.*, secret, token ' . | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |                'FROM subscription JOIN remote_profile ' . | 
					
						
							|  |  |  |                'ON subscription.subscriber = remote_profile.id ' . | 
					
						
							|  |  |  |                'WHERE subscription.subscribed = ' . $notice->profile_id . ' '); | 
					
						
							| 
									
										
										
										
											2008-09-04 20:47:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     $posted = array(); | 
					
						
							| 
									
										
										
										
											2008-09-04 20:47:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     while ($rp->fetch()) { | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |         if (isset($posted[$rp->postnoticeurl])) { | 
					
						
							|  |  |  |             /* We already posted to this url. */ | 
					
						
							|  |  |  |             continue; | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |         common_debug('Posting to ' . $rp->postnoticeurl, __FILE__); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* Post notice. */ | 
					
						
							| 
									
										
										
										
											2009-10-23 20:31:53 +00:00
										 |  |  |         $service = new StatusNet_OMB_Service_Consumer( | 
					
						
							| 
									
										
										
										
											2010-03-01 15:59:24 -05:00
										 |  |  |                      array(OMB_ENDPOINT_POSTNOTICE => $rp->postnoticeurl), | 
					
						
							|  |  |  |                                                       $rp->uri); | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |         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; | 
					
						
							| 
									
										
										
										
											2008-12-11 13:55:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |         common_debug('Finished to ' . $rp->postnoticeurl, __FILE__); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-06-06 12:22:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 15:29:47 -08:00
										 |  |  |     return true; | 
					
						
							| 
									
										
										
										
											2008-09-04 20:47:01 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | function omb_broadcast_profile($profile) | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $user = User::staticGet('id', $profile->id); | 
					
						
							| 
									
										
										
										
											2008-09-04 20:47:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     if (!$user) { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-09-07 15:52:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $profile = $user->getProfile(); | 
					
						
							| 
									
										
										
										
											2008-12-11 13:55:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $omb_profile = profile_to_omb_profile($user->uri, $profile, true); | 
					
						
							| 
									
										
										
										
											2008-12-11 13:55:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     /* Get remote users subscribed to this profile. */ | 
					
						
							|  |  |  |     $rp = new Remote_profile(); | 
					
						
							| 
									
										
										
										
											2008-12-11 13:55:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 18:07:21 -05:00
										 |  |  |     $rp->query('SELECT remote_profile.*, secret, token ' . | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |                'FROM subscription JOIN remote_profile ' . | 
					
						
							|  |  |  |                'ON subscription.subscriber = remote_profile.id ' . | 
					
						
							|  |  |  |                'WHERE subscription.subscribed = ' . $profile->id . ' '); | 
					
						
							| 
									
										
										
										
											2008-06-06 12:22:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $posted = array(); | 
					
						
							| 
									
										
										
										
											2008-12-11 13:55:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     while ($rp->fetch()) { | 
					
						
							|  |  |  |         if (isset($posted[$rp->updateprofileurl])) { | 
					
						
							|  |  |  |             /* We already posted to this url. */ | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         common_debug('Posting to ' . $rp->updateprofileurl, __FILE__); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* Update profile. */ | 
					
						
							| 
									
										
										
										
											2009-08-27 11:16:45 -07:00
										 |  |  |         $service = new StatusNet_OMB_Service_Consumer( | 
					
						
							| 
									
										
										
										
											2010-03-01 15:59:24 -05:00
										 |  |  |                      array(OMB_ENDPOINT_UPDATEPROFILE => $rp->updateprofileurl), | 
					
						
							|  |  |  |                                                       $rp->uri); | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |         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; | 
					
						
							| 
									
										
										
										
											2008-06-06 12:22:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |         common_debug('Finished to ' . $rp->updateprofileurl, __FILE__); | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-11 13:55:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     return; | 
					
						
							| 
									
										
										
										
											2008-06-06 12:22:26 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-12 14:40:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-27 11:16:45 -07:00
										 |  |  | class StatusNet_OMB_Service_Consumer extends OMB_Service_Consumer { | 
					
						
							| 
									
										
										
										
											2010-03-01 15:59:24 -05:00
										 |  |  |     public function __construct($urls, $listener_uri=null) | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->services       = $urls; | 
					
						
							|  |  |  |         $this->datastore      = omb_oauth_datastore(); | 
					
						
							|  |  |  |         $this->oauth_consumer = omb_oauth_consumer(); | 
					
						
							|  |  |  |         $this->fetcher        = Auth_Yadis_Yadis::getHTTPFetcher(); | 
					
						
							| 
									
										
										
										
											2009-12-01 14:38:34 -08:00
										 |  |  |         $this->fetcher->timeout = intval(common_config('omb', 'timeout')); | 
					
						
							| 
									
										
										
										
											2010-03-01 15:59:24 -05:00
										 |  |  |         $this->listener_uri   = $listener_uri; | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 14:40:28 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | function profile_to_omb_profile($uri, $profile, $force = false) | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $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(''); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     if ($avatar) { | 
					
						
							|  |  |  |         $omb_profile->setAvatarURL($avatar->url); | 
					
						
							|  |  |  |     } elseif ($force) { | 
					
						
							|  |  |  |         $omb_profile->setAvatarURL(''); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return $omb_profile; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | function notice_to_omb_notice($notice) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /* Create an OMB_Notice for $notice. */ | 
					
						
							|  |  |  |     $user = User::staticGet('id', $notice->profile_id); | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     if (!$user) { | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $profile = $user->getProfile(); | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     $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')); | 
					
						
							| 
									
										
										
										
											2008-06-12 14:40:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  |     return $omb_notice; | 
					
						
							| 
									
										
										
										
											2008-06-12 14:40:28 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-10 14:48:50 +02:00
										 |  |  | ?>
 |