We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

editgroup.php 10.5 KB
Newer Older
Evan Prodromou's avatar
Evan Prodromou committed
1 2
<?php
/**
3
 * StatusNet, the distributed open-source microblogging tool
Evan Prodromou's avatar
Evan Prodromou committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * Edit an existing group
 *
 * 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  Group
23
 * @package   StatusNet
24 25 26
 * @author    Evan Prodromou <evan@status.net>
 * @author    Sarven Capadisli <csarven@status.net>
 * @author   Zach Copley <zach@status.net>
27
 * @copyright 2008-2009 StatusNet, Inc.
Evan Prodromou's avatar
Evan Prodromou committed
28
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
29
 * @link      http://status.net/
Evan Prodromou's avatar
Evan Prodromou committed
30 31
 */

32
if (!defined('STATUSNET') && !defined('LACONICA')) {
Evan Prodromou's avatar
Evan Prodromou committed
33 34 35 36 37 38 39 40 41
    exit(1);
}

/**
 * Add a new group
 *
 * This is the form for adding a new group
 *
 * @category Group
42
 * @package  StatusNet
43 44
 * @author   Evan Prodromou <evan@status.net>
 * @author   Zach Copley <zach@status.net>
Evan Prodromou's avatar
Evan Prodromou committed
45
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
46
 * @link     http://status.net/
Evan Prodromou's avatar
Evan Prodromou committed
47
 */
Zach Copley's avatar
Zach Copley committed
48
class EditgroupAction extends GroupDesignAction
Evan Prodromou's avatar
Evan Prodromou committed
49 50 51 52 53
{
    var $msg;

    function title()
    {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
54
        // TRANS: Title for form to edit a group. %s is a group nickname.
Evan Prodromou's avatar
Evan Prodromou committed
55 56 57 58 59 60 61 62 63 64 65 66
        return sprintf(_('Edit %s group'), $this->group->nickname);
    }

    /**
     * Prepare to run
     */

    function prepare($args)
    {
        parent::prepare($args);

        if (!common_logged_in()) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
67
            // TRANS: Client error displayed trying to edit a group while not logged in.
Evan Prodromou's avatar
Evan Prodromou committed
68 69 70 71
            $this->clientError(_('You must be logged in to create a group.'));
            return false;
        }

72
        $nickname_arg = $this->trimmed('nickname');
Evan Prodromou's avatar
Evan Prodromou committed
73 74 75 76 77 78 79 80 81 82 83
        $nickname = common_canonical_nickname($nickname_arg);

        // Permanent redirect on non-canonical nickname

        if ($nickname_arg != $nickname) {
            $args = array('nickname' => $nickname);
            common_redirect(common_local_url('editgroup', $args), 301);
            return false;
        }

        if (!$nickname) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
84
            // TRANS: Client error displayed trying to edit a group while not proving a nickname for the group to edit.
85
            $this->clientError(_('No nickname.'), 404);
Evan Prodromou's avatar
Evan Prodromou committed
86 87 88
            return false;
        }

89
        $groupid = $this->trimmed('groupid');
90

91 92 93
        if ($groupid) {
            $this->group = User_group::staticGet('id', $groupid);
        } else {
94 95 96 97
            $local = Local_group::staticGet('nickname', $nickname);
            if ($local) {
                $this->group = User_group::staticGet('id', $local->group_id);
            }
98
        }
Evan Prodromou's avatar
Evan Prodromou committed
99 100

        if (!$this->group) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
101
            // TRANS: Client error displayed trying to edit a non-existing group.
102
            $this->clientError(_('No such group.'), 404);
Evan Prodromou's avatar
Evan Prodromou committed
103 104
            return false;
        }
105

106 107
        $cur = common_current_user();

108
        if (!$cur->isAdmin($this->group)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
109
            // TRANS: Client error displayed trying to edit a group while not being a group admin.
110
            $this->clientError(_('You must be an admin to edit the group.'), 403);
111 112 113
            return false;
        }

114
        return true;
Evan Prodromou's avatar
Evan Prodromou committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
    }

    /**
     * Handle the request
     *
     * On GET, show the form. On POST, try to save the group.
     *
     * @param array $args unused
     *
     * @return void
     */
    function handle($args)
    {
        parent::handle($args);
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $this->trySave();
        } else {
            $this->showForm();
        }
    }

    function showForm($msg=null)
    {
        $this->msg = $msg;
        $this->showPage();
    }

142 143 144 145 146 147
    function showLocalNav()
    {
        $nav = new GroupNav($this, $this->group);
        $nav->show();
    }

Evan Prodromou's avatar
Evan Prodromou committed
148 149 150 151 152 153 154 155 156 157 158 159
    function showContent()
    {
        $form = new GroupEditForm($this, $this->group);
        $form->show();
    }

    function showPageNotice()
    {
        if ($this->msg) {
            $this->element('p', 'error', $this->msg);
        } else {
            $this->element('p', 'instructions',
Siebrand Mazeland's avatar
Siebrand Mazeland committed
160
                           // TRANS: Form instructions for group edit form.
Evan Prodromou's avatar
Evan Prodromou committed
161 162 163 164
                           _('Use this form to edit the group.'));
        }
    }

165 166 167 168 169 170
    function showScripts()
    {
        parent::showScripts();
        $this->autofocus('nickname');
    }

Evan Prodromou's avatar
Evan Prodromou committed
171 172
    function trySave()
    {
173 174
        $cur = common_current_user();
        if (!$cur->isAdmin($this->group)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
175
            // TRANS: Client error displayed trying to edit a group while not being a group admin.
176
            $this->clientError(_('You must be an admin to edit the group.'), 403);
177 178 179
            return;
        }

180
        $nickname    = Nickname::normalize($this->trimmed('nickname'));
Evan Prodromou's avatar
Evan Prodromou committed
181 182 183 184
        $fullname    = $this->trimmed('fullname');
        $homepage    = $this->trimmed('homepage');
        $description = $this->trimmed('description');
        $location    = $this->trimmed('location');
185
        $aliasstring = $this->trimmed('aliases');
Evan Prodromou's avatar
Evan Prodromou committed
186

187
        if ($this->nicknameExists($nickname)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
188
            // TRANS: Group edit form validation error.
Evan Prodromou's avatar
Evan Prodromou committed
189 190 191
            $this->showForm(_('Nickname already in use. Try another one.'));
            return;
        } else if (!User_group::allowedNickname($nickname)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
192
            // TRANS: Group edit form validation error.
Evan Prodromou's avatar
Evan Prodromou committed
193 194 195 196 197 198
            $this->showForm(_('Not a valid nickname.'));
            return;
        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
                   !Validate::uri($homepage,
                                  array('allowed_schemes' =>
                                        array('http', 'https')))) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
199
            // TRANS: Group edit form validation error.
Evan Prodromou's avatar
Evan Prodromou committed
200 201
            $this->showForm(_('Homepage is not a valid URL.'));
            return;
202
        } else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
203
            // TRANS: Group edit form validation error.
204
            $this->showForm(_('Full name is too long (maximum 255 characters).'));
Evan Prodromou's avatar
Evan Prodromou committed
205
            return;
206
        } else if (User_group::descriptionTooLong($description)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
207 208 209 210 211 212
            $this->showForm(sprintf(
                // TRANS: Group edit form validation error.
                _m('Description is too long (maximum %d character).',
                  'Description is too long (maximum %d characters).',
                  User_group::maxDescription()),
                                    User_group::maxDescription()));
Evan Prodromou's avatar
Evan Prodromou committed
213
            return;
214
        } else if (!is_null($location) && mb_strlen($location) > 255) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
215
            // TRANS: Group edit form validation error.
216
            $this->showForm(_('Location is too long (maximum 255 characters).'));
Evan Prodromou's avatar
Evan Prodromou committed
217 218 219
            return;
        }

220 221 222 223 224 225 226
        if (!empty($aliasstring)) {
            $aliases = array_map('common_canonical_nickname', array_unique(preg_split('/[\s,]+/', $aliasstring)));
        } else {
            $aliases = array();
        }

        if (count($aliases) > common_config('group', 'maxaliases')) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
227 228 229 230 231
            // TRANS: Group edit form validation error.
            // TRANS: %d is the maximum number of allowed aliases.
            $this->showForm(sprintf(_m('Too many aliases! Maximum %d allowed.',
                                       'Too many aliases! Maximum %d allowed.',
                                       common_config('group', 'maxaliases')),
232 233 234 235 236
                                    common_config('group', 'maxaliases')));
            return;
        }

        foreach ($aliases as $alias) {
237
            if (!Nickname::isValid($alias)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
238
                // TRANS: Group edit form validation error.
239 240 241 242
                $this->showForm(sprintf(_('Invalid alias: "%s"'), $alias));
                return;
            }
            if ($this->nicknameExists($alias)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
243
                // TRANS: Group edit form validation error.
244 245 246 247 248 249
                $this->showForm(sprintf(_('Alias "%s" already in use. Try another one.'),
                                        $alias));
                return;
            }
            // XXX assumes alphanum nicknames
            if (strcmp($alias, $nickname) == 0) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
250
                // TRANS: Group edit form validation error.
251 252 253 254 255 256 257
                $this->showForm(_('Alias can\'t be the same as nickname.'));
                return;
            }
        }

        $this->group->query('BEGIN');

Evan Prodromou's avatar
Evan Prodromou committed
258 259 260 261 262 263 264
        $orig = clone($this->group);

        $this->group->nickname    = $nickname;
        $this->group->fullname    = $fullname;
        $this->group->homepage    = $homepage;
        $this->group->description = $description;
        $this->group->location    = $location;
265
        $this->group->mainpage    = common_local_url('showgroup', array('nickname' => $nickname));
Evan Prodromou's avatar
Evan Prodromou committed
266 267 268 269 270

        $result = $this->group->update($orig);

        if (!$result) {
            common_log_db_error($this->group, 'UPDATE', __FILE__);
Siebrand Mazeland's avatar
Siebrand Mazeland committed
271
            // TRANS: Server error displayed when editing a group fails.
Evan Prodromou's avatar
Evan Prodromou committed
272 273 274
            $this->serverError(_('Could not update group.'));
        }

275 276 277
        $result = $this->group->setAliases($aliases);

        if (!$result) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
278
            // TRANS: Server error displayed when group aliases could not be added.
279 280 281
            $this->serverError(_('Could not create aliases.'));
        }

282 283 284 285 286 287
        if ($nickname != $orig->nickname) {
            common_log(LOG_INFO, "Saving local group info.");
            $local = Local_group::staticGet('group_id', $this->group->id);
            $local->setNickname($nickname);
        }

288 289
        $this->group->query('COMMIT');

Evan Prodromou's avatar
Evan Prodromou committed
290 291 292
        if ($this->group->nickname != $orig->nickname) {
            common_redirect(common_local_url('editgroup',
                                             array('nickname' => $nickname)),
293
                            303);
Evan Prodromou's avatar
Evan Prodromou committed
294
        } else {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
295
            // TRANS: Group edit form success message.
Evan Prodromou's avatar
Evan Prodromou committed
296 297 298 299 300 301
            $this->showForm(_('Options saved.'));
        }
    }

    function nicknameExists($nickname)
    {
302
        $group = Local_group::staticGet('nickname', $nickname);
303 304

        if (!empty($group) &&
Michele's avatar
Michele committed
305
            $group->group_id != $this->group->id) {
306 307 308 309 310 311 312 313 314 315 316
            return true;
        }

        $alias = Group_alias::staticGet('alias', $nickname);

        if (!empty($alias) &&
            $alias->group_id != $this->group->id) {
            return true;
        }

        return false;
Evan Prodromou's avatar
Evan Prodromou committed
317
    }
318
}