]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.8.x' of git@gitorious.org:laconica/dev into 0.8.x
authorSarven Capadisli <csarven@controlyourself.ca>
Mon, 15 Jun 2009 03:26:32 +0000 (03:26 +0000)
committerSarven Capadisli <csarven@controlyourself.ca>
Mon, 15 Jun 2009 03:26:32 +0000 (03:26 +0000)
16 files changed:
actions/block.php
actions/blockedfromgroup.php [new file with mode: 0644]
actions/groupblock.php [new file with mode: 0644]
actions/groupmembers.php
actions/groupunblock.php [new file with mode: 0644]
actions/joingroup.php
actions/showgroup.php
actions/showstream.php
actions/unblock.php
classes/Group_block.php [new file with mode: 0644]
classes/User_group.php
classes/laconica.ini
db/laconica.sql
lib/grouplist.php
lib/groupnav.php
lib/router.php

index 34f991dc6126024451004e3115ad45c88106b1eb..0efee5932c101901d6945eb11d08681881d2f08f 100644 (file)
@@ -180,7 +180,7 @@ class BlockAction extends Action
         if ($action) {
             common_redirect(common_local_url($action, $args), 303);
         } else {
-            common_redirect(common_local_url('subscriptions',
+            common_redirect(common_local_url('subscribers',
                                              array('nickname' => $cur->nickname)),
                             303);
         }
diff --git a/actions/blockedfromgroup.php b/actions/blockedfromgroup.php
new file mode 100644 (file)
index 0000000..1b7b317
--- /dev/null
@@ -0,0 +1,313 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * List of group members
+ *
+ * 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
+ * @package   Laconica
+ * @author    Evan Prodromou <evan@controlyourself.ca>
+ * @copyright 2008-2009 Control Yourself, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * List of profiles blocked from this group
+ *
+ * @category Group
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ */
+
+class BlockedfromgroupAction extends Action
+{
+    var $page = null;
+
+    function isReadOnly($args)
+    {
+        return true;
+    }
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+        $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        $nickname_arg = $this->arg('nickname');
+        $nickname = common_canonical_nickname($nickname_arg);
+
+        // Permanent redirect on non-canonical nickname
+
+        if ($nickname_arg != $nickname) {
+            $args = array('nickname' => $nickname);
+            if ($this->page != 1) {
+                $args['page'] = $this->page;
+            }
+            common_redirect(common_local_url('blockedfromgroup', $args), 301);
+            return false;
+        }
+
+        if (!$nickname) {
+            $this->clientError(_('No nickname'), 404);
+            return false;
+        }
+
+        $this->group = User_group::staticGet('nickname', $nickname);
+
+        if (!$this->group) {
+            $this->clientError(_('No such group'), 404);
+            return false;
+        }
+
+        return true;
+    }
+
+    function title()
+    {
+        if ($this->page == 1) {
+            return sprintf(_('%s blocked profiles'),
+                           $this->group->nickname);
+        } else {
+            return sprintf(_('%s blocked profiles, page %d'),
+                           $this->group->nickname,
+                           $this->page);
+        }
+    }
+
+    function handle($args)
+    {
+        parent::handle($args);
+        $this->showPage();
+    }
+
+    function showPageNotice()
+    {
+        $this->element('p', 'instructions',
+                       _('A list of the users blocked from joining this group.'));
+    }
+
+    function showLocalNav()
+    {
+        $nav = new GroupNav($this, $this->group);
+        $nav->show();
+    }
+
+    function showContent()
+    {
+        $offset = ($this->page-1) * PROFILES_PER_PAGE;
+        $limit =  PROFILES_PER_PAGE + 1;
+
+        $cnt = 0;
+
+        $blocked = $this->group->getBlocked($offset, $limit);
+
+        if ($blocked) {
+            $blocked_list = new GroupBlockList($blocked, $this->group, $this);
+            $cnt = $blocked_list->show();
+        }
+
+        $blocked->free();
+
+        $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
+                          $this->page, 'blockedfromgroup',
+                          array('nickname' => $this->group->nickname));
+    }
+}
+
+class GroupBlockList extends ProfileList
+{
+    var $group = null;
+
+    function __construct($profile, $group, $action)
+    {
+        parent::__construct($profile, $action);
+
+        $this->group = $group;
+    }
+
+    function newListItem($profile)
+    {
+        return new GroupBlockListItem($profile, $this->group, $this->action);
+    }
+}
+
+class GroupBlockListItem extends ProfileListItem
+{
+    var $group = null;
+
+    function __construct($profile, $group, $action)
+    {
+        parent::__construct($profile, $action);
+
+        $this->group = $group;
+    }
+
+    function showActions()
+    {
+        $this->startActions();
+        $this->showGroupUnblockForm();
+        $this->endActions();
+    }
+
+    function showGroupUnblockForm()
+    {
+        $user = common_current_user();
+
+        if (!empty($user) && $user->id != $this->profile->id && $user->isAdmin($this->group)) {
+            $bf = new GroupUnblockForm($this->out, $this->profile, $this->group,
+                                       array('action' => 'blockedfromgroup',
+                                             'nickname' => $this->group->nickname));
+            $bf->show();
+        }
+    }
+}
+
+/**
+ * Form for unblocking a user from a group
+ *
+ * @category Form
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @author   Sarven Capadisli <csarven@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ *
+ * @see      UnblockForm
+ */
+
+class GroupUnblockForm extends Form
+{
+    /**
+     * Profile of user to block
+     */
+
+    var $profile = null;
+
+    /**
+     * Group to block the user from
+     */
+
+    var $group = null;
+
+    /**
+     * Return-to args
+     */
+
+    var $args = null;
+
+    /**
+     * Constructor
+     *
+     * @param HTMLOutputter $out     output channel
+     * @param Profile       $profile profile of user to block
+     * @param User_group    $group   group to block user from
+     * @param array         $args    return-to args
+     */
+
+    function __construct($out=null, $profile=null, $group=null, $args=null)
+    {
+        parent::__construct($out);
+
+        $this->profile = $profile;
+        $this->group   = $group;
+        $this->args    = $args;
+    }
+
+    /**
+     * ID of the form
+     *
+     * @return int ID of the form
+     */
+
+    function id()
+    {
+        // This should be unique for the page.
+        return 'unblock-' . $this->profile->id;
+    }
+
+    /**
+     * class of the form
+     *
+     * @return string class of the form
+     */
+
+    function formClass()
+    {
+        return 'form_group_unblock';
+    }
+
+    /**
+     * Action of the form
+     *
+     * @return string URL of the action
+     */
+
+    function action()
+    {
+        return common_local_url('groupunblock');
+    }
+
+    /**
+     * Legend of the Form
+     *
+     * @return void
+     */
+    function formLegend()
+    {
+        $this->out->element('legend', null, _('Unblock user from group'));
+    }
+
+    /**
+     * Data elements of the form
+     *
+     * @return void
+     */
+
+    function formData()
+    {
+        $this->out->hidden('unblockto-' . $this->profile->id,
+                           $this->profile->id,
+                           'unblockto');
+        $this->out->hidden('unblockgroup-' . $this->group->id,
+                           $this->group->id,
+                           'unblockgroup');
+        if ($this->args) {
+            foreach ($this->args as $k => $v) {
+                $this->out->hidden('returnto-' . $k, $v);
+            }
+        }
+    }
+
+    /**
+     * Action elements
+     *
+     * @return void
+     */
+
+    function formActions()
+    {
+        $this->out->submit('submit', _('Unblock'), 'submit', null, _('Unblock this user'));
+    }
+}
diff --git a/actions/groupblock.php b/actions/groupblock.php
new file mode 100644 (file)
index 0000000..93662da
--- /dev/null
@@ -0,0 +1,215 @@
+<?php
+/**
+ * Block a user from a group action class.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://laconi.ca/
+ *
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Block a user from a group
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://laconi.ca/
+ */
+
+class GroupblockAction extends Action
+{
+    var $profile = null;
+    var $group = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+        if (!common_logged_in()) {
+            $this->clientError(_('Not logged in.'));
+            return false;
+        }
+        $token = $this->trimmed('token');
+        if (empty($token) || $token != common_session_token()) {
+            $this->clientError(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+        $id = $this->trimmed('blockto');
+        if (empty($id)) {
+            $this->clientError(_('No profile specified.'));
+            return false;
+        }
+        $this->profile = Profile::staticGet('id', $id);
+        if (empty($this->profile)) {
+            $this->clientError(_('No profile with that ID.'));
+            return false;
+        }
+        $group_id = $this->trimmed('blockgroup');
+        if (empty($group_id)) {
+            $this->clientError(_('No group specified.'));
+            return false;
+        }
+        $this->group = User_group::staticGet('id', $group_id);
+        if (empty($this->group)) {
+            $this->clientError(_('No such group.'));
+            return false;
+        }
+        $user = common_current_user();
+        if (!$user->isAdmin($this->group)) {
+            $this->clientError(_('Only an admin can block group members.'), 401);
+            return false;
+        }
+        if (Group_block::isBlocked($this->group, $this->profile)) {
+            $this->clientError(_('User is already blocked from group.'));
+            return false;
+        }
+        // XXX: could have proactive blocks, but we don't have UI for it.
+        if (!$this->profile->isMember($this->group)) {
+            $this->clientError(_('User is not a member of group.'));
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Handle request
+     *
+     * Shows a page with list of favorite notices
+     *
+     * @param array $args $_REQUEST args; handled in prepare()
+     *
+     * @return void
+     */
+    function handle($args)
+    {
+        parent::handle($args);
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            if ($this->arg('no')) {
+                common_redirect(common_local_url('groupmembers',
+                                                 array('nickname' => $this->group->nickname)),
+                                303);
+            } elseif ($this->arg('yes')) {
+                $this->blockProfile();
+            } elseif ($this->arg('blockto')) {
+                $this->showPage();
+            }
+        }
+    }
+
+    function showContent() {
+        $this->areYouSureForm();
+    }
+
+    function title() {
+        return _('Block user from group');
+    }
+
+    function showNoticeForm() {
+        // nop
+    }
+
+    /**
+     * Confirm with user.
+     *
+     * Shows a confirmation form.
+     *
+     * @return void
+     */
+
+    function areYouSureForm()
+    {
+        $id = $this->profile->id;
+        $this->element('p', null,
+                       sprintf(_('Are you sure you want to block user "%s" from the group "%s"? '.
+                                 'They will be removed from the group, unable to post, and '.
+                                 'unable to subscribe to the group in the future.'),
+                               $this->profile->getBestName(),
+                               $this->group->getBestName()));
+        $this->elementStart('form', array('id' => 'block-' . $id,
+                                           'method' => 'post',
+                                           'class' => 'block',
+                                           'action' => common_local_url('groupblock')));
+        $this->hidden('token', common_session_token());
+        $this->hidden('blockto-' . $this->profile->id,
+                      $this->profile->id,
+                      'blockto');
+        $this->hidden('blockgroup-' . $this->group->id,
+                      $this->group->id,
+                      'blockgroup');
+        foreach ($this->args as $k => $v) {
+            if (substr($k, 0, 9) == 'returnto-') {
+                $this->hidden($k, $v);
+            }
+        }
+        $this->submit('no', _('No'));
+        $this->submit('yes', _('Yes'));
+        $this->elementEnd('form');
+    }
+
+    /**
+     * Actually block a user.
+     *
+     * @return void
+     */
+
+    function blockProfile()
+    {
+        $block = Group_block::blockProfile($this->group, $this->profile,
+                                           common_current_user());
+
+        if (empty($block)) {
+            $this->serverError(_("Database error blocking user from group."));
+            return false;
+        }
+
+        // Now, gotta figure where we go back to
+        foreach ($this->args as $k => $v) {
+            if ($k == 'returnto-action') {
+                $action = $v;
+            } elseif (substr($k, 0, 9) == 'returnto-') {
+                $args[substr($k, 9)] = $v;
+            }
+        }
+
+        if ($action) {
+            common_redirect(common_local_url($action, $args), 303);
+        } else {
+            common_redirect(common_local_url('groupmembers',
+                                             array('nickname' => $this->group->nickname)),
+                            303);
+        }
+    }
+}
+
index 53fee31292ccec61b23204942d95f90ad0c8ade0..150b60a54e10cf3347bdce12c03883c1720a5e9f 100644 (file)
@@ -139,14 +139,180 @@ class GroupmembersAction extends Action
     }
 }
 
-class GroupMemberList extends ProfileList {
+class GroupMemberList extends ProfileList
+{
+    var $group = null;
+
+    function __construct($profile, $group, $action)
+    {
+        parent::__construct($profile, $action);
+
+        $this->group = $group;
+    }
+
+    function newListItem($profile)
+    {
+        return new GroupMemberListItem($profile, $this->group, $this->action);
+    }
+}
 
+class GroupMemberListItem extends ProfileListItem
+{
     var $group = null;
 
-    function __construct($profile, $group=null, $action=null)
+    function __construct($profile, $group, $action)
     {
         parent::__construct($profile, $action);
 
         $this->group = $group;
     }
+
+    function showActions()
+    {
+        $this->startActions();
+        $this->showSubscribeButton();
+        $this->showGroupBlockForm();
+        $this->endActions();
+    }
+
+    function showGroupBlockForm()
+    {
+        $user = common_current_user();
+
+        if (!empty($user) && $user->id != $this->profile->id && $user->isAdmin($this->group)) {
+            $bf = new GroupBlockForm($this->out, $this->profile, $this->group,
+                                array('action' => 'groupmembers',
+                                      'nickname' => $this->group->nickname));
+            $bf->show();
+        }
+
+    }
+}
+
+/**
+ * Form for blocking a user from a group
+ *
+ * @category Form
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @author   Sarven Capadisli <csarven@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ *
+ * @see      BlockForm
+ */
+
+class GroupBlockForm extends Form
+{
+    /**
+     * Profile of user to block
+     */
+
+    var $profile = null;
+
+    /**
+     * Group to block the user from
+     */
+
+    var $group = null;
+
+    /**
+     * Return-to args
+     */
+
+    var $args = null;
+
+    /**
+     * Constructor
+     *
+     * @param HTMLOutputter $out     output channel
+     * @param Profile       $profile profile of user to block
+     * @param User_group    $group   group to block user from
+     * @param array         $args    return-to args
+     */
+
+    function __construct($out=null, $profile=null, $group=null, $args=null)
+    {
+        parent::__construct($out);
+
+        $this->profile = $profile;
+        $this->group   = $group;
+        $this->args    = $args;
+    }
+
+    /**
+     * ID of the form
+     *
+     * @return int ID of the form
+     */
+
+    function id()
+    {
+        // This should be unique for the page.
+        return 'block-' . $this->profile->id;
+    }
+
+    /**
+     * class of the form
+     *
+     * @return string class of the form
+     */
+
+    function formClass()
+    {
+        return 'form_group_block';
+    }
+
+    /**
+     * Action of the form
+     *
+     * @return string URL of the action
+     */
+
+    function action()
+    {
+        return common_local_url('groupblock');
+    }
+
+    /**
+     * Legend of the Form
+     *
+     * @return void
+     */
+    function formLegend()
+    {
+        $this->out->element('legend', null, _('Block user from group'));
+    }
+
+    /**
+     * Data elements of the form
+     *
+     * @return void
+     */
+
+    function formData()
+    {
+        $this->out->hidden('blockto-' . $this->profile->id,
+                           $this->profile->id,
+                           'blockto');
+        $this->out->hidden('blockgroup-' . $this->group->id,
+                           $this->group->id,
+                           'blockgroup');
+        if ($this->args) {
+            foreach ($this->args as $k => $v) {
+                $this->out->hidden('returnto-' . $k, $v);
+            }
+        }
+    }
+
+    /**
+     * Action elements
+     *
+     * @return void
+     */
+
+    function formActions()
+    {
+        $this->out->submit('submit', _('Block'), 'submit', null, _('Block this user'));
+    }
 }
diff --git a/actions/groupunblock.php b/actions/groupunblock.php
new file mode 100644 (file)
index 0000000..a0bcb01
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+/**
+ * Block a user from a group action class.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://laconi.ca/
+ *
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Unlock a user from a group
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://laconi.ca/
+ */
+
+class GroupunblockAction extends Action
+{
+    var $profile = null;
+    var $group = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+        if (!common_logged_in()) {
+            $this->clientError(_('Not logged in.'));
+            return false;
+        }
+        $token = $this->trimmed('token');
+        if (empty($token) || $token != common_session_token()) {
+            $this->clientError(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+        $id = $this->trimmed('unblockto');
+        if (empty($id)) {
+            $this->clientError(_('No profile specified.'));
+            return false;
+        }
+        $this->profile = Profile::staticGet('id', $id);
+        if (empty($this->profile)) {
+            $this->clientError(_('No profile with that ID.'));
+            return false;
+        }
+        $group_id = $this->trimmed('unblockgroup');
+        if (empty($group_id)) {
+            $this->clientError(_('No group specified.'));
+            return false;
+        }
+        $this->group = User_group::staticGet('id', $group_id);
+        if (empty($this->group)) {
+            $this->clientError(_('No such group.'));
+            return false;
+        }
+        $user = common_current_user();
+        if (!$user->isAdmin($this->group)) {
+            $this->clientError(_('Only an admin can unblock group members.'), 401);
+            return false;
+        }
+        if (!Group_block::isBlocked($this->group, $this->profile)) {
+            $this->clientError(_('User is not blocked from group.'));
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Handle request
+     *
+     * @param array $args $_REQUEST args; handled in prepare()
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->unblockProfile();
+        }
+    }
+
+    /**
+     * Unblock a user.
+     *
+     * @return void
+     */
+
+    function unblockProfile()
+    {
+        $result = Group_block::unblockProfile($this->group, $this->profile);
+
+        if (!$result) {
+            $this->serverError(_('Error removing the block.'));
+            return;
+        }
+
+        foreach ($this->args as $k => $v) {
+            if ($k == 'returnto-action') {
+                $action = $v;
+            } else if (substr($k, 0, 9) == 'returnto-') {
+                $args[substr($k, 9)] = $v;
+            }
+        }
+
+        if ($action) {
+            common_redirect(common_local_url($action, $args), 303);
+        } else {
+            common_redirect(common_local_url('blockedfromgroup',
+                                             array('nickname' => $this->group->nickname)),
+                            303);
+        }
+    }
+}
+
index a5d82ddc7780e3afeda2f38f9c16030773931fd1..0e4f96eaf5002e9bb2fd749beb7c49df8f9f1bad 100644 (file)
@@ -96,6 +96,11 @@ class JoingroupAction extends Action
             return false;
         }
 
+        if (Group_block::isBlocked($this->group, $cur->getProfile())) {
+            $this->clientError(_('You have been blocked from that group by the admin.'), 403);
+            return false;
+        }
+
         return true;
     }
 
index 3ce45adc674d26114618c7941c765975cb0c5202..537f09278bcd351211806f8401716501493a8a53 100644 (file)
@@ -283,7 +283,7 @@ class ShowgroupAction extends Action
             if ($cur->isMember($this->group)) {
                 $lf = new LeaveForm($this, $this->group);
                 $lf->show();
-            } else {
+            } else if (!Group_block::isBlocked($this->group, $cur->getProfile())) {
                 $jf = new JoinForm($this, $this->group);
                 $jf->show();
             }
index e2f4e24d435ea7476132f7a22a16fc9cbed6743e..72316b2592ffeb26d6a04c80b4d309fd7c763a5b 100644 (file)
@@ -320,10 +320,14 @@ class ShowstreamAction extends ProfileAction
             $blocked = $cur->hasBlocked($this->profile);
             $this->elementStart('li', 'entity_block');
             if ($blocked) {
-                $ubf = new UnblockForm($this, $this->profile);
+                $ubf = new UnblockForm($this, $this->profile,
+                                       array('action' => 'showstream',
+                                             'nickname' => $this->profile->nickname));
                 $ubf->show();
             } else {
-                $bf = new BlockForm($this, $this->profile);
+                $bf = new BlockForm($this, $this->profile,
+                                    array('action' => 'showstream',
+                                          'nickname' => $this->profile->nickname));
                 $bf->show();
             }
             $this->elementEnd('li');
index 8573b2a873e2285492e45ee8fec5e8cbbac9bf6a..6e671c9dd257fa7ee2e6e0e2b10a546252ae8f5c 100644 (file)
@@ -118,7 +118,7 @@ class UnblockAction extends Action
         if ($action) {
             common_redirect(common_local_url($action, $args), 303);
         } else {
-            common_redirect(common_local_url('subscriptions',
+            common_redirect(common_local_url('subscribers',
                                              array('nickname' => $cur->nickname)),
                             303);
         }
diff --git a/classes/Group_block.php b/classes/Group_block.php
new file mode 100644 (file)
index 0000000..4c583d8
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Table Definition for group_block
+ *
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+
+class Group_block extends Memcached_DataObject
+{
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'group_block';                     // table name
+    public $group_id;                        // int(4)  primary_key not_null
+    public $blocked;                         // int(4)  primary_key not_null
+    public $blocker;                         // int(4)   not_null
+    public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('Group_block',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+
+    function &pkeyGet($kv)
+    {
+        return Memcached_DataObject::pkeyGet('Group_block', $kv);
+    }
+
+    static function isBlocked($group, $profile)
+    {
+        $block = Group_block::pkeyGet(array('group_id' => $group->id,
+                                            'blocked' => $profile->id));
+        return !empty($block);
+    }
+
+    static function blockProfile($group, $profile, $blocker)
+    {
+        // Insert the block
+
+        $block = new Group_block();
+
+        $block->query('BEGIN');
+
+        $block->group_id = $group->id;
+        $block->blocked  = $profile->id;
+        $block->blocker  = $blocker->id;
+
+        $result = $block->insert();
+
+        if (!$result) {
+            common_log_db_error($block, 'INSERT', __FILE__);
+            return null;
+        }
+
+        // Delete membership if any
+
+        $member = new Group_member();
+
+        $member->group_id   = $group->id;
+        $member->profile_id = $profile->id;
+
+        if ($member->find(true)) {
+            $result = $member->delete();
+            if (!$result) {
+                common_log_db_error($member, 'DELETE', __FILE__);
+                return null;
+            }
+        }
+
+        // Commit, since both have been done
+
+        $block->query('COMMIT');
+
+        return $block;
+    }
+
+    static function unblockProfile($group, $profile)
+    {
+        $block = Group_block::pkeyGet(array('group_id' => $group->id,
+                                            'blocked' => $profile->id));
+
+        if (empty($block)) {
+            return null;
+        }
+
+        $result = $block->delete();
+
+        if (!$result) {
+            common_log_db_error($block, 'DELETE', __FILE__);
+            return null;
+        }
+
+        return true;
+    }
+
+}
index a135015baca3a1f2d67601ebb9ae6f03d4c5dd0f..9f9977755be5e8182a1f20637f7c42e7bdb7b6b9 100644 (file)
@@ -125,6 +125,29 @@ class User_group extends Memcached_DataObject
         return $members;
     }
 
+    function getBlocked($offset=0, $limit=null)
+    {
+        $qry =
+          'SELECT profile.* ' .
+          'FROM profile JOIN group_block '.
+          'ON profile.id = group_block.blocked ' .
+          'WHERE group_block.group_id = %d ' .
+          'ORDER BY group_block.modified DESC ';
+
+        if ($limit != null) {
+            if (common_config('db','type') == 'pgsql') {
+                $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+            } else {
+                $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+            }
+        }
+
+        $blocked = new Profile();
+
+        $blocked->query(sprintf($qry, $this->id));
+        return $blocked;
+    }
+
     function setOriginal($filename)
     {
         $imagefile = new ImageFile($this->id, Avatar::path($filename));
@@ -137,4 +160,9 @@ class User_group extends Memcached_DataObject
         common_debug(common_log_objstring($this));
         return $this->update($orig);
     }
+
+    function getBestName()
+    {
+        return ($this->fullname) ? $this->fullname : $this->nickname;
+    }
 }
index 92bbb35d4c1c4b27d09de5de1ba2827e311fedba..8e4e78b7945c989cb7ef82e674958a6890581b7f 100644 (file)
@@ -1,3 +1,4 @@
+
 [avatar]
 profile_id = 129
 original = 17
@@ -157,6 +158,16 @@ id = K
 service = K
 uri = U
 
+[group_block]
+group_id = 129
+blocked = 129
+blocker = 129
+modified = 384
+
+[group_block__keys]
+group_id = K
+blocked = K
+
 [group_inbox]
 group_id = 129
 notice_id = 129
index 7f52a5ef7ffe44cf1676f053d78161822295e65e..bc824fc4db4540830d2354672b6a454e064896f5 100644 (file)
@@ -483,3 +483,13 @@ create table file_to_post (
 
     unique(file_id, post_id)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
+create table group_block (
+   group_id integer not null comment 'group profile is blocked from' references user_group (id),
+   blocked integer not null comment 'profile that is blocked' references profile (id),
+   blocker integer not null comment 'user making the block' references user (id),
+   modified timestamp comment 'date of blocking',
+
+   constraint primary key (group_id, blocked)
+
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
index 1b854749982198e68f89de742d2c1fd306e3ce1c..1ded5160bdcd655e2c1b2656d7eee3d8af6c3aab 100644 (file)
@@ -166,7 +166,7 @@ class GroupList extends Widget
             if ($user->isMember($this->group)) {
                 $lf = new LeaveForm($this->out, $this->group);
                 $lf->show();
-            } else {
+            } else if (!Group_block::isBlocked($this->group, $user->getProfile())) {
                 $jf = new JoinForm($this->out, $this->group);
                 $jf->show();
             }
index 90bdc10149b30cda2cb0aab8dca759d615e90c78..194247982cc6ae7e6b25c71fd816125902d9d66e 100644 (file)
@@ -95,6 +95,12 @@ class GroupNav extends Widget
         $cur = common_current_user();
 
         if ($cur && $cur->isAdmin($this->group)) {
+            $this->out->menuItem(common_local_url('blockedfromgroup', array('nickname' =>
+                                                                            $nickname)),
+                                 _('Blocked'),
+                                 sprintf(_('%s blocked users'), $nickname),
+                                 $action_name == 'blockedfromgroup',
+                                 'nav_group_blocked');
             $this->out->menuItem(common_local_url('editgroup', array('nickname' =>
                                                                      $nickname)),
                                  _('Admin'),
index 456d1793e3245bf333343aae7ee4213245420fda..e10871bc08ab9271354faa34f36988d34507c8e0 100644 (file)
@@ -101,7 +101,8 @@ class Router
         $main = array('login', 'logout', 'register', 'subscribe',
                       'unsubscribe', 'confirmaddress', 'recoverpassword',
                       'invite', 'favor', 'disfavor', 'sup',
-                      'block', 'subedit');
+                      'block', 'unblock', 'subedit',
+                      'groupblock', 'groupunblock');
 
         foreach ($main as $a) {
             $m->connect('main/'.$a, array('action' => $a));
@@ -164,10 +165,10 @@ class Router
                     array('action' => 'newnotice'),
                     array('replyto' => '[A-Za-z0-9_-]+'));
 
-        $m->connect('notice/:notice/file', 
-            array('action' => 'file'), 
+        $m->connect('notice/:notice/file',
+            array('action' => 'file'),
             array('notice' => '[0-9]+'));
-        
+
         $m->connect('notice/:notice',
                     array('action' => 'shownotice'),
                     array('notice' => '[0-9]+'));
@@ -228,6 +229,10 @@ class Router
                         array('nickname' => '[a-zA-Z0-9]+'));
         }
 
+        $m->connect('group/:nickname/blocked',
+                    array('action' => 'blockedfromgroup'),
+                    array('nickname' => '[a-zA-Z0-9]+'));
+
         $m->connect('group/:id/id',
                     array('action' => 'groupbyid'),
                     array('id' => '[0-9]+'));