Merge branch 'master' into feature/dope-layout-5543

This commit is contained in:
Eric Lippmann 2015-10-01 17:42:24 +02:00
commit 3d2521abf0
14 changed files with 82 additions and 37 deletions

View File

@ -215,7 +215,7 @@ class NavigationController extends Controller
$form->addDescription($this->translate('Create a new navigation item, such as a menu entry or dashlet.')); $form->addDescription($this->translate('Create a new navigation item, such as a menu entry or dashlet.'));
// TODO: Fetch all "safe" parameters from the url and populate them // TODO: Fetch all "safe" parameters from the url and populate them
$form->populate(array('url' => rawurldecode($this->params->get('url', '')))); $form->setDefaultUrl(rawurldecode($this->params->get('url', '')));
$form->setOnSuccess(function (NavigationConfigForm $form) { $form->setOnSuccess(function (NavigationConfigForm $form) {
$data = array_filter($form->getValues()); $data = array_filter($form->getValues());

View File

@ -71,7 +71,7 @@ class LoginForm extends Form
if ($this->created) { if ($this->created) {
$redirect = $this->getElement('redirect')->getValue(); $redirect = $this->getElement('redirect')->getValue();
} }
if (empty($redirect)) { if (empty($redirect) || strpos($redirect, 'authentication/logout') !== 0) {
$redirect = static::REDIRECT_URL; $redirect = static::REDIRECT_URL;
} }
return Url::fromPath($redirect); return Url::fromPath($redirect);

View File

@ -74,6 +74,8 @@ class NavigationConfigForm extends ConfigForm
*/ */
protected $itemTypes; protected $itemTypes;
private $defaultUrl;
/** /**
* Initialize this form * Initialize this form
*/ */
@ -129,7 +131,7 @@ class NavigationConfigForm extends ConfigForm
*/ */
public function getUserConfig($type = null) public function getUserConfig($type = null)
{ {
if ($this->userConfig === null) { if ($this->userConfig === null || $type !== null) {
if ($type === null) { if ($type === null) {
throw new ProgrammingError('You need to pass a type if no user configuration is set'); throw new ProgrammingError('You need to pass a type if no user configuration is set');
} }
@ -680,6 +682,14 @@ class NavigationConfigForm extends ConfigForm
$itemForm->create($formData); // May require a parent which gets set by addSubForm() $itemForm->create($formData); // May require a parent which gets set by addSubForm()
} }
/**
* DO NOT USE! This will be removed soon, very soon...
*/
public function setDefaultUrl($url)
{
$this->defaultUrl = $url;
}
/** /**
* Populate the configuration of the navigation item to load * Populate the configuration of the navigation item to load
*/ */
@ -689,6 +699,8 @@ class NavigationConfigForm extends ConfigForm
$data = $this->getConfigForItem($this->itemToLoad)->getSection($this->itemToLoad)->toArray(); $data = $this->getConfigForItem($this->itemToLoad)->getSection($this->itemToLoad)->toArray();
$data['name'] = $this->itemToLoad; $data['name'] = $this->itemToLoad;
$this->populate($data); $this->populate($data);
} elseif ($this->defaultUrl !== null) {
$this->populate(array('url' => $this->defaultUrl));
} }
} }

View File

@ -85,6 +85,7 @@ foreach ($members as $member): ?>
<td class="member-name"> <td class="member-name">
<?php if ( <?php if (
$this->hasPermission('config/authentication/users/show') $this->hasPermission('config/authentication/users/show')
&& method_exists($backend, 'getUserBackend')
&& ($userBackend = $backend->getUserBackend()) !== null && ($userBackend = $backend->getUserBackend()) !== null
&& $userBackend instanceof Selectable && $userBackend instanceof Selectable
): ?> ): ?>

View File

@ -151,7 +151,7 @@ class Web extends EmbeddedWeb
if (isset($config['users'])) { if (isset($config['users'])) {
$users = array_map('trim', explode(',', strtolower($config['users']))); $users = array_map('trim', explode(',', strtolower($config['users'])));
if (in_array($this->user->getUsername(), $users, true)) { if (in_array('*', $users, true) || in_array($this->user->getUsername(), $users, true)) {
unset($config['users']); unset($config['users']);
return true; return true;
} }
@ -159,6 +159,11 @@ class Web extends EmbeddedWeb
if (isset($config['groups'])) { if (isset($config['groups'])) {
$groups = array_map('trim', explode(',', strtolower($config['groups']))); $groups = array_map('trim', explode(',', strtolower($config['groups'])));
if (in_array('*', $groups, true)) {
unset($config['groups']);
return true;
}
$userGroups = array_map('strtolower', $this->user->getGroups()); $userGroups = array_map('strtolower', $this->user->getGroups());
$matches = array_intersect($userGroups, $groups); $matches = array_intersect($userGroups, $groups);
if (! empty($matches)) { if (! empty($matches)) {

View File

@ -808,7 +808,7 @@ class LdapConnection implements Selectable, Inspectable
$ds = $this->getConnection(); $ds = $this->getConnection();
$serverSorting = $this->getCapabilities()->hasOid(LdapCapabilities::LDAP_SERVER_SORT_OID); $serverSorting = false;//$this->getCapabilities()->hasOid(LdapCapabilities::LDAP_SERVER_SORT_OID);
if (! $serverSorting && $query->hasOrder()) { if (! $serverSorting && $query->hasOrder()) {
foreach ($query->getOrder() as $rule) { foreach ($query->getOrder() as $rule) {
if (! in_array($rule[0], $fields)) { if (! in_array($rule[0], $fields)) {

View File

@ -48,7 +48,7 @@ class LdapQuery extends SimpleQuery
protected function init() protected function init()
{ {
$this->filters = array(); $this->filters = array();
$this->usePagedResults = true; $this->usePagedResults = false;
} }
/** /**

View File

@ -138,7 +138,6 @@ class NavigationItem implements IteratorAggregate
public function __construct($name, array $properties = null) public function __construct($name, array $properties = null)
{ {
$this->setName($name); $this->setName($name);
$this->priority = 100;
$this->children = new Navigation(); $this->children = new Navigation();
if (! empty($properties)) { if (! empty($properties)) {
@ -237,7 +236,7 @@ class NavigationItem implements IteratorAggregate
*/ */
public function getPriority() public function getPriority()
{ {
return $this->priority; return $this->priority !== null ? $this->priority : 100;
} }
/** /**
@ -627,18 +626,32 @@ class NavigationItem implements IteratorAggregate
throw new ProgrammingError('Cannot merge, conflict detected.'); throw new ProgrammingError('Cannot merge, conflict detected.');
} }
if ($item->getActive()) { if ($this->priority === null) {
$this->setActive(); $priority = $item->getPriority();
if ($priority !== 100) {
$this->setPriority($priority);
}
} }
if (! $this->getIcon()) { if (! $this->getIcon()) {
$this->setIcon($item->getIcon()); $this->setIcon($item->getIcon());
} }
if ($this->getLabel() === $this->getName()) { if ($this->getLabel() === $this->getName() && $item->getLabel() !== $item->getName()) {
$this->setLabel($item->getLabel()); $this->setLabel($item->getLabel());
} }
if ($this->target === null && ($target = $item->getTarget()) !== null) {
$this->setTarget($target);
}
if ($this->renderer === null) {
$renderer = $item->getRenderer();
if (get_class($renderer) !== 'NavigationItemRenderer') {
$this->setRenderer($renderer);
}
}
foreach ($item->getAttributes() as $name => $value) { foreach ($item->getAttributes() as $name => $value) {
$this->setAttribute($name, $value); $this->setAttribute($name, $value);
} }

View File

@ -161,9 +161,12 @@ class Url
if ($urlPath && $urlPath[0] === '/') { if ($urlPath && $urlPath[0] === '/') {
if ($baseUrl) { if ($baseUrl) {
$urlPath = substr($urlPath, 1); $urlPath = substr($urlPath, 1);
} elseif (strpos($urlPath, $request->getBaseUrl()) === 0) { } else {
$baseUrl = $request->getBaseUrl(); $requestBaseUrl = $request->getBaseUrl();
$urlPath = substr($urlPath, strlen($baseUrl) + 1); if ($requestBaseUrl && $requestBaseUrl !== '/' && strpos($urlPath, $requestBaseUrl) === 0) {
$urlPath = substr($urlPath, strlen($requestBaseUrl) + 1);
$baseUrl = $requestBaseUrl;
}
} }
} elseif (! $baseUrl) { } elseif (! $baseUrl) {
$baseUrl = $request->getBaseUrl(); $baseUrl = $request->getBaseUrl();

View File

@ -48,10 +48,10 @@ class MacroTest extends BaseTestCase
{ {
$objectMock = Mockery::mock('object'); $objectMock = Mockery::mock('object');
$objectMock->customvars = array( $objectMock->customvars = array(
'CUSTOMVAR' => 'test' 'customvar' => 'test'
); );
$this->assertEquals(Macro::resolveMacros('$CUSTOMVAR$', $objectMock), $objectMock->customvars['CUSTOMVAR']); $this->assertEquals(Macro::resolveMacros('$CUSTOMVAR$', $objectMock), $objectMock->customvars['customvar']);
} }
public function testFaultyMacros() public function testFaultyMacros()
@ -59,8 +59,8 @@ class MacroTest extends BaseTestCase
$hostMock = Mockery::mock('host'); $hostMock = Mockery::mock('host');
$hostMock->host_name = 'test'; $hostMock->host_name = 'test';
$hostMock->customvars = array( $hostMock->customvars = array(
'HOST' => 'te', 'host' => 'te',
'NAME' => 'st' 'name' => 'st'
); );
$this->assertEquals( $this->assertEquals(
@ -73,12 +73,12 @@ class MacroTest extends BaseTestCase
{ {
$objectMock = Mockery::mock('object'); $objectMock = Mockery::mock('object');
$objectMock->customvars = array( $objectMock->customvars = array(
'V€RY_SP3C|@L' => 'not too special!' 'v€ry_sp3c|@l' => 'not too special!'
); );
$this->assertEquals( $this->assertEquals(
Macro::resolveMacros('$V€RY_SP3C|@L$', $objectMock), Macro::resolveMacros('$V€RY_SP3C|@L$', $objectMock),
$objectMock->customvars['V€RY_SP3C|@L'] $objectMock->customvars['v€ry_sp3c|@l']
); );
} }
} }

View File

@ -291,11 +291,15 @@ class AdminAccountPage extends Form
protected function fetchUsers() protected function fetchUsers()
{ {
try { try {
return $this $query = $this
->createUserBackend() ->createUserBackend()
->select(array('user_name')) ->select(array('user_name'))
->order('user_name', 'asc', true) ->order('user_name', 'asc', true);
->fetchColumn(); if (in_array($this->backendConfig['backend'], array('ldap', 'msldap'))) {
$query->getQuery()->setUsePagedResults();
}
return $query->fetchColumn();
} catch (Exception $_) { } catch (Exception $_) {
// No need to handle anything special here. Error means no users found. // No need to handle anything special here. Error means no users found.
return array(); return array();
@ -346,10 +350,14 @@ class AdminAccountPage extends Form
protected function fetchGroups() protected function fetchGroups()
{ {
try { try {
return $this $query = $this
->createUserGroupBackend() ->createUserGroupBackend()
->select(array('group_name')) ->select(array('group_name'));
->fetchColumn(); if (in_array($this->backendConfig['backend'], array('ldap', 'msldap'))) {
$query->getQuery()->setUsePagedResults();
}
return $query->fetchColumn();
} catch (Exception $_) { } catch (Exception $_) {
// No need to handle anything special here. Error means no groups found. // No need to handle anything special here. Error means no groups found.
return array(); return array();

View File

@ -291,7 +291,9 @@
// Disable all form controls to prevent resubmission as early as possible. // Disable all form controls to prevent resubmission as early as possible.
// (This relies on native form submission, so using setTimeout is the only possible solution) // (This relies on native form submission, so using setTimeout is the only possible solution)
setTimeout(function () { setTimeout(function () {
$form.find(':input:not(:disabled)').prop('disabled', true); if ($target.attr('id') == $form.closest('.container').attr('id')) {
$form.find(':input:not(:disabled)').prop('disabled', true);
}
}, 0); }, 0);
if (autosubmit) { if (autosubmit) {
@ -331,7 +333,9 @@
// Disable all form controls to prevent resubmission except for our search input // Disable all form controls to prevent resubmission except for our search input
// Note that disabled form inputs will not be enabled via JavaScript again // Note that disabled form inputs will not be enabled via JavaScript again
$form.find(':input:not(#search):not(:disabled)').prop('disabled', true); if ($target.attr('id') == $form.closest('.container').attr('id')) {
$form.find(':input:not(#search):not(:disabled)').prop('disabled', true);
}
// Show a spinner depending on how the form is being submitted // Show a spinner depending on how the form is being submitted
if (autosubmit && typeof $el !== 'undefined' && $el.next().hasClass('spinner')) { if (autosubmit && typeof $el !== 'undefined' && $el.next().hasClass('spinner')) {

View File

@ -359,7 +359,7 @@
url = parts.shift(); url = parts.shift();
var redirectionUrl = this.addUrlFlag(url, 'renderLayout'); var redirectionUrl = this.addUrlFlag(url, 'renderLayout');
var r = this.loadUrl(redirectionUrl, $('#layout')); var r = this.loadUrl(redirectionUrl, $('#layout'));
r.url = url; r.historyUrl = url;
if (parts.length) { if (parts.length) {
r.loadNext = parts; r.loadNext = parts;
} else if (!! document.location.hash) { } else if (!! document.location.hash) {
@ -608,7 +608,8 @@
} else { } else {
// Request wasn't for a container, so it's usually the body // Request wasn't for a container, so it's usually the body
// or the full layout. Push request URL to history: // or the full layout. Push request URL to history:
this.icinga.history.pushUrl(req.url); var url = typeof req.historyUrl !== 'undefined' ? req.historyUrl : req.url;
this.icinga.history.pushUrl(url);
} }
} }
@ -620,7 +621,8 @@
if (typeof req.loadNext !== 'undefined' && req.loadNext.length) { if (typeof req.loadNext !== 'undefined' && req.loadNext.length) {
if ($('#col2').length) { if ($('#col2').length) {
this.loadUrl(req.loadNext[0], $('#col2')); var r = this.loadUrl(req.loadNext[0], $('#col2'));
r.addToHistory = req.addToHistory;
this.icinga.ui.layout2col(); this.icinga.ui.layout2col();
} else { } else {
this.icinga.logger.error('Failed to load URL for #col2', req.loadNext); this.icinga.logger.error('Failed to load URL for #col2', req.loadNext);

View File

@ -158,17 +158,14 @@ class UrlTest extends BaseTestCase
); );
} }
/** public function testWhetherGetRelativeUrlReturnsTheEmptyStringForAbsoluteUrls()
* @depends testWhetherFromPathProperlyRecognizesAndDecodesQueryParameters
*/
public function testWhetherGetRelativeUrlReturnsTheRelativeUrl()
{ {
$url = Url::fromPath('/my/test/url.html?param=val&param2=val2'); $url = Url::fromPath('/my/test/url.html?param=val&param2=val2');
$this->assertEquals( $this->assertEquals(
'my/test/url.html?param=val&param2=val2', '',
$url->getRelativeUrl(), $url->getRelativeUrl(),
'Url::getRelativeUrl does not return the relative url' 'Url::getRelativeUrl does not return the empty string for absolute urls'
); );
} }