function wikiplugin_memberlist($data, $params)
{
    global $prefs;
    static $execution = 0;
    $key = 'memberlist-execution-' . ++$execution;
    if (!isset($params['groups'])) {
        return "^Missing group list^";
    }
    $groups = $params['groups'];
    Perms::bulk(array('type' => 'group'), 'object', $groups);
    $validGroups = wikiplugin_memberlist_get_group_details($groups);
    if (isset($_POST[$key])) {
        if (isset($_POST['join'])) {
            wikiplugin_memberlist_join($validGroups, $_POST['join']);
        }
        if (isset($_POST['leave'])) {
            wikiplugin_memberlist_leave($validGroups, $_POST['leave']);
        }
        if (isset($_POST['remove'])) {
            wikiplugin_memberlist_remove($validGroups, $_POST['remove']);
        }
        if (isset($_POST['add'])) {
            wikiplugin_memberlist_add($validGroups, $_POST['add']);
        }
        header('Location: ' . $_SERVER['REQUEST_URI']);
        exit;
    }
    if (isset($_REQUEST['transition'], $_REQUEST['member'])) {
        if ($prefs['feature_group_transition'] == 'y') {
            require_once 'lib/transitionlib.php';
            $transitionlib = new TransitionLib('group');
            $transitionlib->triggerTransition($_REQUEST['transition'], $_REQUEST['member']);
            $url = $_SERVER['REQUEST_URI'];
            $url = str_replace('transition=', 'x=', $url);
            $url = str_replace('member=', 'x=', $url);
            header('Location: ' . $url);
            exit;
        }
    }
    $canApply = false;
    foreach ($validGroups as $group) {
        if ($group['can_add'] || $group['can_remove'] || $group['can_join'] || $group['can_leave']) {
            $canApply = true;
            break;
        }
    }
    global $smarty;
    $smarty->assign('execution_key', $key);
    $smarty->assign('can_apply', $canApply);
    $smarty->assign('memberlist_groups', $validGroups);
    return '~np~' . $smarty->fetch('wiki-plugins/wikiplugin_memberlist.tpl') . '~/np~';
}
Exemple #2
0
 private function prepare()
 {
     if ($this->prepared) {
         return;
     }
     $categories = $this->managed;
     Perms::bulk(array('type' => 'category'), 'object', $categories);
     if (count($this->managed)) {
         $base = array_diff($this->current, $this->managed);
         $managed = array_intersect($this->new, $this->managed);
         $this->new = array_merge($base, $managed);
     }
     if (count($this->unmanaged)) {
         $base = array_intersect($this->current, $this->unmanaged);
         $managed = array_diff($this->new, $this->unmanaged);
         $this->new = array_merge($base, $managed);
     }
     $this->applyConstraints();
     $this->prepared = true;
 }
Exemple #3
0
        if ($prefs['allowmsg_is_optional'] == 'y') {
            if ($tikilib->get_user_preference($user, 'allowMsgs', 'y') != 'y') {
                $send_msg = false;
            }
        }
        $smarty->assign('send_msg', $send_msg);
    } else {
        $smarty->assign('send_msg', false);
    }
    $smarty->assign('messageto', isset($_REQUEST['messageto']) ? $_REQUEST['messageto'] : '');
    if (isset($prefs['feature_forums']) and $prefs['feature_forums'] == 'y') {
        $commentslib = TikiLib::lib('comments');
        // not done in commentslib
        $sort_mode = $prefs['forums_ordering'];
        $channels = $commentslib->list_forums(0, -1, $sort_mode, '');
        Perms::bulk(array('type' => 'forum'), 'object', $channels['data'], 'forumId');
        $forums = array();
        $temp_max = count($channels['data']);
        for ($i = 0; $i < $temp_max; $i++) {
            $forumperms = Perms::get(array('type' => 'forum', 'object' => $channels['data'][$i]['forumId']));
            if ($forumperms->forum_post and $forumperms->forum_post_topic or $forumperms->admin_forum) {
                $forums[] = $channels['data'][$i];
            }
        }
        $smarty->assign('forumId', isset($_REQUEST['forumId']) ? $_REQUEST['forumId'] : 0);
    } else {
        $forums = array();
    }
    $smarty->assign('forums', $forums);
    $report = 'n';
} else {
}
if ($prefs['feature_trackers'] != 'y') {
    die;
}
$arrayTrackerId = explode(',', $_GET["trackerIdList"]);
$arrayMandatory = explode(',', $_GET["mandatory"]);
if (isset($_GET['selected'])) {
    $arraySelected = explode(',', utf8_encode(rawurldecode($_GET["selected"])));
}
$arrayFieldlist = explode(',', $_GET["fieldlist"]);
$arrayFilterfield = explode(',', $_GET["filterfield"]);
$arrayStatus = explode(',', $_GET["status"]);
$arrayItem = explode(',', $_GET['item']);
header('Cache-Control: no-cache');
header('content-type: application/x-javascript');
Perms::bulk(array('type' => 'tracker'), 'object', $arrayTrackerId);
$json_return = array();
for ($index = 0, $count_arrayTrackerId = count($arrayTrackerId); $index < $count_arrayTrackerId; $index++) {
    $arrayFieldlistMultiple = explode('|', $arrayFieldlist[$index]);
    $tikilib->get_perm_object($arrayTrackerId[$index], 'tracker');
    $filtervalue = utf8_encode(rawurldecode($_GET["filtervalue"]));
    if (!empty($_GET['item'])) {
        // we want the value of field filterfield for item
        $filtervalue = $trklib->get_item_value($arrayTrackerId[$index], $arrayItem[$index], $arrayFilterfield[$index]);
        if (!$filtervalue) {
            $otherField = $trklib->get_tracker_field($arrayFilterfield[$index]);
            if ($otherField['type'] == 'r') {
                // filterFieldIdThere is itemlink, so get the filtervalue from what that links to
                $filtervalue = $trklib->get_item_value($otherField['options_array'][0], $arrayItem[$index], $otherField['options_array'][1]);
            } else {
                if ($otherField['type'] == 'u') {
Exemple #5
0
if (isset($_REQUEST['rej']) && isset($_REQUEST['msg'])) {
    check_ticket('forum-queue');
    foreach (array_keys($_REQUEST['msg']) as $msg) {
        $commentslib->remove_queued($msg);
    }
}
if (isset($_REQUEST['app']) && isset($_REQUEST['msg'])) {
    check_ticket('forum-queue');
    foreach (array_keys($_REQUEST['msg']) as $msg) {
        $commentslib->approve_queued($msg);
    }
}
// Quickjumpt to other forums
if ($tiki_p_admin_forum == 'y' || $prefs['feature_forum_quickjump'] == 'y') {
    $all_forums = $commentslib->list_forums(0, -1, 'name_asc', '');
    Perms::bulk(array('type' => 'forum'), 'object', $all_forums['data'], 'forumId');
    $temp_max = count($all_forums["data"]);
    for ($i = 0; $i < $temp_max; $i++) {
        $forumperms = Perms::get(array('type' => 'forum', 'object' => $all_forums['data'][$i]['forumId']));
        $all_forums["data"][$i]["can_read"] = $forumperms->forum_read ? 'y' : 'n';
    }
    $smarty->assign('all_forums', $all_forums['data']);
}
// Number of queued messages
if ($tiki_p_admin_forum == 'y') {
    $smarty->assign('queued', $commentslib->get_num_queued('forum' . $_REQUEST['forumId']));
}
// Items will contain messages
if (!isset($_REQUEST["sort_mode"])) {
    $sort_mode = 'timestamp_asc';
} else {
// use the maxRecords php variable to set the limit
// if sortMode is not set then use lastModif_desc
if (!isset($_REQUEST["offset"])) {
    $offset = 0;
} else {
    $offset = $_REQUEST["offset"];
}
$smarty->assign_by_ref('offset', $offset);
if (isset($_REQUEST["find"])) {
    $find = $_REQUEST["find"];
} else {
    $find = '';
}
$smarty->assign('find', $find);
// Get a list of last changes to the Wiki database
$listpages = $bloglib->list_blogs($offset, $maxRecords, $sort_mode, $find);
Perms::bulk(array('type' => 'blog'), 'object', $listpages['data'], 'blogId');
$temp_max = count($listpages["data"]);
for ($i = 0; $i < $temp_max; $i++) {
    $blogperms = Perms::get(array('type' => 'blog', 'object' => $listpages['data'][$i]['blogId']));
    $listpages["data"][$i]["individual_tiki_p_read_blog"] = $blogperms->read_blog ? 'y' : 'n';
    $listpages["data"][$i]["individual_tiki_p_blog_post"] = $blogperms->blog_post ? 'y' : 'n';
    $listpages["data"][$i]["individual_tiki_p_create_blogs"] = $blogperms->create_blogs ? 'y' : 'n';
}
$smarty->assign_by_ref('listpages', $listpages["data"]);
$smarty->assign_by_ref('cant', $listpages["cant"]);
include_once 'tiki-section_options.php';
ask_ticket('list-blogs');
// Display the template
$smarty->assign('mid', 'tiki-list_blogs.tpl');
$smarty->display("tiki.tpl");
Exemple #7
0
 function getCategories($filter = array('type' => 'all'), $considerCategoryFilter = true, $considerPermissions = true, $localized = true)
 {
     global $prefs;
     $cachelib = TikiLib::lib('cache');
     $cacheKey = 'all' . ($localized ? '_' . $prefs['language'] : '');
     if (!($ret = $cachelib->getSerialized($cacheKey, 'allcategs'))) {
         // This generates different caches for each language. The empty key is used when no localization was requested.
         // This could be optimized, but for now each cache is generated from scratch.
         $categories = array();
         $roots = array();
         $query = "select * from `tiki_categories`";
         $result = $this->query($query, array());
         while ($res = $result->fetchRow()) {
             $id = $res["categId"];
             $query = "select count(*) from `tiki_category_objects` where `categId`=?";
             $res["objects"] = $this->getOne($query, array($id));
             $res['children'] = array();
             $res['descendants'] = array();
             if ($localized) {
                 $res['name'] = tr($res['name']);
             }
             $categories[$id] = $res;
         }
         foreach ($categories as &$category) {
             if ($category['parentId']) {
                 // Link this category from its parent.
                 $categories[$category['parentId']]['children'][] = $category['categId'];
             } else {
                 // Mark as a root category.
                 $roots[$category['name']] = $category['categId'];
             }
             $path = array($category['categId'] => $category['name']);
             $parent = $category['parentId'];
             while (!empty($parent)) {
                 if (isset($categories[$parent]['name'])) {
                     $path[$parent] = $categories[$parent]['name'];
                 } else {
                     $path[$parent] = "";
                 }
                 $categories[$parent]['descendants'][] = $category['categId'];
                 // Link this category from its ascendants for optimization.
                 if (isset($categories[$parent]['parentId'])) {
                     $parent = $categories[$parent]['parentId'];
                 } else {
                     $parent = 0;
                 }
             }
             $path = array_reverse($path, true);
             $category["tepath"] = $path;
             $category["categpath"] = implode("::", $path);
             $category["relativePathString"] = $category["categpath"];
         }
         // Sort in preorder. Siblings are sorted by name.
         if ($prefs['category_sort_ascii'] == 'y') {
             uksort($roots, array("CategLib", "cmpcatname"));
         } else {
             ksort($roots, SORT_LOCALE_STRING);
         }
         $sortedCategoryIdentifiers = array();
         foreach ($roots as $root) {
             $sortedCategoryIdentifiers = array_merge($sortedCategoryIdentifiers, $this->getSortedSubTreeNodes($root, $categories));
         }
         $ret = array();
         foreach ($sortedCategoryIdentifiers as $categoryIdentifier) {
             $ret[$categories[$categoryIdentifier]['categId']] = $categories[$categoryIdentifier];
         }
         unset($categories);
         $cachelib->cacheItem($cacheKey, serialize($ret), 'allcategs');
         $cachelib->cacheItem('roots', serialize($roots), 'allcategs');
         // Used in get_category_descendants()
     }
     $type = is_null($filter) ? 'all' : (isset($filter['type']) ? $filter['type'] : 'self');
     if ($type != 'all') {
         $kept = array();
         if ($type != 'roots') {
             if (!isset($filter['identifier'])) {
                 throw new Exception("Missing base category");
             }
             if (!empty($ret) && isset($ret[$filter['identifier']])) {
                 $filterBaseCategory = $ret[$filter['identifier']];
             } else {
                 $filterBaseCategory = null;
             }
         }
         switch ($type) {
             case 'children':
                 $kept = $filterBaseCategory['children'];
                 break;
             case 'descendants':
                 $kept = $filterBaseCategory['descendants'];
                 break;
             case 'roots':
                 $kept = $cachelib->getSerialized('roots', 'allcategs');
                 break;
             default:
                 $ret = array($filter['identifier'] => $filterBaseCategory);
                 // Avoid array functions for optimization
         }
         if ($type != 'self') {
             $ret = array_intersect_key($ret, array_flip($kept));
             if ($type != 'roots') {
                 // Set relativePathString by stripping the length of the common ancestor plus 2 characters for the pathname separator ("::").
                 $strippedLength = strlen($filterBaseCategory['categpath']) + 2;
                 foreach ($ret as &$category) {
                     $category['relativePathString'] = substr($category['categpath'], $strippedLength);
                 }
             }
         }
     }
     if ($considerCategoryFilter) {
         if ($jail = $this->get_jail()) {
             $area = array();
             if ($prefs['feature_areas'] === 'y') {
                 $areaslib = TikiLib::lib('areas');
                 $area = $areaslib->getAreaByPerspId($_SESSION['current_perspective']);
             }
             $roots = array_filter((array) $prefs['category_jail_root']);
             // Skip 0 and other forms of empty
             $ret = array_filter($ret, function ($category) use($jail, $roots, $area) {
                 if (in_array($category['categId'], $jail)) {
                     return true;
                 }
                 if ($area && !$area['share_common']) {
                     return false;
                 }
                 if ($category['rootId'] && !in_array($category['rootId'], $roots)) {
                     return true;
                 } elseif (!$category['rootId'] && !in_array($category['categId'], $roots)) {
                     return true;
                 }
                 return false;
             });
         }
     }
     if ($considerPermissions) {
         $categoryIdentifiers = array_keys($ret);
         if (is_null($categoryIdentifiers)) {
             $categoryIdentifiers = array();
         }
         Perms::bulk(array('type' => 'category'), 'object', $categoryIdentifiers);
         foreach ($categoryIdentifiers as $categoryIdentifier) {
             $permissions = Perms::get(array('type' => 'category', 'object' => $categoryIdentifier));
             if (!$permissions->view_category) {
                 unset($ret[$categoryIdentifier]);
             }
         }
     }
     return $ret;
 }
}
if (!isset($_REQUEST["offset"])) {
    $offset = 0;
} else {
    $offset = $_REQUEST["offset"];
}
$smarty->assign_by_ref('offset', $offset);
if (isset($_REQUEST["find"])) {
    $find = $_REQUEST["find"];
} else {
    $find = '';
}
$smarty->assign('find', $find);
$smarty->assign_by_ref('sort_mode', $sort_mode);
$channels = $quizlib->list_quizzes($offset, $maxRecords, $sort_mode, $find);
Perms::bulk(array('type' => 'quiz'), 'object', $channels['data'], 'quizId');
$temp_max = count($channels["data"]);
for ($i = 0; $i < $temp_max; $i++) {
    $quizperms = Perms::get(array('type' => 'quiz', 'object' => $channels['data'][$i]['quizId']));
    $channels["data"][$i]["individual_tiki_p_take_quiz"] = $quizperms->take_quiz ? 'y' : 'n';
    $channels["data"][$i]["individual_tiki_p_view_quiz_stats"] = $quizperms->view_quiz_stats ? 'y' : 'n';
    $channels["data"][$i]["individual_tiki_p_view_user_stats"] = $quizperms->view_user_stats ? 'y' : 'n';
    $channels["data"][$i]["individual_tiki_p_admin_quizzes"] = $quizperms->admin_quizzes ? 'y' : 'n';
}
$smarty->assign_by_ref('cant_pages', $channels["cant"]);
$smarty->assign_by_ref('channels', $channels["data"]);
include_once 'tiki-section_options.php';
ask_ticket('list-quizzes');
// Display the template
$smarty->assign('mid', 'tiki-list_quizzes.tpl');
$smarty->display("tiki.tpl");
Exemple #9
0
    $sort_mode = $_REQUEST['sort_mode'];
}
$smarty->assign_by_ref('sort_mode', $sort_mode);
if (!isset($_REQUEST['offset'])) {
    $offset = 0;
} else {
    $offset = $_REQUEST['offset'];
}
$smarty->assign_by_ref('offset', $offset);
// Get the list of libraries available for this user (or public galleries)
global $imagegallib;
if (!is_object($imagegallib)) {
    require_once 'lib/imagegals/imagegallib.php';
}
$galleries = $imagegallib->list_galleries($offset, $maxRecords, $sort_mode, 'admin', $find);
Perms::bulk(array('type' => 'image gallery'), 'object', $galleries, 'galleryId');
$smarty->assign('filter', '');
if (!empty($_REQUEST['filter'])) {
    $smarty->assign('filter', $_REQUEST['filter']);
}
$temp_max = count($galleries['data']);
for ($i = 0; $i < $temp_max; $i++) {
    $galperms = Perms::get(array('type' => 'image gallery', 'object' => $galleries['data'][$i]['galleryId']));
    // check if top gallery (has no parents)
    $info = $imagegallib->get_gallery_info($galleries['data'][$i]['galleryId']);
    if ($info['parentgallery'] == -1) {
        $galleries['data'][$i]['topgal'] = 'y';
    } else {
        $galleries['data'][$i]['topgal'] = 'n';
    }
    // check if has subgalleries (parent of any children)
Exemple #10
0
}
if (!isset($_REQUEST["offset"])) {
    $offset = 0;
} else {
    $offset = $_REQUEST["offset"];
}
$smarty->assign_by_ref('offset', $offset);
if (isset($_REQUEST["find"])) {
    $find = $_REQUEST["find"];
} else {
    $find = '';
}
$smarty->assign('find', $find);
$smarty->assign_by_ref('sort_mode', $sort_mode);
$channels = $srvlib->list_surveys($offset, $maxRecords, $sort_mode, $find);
Perms::bulk(array('type' => 'survey'), 'object', $channels['data'], 'surveyId');
$temp_max = count($channels["data"]);
for ($i = 0; $i < $temp_max; $i++) {
    $survperms = Perms::get(array('type' => 'survey', 'object' => $channels['data'][$i]['surveyId']));
    $channels["data"][$i]["individual_tiki_p_take_survey"] = $survperms->take_survey ? 'y' : 'n';
    $channels["data"][$i]["individual_tiki_p_view_survey_stats"] = $survperms->view_survey_stats ? 'y' : 'n';
    $channels["data"][$i]["individual_tiki_p_admin_surveys"] = $survperms->admin_surveys ? 'y' : 'n';
    if ($tikilib->user_has_voted($user, 'survey' . $channels["data"][$i]["surveyId"])) {
        $channels["data"][$i]["taken_survey"] = 'y';
    } else {
        $channels["data"][$i]["taken_survey"] = 'n';
    }
}
$smarty->assign_by_ref('cant_pages', $channels["cant"]);
$smarty->assign_by_ref('channels', $channels["data"]);
include_once 'tiki-section_options.php';
Exemple #11
0
}
$smarty->assign('all_langs', $all_langs);
$access->check_feature(array('feature_wiki', 'feature_listPages'));
$access->check_permission('tiki_p_view');
/* mass-remove:
the checkboxes are sent as the array $_REQUEST["checked[]"], values are the wiki-PageNames,
e.g. $_REQUEST["checked"][3]="HomePage"
$_REQUEST["submit_mult"] holds the value of the "with selected do..."-option list
we look if any page's checkbox is on and if remove_pages is selected.
then we check permission to delete pages.
if so, we call histlib's method remove_all_versions for all the checked pages.
*/
if (!empty($_REQUEST['submit_mult']) && isset($_REQUEST['checked'])) {
    $action = $_REQUEST['submit_mult'];
    check_ticket('list-pages');
    Perms::bulk(array('type' => 'wiki page'), 'object', $_REQUEST['checked']);
    switch ($action) {
        case 'remove_pages':
            // Now check permissions to remove the selected pages
            $access->check_permission('tiki_p_remove');
            $access->check_authenticity(tr('Are you sure you want to remove the %0 selected pages?', count($_REQUEST['checked'])));
            foreach ($_REQUEST['checked'] as $check) {
                $tikilib->remove_all_versions($check);
            }
            break;
        case 'print_pages':
            $access->check_feature('feature_wiki_multiprint');
            foreach ($_REQUEST['checked'] as $check) {
                $access->check_page_exists($check);
                // Now check permissions to access this page
                $perms = Perms::get(array('type' => 'wiki page', 'object' => $check));
Exemple #12
0
 function testBulkLoading()
 {
     $mockObject = $this->getMock('Perms_ResolverFactory');
     $mockCategory = $this->getMock('Perms_ResolverFactory');
     $mockGlobal = $this->getMock('Perms_ResolverFactory');
     $perms = new Perms();
     $perms->setResolverFactories(array($mockObject, $mockCategory, $mockGlobal));
     Perms::set($perms);
     $mockObject->expects($this->once())->method('bulk')->with($this->equalTo(array('type' => 'wiki page')), $this->equalTo('object'), $this->equalTo(array('A', 'B', 'C', 'D', 'E')))->will($this->returnValue(array('A', 'C', 'E')));
     $mockCategory->expects($this->once())->method('bulk')->with($this->equalTo(array('type' => 'wiki page')), $this->equalTo('object'), $this->equalTo(array('A', 'C', 'E')))->will($this->returnValue(array('C')));
     $mockGlobal->expects($this->once())->method('bulk')->with($this->equalTo(array('type' => 'wiki page')), $this->equalTo('object'), $this->equalTo(array('C')))->will($this->returnArgument(0));
     $data = array(array('pageId' => 1, 'pageName' => 'A', 'content' => 'Hello World'), array('pageId' => 2, 'pageName' => 'B', 'content' => 'Hello World'), array('pageId' => 3, 'pageName' => 'C', 'content' => 'Hello World'), array('pageId' => 4, 'pageName' => 'D', 'content' => 'Hello World'), array('pageId' => 5, 'pageName' => 'E', 'content' => 'Hello World'));
     Perms::bulk(array('type' => 'wiki page'), 'object', $data, 'pageName');
 }
function wikiplugin_memberlist($data, $params)
{
    global $prefs, $userlib, $user;
    static $execution = 0;
    $exec_key = 'memberlist-execution-' . ++$execution;
    if (!isset($params['groups'])) {
        return "^Missing group list^";
    }
    $groups = $params['groups'];
    $defaults = array();
    $plugininfo = wikiplugin_memberlist_info();
    foreach ($plugininfo['params'] as $key => $param) {
        $defaults["{$key}"] = $param['default'];
    }
    $params = array_merge($defaults, $params);
    if ($prefs['feature_user_watches'] == 'y') {
        if (!empty($user)) {
            $tikilib = TikiLib::lib('tiki');
            if (isset($_REQUEST['watch'])) {
                $tikilib->add_user_watch($user, 'user_joins_group', $_REQUEST['watch'], 'group');
            } else {
                if (isset($_REQUEST['unwatch'])) {
                    $tikilib->remove_user_watch($user, 'user_joins_group', $_REQUEST['unwatch'], 'group');
                }
            }
        }
    }
    if (count($groups) === 1 && $groups[0] === '*') {
        // all available
        $groups = $userlib->list_all_groups();
    }
    if (!empty($params['membersOnly'])) {
        if ($params['membersOnly'] === '%user%') {
            $params['membersOnly'] = $GLOBALS['user'];
        }
        $usergroups = $userlib->get_user_groups($params['membersOnly']);
        $in_group = array();
        foreach ($groups as $group) {
            if (in_array($group, $usergroups) && $group != 'Anonymous') {
                $in_group[] = $group;
            }
        }
        $groups = $in_group;
        unset($in_group);
    }
    if (!empty($params['including'])) {
        $includinggroups = $userlib->get_including_groups($params['including']);
        $in_group = array();
        foreach ($groups as $group) {
            if (in_array($group, $includinggroups)) {
                $in_group[] = $group;
            }
        }
        $groups = $in_group;
        unset($in_group);
    }
    Perms::bulk(array('type' => 'group'), 'object', $groups);
    if ($params['readOnly'] == 'y') {
        $readOnly = true;
    } else {
        $readOnly = false;
    }
    $validGroups = wikiplugin_memberlist_get_group_details($groups, $params['max'], $params['sort_mode'], $readOnly);
    if (isset($_POST[$exec_key])) {
        if (isset($_POST['join'])) {
            wikiplugin_memberlist_join($validGroups, $_POST['join']);
        }
        if (isset($_POST['leave'])) {
            wikiplugin_memberlist_leave($validGroups, $_POST['leave']);
        }
        if (isset($_POST['remove'])) {
            wikiplugin_memberlist_remove($validGroups, $_POST['remove']);
        }
        if (isset($_POST['add'])) {
            wikiplugin_memberlist_add($validGroups, $_POST['add']);
        }
        if (isset($_POST['defgroup'])) {
            wikiplugin_memberlist_add($validGroups, $_POST['defgroup'], true);
        }
        header('Location: ' . $_SERVER['REQUEST_URI']);
        exit;
    }
    if (isset($_REQUEST['transition'], $_REQUEST['member'])) {
        if ($prefs['feature_group_transition'] == 'y') {
            require_once 'lib/transitionlib.php';
            $transitionlib = new TransitionLib('group');
            $transitionlib->triggerTransition($_REQUEST['transition'], $_REQUEST['member']);
            $url = $_SERVER['REQUEST_URI'];
            $url = str_replace('transition=', 'x=', $url);
            $url = str_replace('member=', 'x=', $url);
            header('Location: ' . $url);
            exit;
        }
    }
    $canApply = false;
    foreach ($validGroups as $group) {
        if ($group['can_add'] || $group['can_remove'] || $group['can_join'] || $group['can_leave']) {
            $canApply = true;
            break;
        }
    }
    if ($params['showDescriptions'] === 'y') {
        foreach ($validGroups as $name => &$group) {
            $group['info'] = $userlib->get_group_info($name);
        }
    }
    global $smarty;
    $smarty->assign('execution_key', $exec_key);
    $smarty->assign('can_apply', $canApply);
    $smarty->assign('defaultGroup', $params['defaultGroup']);
    $smarty->assign('memberlist_groups', $validGroups);
    $smarty->assign('displayMode', $params['displayMode']);
    // seems conditionally adding tabs in the tpl doesn't work (unclosed {tabset} errors etc) - a Smarty 3 change?
    if (empty($params['displayMode']) && $prefs['feature_tabs'] === 'y') {
        $oldTabs = $prefs['feature_tabs'];
        $prefs['feature_tabs'] = 'n';
        // css workarounds for when in non tabs mode
        TikiLib::lib('header')->add_css('.memberlist > fieldset { border: none; margin:  0; padding:  0; }
			.memberlist > fieldset > legend { display: none; }');
    }
    $out = '~np~' . $smarty->fetch('wiki-plugins/wikiplugin_memberlist.tpl') . '~/np~';
    if (empty($params['displayMode']) && !empty($oldTabs)) {
        $prefs['feature_tabs'] = $oldTabs;
    }
    return $out;
}
function wikiplugin_memberlist($data, $params)
{
    global $prefs, $user, $page;
    $mail = false;
    $tikilib = TikiLib::lib('tiki');
    $userlib = TikiLib::lib('user');
    $smarty = TikiLib::lib('smarty');
    static $execution = 0;
    $exec_key = 'memberlist-execution-' . ++$execution;
    if (!isset($params['groups'])) {
        return "^Missing group list^";
    }
    $groups = $params['groups'];
    $defaults = array();
    $plugininfo = wikiplugin_memberlist_info();
    foreach ($plugininfo['params'] as $key => $param) {
        $defaults["{$key}"] = $param['default'];
    }
    $params = array_merge($defaults, $params);
    if ($prefs['feature_user_watches'] == 'y') {
        if (!empty($user)) {
            if (isset($_REQUEST['watch'])) {
                $tikilib->add_user_watch($user, 'user_joins_group', $_REQUEST['watch'], 'group');
            } else {
                if (isset($_REQUEST['unwatch'])) {
                    $tikilib->remove_user_watch($user, 'user_joins_group', $_REQUEST['unwatch'], 'group');
                }
            }
        }
    }
    if (count($groups) === 1 && $groups[0] === '*') {
        // all available
        $groups = $userlib->list_all_groups();
    }
    if (!empty($params['membersOnly'])) {
        if ($params['membersOnly'] === '%user%') {
            $params['membersOnly'] = $GLOBALS['user'];
        }
        $usergroups = $userlib->get_user_groups($params['membersOnly']);
        $in_group = array();
        foreach ($groups as $group) {
            if (in_array($group, $usergroups) && $group != 'Anonymous') {
                $in_group[] = $group;
            }
        }
        $groups = $in_group;
        unset($in_group);
    }
    if (!empty($params['including'])) {
        $includinggroups = $userlib->get_including_groups($params['including']);
        $in_group = array();
        foreach ($groups as $group) {
            if (in_array($group, $includinggroups)) {
                $in_group[] = $group;
            }
        }
        $groups = $in_group;
        unset($in_group);
    }
    if ($params['addon_groups_approval_buttons'] == 'y') {
        $pageInfo = $tikilib->get_page_info($page);
        $pageLang = $pageInfo['lang'];
        $api = new TikiAddons_Api_Group();
        $group_base = $api->getOrganicGroupBaseName($params['groups'][0]);
        $smarty->assign('mail_group', $group_base);
        $itemId = $api->getItemIdFromToken($params['groups'][0]);
        $smarty->assign('mail_organicgroup_id', $itemId);
        $userid = "user" . $userlib->get_user_id($user);
        $smarty->assign('mail_userid', $userid);
        $smarty->assign('mail_url', $api->getGroupHomePage($params['groups'][0]) . '?itemId=' . $itemId);
        $foo = parse_url($_SERVER["REQUEST_URI"]);
        $machine = $tikilib->httpPrefix(true) . dirname($foo["path"]);
        if (substr($machine, -1) == '/') {
            $machine = substr($machine, 0, -1);
        }
        $smarty->assign('mail_machine', $machine);
        $file_wel = $smarty->fetchLang($pageLang, "mail/admin_approval_user_joins_group_notification.tpl");
        $file_rej = $smarty->fetchLang($pageLang, "mail/admin_rejection_user_group_notification.tpl");
        $smarty->assign('welcome_content', $file_wel);
        $smarty->assign('reject_content', $file_rej);
        $smarty->assign('Need_app', $exec_key);
    } else {
        $smarty->assign('Need_app', '');
    }
    Perms::bulk(array('type' => 'group'), 'object', $groups);
    if ($params['readOnly'] == 'y') {
        $readOnly = true;
    } else {
        $readOnly = false;
    }
    $validGroups = wikiplugin_memberlist_get_group_details($groups, $params['max'], $params['sort_mode'], $readOnly);
    if (isset($_POST[$exec_key])) {
        if (isset($_POST['join'])) {
            wikiplugin_memberlist_join($validGroups, $_POST['join']);
        }
        if (isset($_POST['leave'])) {
            wikiplugin_memberlist_leave($validGroups, $_POST['leave']);
        }
        if (isset($_POST['remove'])) {
            if (isset($params['email_to_removed_user']) && $params['email_to_removed_user'] == 'y' || isset($_POST['text_area'])) {
                $mail = 'true';
            }
            wikiplugin_memberlist_remove($validGroups, $_POST['remove'], $mail, $params);
        }
        if (isset($_POST['add'])) {
            $addit = array();
            foreach ($_POST['add'] as $key => $value) {
                if ($params['addon_groups_approval_buttons'] == 'y') {
                    $basegroup = $api->getOrganicGroupBaseToken($key);
                    $valgroup[] = $basegroup;
                    $addit['add'][$basegroup] = $value;
                    $removeit['add'][$api->getOrganicGroupPendingToken($key)][] = $value;
                } else {
                    $valgroup[] = $key;
                    $addit['add'][$key] = $value;
                }
            }
            if (isset($params['email_to_added_user']) && $params['email_to_added_user'] == 'y' || isset($_POST['text_area'])) {
                $mail = 'true';
            }
            $validrem = wikiplugin_memberlist_get_group_details($valgroup, $params['max'], $params['sort_mode'], $readOnly);
            if ($params['addon_groups_approval_buttons'] == 'y' && isset($removeit['add'])) {
                wikiplugin_memberlist_remove($validGroups, $removeit['add'], 'false', $params);
            }
            wikiplugin_memberlist_add($validrem, $addit['add'], '', $mail, $params);
        }
        if (isset($_POST['defgroup'])) {
            wikiplugin_memberlist_add($validGroups, $_POST['defgroup'], true);
        }
        header('Location: ' . $_SERVER['REQUEST_URI']);
        exit;
    }
    if (isset($_REQUEST['transition'], $_REQUEST['member'])) {
        if ($prefs['feature_group_transition'] == 'y') {
            require_once 'lib/transitionlib.php';
            $transitionlib = new TransitionLib('group');
            $transitionlib->triggerTransition($_REQUEST['transition'], $_REQUEST['member']);
            $url = $_SERVER['REQUEST_URI'];
            $url = str_replace('transition=', 'x=', $url);
            $url = str_replace('member=', 'x=', $url);
            header('Location: ' . $url);
            exit;
        }
    }
    $canApply = false;
    foreach ($validGroups as $group) {
        if ($group['can_add'] || $group['can_remove'] || $group['can_join'] || $group['can_leave']) {
            $canApply = true;
            break;
        }
    }
    if ($params['showDescriptions'] === 'y') {
        foreach ($validGroups as $name => &$group) {
            $group['info'] = $userlib->get_group_info($name);
        }
    }
    $smarty = TikiLib::lib('smarty');
    $smarty->assign('execution_key', $exec_key);
    $smarty->assign('can_apply', $canApply);
    $smarty->assign('defaultGroup', $params['defaultGroup']);
    $smarty->assign('memberlist_groups', $validGroups);
    $smarty->assign('displayMode', $params['displayMode']);
    // seems conditionally adding tabs in the tpl doesn't work (unclosed {tabset} errors etc) - a Smarty 3 change?
    if (empty($params['displayMode']) && $prefs['feature_tabs'] === 'y') {
        $oldTabs = $prefs['feature_tabs'];
        $prefs['feature_tabs'] = 'n';
        // css workarounds for when in non tabs mode
        TikiLib::lib('header')->add_css('.memberlist > fieldset { border: none; margin:  0; padding:  0; }
			.memberlist > fieldset > legend { display: none; }');
    }
    $out = '~np~' . $smarty->fetch('wiki-plugins/wikiplugin_memberlist.tpl') . '~/np~';
    if (empty($params['displayMode']) && !empty($oldTabs)) {
        $prefs['feature_tabs'] = $oldTabs;
    }
    return $out;
}