Skip to content

Commit 6d8e915

Browse files
committed
fix: harden date time handling and check for constant #2975
1 parent af3eba4 commit 6d8e915

File tree

4 files changed

+84
-41
lines changed

4 files changed

+84
-41
lines changed

app/Core/Support/DateTimeHelper.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,14 @@ public function parseUserDateTime(string $userDate, string $userTime = ''): Carb
9090
$standardFormats = [
9191
DateTime::ATOM,
9292
DateTime::ISO8601,
93-
DateTime::ISO8601_EXPANDED,
9493
DateTime::W3C,
9594
];
9695

96+
//Added in PHP 8.2
97+
if(defined('DateTime::ISO8601_EXPANDED')) {
98+
$standardFormats[] = DateTime::ISO8601_EXPANDED;
99+
}
100+
97101
// Try standard formats first
98102
foreach ($standardFormats as $format) {
99103
try {
@@ -130,6 +134,8 @@ public function parseUserDateTime(string $userDate, string $userTime = ''): Carb
130134
*
131135
* @param string $dbDate The date string in the database format to parse.
132136
* @return CarbonImmutable The parsed CarbonImmutable instance in db timezone (UTC)
137+
*
138+
* @throws InvalidDateException
133139
*/
134140
public function parseDbDateTime(string $dbDate): CarbonImmutable
135141
{

app/Domain/Tickets/Controllers/ShowTicket.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,14 @@ public function post($params): Response
214214

215215
// Log time
216216
if (isset($params['saveTimes']) === true) {
217-
$result = $this->timesheetService->logTime($id, $params);
218217

219-
if ($result === true) {
218+
try {
219+
$result = $this->timesheetService->logTime($id, $params);
220220
$this->tpl->setNotification($this->language->__('notifications.time_logged_success'), 'success');
221-
} else {
222-
$this->tpl->setNotification($this->language->__($result['msg']), 'error');
221+
}catch (\Exception $e) {
222+
$this->tpl->setNotification($e->getMessage(), 'error');
223223
}
224+
224225
}
225226

226227
// Save Ticket

app/Domain/Tickets/Services/Tickets.php

+64-35
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use DateTime;
88
use Illuminate\Container\EntryNotFoundException;
99
use Illuminate\Contracts\Container\BindingResolutionException;
10+
use Illuminate\Support\Facades\Log;
1011
use Illuminate\Support\Str;
1112
use Leantime\Core\Configuration\Environment as EnvironmentCore;
1213
use Leantime\Core\Events\DispatchesEvents;
@@ -720,7 +721,14 @@ public function getOpenUserTicketsThisWeekAndLater($userId, $projectId, bool $in
720721
}
721722
} else {
722723
$today = dtHelper()->userNow()->setToDbTimezone();
723-
$dbDueDate = dtHelper()->parseDbDateTime($row['dateToFinish']);
724+
725+
try {
726+
$dbDueDate = dtHelper()->parseDbDateTime($row['dateToFinish']);
727+
}catch(\Exception $e){
728+
Log::warning('Error in DB Due date parsing: '.$e->getMessage());
729+
$dbDueDate = dtHelper()->userNow()->addYears();
730+
}
731+
724732
$nextFriday = dtHelper()->userNow()->endOfWeek(CarbonInterface::FRIDAY)->setToDbTimezone();
725733

726734
if ($dbDueDate <= $nextFriday && $dbDueDate >= $today) {
@@ -2290,57 +2298,78 @@ public function prepareTicketDates(&$values)
22902298
// Prepare dates for db
22912299
if (! empty($values['dateToFinish'])) {
22922300

2293-
if ($values['dateToFinish'] instanceof CarbonImmutable) {
2294-
$values['dateToFinish'] = $values['dateToFinish']->formatDateTimeForDb();
2295-
} else {
2296-
if (isset($values['timeToFinish']) && $values['timeToFinish'] != null) {
2297-
$values['dateToFinish'] = dtHelper()->parseUserDateTime($values['dateToFinish'], $values['timeToFinish'])->formatDateTimeForDb();
2298-
unset($values['timeToFinish']);
2301+
try {
2302+
if ($values['dateToFinish'] instanceof CarbonImmutable) {
2303+
$values['dateToFinish'] = $values['dateToFinish']->formatDateTimeForDb();
22992304
} else {
2300-
$values['dateToFinish'] = dtHelper()->parseUserDateTime($values['dateToFinish'], 'end')->formatDateTimeForDb();
2305+
if (isset($values['timeToFinish']) && $values['timeToFinish'] != null) {
2306+
$values['dateToFinish'] = dtHelper()->parseUserDateTime(
2307+
$values['dateToFinish'],
2308+
$values['timeToFinish']
2309+
)->formatDateTimeForDb();
2310+
unset($values['timeToFinish']);
2311+
} else {
2312+
$values['dateToFinish'] = dtHelper()->parseUserDateTime(
2313+
$values['dateToFinish'],
2314+
'end'
2315+
)->formatDateTimeForDb();
2316+
}
23012317
}
2318+
} catch (\Exception $e) {
2319+
$values['dateToFinish'] = '';
23022320
}
23032321
}
23042322

23052323
if (! empty($values['editFrom'])) {
23062324

2307-
if ($values['editFrom'] instanceof CarbonImmutable) {
2308-
$values['editFrom'] = $values['editFrom']->formatDateTimeForDb();
2309-
} else {
2310-
if (isset($values['timeFrom']) && $values['timeFrom'] != null) {
2311-
$values['editFrom'] = dtHelper()->parseUserDateTime(
2312-
$values['editFrom'],
2313-
$values['timeFrom'],
2314-
FromFormat::UserDateTime
2315-
)->formatDateTimeForDb();
2316-
unset($values['timeFrom']);
2325+
try {
2326+
if ($values['editFrom'] instanceof CarbonImmutable) {
2327+
$values['editFrom'] = $values['editFrom']->formatDateTimeForDb();
23172328
} else {
2318-
$values['editFrom'] = dtHelper()->parseUserDateTime(
2319-
$values['editFrom'],
2320-
'start'
2321-
)->formatDateTimeForDb();
2329+
if (isset($values['timeFrom']) && $values['timeFrom'] != null) {
2330+
$values['editFrom'] = dtHelper()->parseUserDateTime(
2331+
$values['editFrom'],
2332+
$values['timeFrom'],
2333+
FromFormat::UserDateTime
2334+
)->formatDateTimeForDb();
2335+
unset($values['timeFrom']);
2336+
} else {
2337+
$values['editFrom'] = dtHelper()->parseUserDateTime(
2338+
$values['editFrom'],
2339+
'start'
2340+
)->formatDateTimeForDb();
2341+
}
23222342
}
2343+
} catch (\Exception $e) {
2344+
$values['editFrom'] = '';
23232345
}
23242346
}
23252347

23262348
if (! empty($values['editTo'])) {
23272349

2328-
if ($values['editTo'] instanceof CarbonImmutable) {
2329-
$values['editTo'] = $values['editTo']->formatDateTimeForDb();
2330-
} else {
2331-
if (isset($values['timeTo']) && $values['timeTo'] != null) {
2332-
$values['editTo'] = dtHelper()->parseUserDateTime(
2333-
$values['editTo'],
2334-
$values['timeTo']
2335-
)->formatDateTimeForDb();
2336-
unset($values['timeTo']);
2350+
try {
2351+
2352+
if ($values['editTo'] instanceof CarbonImmutable) {
2353+
$values['editTo'] = $values['editTo']->formatDateTimeForDb();
23372354
} else {
2338-
$values['editTo'] = dtHelper()->parseUserDateTime(
2339-
$values['editTo'],
2340-
'end'
2341-
)->formatDateTimeForDb();
2355+
if (isset($values['timeTo']) && $values['timeTo'] != null) {
2356+
$values['editTo'] = dtHelper()->parseUserDateTime(
2357+
$values['editTo'],
2358+
$values['timeTo']
2359+
)->formatDateTimeForDb();
2360+
unset($values['timeTo']);
2361+
} else {
2362+
$values['editTo'] = dtHelper()->parseUserDateTime(
2363+
$values['editTo'],
2364+
'end'
2365+
)->formatDateTimeForDb();
2366+
}
23422367
}
2368+
2369+
} catch (\Exception $e) {
2370+
$values['editTo'] = '';
23432371
}
2372+
23442373
}
23452374

23462375
return $values;

app/Domain/Timesheets/Services/Timesheets.php

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Carbon\CarbonInterface;
66
use Illuminate\Contracts\Container\BindingResolutionException;
7+
use Illuminate\Support\Facades\Log;
78
use Leantime\Core\Exceptions\MissingParameterException;
89
use Leantime\Domain\Tickets\Models\Tickets;
910
use Leantime\Domain\Timesheets\Repositories\Timesheets as TimesheetRepository;
@@ -294,8 +295,14 @@ public function getWeeklyTimesheets(int $projectId, CarbonInterface $fromDate, i
294295
// Timesheets are grouped by ticketId + type
295296
$timesheetGroups = [];
296297
foreach ($allTimesheets as $timesheet) {
297-
$currentWorkDate = dtHelper()->parseDbDateTime($timesheet['workDate']);
298298

299+
try {
300+
$currentWorkDate = dtHelper()->parseDbDateTime($timesheet['workDate']);
301+
} catch (\Exception $e) {
302+
Log::warning($e);
303+
304+
continue;
305+
}
299306
// Detect timezone offset
300307

301308
$workdateOffsetStart = ($currentWorkDate->setToUserTimezone()->secondsSinceMidnight() / 60 / 60);

0 commit comments

Comments
 (0)