Merge remote branch 'gitorious/1.0.x' into 1.0.x
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -25,3 +25,4 @@ good-config.php | ||||
| lac08.log | ||||
| php.log | ||||
| .DS_Store | ||||
| nbproject | ||||
|   | ||||
							
								
								
									
										54
									
								
								EVENTS.txt
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								EVENTS.txt
									
									
									
									
									
								
							| @@ -258,10 +258,28 @@ EndShowExportData: just after showing the <div> with export data (feeds) | ||||
| - $action: action object being shown | ||||
|  | ||||
| StartShowNoticeItem: just before showing the notice item | ||||
| - $action: action object being shown | ||||
| - $item: The NoticeListItem object being shown | ||||
|  | ||||
| EndShowNoticeItem: just after showing the notice item | ||||
| - $action: action object being shown | ||||
| - $item: the NoticeListItem object being shown | ||||
|  | ||||
| StartShowNoticeInfo: just before showing notice info | ||||
| - $item: The NoticeListItem object being shown | ||||
|  | ||||
| EndShowNoticeInfo: just after showing notice info | ||||
| - $item: The NoticeListItem object being shown | ||||
|  | ||||
| StartShowNoticeOptions: just before showing notice options like fave, repeat, etc. | ||||
| - $item: the NoticeListItem object being shown | ||||
|  | ||||
| EndShowNoticeOptions: just after showing notice options like fave, repeat, etc. | ||||
| - $item: the NoticeListItem object being shown | ||||
|  | ||||
| StartShowFaveForm: just before showing the fave form | ||||
| - $item: the NoticeListItem object being shown | ||||
|  | ||||
| EndShowFaveForm: just after showing the fave form | ||||
| - $item: the NoticeListItem object being shown | ||||
|  | ||||
| StartShowPageNotice: just before showing the page notice (instructions or error) | ||||
| - $action: action object being shown | ||||
| @@ -780,6 +798,22 @@ EndDisfavorNotice: After saving a notice as a favorite | ||||
| - $profile: profile of the person faving (can be remote!) | ||||
| - $notice: notice being faved | ||||
|  | ||||
| StartFavorNoticeForm: starting the data in the form for favoring a notice | ||||
| - $FavorForm: the favor form being shown | ||||
| - $notice: notice being favored | ||||
|  | ||||
| EndFavorNoticeForm: Ending the data in the form for favoring a notice | ||||
| - $FavorForm: the favor form being shown | ||||
| - $notice: notice being favored | ||||
|  | ||||
| StartDisFavorNoticeForm: starting the data in the form for disfavoring a notice | ||||
| - $DisfavorForm: the disfavor form being shown | ||||
| - $notice: notice being difavored | ||||
|  | ||||
| EndDisFavorNoticeForm: Ending the data in the form for disfavoring a notice | ||||
| - $DisfavorForm: the disfavor form being shown | ||||
| - $notice: notice being disfavored | ||||
|  | ||||
| StartFindMentions: start finding mentions in a block of text | ||||
| - $sender: sender profile | ||||
| - $text: plain text version of the notice | ||||
| @@ -1110,3 +1144,19 @@ StartDeleteOwnNotice: when a user starts to delete their own notice | ||||
| EndDeleteOwnNotice: when a user has deleted their own notice | ||||
| - $user: the user doing the delete | ||||
| - $notice: the notice being deleted | ||||
|  | ||||
| StartShowFeedLinkList: before showing the feed list in the sidebar | ||||
| - $action: action being executed | ||||
| - $feeds: list of feeds to show | ||||
|  | ||||
| EndShowFeedLinkList: after showing the feed list in the sidebar | ||||
| - $action: action being executed | ||||
| - $feeds: list of feeds shown | ||||
|  | ||||
| StartShowFeedLink: before showing an individual feed item | ||||
| - $action: action being executed | ||||
| - $feed: feed to show | ||||
|  | ||||
| EndShowFeedLink: after showing an individual feed | ||||
| - $action: action being executed | ||||
| - $feed: feed to show | ||||
|   | ||||
| @@ -83,6 +83,7 @@ class ApiAccountUpdateDeliveryDeviceAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error message. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, $this->format | ||||
|             ); | ||||
|   | ||||
| @@ -86,6 +86,7 @@ class ApiAccountUpdateProfileAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, $this->format | ||||
|             ); | ||||
|   | ||||
| @@ -83,6 +83,7 @@ class ApiAccountUpdateProfileBackgroundImageAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, $this->format | ||||
|             ); | ||||
|   | ||||
| @@ -107,6 +107,7 @@ class ApiAccountUpdateProfileColorsAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, $this->format | ||||
|             ); | ||||
|   | ||||
| @@ -81,6 +81,7 @@ class ApiAccountUpdateProfileImageAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, $this->format | ||||
|             ); | ||||
|   | ||||
| @@ -86,6 +86,7 @@ class ApiBlockCreateAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -85,6 +85,7 @@ class ApiBlockDestroyAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -357,6 +357,7 @@ class ApiDirectMessageAction extends ApiAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       strtotime($this->messages[0]->created), | ||||
|                       strtotime($this->messages[$last]->created) | ||||
|   | ||||
| @@ -106,6 +106,7 @@ class ApiDirectMessageNewAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -88,6 +88,7 @@ class ApiFavoriteCreateAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -89,6 +89,7 @@ class ApiFavoriteDestroyAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -88,6 +88,7 @@ class ApiFriendshipsCreateAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -88,6 +88,7 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -102,6 +102,7 @@ class ApiGroupCreateAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|              $this->clientError( | ||||
|                  // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                  _('This method requires a POST.'), | ||||
|                  400, | ||||
|                  $this->format | ||||
|   | ||||
| @@ -89,6 +89,7 @@ class ApiGroupJoinAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -89,6 +89,7 @@ class ApiGroupLeaveAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -213,6 +213,7 @@ class ApiGroupListAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->user->id, | ||||
|                       strtotime($this->groups[0]->created), | ||||
|   | ||||
| @@ -204,6 +204,7 @@ class ApiGroupListAllAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       strtotime($this->groups[0]->created), | ||||
|                       strtotime($this->groups[$last]->created)) | ||||
|   | ||||
| @@ -183,6 +183,7 @@ class ApiGroupMembershipAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->group->id, | ||||
|                       strtotime($this->profiles[0]->created), | ||||
|   | ||||
| @@ -149,6 +149,7 @@ class ApiGroupShowAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->group->id, | ||||
|                       strtotime($this->group->modified)) | ||||
|   | ||||
| @@ -64,6 +64,7 @@ class ApiMediaUploadAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, $this->format | ||||
|             ); | ||||
|   | ||||
| @@ -270,7 +270,7 @@ class ApiOauthAuthorizeAction extends ApiOauthAction | ||||
|         $this->elementStart('form', array('method' => 'post', | ||||
|                                           'id' => 'form_apioauthauthorize', | ||||
|                                           'class' => 'form_settings', | ||||
|                                           'action' => common_local_url('apioauthauthorize'))); | ||||
|                                           'action' => common_local_url('ApiOauthAuthorize'))); | ||||
|         $this->elementStart('fieldset'); | ||||
|         $this->element('legend', array('id' => 'apioauthauthorize_allowdeny'), | ||||
|                                  _('Allow or deny access')); | ||||
|   | ||||
| @@ -62,6 +62,7 @@ class ApiStatusesRetweetAction extends ApiAuthAction | ||||
|         parent::prepare($args); | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|             $this->clientError(_('This method requires a POST.'), | ||||
|                                400, $this->format); | ||||
|             return false; | ||||
|   | ||||
| @@ -194,6 +194,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->notice->id, | ||||
|                       strtotime($this->notice->created)) | ||||
|   | ||||
| @@ -195,6 +195,7 @@ class ApiStatusesUpdateAction extends ApiAuthAction | ||||
|  | ||||
|         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | ||||
|             $this->clientError( | ||||
|                 // TRANS: Client error. POST is a HTTP command. It should not be translated. | ||||
|                 _('This method requires a POST.'), | ||||
|                 400, | ||||
|                 $this->format | ||||
|   | ||||
| @@ -181,6 +181,7 @@ class ApiSubscriptionsAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->user->id, | ||||
|                       isset($this->ids_only) ? 'IDs' : 'Profiles', | ||||
|   | ||||
| @@ -259,6 +259,7 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->user->id, | ||||
|                       strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -346,6 +346,7 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                                  ':', | ||||
|                                  array($this->arg('action'), | ||||
|                                        common_user_cache_hash($this->auth_user), | ||||
|                                        common_language(), | ||||
|                                        $this->user->id, | ||||
|                                        strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -229,6 +229,7 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->group->id, | ||||
|                       strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -254,6 +254,7 @@ class ApiTimelineHomeAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->user->id, | ||||
|                       strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -244,6 +244,7 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->user->id, | ||||
|                       strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -311,6 +311,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       strtotime($this->notices[0]->created), | ||||
|                       strtotime($this->notices[$last]->created)) | ||||
|   | ||||
| @@ -232,6 +232,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->tag, | ||||
|                       strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -234,6 +234,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction | ||||
|             return '"' . implode( | ||||
|                 ':', | ||||
|                 array($this->arg('action'), | ||||
|                       common_user_cache_hash($this->auth_user), | ||||
|                       common_language(), | ||||
|                       $this->user->id, | ||||
|                       strtotime($this->notices[0]->created), | ||||
|   | ||||
| @@ -71,7 +71,7 @@ class DesignadminpanelAction extends AdminPanelAction | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return _('Design settings for this StatusNet site.'); | ||||
|         return _('Design settings for this StatusNet site'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -154,9 +154,22 @@ class DesignadminpanelAction extends AdminPanelAction | ||||
|  | ||||
|         $config->query('BEGIN'); | ||||
|  | ||||
|         // Only update colors if the theme has not changed. | ||||
|         if ($themeChanged) { | ||||
|             // If the theme has changed, reset custom colors and let them pick | ||||
|             // up the new theme's defaults. | ||||
|             $colors = array('background', 'content', 'sidebar', 'text', 'link'); | ||||
|             foreach ($colors as $colorKey) { | ||||
|                 // Clear from global config so we see defaults on this page... | ||||
|                 $GLOBALS['config']['design'][$colorKey . 'color'] = false; | ||||
|  | ||||
|         if (!$themeChanged) { | ||||
|                 // And remove old settings from DB... | ||||
|                 $this->deleteSetting('design', $colorKey . 'color'); | ||||
|             } | ||||
|         } else { | ||||
|             // Only save colors from the form if the theme has not changed. | ||||
|             // | ||||
|             // @fixme a future more ajaxy form should allow theme switch | ||||
|             // and color customization in one step. | ||||
|  | ||||
|             $bgcolor = new WebColor($this->trimmed('design_background')); | ||||
|             $ccolor  = new WebColor($this->trimmed('design_content')); | ||||
|   | ||||
| @@ -188,7 +188,7 @@ class EditApplicationAction extends OwnerDesignAction | ||||
|         } elseif (Oauth_application::descriptionTooLong($description)) { | ||||
|             $this->showForm(sprintf( | ||||
|                 _('Description is too long (max %d chars).'), | ||||
|                                     Oauth_application::maxDescription())); | ||||
|                                     Oauth_application::maxDesc())); | ||||
|             return; | ||||
|         } elseif (mb_strlen($source_url) > 255) { | ||||
|             $this->showForm(_('Source URL is too long.')); | ||||
| @@ -253,7 +253,10 @@ class EditApplicationAction extends OwnerDesignAction | ||||
|  | ||||
|         $result = $this->app->update($orig); | ||||
|  | ||||
|         if (!$result) { | ||||
|         // Note: 0 means no rows changed, which can happen if the only | ||||
|         // thing we changed was the icon, since it's not altered until | ||||
|         // the next step. | ||||
|         if ($result === false) { | ||||
|             common_log_db_error($this->app, 'UPDATE', __FILE__); | ||||
|             $this->serverError(_('Could not update application.')); | ||||
|         } | ||||
|   | ||||
| @@ -131,7 +131,11 @@ class EmailsettingsAction extends AccountSettingsAction | ||||
|                 // TRANS: Field label for e-mail address input in e-mail settings form. | ||||
|                 $this->input('email', _('Email address'), | ||||
|                              ($this->arg('email')) ? $this->arg('email') : null, | ||||
|                              // TRANS: Instructions for e-mail address input form. | ||||
|                              // TRANS: Instructions for e-mail address input form. Do not translate | ||||
|                              // TRANS: "example.org". It is one of the domain names reserved for | ||||
|                              // TRANS: use in examples by http://www.rfc-editor.org/rfc/rfc2606.txt. | ||||
|                              // TRANS: Any other domain may be owned by a legitimate person or | ||||
|                              // TRANS: organization. | ||||
|                              _('Email address, like "UserName@example.org"')); | ||||
|                 $this->elementEnd('li'); | ||||
|                 $this->elementEnd('ul'); | ||||
|   | ||||
| @@ -97,9 +97,13 @@ class GroupmembersAction extends GroupDesignAction | ||||
|     function title() | ||||
|     { | ||||
|         if ($this->page == 1) { | ||||
|             // TRANS: Title of the page showing group members. | ||||
|             // TRANS: %s is the name of the group. | ||||
|             return sprintf(_('%s group members'), | ||||
|                            $this->group->nickname); | ||||
|         } else { | ||||
|             // TRANS: Title of the page showing group members. | ||||
|             // TRANS: %1$s is the name of the group, %2$d is the page number of the members list. | ||||
|             return sprintf(_('%1$s group members, page %2$d'), | ||||
|                            $this->group->nickname, | ||||
|                            $this->page); | ||||
| @@ -389,7 +393,14 @@ class GroupBlockForm extends Form | ||||
|  | ||||
|     function formActions() | ||||
|     { | ||||
|         $this->out->submit('submit', _('Block'), 'submit', null, _('Block this user')); | ||||
|         $this->out->submit( | ||||
|             'submit', | ||||
|             // TRANS: Button text for the form that will block a user from a group. | ||||
|             _m('BUTTON','Block'), | ||||
|             'submit', | ||||
|             null, | ||||
|             // TRANS: Submit button title. | ||||
|             _m('TOOLTIP', 'Block this user')); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -516,6 +527,13 @@ class MakeAdminForm extends Form | ||||
|  | ||||
|     function formActions() | ||||
|     { | ||||
|         $this->out->submit('submit', _('Make Admin'), 'submit', null, _('Make this user an admin')); | ||||
|         $this->out->submit( | ||||
|           'submit', | ||||
|           // TRANS: Button text for the form that will make a user administrator. | ||||
|           _m('BUTTON','Make Admin'), | ||||
|           'submit', | ||||
|           null, | ||||
|           // TRANS: Submit button title. | ||||
|           _m('TOOLTIP','Make this user an admin')); | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										322
									
								
								actions/licenseadminpanel.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										322
									
								
								actions/licenseadminpanel.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,322 @@ | ||||
| <?php | ||||
| /** | ||||
|  * StatusNet, the distributed open-source microblogging tool | ||||
|  * | ||||
|  * License administration panel | ||||
|  * | ||||
|  * PHP version 5 | ||||
|  * | ||||
|  * LICENCE: 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  Settings | ||||
|  * @package   StatusNet | ||||
|  * @author    Zach Copley <zach@status.net> | ||||
|  * @copyright 2010 StatusNet, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('STATUSNET')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * License settings | ||||
|  * | ||||
|  * @category Admin | ||||
|  * @package  StatusNet | ||||
|  * @author   Zach Copley <zach@status.net> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class LicenseadminpanelAction extends AdminPanelAction | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * Returns the page title | ||||
|      * | ||||
|      * @return string page title | ||||
|      */ | ||||
|  | ||||
|     function title() | ||||
|     { | ||||
|         // TRANS: User admin panel title | ||||
|         return _m('TITLE', 'License'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Instructions for using this form. | ||||
|      * | ||||
|      * @return string instructions | ||||
|      */ | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return _('License for this StatusNet site'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the site admin panel form | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function showForm() | ||||
|     { | ||||
|         $form = new LicenseAdminPanelForm($this); | ||||
|         $form->show(); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Save settings from the form | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function saveSettings() | ||||
|     { | ||||
|         static $settings = array( | ||||
|             'license' => array('type', 'owner', 'url', 'title', 'image') | ||||
|         ); | ||||
|  | ||||
|         $values = array(); | ||||
|  | ||||
|         foreach ($settings as $section => $parts) { | ||||
|             foreach ($parts as $setting) { | ||||
|                 $values[$section][$setting] = $this->trimmed($setting); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // This throws an exception on validation errors | ||||
|  | ||||
|         $this->validate($values); | ||||
|  | ||||
|         // assert(all values are valid); | ||||
|  | ||||
|         $config = new Config(); | ||||
|  | ||||
|         $config->query('BEGIN'); | ||||
|  | ||||
|         foreach ($settings as $section => $parts) { | ||||
|             foreach ($parts as $setting) { | ||||
|                 Config::save($section, $setting, $values[$section][$setting]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $config->query('COMMIT'); | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validate License admin form values | ||||
|      * | ||||
|      * @param array &$values from the form | ||||
|      * | ||||
|      * @return nothing | ||||
|      */ | ||||
|  | ||||
|     function validate(&$values) | ||||
|     { | ||||
|         // Validate license type (shouldn't have to do it, but just in case) | ||||
|  | ||||
|         $types = array('private', 'allrightsreserved', 'cc'); | ||||
|  | ||||
|         if (!in_array($values['license']['type'], $types)) { | ||||
|             $this->clientError(_("Invalid license selection.")); | ||||
|         } | ||||
|  | ||||
|         // Make sure the user has set an owner if the site has a private | ||||
|         // license | ||||
|  | ||||
|         if ($values['license']['type'] == 'allrightsreserved' | ||||
|             && empty($values['license']['owner']) | ||||
|         ) { | ||||
|             $this->clientError( | ||||
|                 _("You must specify the owner of the content when using the All Rights Reserved license.") | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         // Make sure the license title is not too long | ||||
|         if (mb_strlen($values['license']['type']) > 255) { | ||||
|             $this->clientError( | ||||
|                 _("Invalid license title. Max length is 255 characters.") | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         // make sure the license URL and license image URL are valid URLs | ||||
|  | ||||
|         $options = array('allowed_schemes' => array('http', 'https')); | ||||
|  | ||||
|         // URLs should be set for cc license | ||||
|  | ||||
|         if ($values['license']['type'] == 'cc') { | ||||
|             if (!Validate::uri($values['license']['url'], $options)) { | ||||
|                 $this->clientError(_("Invalid license URL.")); | ||||
|             } | ||||
|             if (!Validate::uri($values['license']['image'], $options)) { | ||||
|                 $this->clientError(_("Invalid license image URL.")); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // can be either blank or a valid URL for private & allrightsreserved | ||||
|  | ||||
|         if (!empty($values['license']['url'])) { | ||||
|             if (!Validate::uri($values['license']['url'], $options)) { | ||||
|                 $this->clientError(_("License URL must be blank or a valid URL.")); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // can be either blank or a valid URL for private & allrightsreserved | ||||
|  | ||||
|         if (!empty($values['license']['image'])) { | ||||
|             if (!Validate::uri($values['license']['image'], $options)) { | ||||
|                 $this->clientError(_("License image must be blank or valid URL.")); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| class LicenseAdminPanelForm extends AdminForm | ||||
| { | ||||
|     /** | ||||
|      * ID of the form | ||||
|      * | ||||
|      * @return int ID of the form | ||||
|      */ | ||||
|  | ||||
|     function id() | ||||
|     { | ||||
|         return 'licenseadminpanel'; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * class of the form | ||||
|      * | ||||
|      * @return string class of the form | ||||
|      */ | ||||
|  | ||||
|     function formClass() | ||||
|     { | ||||
|         return 'form_settings'; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Action of the form | ||||
|      * | ||||
|      * @return string URL of the action | ||||
|      */ | ||||
|  | ||||
|     function action() | ||||
|     { | ||||
|         return common_local_url('licenseadminpanel'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Data elements of the form | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function formData() | ||||
|     { | ||||
|         $this->out->elementStart( | ||||
|             'fieldset', array('id' => 'settings_license-selection') | ||||
|         ); | ||||
|         $this->out->element('legend', null, _('License selection')); | ||||
|         $this->out->elementStart('ul', 'form_data'); | ||||
|  | ||||
|         $this->li(); | ||||
|  | ||||
|         $types = array( | ||||
|             'private' => _('Private'), | ||||
|             'allrightsreserved' => _('All Rights Reserved'), | ||||
|             'cc' => _('Creative Commons') | ||||
|         ); | ||||
|  | ||||
|         $this->out->dropdown( | ||||
|             'type', | ||||
|             _('Type'), | ||||
|             $types, | ||||
|             _('Select license'), | ||||
|             false, | ||||
|             $this->value('type', 'license') | ||||
|         ); | ||||
|  | ||||
|         $this->unli(); | ||||
|  | ||||
|         $this->out->elementEnd('ul'); | ||||
|         $this->out->elementEnd('fieldset'); | ||||
|  | ||||
|         $this->out->elementStart( | ||||
|             'fieldset', | ||||
|             array('id' => 'settings_license-details') | ||||
|         ); | ||||
|         $this->out->element('legend', null, _('License details')); | ||||
|         $this->out->elementStart('ul', 'form_data'); | ||||
|  | ||||
|         $this->li(); | ||||
|         $this->input( | ||||
|             'owner', | ||||
|             _('Owner'), | ||||
|             _('Name of the owner of the site\'s content (if applicable).'), | ||||
|             'license' | ||||
|         ); | ||||
|         $this->unli(); | ||||
|  | ||||
|         $this->li(); | ||||
|         $this->input( | ||||
|             'title', | ||||
|             _('License Title'), | ||||
|             _('The title of the license.'), | ||||
|             'license' | ||||
|         ); | ||||
|         $this->unli(); | ||||
|  | ||||
|         $this->li(); | ||||
|         $this->input( | ||||
|             'url', | ||||
|             _('License URL'), | ||||
|             _('URL for more information about the license.'), | ||||
|             'license' | ||||
|         ); | ||||
|         $this->unli(); | ||||
|  | ||||
|         $this->li(); | ||||
|         $this->input( | ||||
|             'image', _('License Image URL'), | ||||
|             _('URL for an image to display with the license.'), | ||||
|             'license' | ||||
|         ); | ||||
|         $this->unli(); | ||||
|  | ||||
|         $this->out->elementEnd('ul'); | ||||
|         $this->out->elementEnd('fieldset'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Action elements | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function formActions() | ||||
|     { | ||||
|         $this->out->submit( | ||||
|             'submit', _('Save'), 'submit', null, _('Save license settings') | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -170,7 +170,7 @@ class NewApplicationAction extends OwnerDesignAction | ||||
|         } elseif (Oauth_application::descriptionTooLong($description)) { | ||||
|             $this->showForm(sprintf( | ||||
|                 _('Description is too long (max %d chars).'), | ||||
|                 Oauth_application::maxDescription())); | ||||
|                 Oauth_application::maxDesc())); | ||||
|             return; | ||||
|         } elseif (empty($source_url)) { | ||||
|             $this->showForm(_('Source URL is required.')); | ||||
|   | ||||
| @@ -80,7 +80,7 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return _('You have allowed the following applications to access you account.'); | ||||
|         return _('You have allowed the following applications to access your account.'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -67,7 +67,7 @@ class PathsadminpanelAction extends AdminPanelAction | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return _('Path and server settings for this StatusNet site.'); | ||||
|         return _('Path and server settings for this StatusNet site'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -62,7 +62,7 @@ class SessionsadminpanelAction extends AdminPanelAction | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return _('Session settings for this StatusNet site.'); | ||||
|         return _('Session settings for this StatusNet site'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -271,17 +271,17 @@ class ShowApplicationAction extends OwnerDesignAction | ||||
|  | ||||
|         $this->elementStart('dl', 'entity_request_token_url'); | ||||
|         $this->element('dt', null, _('Request token URL')); | ||||
|         $this->element('dd', null, common_local_url('apioauthrequesttoken')); | ||||
|         $this->element('dd', null, common_local_url('ApiOauthRequestToken')); | ||||
|         $this->elementEnd('dl'); | ||||
|  | ||||
|         $this->elementStart('dl', 'entity_access_token_url'); | ||||
|         $this->element('dt', null, _('Access token URL')); | ||||
|         $this->element('dd', null, common_local_url('apioauthaccesstoken')); | ||||
|         $this->element('dd', null, common_local_url('ApiOauthAccessToken')); | ||||
|         $this->elementEnd('dl'); | ||||
|  | ||||
|         $this->elementStart('dl', 'entity_authorize_url'); | ||||
|         $this->element('dt', null, _('Authorize URL')); | ||||
|         $this->element('dd', null, common_local_url('apioauthauthorize')); | ||||
|         $this->element('dd', null, common_local_url('ApiOauthAuthorize')); | ||||
|         $this->elementEnd('dl'); | ||||
|  | ||||
|         $this->element('p', 'note', | ||||
|   | ||||
| @@ -151,6 +151,7 @@ class ShownoticeAction extends OwnerDesignAction | ||||
|           strtotime($this->avatar->modified) : 0; | ||||
|  | ||||
|         return 'W/"' . implode(':', array($this->arg('action'), | ||||
|                                           common_user_cache_hash(), | ||||
|                                           common_language(), | ||||
|                                           $this->notice->id, | ||||
|                                           strtotime($this->notice->created), | ||||
| @@ -291,6 +292,16 @@ class ShownoticeAction extends OwnerDesignAction | ||||
|                 array(), | ||||
|                 array('format'=>'xml','url'=>$this->notice->uri)), | ||||
|             'title'=>'oEmbed'),null); | ||||
|  | ||||
|         // Extras to aid in sharing notices to Facebook | ||||
|         $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE); | ||||
|         $avatarUrl = ($avatar) ? | ||||
|                      $avatar->displayUrl() : | ||||
|                      Avatar::defaultImage(AVATAR_PROFILE_SIZE); | ||||
|         $this->element('meta', array('property' => 'og:image', | ||||
|                                      'content' => $avatarUrl)); | ||||
|         $this->element('meta', array('property' => 'og:description', | ||||
|                                      'content' => $this->notice->content)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -307,10 +318,14 @@ class SingleNoticeItem extends NoticeListItem | ||||
|     function show() | ||||
|     { | ||||
|         $this->showStart(); | ||||
|         $this->showNotice(); | ||||
|         $this->showNoticeAttachments(); | ||||
|         $this->showNoticeInfo(); | ||||
|         $this->showNoticeOptions(); | ||||
|         if (Event::handle('StartShowNoticeItem', array($this))) { | ||||
|             $this->showNotice(); | ||||
|             $this->showNoticeAttachments(); | ||||
|             $this->showNoticeInfo(); | ||||
|             $this->showNoticeOptions(); | ||||
|             Event::handle('EndShowNoticeItem', array($this)); | ||||
|         } | ||||
|  | ||||
|         $this->showEnd(); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -216,7 +216,10 @@ class ShowstreamAction extends ProfileAction | ||||
|           ? $this->user->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1) | ||||
|             : $this->user->getTaggedNotices($this->tag, ($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, 0, 0, null); | ||||
|  | ||||
|         $pnl = new ProfileNoticeList($notice, $this); | ||||
|         $pnl = null; | ||||
|         if (Event::handle('ShowStreamNoticeList', array($notice, $this, &$pnl))) { | ||||
|             $pnl = new ProfileNoticeList($notice, $this); | ||||
|         } | ||||
|         $cnt = $pnl->show(); | ||||
|         if (0 == $cnt) { | ||||
|             $this->showEmptyListMessage(); | ||||
|   | ||||
| @@ -12,6 +12,7 @@ | ||||
|  * (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. | ||||
| @@ -24,7 +25,7 @@ | ||||
|  * @author    Evan Prodromou <evan@status.net> | ||||
|  * @author    Zach Copley <zach@status.net> | ||||
|  * @author    Sarven Capadisli <csarven@status.net> | ||||
|  * @copyright 2008-2009 StatusNet, Inc. | ||||
|  * @copyright 2008-2010 StatusNet, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
| @@ -67,7 +68,7 @@ class UseradminpanelAction extends AdminPanelAction | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return _('User settings for this StatusNet site.'); | ||||
|         return _('User settings for this StatusNet site'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -291,6 +292,6 @@ class UserAdminPanelForm extends AdminForm | ||||
|  | ||||
|     function formActions() | ||||
|     { | ||||
|         $this->out->submit('submit', _('Save'), 'submit', null, _('Save site settings')); | ||||
|         $this->out->submit('submit', _('Save'), 'submit', null, _('Save user settings')); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -42,8 +42,9 @@ class Avatar extends Memcached_DataObject | ||||
|         return Memcached_DataObject::pkeyGet('Avatar', $kv); | ||||
|     } | ||||
|  | ||||
|     // where should the avatar go for this user? | ||||
|  | ||||
|     /** | ||||
|      * Where should the avatar go for this user? | ||||
|      */ | ||||
|     static function filename($id, $extension, $size=null, $extra=null) | ||||
|     { | ||||
|         if ($size) { | ||||
|   | ||||
| @@ -65,5 +65,4 @@ class Consumer extends Memcached_DataObject | ||||
|         $nonce->consumer_key = $this->consumer_key; | ||||
|         $nonce->delete(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -74,6 +74,4 @@ class Conversation extends Memcached_DataObject | ||||
|  | ||||
|         return $conv; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -129,4 +129,32 @@ class Fave extends Memcached_DataObject | ||||
|  | ||||
|         return $ids; | ||||
|     } | ||||
|  | ||||
|     function asActivity() | ||||
|     { | ||||
|         $notice  = Notice::staticGet('id', $this->notice_id); | ||||
|         $profile = Profile::staticGet('id', $this->user_id); | ||||
|  | ||||
|         $act = new Activity(); | ||||
|  | ||||
|         $act->verb = ActivityVerb::FAVORITE; | ||||
|         $act->id   = TagURI::mint('favor:%d:%d:%s', | ||||
|                                   $profile->id, | ||||
|                                   $notice->id, | ||||
|                                   common_date_iso8601($this->modified)); | ||||
|  | ||||
|         $act->time    = strtotime($this->modified); | ||||
|         // TRANS: Activity title when marking a notice as favorite. | ||||
|         $act->title   = _("Favor"); | ||||
|         // TRANS: Ntofication given when a user marks a notice as favorite. | ||||
|         // TRANS: %1$s is a user nickname or full name, %2$s is a notice URI. | ||||
|         $act->content = sprintf(_("%1$s marked notice %2$s as a favorite."), | ||||
|                                $profile->getBestName(), | ||||
|                                $notice->uri); | ||||
|  | ||||
|         $act->actor     = ActivityObject::fromProfile($profile); | ||||
|         $act->objects[] = ActivityObject::fromNotice($notice); | ||||
|  | ||||
|         return $act; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -29,7 +29,6 @@ require_once INSTALLDIR.'/classes/File_to_post.php'; | ||||
| /** | ||||
|  * Table Definition for file | ||||
|  */ | ||||
|  | ||||
| class File extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|   | ||||
| @@ -131,4 +131,3 @@ class File_oembed extends Memcached_DataObject | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -311,4 +311,3 @@ class File_redirection extends Memcached_DataObject | ||||
|         $file_redir->insert(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -57,4 +57,3 @@ class File_thumbnail extends Memcached_DataObject | ||||
|         $tn->insert(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -67,4 +67,3 @@ class File_to_post extends Memcached_DataObject | ||||
|         return Memcached_DataObject::pkeyGet('File_to_post', $kv); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -44,7 +44,6 @@ class Foreign_link extends Memcached_DataObject | ||||
|         $result = $flink->find(true); | ||||
|  | ||||
|         return empty($result) ? null : $flink; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     static function getByForeignID($foreign_id, $service) | ||||
| @@ -129,5 +128,4 @@ class Foreign_link extends Memcached_DataObject | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Foreign_service extends Memcached_DataObject  | ||||
| class Foreign_service extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
| @@ -12,7 +12,7 @@ class Foreign_service extends Memcached_DataObject | ||||
|     public $__table = 'foreign_service';                 // table name | ||||
|     public $id;                              // int(4)  primary_key not_null | ||||
|     public $name;                            // varchar(32)  unique_key not_null | ||||
|     public $description;                     // varchar(255)   | ||||
|     public $description;                     // varchar(255) | ||||
|     public $created;                         // datetime()   not_null | ||||
|     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Foreign_subscription extends Memcached_DataObject  | ||||
| class Foreign_subscription extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
|   | ||||
| @@ -83,5 +83,4 @@ class Foreign_user extends Memcached_DataObject | ||||
|         } | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -111,5 +111,4 @@ class Group_block extends Memcached_DataObject | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * Table Definition for group_inbox | ||||
|  */ | ||||
|  | ||||
| class Group_inbox extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|   | ||||
| @@ -65,4 +65,59 @@ class Group_member extends Memcached_DataObject | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     function getMember() | ||||
|     { | ||||
|         $member = Profile::staticGet('id', $this->profile_id); | ||||
|  | ||||
|         if (empty($member)) { | ||||
|             // TRANS: Exception thrown providing an invalid profile ID. | ||||
|             // TRANS: %s is the invalid profile ID. | ||||
|             throw new Exception(sprintf(_("Profile ID %s is invalid."),$this->profile_id)); | ||||
|         } | ||||
|  | ||||
|         return $member; | ||||
|     } | ||||
|  | ||||
|     function getGroup() | ||||
|     { | ||||
|         $group  = User_group::staticGet('id', $this->group_id); | ||||
|  | ||||
|         if (empty($group)) { | ||||
|             // TRANS: Exception thrown providing an invalid group ID. | ||||
|             // TRANS: %s is the invalid group ID. | ||||
|             throw new Exception(sprintf(_("Group ID %s is invalid."),$this->group_id)); | ||||
|         } | ||||
|  | ||||
|         return $group; | ||||
|     } | ||||
|  | ||||
|     function asActivity() | ||||
|     { | ||||
|         $member = $this->getMember(); | ||||
|         $group  = $this->getGroup(); | ||||
|  | ||||
|         $act = new Activity(); | ||||
|  | ||||
|         $act->id = TagURI::mint('join:%d:%d:%s', | ||||
|                                 $member->id, | ||||
|                                 $group->id, | ||||
|                                 common_date_iso8601($this->created)); | ||||
|  | ||||
|         $act->actor     = ActivityObject::fromProfile($member); | ||||
|         $act->verb      = ActivityVerb::JOIN; | ||||
|         $act->objects[] = ActivityObject::fromGroup($group); | ||||
|  | ||||
|         $act->time  = strtotime($this->created); | ||||
|         // TRANS: Activity title. | ||||
|         $act->title = _("Join"); | ||||
|  | ||||
|         // TRANS: Success message for subscribe to group attempt through OStatus. | ||||
|         // TRANS: %1$s is the member name, %2$s is the subscribed group's name. | ||||
|         $act->content = sprintf(_('%1$s has joined group %2$s.'), | ||||
|                                 $member->getBestName(), | ||||
|                                 $group->getBestName()); | ||||
|  | ||||
|         return $act; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -55,7 +55,6 @@ class Inbox extends Memcached_DataObject | ||||
|     /** | ||||
|      * Create a new inbox from existing Notice_inbox stuff | ||||
|      */ | ||||
|  | ||||
|     static function initialize($user_id) | ||||
|     { | ||||
|         $inbox = Inbox::fromNoticeInbox($user_id); | ||||
| @@ -115,10 +114,10 @@ class Inbox extends Memcached_DataObject | ||||
|      */ | ||||
|     static function insertNotice($user_id, $notice_id) | ||||
|     { | ||||
| 		// Going straight to the DB rather than trusting our caching | ||||
| 		// during an update. Note: not using DB_DataObject::staticGet, | ||||
| 		// which is unsafe to use directly (in-process caching causes | ||||
| 		// memory leaks, which accumulate in queue processes). | ||||
|         // Going straight to the DB rather than trusting our caching | ||||
|         // during an update. Note: not using DB_DataObject::staticGet, | ||||
|         // which is unsafe to use directly (in-process caching causes | ||||
|         // memory leaks, which accumulate in queue processes). | ||||
|         $inbox = new Inbox(); | ||||
|         if (!$inbox->get('user_id', $user_id)) { | ||||
|             $inbox = Inbox::initialize($user_id); | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Invitation extends Memcached_DataObject  | ||||
| class Invitation extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
|   | ||||
| @@ -189,11 +189,11 @@ class Memcached_DataObject extends Safe_DataObject | ||||
|                        str_replace("\n", " ", $e->getTraceAsString())); | ||||
|             return false; | ||||
|         } else { | ||||
| 		$keys = $this->_allCacheKeys(); | ||||
|             $keys = $this->_allCacheKeys(); | ||||
|  | ||||
| 		foreach ($keys as $key) { | ||||
| 		    $c->set($key, $this); | ||||
| 		} | ||||
|             foreach ($keys as $key) { | ||||
|                 $c->set($key, $this); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -637,4 +637,3 @@ class Memcached_DataObject extends Safe_DataObject | ||||
|         return $vstr; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,6 @@ class Message extends Memcached_DataObject | ||||
|     } | ||||
|  | ||||
|     static function saveNew($from, $to, $content, $source) { | ||||
|  | ||||
|         $sender = Profile::staticGet('id', $from); | ||||
|  | ||||
|         if (!$sender->hasRight(Right::NEWMESSAGE)) { | ||||
|   | ||||
| @@ -36,5 +36,4 @@ class Nonce extends Memcached_DataObject | ||||
|     { | ||||
|         return array('consumer_key,token' => 'token:consumer_key,token'); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -745,6 +745,7 @@ class Notice extends Memcached_DataObject | ||||
|                 1, | ||||
|                 1 | ||||
|             ); | ||||
|  | ||||
|             if ($conversation->N > 0) { | ||||
|                 return true; | ||||
|             } | ||||
| @@ -753,8 +754,15 @@ class Notice extends Memcached_DataObject | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param $groups array of Group *objects* | ||||
|      * @param $recipients array of profile *ids* | ||||
|      * Pull up a full list of local recipients who will be getting | ||||
|      * this notice in their inbox. Results will be cached, so don't | ||||
|      * change the input data wily-nilly! | ||||
|      * | ||||
|      * @param array $groups optional list of Group objects; | ||||
|      *              if left empty, will be loaded from group_inbox records | ||||
|      * @param array $recipient optional list of reply profile ids | ||||
|      *              if left empty, will be loaded from reply records | ||||
|      * @return array associating recipient user IDs with an inbox source constant | ||||
|      */ | ||||
|     function whoGets($groups=null, $recipients=null) | ||||
|     { | ||||
| @@ -787,27 +795,27 @@ class Notice extends Memcached_DataObject | ||||
|             $ni[$id] = NOTICE_INBOX_SOURCE_SUB; | ||||
|         } | ||||
|  | ||||
|         $profile = $this->getProfile(); | ||||
|  | ||||
|         foreach ($groups as $group) { | ||||
|             $users = $group->getUserMembers(); | ||||
|             foreach ($users as $id) { | ||||
|                 if (!array_key_exists($id, $ni)) { | ||||
|                     $user = User::staticGet('id', $id); | ||||
|                     if (!$user->hasBlocked($profile)) { | ||||
|                         $ni[$id] = NOTICE_INBOX_SOURCE_GROUP; | ||||
|                     } | ||||
|                     $ni[$id] = NOTICE_INBOX_SOURCE_GROUP; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         foreach ($recipients as $recipient) { | ||||
|  | ||||
|             if (!array_key_exists($recipient, $ni)) { | ||||
|                 $recipientUser = User::staticGet('id', $recipient); | ||||
|                 if (!empty($recipientUser)) { | ||||
|                     $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY; | ||||
|                 } | ||||
|                 $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Exclude any deleted, non-local, or blocking recipients. | ||||
|         $profile = $this->getProfile(); | ||||
|         foreach ($ni as $id => $source) { | ||||
|             $user = User::staticGet('id', $id); | ||||
|             if (empty($user) || $user->hasBlocked($profile)) { | ||||
|                 unset($ni[$id]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -1212,6 +1220,64 @@ class Notice extends Memcached_DataObject | ||||
|         return $groups; | ||||
|     } | ||||
|  | ||||
|     function asActivity() | ||||
|     { | ||||
|         $profile = $this->getProfile(); | ||||
|  | ||||
|         $act = new Activity(); | ||||
|  | ||||
|         $act->actor     = ActivityObject::fromProfile($profile); | ||||
|         $act->verb      = ActivityVerb::POST; | ||||
|         $act->objects[] = ActivityObject::fromNotice($this); | ||||
|  | ||||
|         $act->time    = strtotime($this->created); | ||||
|         $act->link    = $this->bestUrl(); | ||||
|  | ||||
|         $act->content = common_xml_safe_str($this->rendered); | ||||
|         $act->id      = $this->uri; | ||||
|         $act->title   = common_xml_safe_str($this->content); | ||||
|  | ||||
|         $ctx = new ActivityContext(); | ||||
|  | ||||
|         if (!empty($this->reply_to)) { | ||||
|             $reply = Notice::staticGet('id', $this->reply_to); | ||||
|             if (!empty($reply)) { | ||||
|                 $ctx->replyToID  = $reply->uri; | ||||
|                 $ctx->replyToUrl = $reply->bestUrl(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $ctx->location = $this->getLocation(); | ||||
|  | ||||
|         $conv = null; | ||||
|  | ||||
|         if (!empty($this->conversation)) { | ||||
|             $conv = Conversation::staticGet('id', $this->conversation); | ||||
|             if (!empty($conv)) { | ||||
|                 $ctx->conversation = $conv->uri; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $reply_ids = $this->getReplies(); | ||||
|  | ||||
|         foreach ($reply_ids as $id) { | ||||
|             $profile = Profile::staticGet('id', $id); | ||||
|             if (!empty($profile)) { | ||||
|                 $ctx->attention[] = $profile->getUri(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $groups = $this->getGroups(); | ||||
|  | ||||
|         foreach ($groups as $group) { | ||||
|             $ctx->attention[] = $group->uri; | ||||
|         } | ||||
|  | ||||
|         $act->context = $ctx; | ||||
|  | ||||
|         return $act; | ||||
|     } | ||||
|  | ||||
|     // This has gotten way too long. Needs to be sliced up into functional bits | ||||
|     // or ideally exported to a utility class. | ||||
|  | ||||
| @@ -1240,13 +1306,10 @@ class Notice extends Memcached_DataObject | ||||
|         } | ||||
|  | ||||
|         if (Event::handle('StartActivitySource', array(&$this, &$xs))) { | ||||
|  | ||||
|             if ($source) { | ||||
|  | ||||
|                 $atom_feed = $profile->getAtomFeed(); | ||||
|  | ||||
|                 if (!empty($atom_feed)) { | ||||
|  | ||||
|                     $xs->elementStart('source'); | ||||
|  | ||||
|                     // XXX: we should store the actual feed ID | ||||
| @@ -1834,7 +1897,6 @@ class Notice extends Memcached_DataObject | ||||
|         $options = array(); | ||||
|  | ||||
|         if (!empty($location_id) && !empty($location_ns)) { | ||||
|  | ||||
|             $options['location_id'] = $location_id; | ||||
|             $options['location_ns'] = $location_ns; | ||||
|  | ||||
| @@ -1846,7 +1908,6 @@ class Notice extends Memcached_DataObject | ||||
|             } | ||||
|  | ||||
|         } else if (!empty($lat) && !empty($lon)) { | ||||
|  | ||||
|             $options['lat'] = $lat; | ||||
|             $options['lon'] = $lon; | ||||
|  | ||||
| @@ -1857,7 +1918,6 @@ class Notice extends Memcached_DataObject | ||||
|                 $options['location_ns'] = $location->location_ns; | ||||
|             } | ||||
|         } else if (!empty($profile)) { | ||||
|  | ||||
|             if (isset($profile->lat) && isset($profile->lon)) { | ||||
|                 $options['lat'] = $profile->lat; | ||||
|                 $options['lon'] = $profile->lon; | ||||
| @@ -1974,6 +2034,7 @@ class Notice extends Memcached_DataObject | ||||
|     { | ||||
|         // We always insert for the author so they don't | ||||
|         // have to wait | ||||
|         Event::handle('StartNoticeDistribute', array($this)); | ||||
|  | ||||
|         $user = User::staticGet('id', $this->profile_id); | ||||
|         if (!empty($user)) { | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Notice_source extends Memcached_DataObject  | ||||
| class Notice_source extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
|   | ||||
| @@ -110,7 +110,6 @@ class Oauth_application extends Memcached_DataObject | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function uploadLogo() | ||||
|     { | ||||
|         if ($_FILES['app_icon']['error'] == | ||||
| @@ -153,5 +152,4 @@ class Oauth_application extends Memcached_DataObject | ||||
|         $oauser->application_id = $this->id; | ||||
|         $oauser->delete(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -40,5 +40,4 @@ class Oauth_application_user extends Memcached_DataObject | ||||
|  | ||||
|         return empty($result) ? null : $oau; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -103,7 +103,6 @@ class Profile extends Memcached_DataObject | ||||
|         foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { | ||||
|             # We don't do a scaled one if original is our scaled size | ||||
|             if (!($avatar->width == $size && $avatar->height == $size)) { | ||||
|  | ||||
|                 $scaled_filename = $imagefile->resize($size); | ||||
|  | ||||
|                 //$scaled = DB_DataObject::factory('avatar'); | ||||
| @@ -474,6 +473,41 @@ class Profile extends Memcached_DataObject | ||||
|         return $cnt; | ||||
|     } | ||||
|  | ||||
|     function hasFave($notice) | ||||
|     { | ||||
|         $cache = Cache::instance(); | ||||
|  | ||||
|         // XXX: Kind of a hack. | ||||
|  | ||||
|         if (!empty($cache)) { | ||||
|             // This is the stream of favorite notices, in rev chron | ||||
|             // order. This forces it into cache. | ||||
|  | ||||
|             $ids = Fave::stream($this->id, 0, NOTICE_CACHE_WINDOW); | ||||
|  | ||||
|             // If it's in the list, then it's a fave | ||||
|  | ||||
|             if (in_array($notice->id, $ids)) { | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             // If we're not past the end of the cache window, | ||||
|             // then the cache has all available faves, so this one | ||||
|             // is not a fave. | ||||
|  | ||||
|             if (count($ids) < NOTICE_CACHE_WINDOW) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // Otherwise, cache doesn't have all faves; | ||||
|             // fall through to the default | ||||
|         } | ||||
|  | ||||
|         $fave = Fave::pkeyGet(array('user_id' => $this->id, | ||||
|                                     'notice_id' => $notice->id)); | ||||
|         return ((is_null($fave)) ? false : true); | ||||
|     } | ||||
|  | ||||
|     function faveCount() | ||||
|     { | ||||
|         $c = Cache::instance(); | ||||
| @@ -517,6 +551,20 @@ class Profile extends Memcached_DataObject | ||||
|         return $cnt; | ||||
|     } | ||||
|  | ||||
|     function blowFavesCache() | ||||
|     { | ||||
|         $cache = common_memcache(); | ||||
|         if ($cache) { | ||||
|             // Faves don't happen chronologically, so we need to blow | ||||
|             // ;last cache, too | ||||
|             $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id)); | ||||
|             $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id.';last')); | ||||
|             $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id)); | ||||
|             $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id.';last')); | ||||
|         } | ||||
|         $this->blowFaveCount(); | ||||
|     } | ||||
|  | ||||
|     function blowSubscriberCount() | ||||
|     { | ||||
|         $c = Cache::instance(); | ||||
| @@ -790,13 +838,14 @@ class Profile extends Memcached_DataObject | ||||
|      * @param $right string Name of the right, usually a constant in class Right | ||||
|      * @return boolean whether the user has the right in question | ||||
|      */ | ||||
|  | ||||
|     function hasRight($right) | ||||
|     { | ||||
|         $result = false; | ||||
|  | ||||
|         if ($this->hasRole(Profile_role::DELETED)) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (Event::handle('UserRightsCheck', array($this, $right, &$result))) { | ||||
|             switch ($right) | ||||
|             { | ||||
|   | ||||
| @@ -23,7 +23,6 @@ class Profile_tag extends Memcached_DataObject | ||||
|     ###END_AUTOCODE | ||||
|  | ||||
|     static function getTags($tagger, $tagged) { | ||||
|  | ||||
|         $tags = array(); | ||||
|  | ||||
|         # XXX: store this in memcached | ||||
| @@ -44,7 +43,6 @@ class Profile_tag extends Memcached_DataObject | ||||
|     } | ||||
|  | ||||
|     static function setTags($tagger, $tagged, $newtags) { | ||||
|  | ||||
|         $newtags = array_unique($newtags); | ||||
|         $oldtags = Profile_tag::getTags($tagger, $tagged); | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Remember_me extends Memcached_DataObject  | ||||
| class Remember_me extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
| @@ -16,11 +16,15 @@ class Remember_me extends Memcached_DataObject | ||||
|  | ||||
|     /* Static get */ | ||||
|     function staticGet($k,$v=null) | ||||
|     { return Memcached_DataObject::staticGet('Remember_me',$k,$v); } | ||||
|     { | ||||
|         return Memcached_DataObject::staticGet('Remember_me',$k,$v); | ||||
|     } | ||||
|  | ||||
|     /* the code above is auto generated do not remove the tag below */ | ||||
|     ###END_AUTOCODE | ||||
|  | ||||
|     function sequenceKey() | ||||
|     { return array(false, false); } | ||||
|     { | ||||
|         return array(false, false); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -24,7 +24,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Remote_profile extends Memcached_DataObject  | ||||
| class Remote_profile extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
| @@ -32,8 +32,8 @@ class Remote_profile extends Memcached_DataObject | ||||
|     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 $postnoticeurl;                   // varchar(255) | ||||
|     public $updateprofileurl;                // varchar(255) | ||||
|     public $created;                         // datetime()   not_null | ||||
|     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP | ||||
|  | ||||
| @@ -43,7 +43,7 @@ class Remote_profile extends Memcached_DataObject | ||||
|  | ||||
|     /* the code above is auto generated do not remove the tag below */ | ||||
|     ###END_AUTOCODE | ||||
|      | ||||
|  | ||||
|     function hasRight($right) | ||||
|     { | ||||
|         $profile = Profile::staticGet($this->id); | ||||
|   | ||||
| @@ -287,4 +287,3 @@ class Safe_DataObject extends DB_DataObject | ||||
|         return Safe_DataObject::$iniCache[$key]; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| class Sms_carrier extends Memcached_DataObject  | ||||
| class Sms_carrier extends Memcached_DataObject | ||||
| { | ||||
|     ###START_AUTOCODE | ||||
|     /* the code below is auto generated do not remove the above tag */ | ||||
| @@ -22,7 +22,7 @@ class Sms_carrier extends Memcached_DataObject | ||||
|  | ||||
|     /* the code above is auto generated do not remove the tag below */ | ||||
|     ###END_AUTOCODE | ||||
|      | ||||
|  | ||||
|     function toEmailAddress($sms) | ||||
|     { | ||||
|         return sprintf($this->email_pattern, $sms); | ||||
|   | ||||
| @@ -167,18 +167,17 @@ class Status_network extends Safe_DataObject | ||||
|             ' WHERE nickname = ' . $this->_quote($this->nickname); | ||||
|         $orig->decache(); | ||||
|         $result = $this->query($qry); | ||||
|         if ($result) { | ||||
|             $this->encache(); | ||||
|         } | ||||
|         $this->decache(); | ||||
|  | ||||
|         return $result; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     function delete() | ||||
|     { | ||||
|         $this->decache(); # while we still have the values! | ||||
|         return parent::delete(); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /** | ||||
|      * @param string $servername hostname | ||||
|      * @param string $wildcard hostname suffix to match wildcard config | ||||
| @@ -314,7 +313,7 @@ class Status_network extends Safe_DataObject | ||||
|         if (empty($result)) { | ||||
|             return explode('|', $this->tags); | ||||
|         } | ||||
|          | ||||
|  | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
| @@ -332,7 +331,7 @@ class Status_network extends Safe_DataObject | ||||
|                 $snt->site_id = $this->site_id; | ||||
|                 $snt->tag = $tag; | ||||
|                 $snt->created = common_sql_now(); | ||||
|                  | ||||
|  | ||||
|                 $id = $snt->insert(); | ||||
|                 if (!$id) { | ||||
|                     // TRANS: Exception thrown when a tag cannot be saved. | ||||
| @@ -357,7 +356,7 @@ class Status_network extends Safe_DataObject | ||||
|  | ||||
|         $tag->free(); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /** | ||||
|      * Check if this site record has a particular meta-info tag attached. | ||||
|      * @param string $tag | ||||
|   | ||||
| @@ -26,7 +26,7 @@ class Status_network_tag extends Safe_DataObject | ||||
|  | ||||
|     public $__table = 'status_network_tag';                      // table name | ||||
|     public $site_id;                  // int(4)  primary_key not_null | ||||
|     public $tag;                      // varchar(64)  primary_key not_null  | ||||
|     public $tag;                      // varchar(64)  primary_key not_null | ||||
|     public $created;                 // datetime()   not_null | ||||
|  | ||||
|  | ||||
| @@ -34,7 +34,7 @@ class Status_network_tag extends Safe_DataObject | ||||
|     { | ||||
|         global $config; | ||||
|         global $_DB_DATAOBJECT; | ||||
|          | ||||
|  | ||||
|         $sn = new Status_network(); | ||||
|         $sn->_connect(); | ||||
|  | ||||
|   | ||||
| @@ -235,4 +235,33 @@ class Subscription extends Memcached_DataObject | ||||
|                                            'subscribed' => $other->id)); | ||||
|         return (empty($sub)) ? false : true; | ||||
|     } | ||||
|  | ||||
|     function asActivity() | ||||
|     { | ||||
|         $subscriber = Profile::staticGet('id', $this->subscriber); | ||||
|         $subscribed = Profile::staticGet('id', $this->subscribed); | ||||
|  | ||||
|         $act = new Activity(); | ||||
|  | ||||
|         $act->verb = ActivityVerb::FOLLOW; | ||||
|  | ||||
|         $act->id   = TagURI::mint('follow:%d:%d:%s', | ||||
|                                   $subscriber->id, | ||||
|                                   $subscribed->id, | ||||
|                                   common_date_iso8601($this->created)); | ||||
|  | ||||
|         $act->time    = strtotime($this->created); | ||||
|         // TRANS: Activity tile when subscribing to another person. | ||||
|         $act->title   = _("Follow"); | ||||
|         // TRANS: Notification given when one person starts following another. | ||||
|         // TRANS: %1$s is the subscriber, %2$s is the subscribed. | ||||
|         $act->content = sprintf(_("%1$s is now following %2$s."), | ||||
|                                $subscriber->getBestName(), | ||||
|                                $subscribed->getBestName()); | ||||
|  | ||||
|         $act->actor     = ActivityObject::fromProfile($subscriber); | ||||
|         $act->objects[] = ActivityObject::fromProfile($subscribed); | ||||
|  | ||||
|         return $act; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -250,6 +250,19 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|         $user->inboxed = 1; | ||||
|  | ||||
|         // Set default-on options here, otherwise they'll be disabled | ||||
|         // initially for sites using caching, since the initial encache | ||||
|         // doesn't know about the defaults in the database. | ||||
|         $user->emailnotifysub = 1; | ||||
|         $user->emailnotifyfav = 1; | ||||
|         $user->emailnotifynudge = 1; | ||||
|         $user->emailnotifymsg = 1; | ||||
|         $user->emailnotifyattn = 1; | ||||
|         $user->emailmicroid = 1; | ||||
|         $user->emailpost = 1; | ||||
|         $user->jabbermicroid = 1; | ||||
|         $user->viewdesigns = 1; | ||||
|  | ||||
|         $user->created = common_sql_now(); | ||||
|  | ||||
|         if (Event::handle('StartUserRegister', array(&$user, &$profile))) { | ||||
| @@ -264,7 +277,13 @@ class User extends Memcached_DataObject | ||||
|             } | ||||
|  | ||||
|             $user->id = $id; | ||||
|             $user->uri = common_user_uri($user); | ||||
|  | ||||
|             if (!empty($uri)) { | ||||
|                 $user->uri = $uri; | ||||
|             } else { | ||||
|                 $user->uri = common_user_uri($user); | ||||
|             } | ||||
|  | ||||
|             if (!empty($password)) { // may not have a password for OpenID users | ||||
|                 $user->password = common_munge_password($password, $id); | ||||
|             } | ||||
| @@ -388,37 +407,8 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     function hasFave($notice) | ||||
|     { | ||||
|         $cache = Cache::instance(); | ||||
|  | ||||
|         // XXX: Kind of a hack. | ||||
|  | ||||
|         if ($cache) { | ||||
|             // This is the stream of favorite notices, in rev chron | ||||
|             // order. This forces it into cache. | ||||
|  | ||||
|             $ids = Fave::stream($this->id, 0, NOTICE_CACHE_WINDOW); | ||||
|  | ||||
|             // If it's in the list, then it's a fave | ||||
|  | ||||
|             if (in_array($notice->id, $ids)) { | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             // If we're not past the end of the cache window, | ||||
|             // then the cache has all available faves, so this one | ||||
|             // is not a fave. | ||||
|  | ||||
|             if (count($ids) < NOTICE_CACHE_WINDOW) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // Otherwise, cache doesn't have all faves; | ||||
|             // fall through to the default | ||||
|         } | ||||
|  | ||||
|         $fave = Fave::pkeyGet(array('user_id' => $this->id, | ||||
|                                     'notice_id' => $notice->id)); | ||||
|         return ((is_null($fave)) ? false : true); | ||||
|         $profile = $this->getProfile(); | ||||
|         return $profile->hasFave($notice); | ||||
|     } | ||||
|  | ||||
|     function mutuallySubscribed($other) | ||||
| @@ -487,17 +477,8 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     function blowFavesCache() | ||||
|     { | ||||
|         $cache = Cache::instance(); | ||||
|         if ($cache) { | ||||
|             // Faves don't happen chronologically, so we need to blow | ||||
|             // ;last cache, too | ||||
|             $cache->delete(Cache::key('fave:ids_by_user:'.$this->id)); | ||||
|             $cache->delete(Cache::key('fave:ids_by_user:'.$this->id.';last')); | ||||
|             $cache->delete(Cache::key('fave:ids_by_user_own:'.$this->id)); | ||||
|             $cache->delete(Cache::key('fave:ids_by_user_own:'.$this->id.';last')); | ||||
|         } | ||||
|         $profile = $this->getProfile(); | ||||
|         $profile->blowFaveCount(); | ||||
|         $profile->blowFavesCache(); | ||||
|     } | ||||
|  | ||||
|     function getSelfTags() | ||||
| @@ -547,6 +528,9 @@ class User extends Memcached_DataObject | ||||
|         if (Subscription::exists($other, $self)) { | ||||
|             Subscription::cancel($other, $self); | ||||
|         } | ||||
|         if (Subscription::exists($self, $other)) { | ||||
|             Subscription::cancel($self, $other); | ||||
|         } | ||||
|  | ||||
|         $block->query('COMMIT'); | ||||
|  | ||||
|   | ||||
| @@ -465,7 +465,6 @@ class User_group extends Memcached_DataObject | ||||
|     } | ||||
|  | ||||
|     static function register($fields) { | ||||
|  | ||||
|         // MAGICALLY put fields into current scope | ||||
|  | ||||
|         extract($fields); | ||||
|   | ||||
| @@ -18,7 +18,9 @@ class User_username extends Memcached_DataObject | ||||
|  | ||||
|     /* Static get */ | ||||
|     function staticGet($k,$v=null) | ||||
|     { return Memcached_DataObject::staticGet('User_username',$k,$v); } | ||||
|     { | ||||
|         return Memcached_DataObject::staticGet('User_username',$k,$v); | ||||
|     } | ||||
|  | ||||
|     /* the code above is auto generated do not remove the tag below */ | ||||
|     ###END_AUTOCODE | ||||
| @@ -37,6 +39,7 @@ class User_username extends Memcached_DataObject | ||||
|         $user_username->provider_name = $provider_name; | ||||
|         $user_username->username = $username; | ||||
|         $user_username->created = DB_DataObject_Cast::dateTime(); | ||||
|  | ||||
|         if($user_username->insert()){ | ||||
|             return $user_username; | ||||
|         }else{ | ||||
| @@ -57,5 +60,4 @@ class User_username extends Memcached_DataObject | ||||
|     function keys() { | ||||
|         return array('provider_name' => 'K', 'username' => 'K'); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -52,6 +52,10 @@ VALUES | ||||
|     ('socialoomphBfD4pMqz31', 'SocialOomph', 'http://www.socialoomph.com/', now()), | ||||
|     ('spaz','Spaz','http://funkatron.com/spaz', now()), | ||||
|     ('StatusNet Desktop', 'StatusNet Desktop', 'http://status.net/desktop', now()), | ||||
|     ('StatusNet Mobile', 'StatusNet Mobile', 'http://status.net/mobile', now()), | ||||
|     ('StatusNet iPhone', 'iPhone', 'http://status.net/iphone', now()), | ||||
|     ('StatusNet Android', 'Android', 'http://status.net/android', now()), | ||||
|     ('StatusNet Blackberry', 'Blackberry', 'http://status.net/blackberry', now()), | ||||
|     ('tarpipe','tarpipe','http://tarpipe.com/', now()), | ||||
|     ('tjunar','Tjunar','http://nederflash.nl/boek/titels/tjunar-air', now()), | ||||
|     ('tr.im','tr.im','http://tr.im/', now()), | ||||
|   | ||||
| @@ -44,7 +44,6 @@ require_once INSTALLDIR.'/lib/settingsaction.php'; | ||||
|  * | ||||
|  * @see      Widget | ||||
|  */ | ||||
|  | ||||
| class AccountSettingsAction extends SettingsAction | ||||
| { | ||||
|     /** | ||||
| @@ -54,7 +53,6 @@ class AccountSettingsAction extends SettingsAction | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function showLocalNav() | ||||
|     { | ||||
|         $menu = new AccountSettingsNav($this); | ||||
| @@ -73,7 +71,6 @@ class AccountSettingsAction extends SettingsAction | ||||
|  * | ||||
|  * @see      HTMLOutputter | ||||
|  */ | ||||
|  | ||||
| class AccountSettingsNav extends Widget | ||||
| { | ||||
|     var $action = null; | ||||
| @@ -83,7 +80,6 @@ class AccountSettingsNav extends Widget | ||||
|      * | ||||
|      * @param Action $action current action, used for output | ||||
|      */ | ||||
|  | ||||
|     function __construct($action=null) | ||||
|     { | ||||
|         parent::__construct($action); | ||||
| @@ -95,7 +91,6 @@ class AccountSettingsNav extends Widget | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function show() | ||||
|     { | ||||
|         $action_name = $this->action->trimmed('action'); | ||||
|   | ||||
| @@ -314,7 +314,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return nothing | ||||
|      */ | ||||
|  | ||||
|     function showFeeds() | ||||
|     { | ||||
|         $feeds = $this->getFeeds(); | ||||
| @@ -710,19 +709,18 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return nothing | ||||
|      */ | ||||
|  | ||||
|     function showAside() | ||||
|     { | ||||
|         $this->elementStart('div', array('id' => 'aside_primary', | ||||
|                                          'class' => 'aside')); | ||||
|         if (Event::handle('StartShowExportData', array($this))) { | ||||
|             $this->showExportData(); | ||||
|             Event::handle('EndShowExportData', array($this)); | ||||
|         } | ||||
|         if (Event::handle('StartShowSections', array($this))) { | ||||
|             $this->showSections(); | ||||
|             Event::handle('EndShowSections', array($this)); | ||||
|         } | ||||
|         if (Event::handle('StartShowExportData', array($this))) { | ||||
|             $this->showExportData(); | ||||
|             Event::handle('EndShowExportData', array($this)); | ||||
|         } | ||||
|         $this->elementEnd('div'); | ||||
|     } | ||||
|  | ||||
| @@ -731,7 +729,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function showExportData() | ||||
|     { | ||||
|         $feeds = $this->getFeeds(); | ||||
| @@ -807,6 +804,7 @@ class Action extends HTMLOutputter // lawsuit | ||||
|                             // TRANS: Secondary navigation menu option leading to contact information on the StatusNet site. | ||||
|                             _('Contact')); | ||||
|             $this->menuItem(common_local_url('doc', array('title' => 'badge')), | ||||
|                             // TRANS: Secondary navigation menu option. | ||||
|                             _('Badge')); | ||||
|             Event::handle('EndSecondaryNav', array($this)); | ||||
|         } | ||||
| @@ -840,6 +838,9 @@ class Action extends HTMLOutputter // lawsuit | ||||
|         $this->elementStart('dd', null); | ||||
|         if (common_config('site', 'broughtby')) { | ||||
|             // TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. | ||||
|             // TRANS: Text between [] is a link description, text between () is the link itself. | ||||
|             // TRANS: Make sure there is no whitespace between "]" and "(". | ||||
|             // TRANS: "%%site.broughtby%%" is the value of the variable site.broughtby | ||||
|             $instr = _('**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%).'); | ||||
|         } else { | ||||
|             // TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. | ||||
| @@ -847,6 +848,9 @@ class Action extends HTMLOutputter // lawsuit | ||||
|         } | ||||
|         $instr .= ' '; | ||||
|         // TRANS: Second sentence of the StatusNet site license. Mentions the StatusNet source code license. | ||||
|         // TRANS: Make sure there is no whitespace between "]" and "(". | ||||
|         // TRANS: Text between [] is a link description, text between () is the link itself. | ||||
|         // TRANS: %s is the version of StatusNet that is being used. | ||||
|         $instr .= sprintf(_('It runs the [StatusNet](http://status.net/) microblogging software, version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), STATUSNET_VERSION); | ||||
|         $output = common_markup_to_html($instr); | ||||
|         $this->raw($output); | ||||
| @@ -893,7 +897,8 @@ class Action extends HTMLOutputter // lawsuit | ||||
|                                             'width' => '80', | ||||
|                                             'height' => '15')); | ||||
|                 $this->text(' '); | ||||
|                 // TRANS: license message in footer. %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. | ||||
|                 // TRANS: license message in footer. | ||||
|                 // TRANS: %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. | ||||
|                 $notice = _('All %1$s content and data are available under the %2$s license.'); | ||||
|                 $link = "<a class=\"license\" rel=\"external license\" href=\"" . | ||||
|                         htmlspecialchars(common_config('license', 'url')) . | ||||
| @@ -947,7 +952,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return boolean is read only action? | ||||
|      */ | ||||
|  | ||||
|     function isReadOnly($args) | ||||
|     { | ||||
|         return false; | ||||
| @@ -1011,17 +1015,22 @@ class Action extends HTMLOutputter // lawsuit | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $checked = false; | ||||
|         if ($etag) { | ||||
|             $if_none_match = (array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)) ? | ||||
|               $_SERVER['HTTP_IF_NONE_MATCH'] : null; | ||||
|             if ($if_none_match && $this->_hasEtag($etag, $if_none_match)) { | ||||
|                 header('HTTP/1.1 304 Not Modified'); | ||||
|                 // Better way to do this? | ||||
|                 exit(0); | ||||
|             if ($if_none_match) { | ||||
|                 // If this check fails, ignore the if-modified-since below. | ||||
|                 $checked = true; | ||||
|                 if ($this->_hasEtag($etag, $if_none_match)) { | ||||
|                     header('HTTP/1.1 304 Not Modified'); | ||||
|                     // Better way to do this? | ||||
|                     exit(0); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if ($lm && array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) { | ||||
|         if (!$checked && $lm && array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) { | ||||
|             $if_modified_since = $_SERVER['HTTP_IF_MODIFIED_SINCE']; | ||||
|             $ims = strtotime($if_modified_since); | ||||
|             if ($lm <= $ims) { | ||||
| @@ -1041,7 +1050,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return boolean is read only action? | ||||
|      */ | ||||
|  | ||||
|     function isCacheable() | ||||
|     { | ||||
|         return true; | ||||
| @@ -1055,7 +1063,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return boolean | ||||
|      */ | ||||
|  | ||||
|     function _hasEtag($etag, $if_none_match) | ||||
|     { | ||||
|         $etags = explode(',', $if_none_match); | ||||
| @@ -1095,7 +1102,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return integer integer value | ||||
|      */ | ||||
|  | ||||
|     function int($key, $defValue=null, $maxValue=null, $minValue=null) | ||||
|     { | ||||
|         $arg = strtolower($this->trimmed($key)); | ||||
| @@ -1123,7 +1129,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return nothing | ||||
|      */ | ||||
|  | ||||
|     function serverError($msg, $code=500) | ||||
|     { | ||||
|         $action = $this->trimmed('action'); | ||||
| @@ -1139,7 +1144,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return nothing | ||||
|      */ | ||||
|  | ||||
|     function clientError($msg, $code=400) | ||||
|     { | ||||
|         $action = $this->trimmed('action'); | ||||
| @@ -1152,7 +1156,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return string current URL | ||||
|      */ | ||||
|  | ||||
|     function selfUrl() | ||||
|     { | ||||
|         list($action, $args) = $this->returnToArgs(); | ||||
| @@ -1164,7 +1167,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return array two elements: action, other args | ||||
|      */ | ||||
|  | ||||
|     function returnToArgs() | ||||
|     { | ||||
|         $action = $this->trimmed('action'); | ||||
| @@ -1271,7 +1273,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return array Feed object to show in head and links | ||||
|      */ | ||||
|  | ||||
|     function getFeeds() | ||||
|     { | ||||
|         return null; | ||||
| @@ -1282,7 +1283,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return Design a design object to use | ||||
|      */ | ||||
|  | ||||
|     function getDesign() | ||||
|     { | ||||
|         return Design::siteDesign(); | ||||
| @@ -1296,7 +1296,6 @@ class Action extends HTMLOutputter // lawsuit | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     // XXX: Finding this type of check with the same message about 50 times. | ||||
|     //      Possible to refactor? | ||||
|     function checkSessionToken() | ||||
| @@ -1304,6 +1303,7 @@ class Action extends HTMLOutputter // lawsuit | ||||
|         // CSRF protection | ||||
|         $token = $this->trimmed('token'); | ||||
|         if (empty($token) || $token != common_session_token()) { | ||||
|             // TRANS: Client error text when there is a problem with the session token. | ||||
|             $this->clientError(_('There was a problem with your session token.')); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -48,7 +48,6 @@ if (!defined('STATUSNET')) { | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class Activity | ||||
| { | ||||
|     const SPEC   = 'http://activitystrea.ms/spec/1.0/'; | ||||
| @@ -108,7 +107,6 @@ class Activity | ||||
|      * @param DOMElement $entry Atom entry to poke at | ||||
|      * @param DOMElement $feed  Atom feed, for context | ||||
|      */ | ||||
|  | ||||
|     function __construct($entry = null, $feed = null) | ||||
|     { | ||||
|         if (is_null($entry)) { | ||||
| @@ -133,6 +131,7 @@ class Activity | ||||
|                    $entry->localName == 'item') { | ||||
|             $this->_fromRssItem($entry, $feed); | ||||
|         } else { | ||||
|             // Low level exception. No need for i18n. | ||||
|             throw new Exception("Unknown DOM element: {$entry->namespaceURI} {$entry->localName}"); | ||||
|         } | ||||
|     } | ||||
| @@ -313,13 +312,12 @@ class Activity | ||||
|      * | ||||
|      * @return DOMElement Atom entry | ||||
|      */ | ||||
|  | ||||
|     function toAtomEntry() | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     function asString($namespace=false) | ||||
|     function asString($namespace=false, $author=true) | ||||
|     { | ||||
|         $xs = new XMLStringer(true); | ||||
|  | ||||
| @@ -338,7 +336,7 @@ class Activity | ||||
|  | ||||
|         $xs->element('id', null, $this->id); | ||||
|         $xs->element('title', null, $this->title); | ||||
|         $xs->element('published', null, common_date_iso8601($this->time)); | ||||
|         $xs->element('published', null, self::iso8601Date($this->time)); | ||||
|         $xs->element('content', array('type' => 'html'), $this->content); | ||||
|  | ||||
|         if (!empty($this->summary)) { | ||||
| @@ -353,13 +351,15 @@ class Activity | ||||
|  | ||||
|         // XXX: add context | ||||
|  | ||||
|         $xs->elementStart('author'); | ||||
|         $xs->element('uri', array(), $this->actor->id); | ||||
|         if ($this->actor->title) { | ||||
|             $xs->element('name', array(), $this->actor->title); | ||||
|         if ($author) { | ||||
|             $xs->elementStart('author'); | ||||
|             $xs->element('uri', array(), $this->actor->id); | ||||
|             if ($this->actor->title) { | ||||
|                 $xs->element('name', array(), $this->actor->title); | ||||
|             } | ||||
|             $xs->elementEnd('author'); | ||||
|             $xs->raw($this->actor->asString('activity:actor')); | ||||
|         } | ||||
|         $xs->elementEnd('author'); | ||||
|         $xs->raw($this->actor->asString('activity:actor')); | ||||
|  | ||||
|         $xs->element('activity:verb', null, $this->verb); | ||||
|  | ||||
| @@ -386,5 +386,12 @@ class Activity | ||||
|     { | ||||
|         return ActivityUtils::child($element, $tag, $namespace); | ||||
|     } | ||||
| } | ||||
|  | ||||
|     static function iso8601Date($tm) | ||||
|     { | ||||
|         $dateStr = date('d F Y H:i:s', $tm); | ||||
|         $d = new DateTime($dateStr, new DateTimeZone('UTC')); | ||||
|         $d->setTimezone(new DateTimeZone(common_timezone())); | ||||
|         return $d->format('c'); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -54,8 +54,12 @@ class ActivityContext | ||||
|     const MENTIONED    = 'mentioned'; | ||||
|     const CONVERSATION = 'ostatus:conversation'; | ||||
|  | ||||
|     function __construct($element) | ||||
|     function __construct($element = null) | ||||
|     { | ||||
|         if (empty($element)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $replyToEl = ActivityUtils::child($element, self::INREPLYTO, self::THR); | ||||
|  | ||||
|         if (!empty($replyToEl)) { | ||||
| @@ -73,7 +77,6 @@ class ActivityContext | ||||
|  | ||||
|         $attention = array(); | ||||
|         for ($i = 0; $i < $links->length; $i++) { | ||||
|  | ||||
|             $link = $links->item($i); | ||||
|  | ||||
|             $linkRel = $link->getAttribute(ActivityUtils::REL); | ||||
|   | ||||
| @@ -49,7 +49,6 @@ if (!defined('STATUSNET')) { | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ActivityObject | ||||
| { | ||||
|     const ARTICLE   = 'http://activitystrea.ms/schema/1.0/article'; | ||||
| @@ -116,7 +115,6 @@ class ActivityObject | ||||
|      * | ||||
|      * @param DOMElement $element DOM thing to turn into an Activity thing | ||||
|      */ | ||||
|  | ||||
|     function __construct($element = null) | ||||
|     { | ||||
|         if (empty($element)) { | ||||
| @@ -168,7 +166,6 @@ class ActivityObject | ||||
|                 ActivityObject::MEDIA_DESCRIPTION, | ||||
|                 Activity::MEDIA | ||||
|             ); | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -204,7 +201,7 @@ class ActivityObject | ||||
|  | ||||
|         $title = ActivityUtils::childHtmlContent($element, self::TITLE); | ||||
|  | ||||
|         $this->title = html_entity_decode(strip_tags($title)); | ||||
|         $this->title = html_entity_decode(strip_tags($title), ENT_QUOTES, 'UTF-8'); | ||||
|  | ||||
|         $this->source  = $this->_getSource($element); | ||||
|  | ||||
| @@ -217,8 +214,7 @@ class ActivityObject | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // @fixme rationalize with Activity::_fromRssItem() | ||||
|  | ||||
|     // @todo FIXME: rationalize with Activity::_fromRssItem() | ||||
|     private function _fromRssItem($item) | ||||
|     { | ||||
|         $this->title = ActivityUtils::childContent($item, ActivityObject::TITLE, Activity::RSS); | ||||
| @@ -418,7 +414,6 @@ class ActivityObject | ||||
|         ); | ||||
|  | ||||
|         foreach ($sizes as $size) { | ||||
|  | ||||
|             $alink  = null; | ||||
|             $avatar = $profile->getAvatar($size); | ||||
|  | ||||
| @@ -430,6 +425,17 @@ class ActivityObject | ||||
|                 $alink->height = $size; | ||||
|                 $alink->width  = $size; | ||||
|                 $alink->url    = Avatar::defaultImage($size); | ||||
|  | ||||
|                 if ($size == AVATAR_PROFILE_SIZE) { | ||||
|                     // Hack for Twitter import: we don't have a 96x96 image, | ||||
|                     // but we do have a 73x73 image. For now, fake it with that. | ||||
|                     $avatar = $profile->getAvatar(73); | ||||
|                     if ($avatar) { | ||||
|                         $alink = AvatarLink::fromAvatar($avatar); | ||||
|                         $alink->height= $size; | ||||
|                         $alink->width = $size; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $object->avatarLinks[] = $alink; | ||||
|   | ||||
| @@ -46,7 +46,6 @@ if (!defined('STATUSNET')) { | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ActivityUtils | ||||
| { | ||||
|     const ATOM = 'http://www.w3.org/2005/Atom'; | ||||
| @@ -66,7 +65,6 @@ class ActivityUtils | ||||
|      * | ||||
|      * @return string related link, if any | ||||
|      */ | ||||
|  | ||||
|     static function getPermalink($element) | ||||
|     { | ||||
|         return self::getLink($element, 'alternate', 'text/html'); | ||||
| @@ -79,19 +77,16 @@ class ActivityUtils | ||||
|      * | ||||
|      * @return string related link, if any | ||||
|      */ | ||||
|  | ||||
|     static function getLink(DOMNode $element, $rel, $type=null) | ||||
|     { | ||||
|         $els = $element->childNodes; | ||||
|  | ||||
|         foreach ($els as $link) { | ||||
|  | ||||
|             if (!($link instanceof DOMElement)) { | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) { | ||||
|  | ||||
|                 $linkRel = $link->getAttribute(self::REL); | ||||
|                 $linkType = $link->getAttribute(self::TYPE); | ||||
|  | ||||
| @@ -112,7 +107,6 @@ class ActivityUtils | ||||
|  | ||||
|         foreach ($els as $link) { | ||||
|             if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) { | ||||
|  | ||||
|                 $linkRel = $link->getAttribute(self::REL); | ||||
|                 $linkType = $link->getAttribute(self::TYPE); | ||||
|  | ||||
| @@ -135,7 +129,6 @@ class ActivityUtils | ||||
|      * | ||||
|      * @return DOMElement found element or null | ||||
|      */ | ||||
|  | ||||
|     static function child(DOMNode $element, $tag, $namespace=self::ATOM) | ||||
|     { | ||||
|         $els = $element->childNodes; | ||||
| @@ -160,7 +153,6 @@ class ActivityUtils | ||||
|      * | ||||
|      * @return string content of the child | ||||
|      */ | ||||
|  | ||||
|     static function childContent(DOMNode $element, $tag, $namespace=self::ATOM) | ||||
|     { | ||||
|         $el = self::child($element, $tag, $namespace); | ||||
| @@ -194,7 +186,6 @@ class ActivityUtils | ||||
|      * @todo handle embedded XML mime types | ||||
|      * @todo handle base64-encoded non-XML and non-text mime types | ||||
|      */ | ||||
|  | ||||
|     static function getContent($element) | ||||
|     { | ||||
|         return self::childHtmlContent($element, self::CONTENT, self::ATOM); | ||||
| @@ -205,6 +196,7 @@ class ActivityUtils | ||||
|         $src  = $el->getAttribute(self::SRC); | ||||
|  | ||||
|         if (!empty($src)) { | ||||
|             // TRANS: Client exception thrown when there is no source attribute. | ||||
|             throw new ClientException(_("Can't handle remote content yet.")); | ||||
|         } | ||||
|  | ||||
| @@ -241,10 +233,12 @@ class ActivityUtils | ||||
|             return trim($text); | ||||
|         } else if (in_array($type, array('text/xml', 'application/xml')) || | ||||
|                    preg_match('#(+|/)xml$#', $type)) { | ||||
|             // TRANS: Client exception thrown when there embedded XML content is found that cannot be processed yet. | ||||
|             throw new ClientException(_("Can't handle embedded XML content yet.")); | ||||
|         } else if (strncasecmp($type, 'text/', 5)) { | ||||
|             return $el->textContent; | ||||
|         } else { | ||||
|             // TRANS: Client exception thrown when base64 encoded content is found that cannot be processed yet. | ||||
|             throw new ClientException(_("Can't handle embedded Base64 content yet.")); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -42,7 +42,6 @@ if (!defined('STATUSNET')) { | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ActivityVerb | ||||
| { | ||||
|     const POST     = 'http://activitystrea.ms/schema/1.0/post'; | ||||
|   | ||||
| @@ -45,7 +45,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { | ||||
|  * | ||||
|  * @see      Form | ||||
|  */ | ||||
|  | ||||
| class AdminForm extends Form | ||||
| { | ||||
|     /** | ||||
| @@ -59,7 +58,6 @@ class AdminForm extends Form | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function input($setting, $title, $instructions, $section='site') | ||||
|     { | ||||
|         $this->out->input($setting, $title, $this->value($setting, $section), $instructions); | ||||
| @@ -73,7 +71,6 @@ class AdminForm extends Form | ||||
|      * | ||||
|      * @return string param value if posted, or current config value | ||||
|      */ | ||||
|  | ||||
|     function value($setting, $main='site') | ||||
|     { | ||||
|         $value = $this->out->trimmed($setting); | ||||
| @@ -82,5 +79,4 @@ class AdminForm extends Form | ||||
|         } | ||||
|         return $value; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -44,7 +44,6 @@ if (!defined('STATUSNET')) { | ||||
|  * | ||||
|  * @todo Find some commonalities with SettingsAction and combine | ||||
|  */ | ||||
|  | ||||
| class AdminPanelAction extends Action | ||||
| { | ||||
|     var $success = true; | ||||
| @@ -61,7 +60,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return boolean success flag | ||||
|      */ | ||||
|  | ||||
|     function prepare($args) | ||||
|     { | ||||
|         parent::prepare($args); | ||||
| @@ -124,7 +122,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function handle($args) | ||||
|     { | ||||
|         if ($_SERVER['REQUEST_METHOD'] == 'POST') { | ||||
| @@ -155,7 +152,6 @@ class AdminPanelAction extends Action | ||||
|      * @return void | ||||
|      * @see AdminPanelNav | ||||
|      */ | ||||
|  | ||||
|     function showLocalNav() | ||||
|     { | ||||
|         $nav = new AdminPanelNav($this); | ||||
| @@ -169,7 +165,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return void. | ||||
|      */ | ||||
|  | ||||
|     function showContent() | ||||
|     { | ||||
|         $this->showForm(); | ||||
| @@ -199,7 +194,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function showPageNotice() | ||||
|     { | ||||
|         if ($this->msg) { | ||||
| @@ -222,7 +216,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function showForm() | ||||
|     { | ||||
|         // TRANS: Client error message. | ||||
| @@ -239,7 +232,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function getInstructions() | ||||
|     { | ||||
|         return ''; | ||||
| @@ -252,7 +244,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function saveSettings() | ||||
|     { | ||||
|         // TRANS: Client error message | ||||
| @@ -267,7 +258,6 @@ class AdminPanelAction extends Action | ||||
|      * | ||||
|      * @return mixed $result false if something didn't work | ||||
|      */ | ||||
|  | ||||
|     function deleteSetting($section, $setting) | ||||
|     { | ||||
|         $config = new Config(); | ||||
| @@ -314,7 +304,6 @@ class AdminPanelAction extends Action | ||||
|  * | ||||
|  * @see      Widget | ||||
|  */ | ||||
|  | ||||
| class AdminPanelNav extends Widget | ||||
| { | ||||
|     var $action = null; | ||||
| @@ -324,7 +313,6 @@ class AdminPanelNav extends Widget | ||||
|      * | ||||
|      * @param Action $action current action, used for output | ||||
|      */ | ||||
|  | ||||
|     function __construct($action=null) | ||||
|     { | ||||
|         parent::__construct($action); | ||||
| @@ -336,7 +324,6 @@ class AdminPanelNav extends Widget | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function show() | ||||
|     { | ||||
|         $action_name = $this->action->trimmed('action'); | ||||
| @@ -409,6 +396,14 @@ class AdminPanelNav extends Widget | ||||
|                                      $menu_title, $action_name == 'snapshotadminpanel', 'nav_snapshot_admin_panel'); | ||||
|             } | ||||
|  | ||||
|             if (AdminPanelAction::canAdmin('license')) { | ||||
|                 // TRANS: Menu item title/tooltip | ||||
|                 $menu_title = _('Set site license'); | ||||
|                 // TRANS: Menu item for site administration | ||||
|                 $this->out->menuItem(common_local_url('licenseadminpanel'), _('License'), | ||||
|                                      $menu_title, $action_name == 'licenseadminpanel', 'nav_license_admin_panel'); | ||||
|             } | ||||
|  | ||||
|             if (AdminPanelAction::canAdmin('plugins')) { | ||||
|                 // TRANS: Menu item title/tooltip | ||||
|                 $menu_title = _('Plugins configuration'); | ||||
| @@ -421,5 +416,4 @@ class AdminPanelNav extends Widget | ||||
|         } | ||||
|         $this->action->elementEnd('ul'); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -114,7 +114,6 @@ class ApiValidationException extends Exception { } | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ApiAction extends Action | ||||
| { | ||||
|     const READ_ONLY  = 1; | ||||
| @@ -141,7 +140,6 @@ class ApiAction extends Action | ||||
|      * | ||||
|      * @return boolean false if user doesn't exist | ||||
|      */ | ||||
|  | ||||
|     function prepare($args) | ||||
|     { | ||||
|         StatusNet::setApi(true); // reduce exception reports to aid in debugging | ||||
| @@ -174,7 +172,6 @@ class ApiAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function handle($args) | ||||
|     { | ||||
|         header('Access-Control-Allow-Origin: *'); | ||||
| @@ -467,7 +464,6 @@ class ApiAction extends Action | ||||
|         $entry = array(); | ||||
|  | ||||
|         if (Event::handle('StartRssEntryArray', array($notice, &$entry))) { | ||||
|  | ||||
|             $profile = $notice->getProfile(); | ||||
|  | ||||
|             // We trim() to avoid extraneous whitespace in the output | ||||
| @@ -557,7 +553,6 @@ class ApiAction extends Action | ||||
|         $notifications = false; | ||||
|  | ||||
|         if ($source->isSubscribed($target)) { | ||||
|  | ||||
|             $sub = Subscription::pkeyGet(array('subscriber' => | ||||
|                 $source->id, 'subscribed' => $target->id)); | ||||
|  | ||||
| @@ -743,7 +738,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showXmlTimeline($notice) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('xml'); | ||||
|         $this->elementStart('statuses', array('type' => 'array', | ||||
|                                               'xmlns:statusnet' => 'http://status.net/schema/api/1/')); | ||||
| @@ -768,7 +762,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showRssTimeline($notice, $title, $link, $subtitle, $suplink = null, $logo = null, $self = null) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('rss'); | ||||
|  | ||||
|         $this->element('title', null, $title); | ||||
| @@ -824,7 +817,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null, $logo=null) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('atom'); | ||||
|  | ||||
|         $this->element('title', null, $title); | ||||
| @@ -864,12 +856,10 @@ class ApiAction extends Action | ||||
|         } | ||||
|  | ||||
|         $this->endDocument('atom'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     function showRssGroups($group, $title, $link, $subtitle) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('rss'); | ||||
|  | ||||
|         $this->element('title', null, $title); | ||||
| @@ -1017,7 +1007,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showAtomGroups($group, $title, $id, $link, $subtitle=null, $selfuri=null) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('atom'); | ||||
|  | ||||
|         $this->element('title', null, common_xml_safe_str($title)); | ||||
| @@ -1048,7 +1037,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showJsonTimeline($notice) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('json'); | ||||
|  | ||||
|         $statuses = array(); | ||||
| @@ -1074,7 +1062,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showJsonGroups($group) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('json'); | ||||
|  | ||||
|         $groups = array(); | ||||
| @@ -1120,7 +1107,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showTwitterXmlUsers($user) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('xml'); | ||||
|         $this->elementStart('users', array('type' => 'array', | ||||
|                                            'xmlns:statusnet' => 'http://status.net/schema/api/1/')); | ||||
| @@ -1143,7 +1129,6 @@ class ApiAction extends Action | ||||
|  | ||||
|     function showJsonUsers($user) | ||||
|     { | ||||
|  | ||||
|         $this->initDocument('json'); | ||||
|  | ||||
|         $users = array(); | ||||
| @@ -1228,7 +1213,6 @@ class ApiAction extends Action | ||||
|             $this->endXML(); | ||||
|             break; | ||||
|         case 'json': | ||||
|  | ||||
|             // Check for JSONP callback | ||||
|             if (isset($this->callback)) { | ||||
|                 print ')'; | ||||
| @@ -1374,7 +1358,6 @@ class ApiAction extends Action | ||||
|     function getTargetUser($id) | ||||
|     { | ||||
|         if (empty($id)) { | ||||
|  | ||||
|             // Twitter supports these other ways of passing the user ID | ||||
|             if (is_numeric($this->arg('id'))) { | ||||
|                 return User::staticGet($this->arg('id')); | ||||
| @@ -1485,7 +1468,6 @@ class ApiAction extends Action | ||||
|      */ | ||||
|     function arg($key, $def=null) | ||||
|     { | ||||
|  | ||||
|         // XXX: Do even more input validation/scrubbing? | ||||
|  | ||||
|         if (array_key_exists($key, $this->args)) { | ||||
| @@ -1552,5 +1534,4 @@ class ApiAction extends Action | ||||
|  | ||||
|         return $uri; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -68,7 +68,6 @@ require_once INSTALLDIR . '/lib/apioauth.php'; | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ApiAuthAction extends ApiAction | ||||
| { | ||||
|     var $auth_user_nickname = null; | ||||
| @@ -83,7 +82,6 @@ class ApiAuthAction extends ApiAction | ||||
|      * @return boolean success flag | ||||
|      * | ||||
|      */ | ||||
|  | ||||
|     function prepare($args) | ||||
|     { | ||||
|         parent::prepare($args); | ||||
| @@ -126,7 +124,6 @@ class ApiAuthAction extends ApiAction | ||||
|      * | ||||
|      * @return mixed the OAuthRequest or false | ||||
|      */ | ||||
|  | ||||
|     function getOAuthRequest() | ||||
|     { | ||||
|         ApiOauthAction::cleanRequest(); | ||||
| @@ -154,7 +151,6 @@ class ApiAuthAction extends ApiAction | ||||
|      * | ||||
|      * @return nothing | ||||
|      */ | ||||
|  | ||||
|     function checkOAuthRequest($request) | ||||
|     { | ||||
|         $datastore   = new ApiStatusNetOAuthDataStore(); | ||||
| @@ -164,7 +160,6 @@ class ApiAuthAction extends ApiAction | ||||
|         $server->add_signature_method($hmac_method); | ||||
|  | ||||
|         try { | ||||
|  | ||||
|             $server->verify_request($request); | ||||
|  | ||||
|             $consumer     = $request->get_parameter('oauth_consumer_key'); | ||||
| @@ -176,7 +171,8 @@ class ApiAuthAction extends ApiAction | ||||
|                 common_log(LOG_WARNING, | ||||
|                            'Couldn\'t find the OAuth app for consumer key: ' . | ||||
|                            $consumer); | ||||
|                 throw new OAuthException('No application for that consumer key.'); | ||||
|                 // TRANS: OAuth exception thrown when no application is found for a given consumer key. | ||||
|                 throw new OAuthException(_('No application for that consumer key.')); | ||||
|             } | ||||
|  | ||||
|             // set the source attr | ||||
| @@ -186,19 +182,15 @@ class ApiAuthAction extends ApiAction | ||||
|             $appUser = Oauth_application_user::staticGet('token', $access_token); | ||||
|  | ||||
|             if (!empty($appUser)) { | ||||
|  | ||||
|                 // If access_type == 0 we have either a request token | ||||
|                 // or a bad / revoked access token | ||||
|  | ||||
|                 if ($appUser->access_type != 0) { | ||||
|  | ||||
|                     // Set the access level for the api call | ||||
|  | ||||
|                     $this->access = ($appUser->access_type & Oauth_application::$writeAccess) | ||||
|                       ? self::READ_WRITE : self::READ_ONLY; | ||||
|  | ||||
|                     // Set the auth user | ||||
|  | ||||
|                     if (Event::handle('StartSetApiUser', array(&$user))) { | ||||
|                         $this->auth_user = User::staticGet('id', $appUser->profile_id); | ||||
|                         Event::handle('EndSetApiUser', array($user)); | ||||
| @@ -216,13 +208,13 @@ class ApiAuthAction extends ApiAction | ||||
|                                                  'read-write' : 'read-only' | ||||
|                                                  )); | ||||
|                 } else { | ||||
|                     throw new OAuthException('Bad access token.'); | ||||
|                     // TRANS: OAuth exception given when an incorrect access token was given for a user. | ||||
|                     throw new OAuthException(_('Bad access token.')); | ||||
|                 } | ||||
|             } else { | ||||
|  | ||||
|                 // Also should not happen | ||||
|  | ||||
|                 throw new OAuthException('No user for that token.'); | ||||
|                 // TRANS: OAuth exception given when no user was found for a given token (no token was found). | ||||
|                 throw new OAuthException(_('No user for that token.')); | ||||
|             } | ||||
|  | ||||
|         } catch (OAuthException $e) { | ||||
| @@ -237,7 +229,6 @@ class ApiAuthAction extends ApiAction | ||||
|      * | ||||
|      * @return boolean true | ||||
|      */ | ||||
|  | ||||
|     function requiresAuth() | ||||
|     { | ||||
|         return true; | ||||
| @@ -249,7 +240,6 @@ class ApiAuthAction extends ApiAction | ||||
|      * | ||||
|      * @return boolean true or false | ||||
|      */ | ||||
|  | ||||
|     function checkBasicAuthUser($required = true) | ||||
|     { | ||||
|         $this->basicAuthProcessHeader(); | ||||
| @@ -264,8 +254,8 @@ class ApiAuthAction extends ApiAction | ||||
|             header('WWW-Authenticate: Basic realm="' . $realm . '"'); | ||||
|  | ||||
|             // show error if the user clicks 'cancel' | ||||
|  | ||||
|             $this->clientError("Could not authenticate you.", 401, $this->format); | ||||
|             // TRANS: Client error thrown when authentication fails becaus a user clicked "Cancel". | ||||
|             $this->clientError(_("Could not authenticate you."), 401, $this->format); | ||||
|             exit; | ||||
|  | ||||
|         } else { | ||||
| @@ -283,13 +273,11 @@ class ApiAuthAction extends ApiAction | ||||
|             } | ||||
|  | ||||
|             // By default, basic auth users have rw access | ||||
|  | ||||
|             $this->access = self::READ_WRITE; | ||||
|  | ||||
|             if (empty($this->auth_user) && ($required || isset($_SERVER['PHP_AUTH_USER']))) { | ||||
|  | ||||
|                 // basic authentication failed | ||||
|  | ||||
|                 list($proxy, $ip) = common_client_ip(); | ||||
|  | ||||
|                 $msg = sprintf( 'Failed API auth attempt, nickname = %1$s, ' . | ||||
| @@ -298,7 +286,8 @@ class ApiAuthAction extends ApiAction | ||||
|                                $proxy, | ||||
|                                $ip); | ||||
|                 common_log(LOG_WARNING, $msg); | ||||
|                 $this->clientError("Could not authenticate you.", 401, $this->format); | ||||
|                 // TRANS: Client error thrown when authentication fails. | ||||
|                 $this->clientError(_("Could not authenticate you."), 401, $this->format); | ||||
|                 exit; | ||||
|             } | ||||
|         } | ||||
| @@ -310,7 +299,6 @@ class ApiAuthAction extends ApiAction | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function basicAuthProcessHeader() | ||||
|     { | ||||
|         $authHeaders = array('AUTHORIZATION', | ||||
| @@ -332,7 +320,6 @@ class ApiAuthAction extends ApiAction | ||||
|  | ||||
|             // Decode the HTTP_AUTHORIZATION header on php-cgi server self | ||||
|             // on fcgid server the header name is AUTHORIZATION | ||||
|  | ||||
|             $auth_hash = base64_decode(substr($authorization_header, 6)); | ||||
|             list($this->auth_user_nickname, | ||||
|                  $this->auth_user_password) = explode(':', $auth_hash); | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
|  * @author    Evan Prodromou <evan@status.net> | ||||
|  * @author    mEDI <medi@milaro.net> | ||||
|  * @author    Sarven Capadisli <csarven@status.net> | ||||
|  * @author    Zach Copley <zach@status.net>  | ||||
|  * @author    Zach Copley <zach@status.net> | ||||
|  * @copyright 2009 StatusNet, Inc. | ||||
|  * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
| @@ -60,10 +60,8 @@ require_once INSTALLDIR.'/lib/apiauth.php'; | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ApiBareAuthAction extends ApiAuthAction | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * Take arguments for running | ||||
|      * | ||||
| @@ -72,7 +70,6 @@ class ApiBareAuthAction extends ApiAuthAction | ||||
|      * @return boolean success flag | ||||
|      * | ||||
|      */ | ||||
|  | ||||
|     function prepare($args) | ||||
|     { | ||||
|         parent::prepare($args); | ||||
| @@ -84,18 +81,15 @@ class ApiBareAuthAction extends ApiAuthAction | ||||
|      * | ||||
|      * @return boolean true or false | ||||
|      */ | ||||
|  | ||||
|     function requiresAuth() | ||||
|     { | ||||
|         // If the site is "private", all API methods except statusnet/config | ||||
|         // need authentication | ||||
|  | ||||
|         if (common_config('site', 'private')) { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         // check whether a user has been specified somehow | ||||
|  | ||||
|         $id           = $this->arg('id'); | ||||
|         $user_id      = $this->arg('user_id'); | ||||
|         $screen_name  = $this->arg('screen_name'); | ||||
| @@ -106,5 +100,4 @@ class ApiBareAuthAction extends ApiAuthAction | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -44,7 +44,6 @@ require_once INSTALLDIR . '/lib/apioauthstore.php'; | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class ApiOauthAction extends Action | ||||
| { | ||||
|     /** | ||||
| @@ -52,7 +51,6 @@ class ApiOauthAction extends Action | ||||
|      * | ||||
|      * @return boolean false | ||||
|      */ | ||||
|  | ||||
|     function isReadOnly($args) | ||||
|     { | ||||
|         return false; | ||||
| @@ -73,7 +71,6 @@ class ApiOauthAction extends Action | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|  | ||||
|     function handle($args) | ||||
|     { | ||||
|         parent::handle($args); | ||||
| @@ -83,7 +80,6 @@ class ApiOauthAction extends Action | ||||
|     static function cleanRequest() | ||||
|     { | ||||
|         // kill evil effects of magical slashing | ||||
|  | ||||
|         if (get_magic_quotes_gpc() == 1) { | ||||
|             $_POST = array_map('stripslashes', $_POST); | ||||
|             $_GET = array_map('stripslashes', $_GET); | ||||
| @@ -93,7 +89,6 @@ class ApiOauthAction extends Action | ||||
|  | ||||
|         // XXX: should we strip anything else?  Or alternatively | ||||
|         // only allow a known list of params? | ||||
|  | ||||
|         unset($_GET['p']); | ||||
|         unset($_POST['p']); | ||||
|     } | ||||
| @@ -118,5 +113,4 @@ class ApiOauthAction extends Action | ||||
|             return ($url . '&' . $k . '=' . $v); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user