mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-18 04:42:40 +01:00
Reject high-frequency and out-of-range events during import
Summary: Ref T10747. Don't let users import SECONDLY events, or events outside of the range of a signed 32-bit integer (these are likely not too hard to support, but they're more headaches than we need right now). Test Plan: Tried to import these no-good problem events, got helpful import errors. Reviewers: chad Reviewed By: chad Maniphest Tasks: T10747 Differential Revision: https://secure.phabricator.com/D16716
This commit is contained in:
parent
919eac3f90
commit
860809ae79
4 changed files with 137 additions and 0 deletions
|
@ -2113,6 +2113,8 @@ phutil_register_library_map(array(
|
|||
'PhabricatorCalendarImportEditor' => 'applications/calendar/editor/PhabricatorCalendarImportEditor.php',
|
||||
'PhabricatorCalendarImportEmptyLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportEmptyLogType.php',
|
||||
'PhabricatorCalendarImportEngine' => 'applications/calendar/import/PhabricatorCalendarImportEngine.php',
|
||||
'PhabricatorCalendarImportEpochLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportEpochLogType.php',
|
||||
'PhabricatorCalendarImportFrequencyLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportFrequencyLogType.php',
|
||||
'PhabricatorCalendarImportICSFileTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportICSFileTransaction.php',
|
||||
'PhabricatorCalendarImportIgnoredNodeLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportIgnoredNodeLogType.php',
|
||||
'PhabricatorCalendarImportListController' => 'applications/calendar/controller/PhabricatorCalendarImportListController.php',
|
||||
|
@ -6940,6 +6942,8 @@ phutil_register_library_map(array(
|
|||
'PhabricatorCalendarImportEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'PhabricatorCalendarImportEmptyLogType' => 'PhabricatorCalendarImportLogType',
|
||||
'PhabricatorCalendarImportEngine' => 'Phobject',
|
||||
'PhabricatorCalendarImportEpochLogType' => 'PhabricatorCalendarImportLogType',
|
||||
'PhabricatorCalendarImportFrequencyLogType' => 'PhabricatorCalendarImportLogType',
|
||||
'PhabricatorCalendarImportICSFileTransaction' => 'PhabricatorCalendarImportTransactionType',
|
||||
'PhabricatorCalendarImportIgnoredNodeLogType' => 'PhabricatorCalendarImportLogType',
|
||||
'PhabricatorCalendarImportListController' => 'PhabricatorCalendarController',
|
||||
|
|
|
@ -63,6 +63,67 @@ abstract class PhabricatorCalendarImportEngine
|
|||
}
|
||||
}
|
||||
|
||||
// Reject events which have dates outside of the range of a signed
|
||||
// 32-bit integer. We'll need to accommodate a wider range of events
|
||||
// eventually, but have about 20 years until it's an issue and we'll
|
||||
// all be dead by then.
|
||||
foreach ($nodes as $key => $node) {
|
||||
$dates = array();
|
||||
$dates[] = $node->getStartDateTime();
|
||||
$dates[] = $node->getEndDateTime();
|
||||
$dates[] = $node->getCreatedDateTime();
|
||||
$dates[] = $node->getModifiedDateTime();
|
||||
$rrule = $node->getRecurrenceRule();
|
||||
if ($rrule) {
|
||||
$dates[] = $rrule->getUntil();
|
||||
}
|
||||
|
||||
$bad_date = false;
|
||||
foreach ($dates as $date) {
|
||||
if ($date === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$year = $date->getYear();
|
||||
if ($year < 1970 || $year > 2037) {
|
||||
$bad_date = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($bad_date) {
|
||||
$import->newLogMessage(
|
||||
PhabricatorCalendarImportEpochLogType::LOGTYPE,
|
||||
array());
|
||||
unset($nodes[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
// Reject events which occur too frequently. Users do not normally define
|
||||
// these events and the UI and application make many assumptions which are
|
||||
// incompatible with events recurring once per second.
|
||||
foreach ($nodes as $key => $node) {
|
||||
$rrule = $node->getRecurrenceRule();
|
||||
if (!$rrule) {
|
||||
// This is not a recurring event, so we don't need to check the
|
||||
// frequency.
|
||||
continue;
|
||||
}
|
||||
$scale = $rrule->getFrequencyScale();
|
||||
if ($scale >= PhutilCalendarRecurrenceRule::SCALE_DAILY) {
|
||||
// This is a daily, weekly, monthly, or yearly event. These are
|
||||
// supported.
|
||||
} else {
|
||||
// This is an hourly, minutely, or secondly event.
|
||||
$import->newLogMessage(
|
||||
PhabricatorCalendarImportFrequencyLogType::LOGTYPE,
|
||||
array(
|
||||
'frequency' => $rrule->getFrequency(),
|
||||
));
|
||||
unset($nodes[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$node_map = array();
|
||||
foreach ($nodes as $node) {
|
||||
$full_uid = $this->getFullNodeUID($node);
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorCalendarImportEpochLogType
|
||||
extends PhabricatorCalendarImportLogType {
|
||||
|
||||
const LOGTYPE = 'epoch';
|
||||
|
||||
public function getDisplayType(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return pht('Out of Range');
|
||||
}
|
||||
|
||||
public function getDisplayDescription(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return pht(
|
||||
'Ignored an event with an out-of-range date. Only dates between '.
|
||||
'1970 and 2037 are supported.');
|
||||
}
|
||||
|
||||
public function getDisplayIcon(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return 'fa-clock-o';
|
||||
}
|
||||
|
||||
public function getDisplayColor(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return 'red';
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorCalendarImportFrequencyLogType
|
||||
extends PhabricatorCalendarImportLogType {
|
||||
|
||||
const LOGTYPE = 'frequency';
|
||||
|
||||
public function getDisplayType(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return pht('Too Frequent');
|
||||
}
|
||||
|
||||
public function getDisplayDescription(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
|
||||
$frequency = $log->getParameter('frequency');
|
||||
|
||||
return pht(
|
||||
'Ignored an event with an unsupported frequency rule ("%s"). Events '.
|
||||
'which repeat more frequently than daily are not supported.',
|
||||
$frequency);
|
||||
}
|
||||
|
||||
public function getDisplayIcon(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return 'fa-clock-o';
|
||||
}
|
||||
|
||||
public function getDisplayColor(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorCalendarImportLog $log) {
|
||||
return 'red';
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue