1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-29 02:02:41 +01:00
phorge-phorge/src/applications/home/controller/PhabricatorHomeController.php

158 lines
4.6 KiB
PHP
Raw Normal View History

<?php
abstract class PhabricatorHomeController extends PhabricatorController {
public function buildStandardPageResponse($view, array $data) {
2011-01-26 22:21:12 +01:00
$page = $this->buildStandardPageView();
$page->setBaseURI('/');
$page->setTitle(idx($data, 'title'));
$page->setGlyph("\xE2\x9A\x92");
$page->appendChild($view);
$response = new AphrontWebpageResponse();
return $response->setContent($page->render());
}
public function buildNav() {
$user = $this->getRequest()->getUser();
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI('/'));
If a user can't see an application, prevent them from using its controllers Summary: Ref T603. Broadly, this allows you to implement a policy like "Only users in Engineering can use Differential." This isn't complete, and there will be a long tail of special cases to deal with. Some examples: - If you can't use Differential, should you still be able to attach/detach revisions from tasks? - You currently will be able to. - This actually seems pretty reasonable. - But in other cases it might not be: the "send user a message" action should probably require access to Conpherence. - If you can't use Differential, should you still be able to see feed stories about it? - You currently will be able to, if you can see the revisions. - This seems not-so-reasonable and we should probably lock it down. - If you can't use Differential, can users CC you on revisions? - Currently, they can, and you can't do anything about it. - Probably they shouldn't be able to? This seems challenging to explain in the UI. - If you can't use Differential, can you write a Herald rule against it? - You currently will be able to. - Seems like you obviously shouldn't be able to. - I think this is a general issue right now (you can still write Differential herald rules even if you uninstall the application, I believe). There are probably a few more things I haven't thought of. However, there are a finite number of these things and I suspect there aren't //too/ many more than this -- I can't come up with like 100 of them, and half of the ones above have easy fixes. Despite the rough edges, I think this accomplishes 95% of what installs expect from it. Test Plan: Restricted Differential and saw it vanish from the home page. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T603 Differential Revision: https://secure.phabricator.com/D7203
2013-10-03 21:39:41 +02:00
$applications = id(new PhabricatorApplicationQuery())
->setViewer($user)
->withInstalled(true)
->withUnlisted(false)
If a user can't see an application, prevent them from using its controllers Summary: Ref T603. Broadly, this allows you to implement a policy like "Only users in Engineering can use Differential." This isn't complete, and there will be a long tail of special cases to deal with. Some examples: - If you can't use Differential, should you still be able to attach/detach revisions from tasks? - You currently will be able to. - This actually seems pretty reasonable. - But in other cases it might not be: the "send user a message" action should probably require access to Conpherence. - If you can't use Differential, should you still be able to see feed stories about it? - You currently will be able to, if you can see the revisions. - This seems not-so-reasonable and we should probably lock it down. - If you can't use Differential, can users CC you on revisions? - Currently, they can, and you can't do anything about it. - Probably they shouldn't be able to? This seems challenging to explain in the UI. - If you can't use Differential, can you write a Herald rule against it? - You currently will be able to. - Seems like you obviously shouldn't be able to. - I think this is a general issue right now (you can still write Differential herald rules even if you uninstall the application, I believe). There are probably a few more things I haven't thought of. However, there are a finite number of these things and I suspect there aren't //too/ many more than this -- I can't come up with like 100 of them, and half of the ones above have easy fixes. Despite the rough edges, I think this accomplishes 95% of what installs expect from it. Test Plan: Restricted Differential and saw it vanish from the home page. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T603 Differential Revision: https://secure.phabricator.com/D7203
2013-10-03 21:39:41 +02:00
->execute();
foreach ($applications as $key => $application) {
if (!$application->shouldAppearInLaunchView()) {
// Remove hidden applications (usually internal stuff).
unset($applications[$key]);
}
$invisible = PhabricatorApplication::TILE_INVISIBLE;
if ($application->getDefaultTileDisplay($user) == $invisible) {
// Remove invisible applications (e.g., admin apps for non-admins).
unset($applications[$key]);
}
}
$status = array();
foreach ($applications as $key => $application) {
$status[get_class($application)] = $application->loadStatus($user);
}
$tile_groups = array();
$prefs = $user->loadPreferences()->getPreference(
PhabricatorUserPreferences::PREFERENCE_APP_TILES,
array());
foreach ($applications as $key => $application) {
$display = idx(
$prefs,
get_class($application),
$application->getDefaultTileDisplay($user));
$tile_groups[$display][] = $application;
}
$tile_groups = array_select_keys(
$tile_groups,
array(
PhabricatorApplication::TILE_FULL,
PhabricatorApplication::TILE_SHOW,
PhabricatorApplication::TILE_HIDE,
));
foreach ($tile_groups as $tile_display => $tile_group) {
if (!$tile_group) {
continue;
}
$is_small_tiles = ($tile_display == PhabricatorApplication::TILE_SHOW) ||
($tile_display == PhabricatorApplication::TILE_HIDE);
if ($is_small_tiles) {
$groups = PhabricatorApplication::getApplicationGroups();
$tile_group = mgroup($tile_group, 'getApplicationGroup');
$tile_group = array_select_keys($tile_group, array_keys($groups));
} else {
$tile_group = array($tile_group);
}
$is_hide = ($tile_display == PhabricatorApplication::TILE_HIDE);
if ($is_hide) {
$show_item_id = celerity_generate_unique_node_id();
$hide_item_id = celerity_generate_unique_node_id();
$show_item = id(new PHUIListItemView())
->setName(pht('Show More Applications'))
->setHref('#')
->addSigil('reveal-content')
->setID($show_item_id);
$hide_item = id(new PHUIListItemView())
->setName(pht('Show Fewer Applications'))
->setHref('#')
->setStyle('display: none')
->setID($hide_item_id)
->addSigil('reveal-content');
$nav->addMenuItem($show_item);
$tile_ids = array($hide_item_id);
}
foreach ($tile_group as $group => $application_list) {
$tiles = array();
foreach ($application_list as $key => $application) {
$tile = id(new PhabricatorApplicationLaunchView())
->setApplication($application)
->setApplicationStatus(
idx($status, get_class($application), array()))
->setUser($user);
$tiles[] = $tile;
}
$group_id = celerity_generate_unique_node_id();
$tile_ids[] = $group_id;
$nav->addCustomBlock(
phutil_tag(
'div',
array(
'class' => 'application-tile-group',
'id' => $group_id,
'style' => ($is_hide ? 'display: none' : null),
),
mpull($tiles, 'render')));
}
if ($is_hide) {
Javelin::initBehavior('phabricator-reveal-content');
$show_item->setMetadata(
array(
'showIDs' => $tile_ids,
'hideIDs' => array($show_item_id),
));
$hide_item->setMetadata(
array(
'showIDs' => array($show_item_id),
'hideIDs' => $tile_ids,
));
$nav->addMenuItem($hide_item);
}
}
$nav->addFilter(
'',
pht('Customize Applications...'),
'/settings/panel/home/');
$nav->addClass('phabricator-side-menu-home');
$nav->selectFilter(null);
return $nav;
}
}