]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - actions/subscribe.php
Merge remote branch 'gitorious/1.0.x' into 1.0.x
[quix0rs-gnu-social.git] / actions / subscribe.php
1 <?php
2 /**
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2008-2010, StatusNet, Inc.
5  *
6  * Subscription action.
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Affero General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Affero General Public License for more details.
17  *
18  * You should have received a copy of the GNU Affero General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  * PHP version 5
22  *
23  * @category  Action
24  * @package   StatusNet
25  * @author    Evan Prodromou <evan@status.net>
26  * @copyright 2008-2010 StatusNet, Inc.
27  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
28  * @link      http://status.net/
29  */
30
31 if (!defined('STATUSNET')) {
32     exit(1);
33 }
34
35 /**
36  * Subscription action
37  *
38  * Subscribing to a profile. Does not work for OMB 0.1 remote subscriptions,
39  * but may work for other remote subscription protocols, like OStatus.
40  *
41  * Takes parameters:
42  *
43  *    - subscribeto: a profile ID
44  *    - token: session token to prevent CSRF attacks
45  *    - ajax: boolean; whether to return Ajax or full-browser results
46  *
47  * Only works if the current user is logged in.
48  *
49  * @category  Action
50  * @package   StatusNet
51  * @author    Evan Prodromou <evan@status.net>
52  * @copyright 2008-2010 StatusNet, Inc.
53  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
54  * @link      http://status.net/
55  */
56 class SubscribeAction extends Action
57 {
58     var $user;
59     var $other;
60
61     /**
62      * Check pre-requisites and instantiate attributes
63      *
64      * @param Array $args array of arguments (URL, GET, POST)
65      *
66      * @return boolean success flag
67      */
68     function prepare($args)
69     {
70         parent::prepare($args);
71
72         // Only allow POST requests
73
74         if ($_SERVER['REQUEST_METHOD'] != 'POST') {
75             // TRANS: Client error displayed trying to perform any request method other than POST.
76             // TRANS: Do not translate POST.
77             $this->clientError(_('This action only accepts POST requests.'));
78             return false;
79         }
80
81         // CSRF protection
82
83         $token = $this->trimmed('token');
84
85         if (!$token || $token != common_session_token()) {
86             // TRANS: Client error displayed when the session token is not okay.
87             $this->clientError(_('There was a problem with your session token.'.
88                                  ' Try again, please.'));
89             return false;
90         }
91
92         // Only for logged-in users
93
94         $this->user = common_current_user();
95
96         if (empty($this->user)) {
97             // TRANS: Client error displayed trying to subscribe when not logged in.
98             $this->clientError(_('Not logged in.'));
99             return false;
100         }
101
102         // Profile to subscribe to
103
104         $other_id = $this->arg('subscribeto');
105
106         $this->other = Profile::staticGet('id', $other_id);
107
108         if (empty($this->other)) {
109             // TRANS: Client error displayed trying to subscribe to a non-existing profile.
110             $this->clientError(_('No such profile.'));
111             return false;
112         }
113
114         // OMB 0.1 doesn't have a mechanism for local-server-
115         // originated subscription.
116
117         $omb01 = Remote_profile::staticGet('id', $other_id);
118
119         if (!empty($omb01)) {
120             // TRANS: Client error displayed trying to subscribe to an OMB 0.1 remote profile.
121             $this->clientError(_('You cannot subscribe to an OMB 0.1'.
122                                  ' remote profile with this action.'));
123             return false;
124         }
125
126         return true;
127     }
128
129     /**
130      * Handle request
131      *
132      * Does the subscription and returns results.
133      *
134      * @param Array $args unused.
135      *
136      * @return void
137      */
138     function handle($args)
139     {
140         // Throws exception on error
141
142         $sub = Subscription::start($this->user->getProfile(),
143                                    $this->other);
144
145         if ($this->boolean('ajax')) {
146             $this->startHTML('text/xml;charset=utf-8');
147             $this->elementStart('head');
148             // TRANS: Page title when subscription succeeded.
149             $this->element('title', null, _('Subscribed'));
150             $this->elementEnd('head');
151             $this->elementStart('body');
152             if ($sub instanceof Subscription) {
153                 $form = new UnsubscribeForm($this, $this->other);
154             } else {
155                 $form = new CancelSubscriptionForm($this, $this->other);
156             }
157             $form->show();
158             $this->elementEnd('body');
159             $this->elementEnd('html');
160         } else {
161             $url = common_local_url('subscriptions',
162                                     array('nickname' => $this->user->nickname));
163             common_redirect($url, 303);
164         }
165     }
166 }