]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - actions/subscribe.php
Use array_merge instead of array_replace (same effect, and array_merge works with...
[quix0rs-gnu-social.git] / actions / subscribe.php
1 <?php
2 /**
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2008-2011, 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: Error message displayed when trying to perform an action that requires a logged in user.
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         return true;
115     }
116
117     /**
118      * Handle request
119      *
120      * Does the subscription and returns results.
121      *
122      * @param Array $args unused.
123      *
124      * @return void
125      */
126     function handle($args)
127     {
128         // Throws exception on error
129
130         $sub = Subscription::start($this->user->getProfile(),
131                                    $this->other);
132
133         if ($this->boolean('ajax')) {
134             $this->startHTML('text/xml;charset=utf-8');
135             $this->elementStart('head');
136             // TRANS: Page title when subscription succeeded.
137             $this->element('title', null, _('Subscribed'));
138             $this->elementEnd('head');
139             $this->elementStart('body');
140             if ($sub instanceof Subscription) {
141                 $form = new UnsubscribeForm($this, $this->other);
142             } else {
143                 $form = new CancelSubscriptionForm($this, $this->other);
144             }
145             $form->show();
146             $this->elementEnd('body');
147             $this->elementEnd('html');
148         } else {
149             $url = common_local_url('subscriptions',
150                                     array('nickname' => $this->user->nickname));
151             common_redirect($url, 303);
152         }
153     }
154 }