Release 2.14 (#4710)

- show "link has expired message" in password reset screen
- added date objects as hydrator variables - for custom date formats in invoice templates
- show meta-fields with null values (e.g. booleans with `false` where hidden)
- fix permission check: allow to remove `view_own_timesheet` but still record times
- prevent error 500 if customer country is empty
- fix API 500 error if project does not exist when creating new timesheet
- fix tags are not created in remote-search mode
- do not check "export items" by default
- fix daterange query, if user an request locale are different
- added logging for invalid SAML responses (see various discussions)
This commit is contained in:
Kevin Papst
2024-04-05 12:38:21 +02:00
committed by GitHub
parent 19b2d47591
commit b6c98f871d
45 changed files with 318 additions and 317 deletions

View File

@@ -255,6 +255,8 @@ abstract class AbstractController extends BaseAbstractController implements Serv
}
/**
* Use "performSearch=1" to skip loading session searches.
*
* @param array<string> $filterParams parameter names, which should not be saved (neither session, nor database)
* @throws \Exception
*/
@@ -298,7 +300,6 @@ abstract class AbstractController extends BaseAbstractController implements Serv
}
$searchName = $this->getSearchName($data);
/** @var BookmarkRepository $bookmarkRepo */
$bookmarkRepo = $this->getBookmark();
$bookmark = $bookmarkRepo->getSearchDefaultOptions($this->getUser(), $searchName);

View File

@@ -325,7 +325,7 @@ final class CustomerController extends AbstractController
$rates = $rateRepository->getRatesForCustomer($customer);
}
if (null !== $customer->getTimezone()) {
if ($customer->getTimezone() !== null && $customer->getTimezone() !== '') {
$timezone = new \DateTimeZone($customer->getTimezone());
}

View File

@@ -132,6 +132,8 @@ final class PasswordResetController extends AbstractController
}
if (!$user->isPasswordRequestNonExpired($this->configuration->getPasswordResetTokenLifetime())) {
$this->flashWarning('This link has already expired');
return $this->redirectToRoute('resetting_request');
}

View File

@@ -19,8 +19,15 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
/**
* No permission check on controller level, only for single routes.
*
* There was "view_own_timesheet" here once, but it is a bug, as some companies (rarely, but existing) want their
* employees to enter time, but not to see it afterward.
*
* It is legit to only own "create_own_timesheet" without "view_own_timesheet".
*/
#[Route(path: '/timesheet')]
#[IsGranted('view_own_timesheet')]
final class TimesheetController extends TimesheetAbstractController
{
#[Route(path: '/', defaults: ['page' => 1], name: 'timesheet', methods: ['GET'])]

View File

@@ -27,8 +27,15 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
/**
* No permission check on controller level, only for single routes.
*
* There was "view_other_timesheet" here once, but it is a bug.
* Some companies (rarely, but existing) want their employees to enter time, but not to see it afterward.
*
* It is legit to only own "create_other_timesheet" without "view_other_timesheet".
*/
#[Route(path: '/team/timesheet')]
#[IsGranted('view_other_timesheet')]
final class TimesheetTeamController extends TimesheetAbstractController
{
#[Route(path: '/', defaults: ['page' => 1], name: 'admin_timesheet', methods: ['GET'])]