editgroup.php 8.9 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 48
 */

Zach Copley's avatar
Zach Copley committed
49
class EditgroupAction extends GroupDesignAction
Evan Prodromou's avatar
Evan Prodromou committed
50
{
Zach Copley's avatar
Zach Copley committed
51

Evan Prodromou's avatar
Evan Prodromou committed
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    var $msg;

    function title()
    {
        return sprintf(_('Edit %s group'), $this->group->nickname);
    }

    /**
     * Prepare to run
     */

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

        if (!common_config('inboxes','enabled')) {
            $this->serverError(_('Inboxes must be enabled for groups to work'));
            return false;
        }

        if (!common_logged_in()) {
            $this->clientError(_('You must be logged in to create a group.'));
            return false;
        }

77
        $nickname_arg = $this->trimmed('nickname');
Evan Prodromou's avatar
Evan Prodromou committed
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
        $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) {
            $this->clientError(_('No nickname'), 404);
            return false;
        }

93 94 95 96 97 98
        $groupid = $this->trimmed('groupid');
        if ($groupid) {
            $this->group = User_group::staticGet('id', $groupid);
        } else {
            $this->group = User_group::staticGet('nickname', $nickname);
        }
Evan Prodromou's avatar
Evan Prodromou committed
99 100 101 102 103

        if (!$this->group) {
            $this->clientError(_('No such group'), 404);
            return false;
        }
104

105 106
        $cur = common_current_user();

107
        if (!$cur->isAdmin($this->group)) {
108 109 110 111
            $this->clientError(_('You must be an admin to edit the group'), 403);
            return false;
        }

112
        return true;
Evan Prodromou's avatar
Evan Prodromou committed
113 114 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
    }

    /**
     * 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();
    }

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

Evan Prodromou's avatar
Evan Prodromou committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
    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',
                           _('Use this form to edit the group.'));
        }
    }

    function trySave()
    {
165 166 167 168 169 170
        $cur = common_current_user();
        if (!$cur->isAdmin($this->group)) {
            $this->clientError(_('You must be an admin to edit the group'), 403);
            return;
        }

Evan Prodromou's avatar
Evan Prodromou committed
171 172 173 174 175
        $nickname    = common_canonical_nickname($this->trimmed('nickname'));
        $fullname    = $this->trimmed('fullname');
        $homepage    = $this->trimmed('homepage');
        $description = $this->trimmed('description');
        $location    = $this->trimmed('location');
176
        $aliasstring = $this->trimmed('aliases');
Evan Prodromou's avatar
Evan Prodromou committed
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195

        if (!Validate::string($nickname, array('min_length' => 1,
                                               'max_length' => 64,
                                               'format' => NICKNAME_FMT))) {
            $this->showForm(_('Nickname must have only lowercase letters '.
                              'and numbers and no spaces.'));
            return;
        } else if ($this->nicknameExists($nickname)) {
            $this->showForm(_('Nickname already in use. Try another one.'));
            return;
        } else if (!User_group::allowedNickname($nickname)) {
            $this->showForm(_('Not a valid nickname.'));
            return;
        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
                   !Validate::uri($homepage,
                                  array('allowed_schemes' =>
                                        array('http', 'https')))) {
            $this->showForm(_('Homepage is not a valid URL.'));
            return;
196
        } else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
Evan Prodromou's avatar
Evan Prodromou committed
197 198
            $this->showForm(_('Full name is too long (max 255 chars).'));
            return;
199
        } else if (!is_null($description) && mb_strlen($description) > 140) {
Evan Prodromou's avatar
Evan Prodromou committed
200 201
            $this->showForm(_('description is too long (max 140 chars).'));
            return;
202
        } else if (!is_null($location) && mb_strlen($location) > 255) {
Evan Prodromou's avatar
Evan Prodromou committed
203 204 205 206
            $this->showForm(_('Location is too long (max 255 chars).'));
            return;
        }

207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
        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')) {
            $this->showForm(sprintf(_('Too many aliases! Maximum %d.'),
                                    common_config('group', 'maxaliases')));
            return;
        }

        foreach ($aliases as $alias) {
            if (!Validate::string($alias, array('min_length' => 1,
                                                'max_length' => 64,
                                                'format' => NICKNAME_FMT))) {
                $this->showForm(sprintf(_('Invalid alias: "%s"'), $alias));
                return;
            }
            if ($this->nicknameExists($alias)) {
                $this->showForm(sprintf(_('Alias "%s" already in use. Try another one.'),
                                        $alias));
                return;
            }
            // XXX assumes alphanum nicknames
            if (strcmp($alias, $nickname) == 0) {
                $this->showForm(_('Alias can\'t be the same as nickname.'));
                return;
            }
        }

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

Evan Prodromou's avatar
Evan Prodromou committed
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
        $orig = clone($this->group);

        $this->group->nickname    = $nickname;
        $this->group->fullname    = $fullname;
        $this->group->homepage    = $homepage;
        $this->group->description = $description;
        $this->group->location    = $location;
        $this->group->created     = common_sql_now();

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

        if (!$result) {
            common_log_db_error($this->group, 'UPDATE', __FILE__);
            $this->serverError(_('Could not update group.'));
        }

256 257 258 259 260 261 262 263
        $result = $this->group->setAliases($aliases);

        if (!$result) {
            $this->serverError(_('Could not create aliases.'));
        }

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

Evan Prodromou's avatar
Evan Prodromou committed
264 265 266
        if ($this->group->nickname != $orig->nickname) {
            common_redirect(common_local_url('editgroup',
                                             array('nickname' => $nickname)),
267
                            303);
Evan Prodromou's avatar
Evan Prodromou committed
268 269 270 271 272 273 274 275
        } else {
            $this->showForm(_('Options saved.'));
        }
    }

    function nicknameExists($nickname)
    {
        $group = User_group::staticGet('nickname', $nickname);
276 277 278 279 280 281 282 283 284 285 286 287 288 289

        if (!empty($group) &&
            $group->id != $this->group->id) {
            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
290
    }
291 292
}