Make WordPress Core

Ticket #26798: 26798.6.diff

File 26798.6.diff, 7.0 KB (added by johnregan3, 20 months ago)

Minor improvement. Label regex groups as was originally implemented by reporter.

  • src/wp-includes/functions.php

    diff --git src/wp-includes/functions.php src/wp-includes/functions.php
    index 4ecad8e808..11178c1c9b 100644
    function wp_is_stream( $path ) { 
    70587058 * @return bool True if valid date, false if not valid date.
    70597059 */
    70607060function wp_checkdate( $month, $day, $year, $source_date ) {
     7061
     7062        $checkdate = false;
     7063        if ( is_numeric( $month ) && is_numeric( $day ) && is_numeric( $year ) ) {
     7064                $checkdate = checkdate( intval( $month ), intval( $day ), intval( $year ) );
     7065        }
     7066
    70617067        /**
    70627068         * Filters whether the given date is valid for the Gregorian calendar.
    70637069         *
    function wp_checkdate( $month, $day, $year, $source_date ) { 
    70667072         * @param bool   $checkdate   Whether the given date is valid.
    70677073         * @param string $source_date Date to check.
    70687074         */
    7069         return apply_filters( 'wp_checkdate', checkdate( $month, $day, $year ), $source_date );
     7075        return apply_filters( 'wp_checkdate', $checkdate, $source_date );
    70707076}
    70717077
    70727078/**
  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index 4ceb8dd3a6..f23dbf02da 100644
    function wp_resolve_post_date( $post_date = '', $post_date_gmt = '' ) { 
    49124912                }
    49134913        }
    49144914
    4915         // Validate the date.
    4916         $month = substr( $post_date, 5, 2 );
    4917         $day   = substr( $post_date, 8, 2 );
    4918         $year  = substr( $post_date, 0, 4 );
     4915        preg_match( "/^(?P<year>[0-9]{4})-(?P<month>0[1-9]|1[0-2])-(?P<day>0[1-9]|[1-2][0-9]|3[0-1])/", $post_date, $matches );
    49194916
    4920         $valid_date = wp_checkdate( $month, $day, $year, $post_date );
     4917        if ( empty( $matches ) || ! is_array( $matches ) || count( $matches ) < 4 ) {
     4918                return false;
     4919        }
     4920
     4921        $valid_date = wp_checkdate( $matches['month'], $matches['day'], $matches['year'], $post_date );
    49214922
    49224923        if ( ! $valid_date ) {
    49234924                return false;
    49244925        }
     4926
    49254927        return $post_date;
    49264928}
    49274929
  • tests/phpunit/tests/post.php

    diff --git tests/phpunit/tests/post.php tests/phpunit/tests/post.php
    index 108e6ef4a6..26e7525f43 100644
    class Tests_Post extends WP_UnitTestCase { 
    15431543        /**
    15441544         * @ticket 52187
    15451545         */
    1546         public function test_insert_invalid_post_date() {
     1546        public function test_insert_invalid_post_date_with_gmt() {
    15471547                $post_date     = '2020-12-28 11:26:35';
    15481548                $post_date_gmt = '2020-12-29 10:11:45';
    15491549                $invalid_date  = '2020-12-41 14:15:27';
    class Tests_Post extends WP_UnitTestCase { 
    16031603                $this->assertSame( 0, $post_id );
    16041604        }
    16051605
     1606        /**
     1607         * @ticket 26798
     1608         *
     1609         * @dataProvider data_wp_insert_post_handle_malformed_post_date
     1610         *
     1611         * The purpose of this test is to ensure that invalid dates do not
     1612         * cause PHP errors when wp_insert_post() is called, and that the
     1613         * posts are not actually "inserted" (created).
     1614         */
     1615        public function test_wp_insert_post_handle_malformed_post_date( $input, $expected ) {
     1616                $post = array(
     1617                        'post_author'  => self::$editor_id,
     1618                        'post_status'  => 'publish',
     1619                        'post_content' => 'content',
     1620                        'post_title'   => 'title',
     1621                        'post_date'    => $input,
     1622                );
     1623
     1624                // Inserting the post should fail gracefully.
     1625                $id = wp_insert_post( $post );
     1626
     1627                // Check if the result is "0" or not.
     1628                $result = ! empty( $id );
     1629                $this->assertEquals( $result, $expected );
     1630        }
     1631
     1632        /**
     1633         * @ticket 26798
     1634         */
     1635        public function data_wp_insert_post_handle_malformed_post_date() {
     1636                return array(
     1637                        array(
     1638                                '2012-01-01',
     1639                                true,
     1640                        ),
     1641                        // 24-hour time format.
     1642                        array(
     1643                                '2012-01-01 13:00:00',
     1644                                true,
     1645                        ),
     1646                        // ISO8601 date with timezone.
     1647                        array(
     1648                                '2016-01-16T00:00:00Z',
     1649                                true,
     1650                        ),
     1651                        // ISO8601 date with timezone offset.
     1652                        array(
     1653                                '2016-01-16T00:00:00+0100',
     1654                                true,
     1655                        ),
     1656                        // RFC3339 Format.
     1657                        array(
     1658                                '1970-01-01T01:00:00+01:00',
     1659                                true,
     1660                        ),
     1661                        // RSS Format
     1662                        array(
     1663                                '1970-01-01T01:00:00+0100',
     1664                                true,
     1665                        ),
     1666                        // Leap year.
     1667                        array(
     1668                                '2012-02-29',
     1669                                true,
     1670                        ),
     1671                        // Strange formats.
     1672                        array(
     1673                                '2012-01-01 0',
     1674                                true,
     1675                        ),
     1676                        array(
     1677                                '2012-01-01 25:00:00',
     1678                                true,
     1679                        ),
     1680                        array(
     1681                                '2012-01-01 00:60:00',
     1682                                true,
     1683                        ),
     1684                        // Failures.
     1685                        array(
     1686                                '2012-08-0z',
     1687                                false,
     1688                        ),
     1689                        array(
     1690                                '2012-08-1',
     1691                                false,
     1692                        ),
     1693                        array(
     1694                                '201-01-08 00:00:00',
     1695                                false,
     1696                        ),
     1697                        array(
     1698                                '201-01-08 00:60:00',
     1699                                false,
     1700                        ),
     1701                        array(
     1702                                '201a-01-08 00:00:00',
     1703                                false,
     1704                        ),
     1705                        array(
     1706                                '2012-1-08 00:00:00',
     1707                                false,
     1708                        ),
     1709                        array(
     1710                                '2012-31-08 00:00:00',
     1711                                false,
     1712                        ),
     1713                        array(
     1714                                '2012-01-8 00:00:00',
     1715                                false,
     1716                        ),
     1717                        array(
     1718                                '2012-01-48 00:00:00',
     1719                                false,
     1720                        ),
     1721                        // Not a leap year.
     1722                        array(
     1723                                '2011-02-29',
     1724                                false,
     1725                        ),
     1726                );
     1727        }
     1728
    16061729        /**
    16071730         * @ticket 52187
    16081731         */
    1609         public function test_wp_resolve_post_date() {
     1732        public function test_wp_resolve_post_date_with_gmt() {
    16101733                $post_date     = '2020-12-28 11:26:35';
    16111734                $post_date_gmt = '2020-12-29 10:11:45';
    16121735                $invalid_date  = '2020-12-41 14:15:27';
    class Tests_Post extends WP_UnitTestCase { 
    16391762                $this->assertFalse( $resolved_post_date );
    16401763        }
    16411764
     1765        /**
     1766         * @ticket 26798
     1767         *
     1768         * @dataProvider data_wp_resolve_post_date_regex
     1769         *
     1770         * Tests the regex inside of wp_resolve_post_date(), with
     1771         * the emphasis on the date format (not the time).
     1772         */
     1773        public function test_wp_resolve_post_date_regex( $date, $expected ) {
     1774                $out = wp_resolve_post_date( $date );
     1775                $this->assertEquals( $out, $expected );
     1776        }
     1777
     1778        /**
     1779         * @ticket 26798
     1780         */
     1781        public function data_wp_resolve_post_date_regex() {
     1782                return array(
     1783                        array(
     1784                                '2012-01-01',
     1785                                '2012-01-01',
     1786                        ),
     1787                        array(
     1788                                '2012-01-01 00:00:00',
     1789                                '2012-01-01 00:00:00',
     1790                        ),
     1791                        // ISO8601 date with timezone.
     1792                        array(
     1793                                '2016-01-16T00:00:00Z',
     1794                                '2016-01-16T00:00:00Z',
     1795                        ),
     1796                        // ISO8601 date with timezone offset.
     1797                        array(
     1798                                '2016-01-16T00:00:00+0100',
     1799                                '2016-01-16T00:00:00+0100',
     1800                        ),
     1801                        // RFC3339 Format.
     1802                        array(
     1803                                '1970-01-01T01:00:00+01:00',
     1804                                '1970-01-01T01:00:00+01:00',
     1805                        ),
     1806                        // RSS Format
     1807                        array(
     1808                                '1970-01-01T01:00:00+0100',
     1809                                '1970-01-01T01:00:00+0100',
     1810                        ),
     1811                        // 24-hour time format.
     1812                        array(
     1813                                '2012-01-01 13:00:00',
     1814                                '2012-01-01 13:00:00',
     1815                        ),
     1816                        array(
     1817                                '2016-01-16T00:0',
     1818                                '2016-01-16T00:0',
     1819                        ),
     1820                        array(
     1821                                '2012-01-01 0',
     1822                                '2012-01-01 0',
     1823                        ),
     1824                        array(
     1825                                '2012-01-01 00:00',
     1826                                '2012-01-01 00:00',
     1827                        ),
     1828                        array(
     1829                                '2012-01-01 25:00:00',
     1830                                '2012-01-01 25:00:00',
     1831                        ),
     1832                        array(
     1833                                '2012-01-01 00:60:00',
     1834                                '2012-01-01 00:60:00',
     1835                        ),
     1836                        array(
     1837                                '2012-01-01 00:00:60',
     1838                                '2012-01-01 00:00:60',
     1839                        ),
     1840                        array(
     1841                                '201-01-08',
     1842                                false,
     1843                        ),
     1844                        array(
     1845                                '201a-01-08',
     1846                                false,
     1847                        ),
     1848                        array(
     1849                                '2012-1-08',
     1850                                false,
     1851                        ),
     1852                        array(
     1853                                '2012-31-08',
     1854                                false,
     1855                        ),
     1856                        array(
     1857                                '2012-01-8',
     1858                                false,
     1859                        ),
     1860                        array(
     1861                                '2012-01-48 00:00:00',
     1862                                false,
     1863                        ),
     1864                        // Leap year.
     1865                        array(
     1866                                '2012-02-29',
     1867                                '2012-02-29',
     1868                        ),
     1869                        array(
     1870                                '2011-02-29',
     1871                                false,
     1872                        ),
     1873
     1874                );
     1875        }
     1876
    16421877        /**
    16431878         * Ensure sticking a post updates the `sticky_posts` option.
    16441879         *