public $mDefaultDirection = IndexPager::DIR_DESCENDING;
public $mYear;
public $mMonth;
+ public $mDay;
function getNavigationBar() {
if ( !$this->isNavigationBarShown() ) {
return $this->mNavigationBar;
}
- function getDateCond( $year, $month ) {
+ /**
+ * Set and return the mOffset timestamp such that we can get all revisions with
+ * a timestamp up to the specified parameters.
+ * @param int $year Year up to which we want revisions
+ * @param int $month Month up to which we want revisions
+ * @param int $day [optional] Day up to which we want revisions. Default is end of month.
+ * @return string|null Timestamp or null if year and month are false/invalid
+ */
+ function getDateCond( $year, $month, $day = -1 ) {
$year = intval( $year );
$month = intval( $month );
+ $day = intval( $day );
- // Basic validity checks
+ // Basic validity checks for year and month
$this->mYear = $year > 0 ? $year : false;
$this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false;
- // Given an optional year and month, we need to generate a timestamp
- // to use as "WHERE rev_timestamp <= result"
- // Examples: year = 2006 equals < 20070101 (+000000)
- // year=2005, month=1 equals < 20050201
- // year=2005, month=12 equals < 20060101
+ // If year and month are false, don't update the mOffset
if ( !$this->mYear && !$this->mMonth ) {
- return;
+ return null;
}
+ // Given an optional year, month, and day, we need to generate a timestamp
+ // to use as "WHERE rev_timestamp <= result"
+ // Examples: year = 2006 equals < 20070101 (+000000)
+ // year=2005, month=1 equals < 20050201
+ // year=2005, month=12 equals < 20060101
+ // year=2005, month=12, day=5 equals < 20051206
if ( $this->mYear ) {
$year = $this->mYear;
} else {
}
if ( $this->mMonth ) {
- $month = $this->mMonth + 1;
- // For December, we want January 1 of the next year
+ $month = $this->mMonth;
+
+ // Day validity check after we have month and year checked
+ $this->mDay = checkdate( $month, $day, $year ) ? $day : false;
+
+ if ( $this->mDay ) {
+ // If we have a day, we want up to the day immediately afterward
+ $day = $this->mDay + 1;
+
+ // Did we overflow the current month?
+ if ( !checkdate( $month, $day, $year ) ) {
+ $day = 1;
+ $month++;
+ }
+ } else {
+ // If no day, assume beginning of next month
+ $day = 1;
+ $month++;
+ }
+
+ // Did we overflow the current year?
if ( $month > 12 ) {
$month = 1;
$year++;
}
+
} else {
// No month implies we want up to the end of the year in question
$month = 1;
+ $day = 1;
$year++;
}
$year = 2032;
}
- $ymd = (int)sprintf( "%04d%02d01", $year, $month );
+ $ymd = (int)sprintf( "%04d%02d%02d", $year, $month, $day );
if ( $ymd > 20320101 ) {
$ymd = 20320101;
$timestamp = MWTimestamp::getInstance( "${ymd}000000" );
$timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
- $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
+ try {
+ $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
+ } catch ( TimestampException $e ) {
+ // Invalid user provided timestamp (T149257)
+ return null;
+ }
+
+ return $this->mOffset;
}
}