Compare commits

...

135 Commits

Author SHA1 Message Date
desrosj
7904df244f Tag 4.1.28
Built from https://develop.svn.wordpress.org/tags/4.1.28@46535


git-svn-id: http://core.svn.wordpress.org/tags/4.1.28@46332 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-10-14 20:29:11 +00:00
desrosj
4d74fad193 WordPress 4.1.28.
Built from https://develop.svn.wordpress.org/branches/4.1@46519


git-svn-id: http://core.svn.wordpress.org/branches/4.1@46316 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-10-14 20:16:18 +00:00
whyisjake
d1e2b35359 Backporting several bug fixes.
- Query: Remove the static query property.
- HTTP API: Protect against hex interpretation.
- Filesystem API: Prevent directory travelersals when creating new folders.
- Administration: Ensure that admin referer nonce is valid.
- REST API: Send a Vary: Origin header on GET requests.
- Customizer: Properly sanitize background images.

Backports [46474], [46475], [46476], [46477], [46478], [46483], [46485] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@46501


git-svn-id: http://core.svn.wordpress.org/branches/4.1@46298 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-10-14 19:17:19 +00:00
desrosj
d117cdceaa WordPress 4.1.27.
Built from https://develop.svn.wordpress.org/branches/4.1@46035


git-svn-id: http://core.svn.wordpress.org/branches/4.1@45847 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-04 22:03:00 +00:00
desrosj
ae46b28ecb Fix for URL sanitization in wp_kses_bad_protocol_once().
Merges [45997] to the 4.1 branch.

Props irsdl, sstoqnov, whyisjake.
Built from https://develop.svn.wordpress.org/branches/4.1@46013


git-svn-id: http://core.svn.wordpress.org/branches/4.1@45824 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-04 21:41:53 +00:00
Sergey Biryukov
7f5532e6cd Improve URL validation in wp_validate_redirect().
Merges [45971] to the 4.1 branch.
Props vortfu, whyisjake, peterwilsoncc.
Built from https://develop.svn.wordpress.org/branches/4.1@45984


git-svn-id: http://core.svn.wordpress.org/branches/4.1@45795 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-04 17:15:16 +00:00
whyisjake
0c72c0b629 Remove _convert_urlencoded_to_entities() from the get_the_content() callback.
Merges [45937] to the 4.1 branch.

Props vortfu, whyisjake, peterwilsoncc

Built from https://develop.svn.wordpress.org/branches/4.1@45962


git-svn-id: http://core.svn.wordpress.org/branches/4.1@45773 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-04 16:43:37 +00:00
Sergey Biryukov
087255d6fd Escape the output in wp_ajax_upload_attachment().
Merges [45936] to the 4.1 branch.
Props whyisjake, sstoqnov.
Built from https://develop.svn.wordpress.org/branches/4.1@45955


git-svn-id: http://core.svn.wordpress.org/branches/4.1@45766 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-04 16:39:41 +00:00
Gary Pendergast
2af2b726c3 WordPress 4.1.26
Built from https://develop.svn.wordpress.org/branches/4.1@44884


git-svn-id: http://core.svn.wordpress.org/branches/4.1@44715 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-03-13 01:49:17 +00:00
Sergey Biryukov
577c83bd60 Comments: Improve comment content filtering.
Merges [44842] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@44853


git-svn-id: http://core.svn.wordpress.org/branches/4.1@44685 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-03-12 22:43:18 +00:00
Jeremy Felt
841733a905 Bump 4.1 branch to version 4.1.25.
Built from https://develop.svn.wordpress.org/branches/4.1@44086


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43916 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-13 02:15:53 +00:00
Gary Pendergast
4e97db26b9 Editor: Remove unwanted fields before saving posts.
The `meta_input`, `file`, and `guid` fields are not intended to be updated through user input.

Merges [44047] to the 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@44068


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43898 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-13 01:54:33 +00:00
Peter Wilson
c41ec66e1d Multisite: Validate activation links.
Merges [44048] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@44067


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43897 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-13 01:54:18 +00:00
iandunn
8e2414d6b1 KSES: Make the URI attributes DRY.
This commit introduces the `wp_kses_uri_attributes` function and filter. The function centralizes the list of attributes, in order to prevent inconsistency, and the filter provides a way for plugins to customize the attributes.

Merges [44014] and [44017] to the `4.1` branch.

Built from https://develop.svn.wordpress.org/branches/4.1@44043


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43873 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-13 01:17:17 +00:00
Peter Wilson
1fa7b145d1 Multisite: Improve messaging for previously activated users.
Ensure activation of a site is not attempted multiple times and users are shown the correct message if they follow the link a second time.

Merges [44021] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@44036


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43866 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-13 00:59:36 +00:00
Gary Pendergast
1a074d093a KSES: Conditionally remove the <form> element from $allowedposttags.
To avoid backwards compatibility issues, `<form>` is re-added if a custom filter has added the `<input>` or `<select>` elements to `$allowedposttags`.

Merges [43994] to the 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@44013


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43843 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-12 23:52:17 +00:00
Jeremy Felt
9ba26aa950 Media: Improve verification of MIME file types.
Merges [43988] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@44007


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43837 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-12 23:40:20 +00:00
Aaron Campbell
4456704ad8 Bump 4.1 branch to version 4.1.24
Built from https://develop.svn.wordpress.org/branches/4.1@43415


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43243 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-07-05 16:13:45 +00:00
John Blackbourn
79f09bd32f Media: Limit thumbnail file deletions to the same directory as the original file.
Merges [43393] into the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@43401


git-svn-id: http://core.svn.wordpress.org/branches/4.1@43229 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-07-05 15:08:20 +00:00
Aaron Campbell
7773c57a7b Bump 4.1 branch to version 4.1.23
Built from https://develop.svn.wordpress.org/branches/4.1@42941


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42771 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-04-03 20:31:53 +00:00
Dominik Schilling
95a4707db6 Template: Make sure the version string is correctly escaped for use in attributes.
Merge of [42893] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@42925


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42755 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-04-03 16:10:52 +00:00
Dominik Schilling
c037fd2ed8 Login: Use wp_safe_redirect() when redirecting the login page if forced to use HTTPS.
Merge of [42892] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@42903


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42733 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-04-03 15:33:54 +00:00
Sergey Biryukov
641c519b82 General: Update copyright year to 2018 in license.txt.
Props rachelbaker.
Merges [42424] to the 4.1 branch.
Fixes #43007.
Built from https://develop.svn.wordpress.org/branches/4.1@42560


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42389 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-01-23 11:29:55 +00:00
Dion Hulse
0ef34e30c2 Bump the 4.1 branch to 4.1.22.
Built from https://develop.svn.wordpress.org/branches/4.1@42502


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42331 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-01-16 21:45:56 +00:00
Dion Hulse
7683fc66cb External Libraries: Remove unnecessary / obsoleted MediaElement.js files.
Merges [42478] to the 4.1 branch.
Fixes #42720 for 4.1.

Built from https://develop.svn.wordpress.org/branches/4.1@42485


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42314 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-01-16 08:13:27 +00:00
Dion Hulse
179e2944b9 Upgrade: When deleting old files, if deletion fails attempt to empty the file instead.
Props joemcgill, dd32.
Merges [42434] to the 4.1 branch.
Fixes #42963 for 4.1.

Built from https://develop.svn.wordpress.org/branches/4.1@42473


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42302 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-01-16 06:58:21 +00:00
John Blackbourn
f3529cb89d Bump 4.1 branch to version 4.1.21.
Built from https://develop.svn.wordpress.org/branches/4.1@42324


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42153 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-29 19:02:55 +00:00
John Blackbourn
7f0c6cb620 Hardening: Remove the ability to upload JavaScript files for users who do not have the unfiltered_html capability.
Merges [42261] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@42299


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42128 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-29 16:38:28 +00:00
John Blackbourn
348148eee2 Hardening: Ensure the attributes of enclosures are correctly escaped in RSS and Atom feeds.
Merges [42260] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@42298


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42127 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-29 16:37:18 +00:00
John Blackbourn
e16db41a65 Hardening: Add escaping to the language attributes used on html elements.
Merges [42259] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@42297


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42126 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-29 16:36:53 +00:00
John Blackbourn
3d3b4558d6 Hardening: Use a properly generated hash for the newbloguser key instead of a determinate substring.
Merges [42258] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@42296


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42125 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-29 16:36:28 +00:00
Dion Hulse
3c4befe52b WPDB: Check that AUTH_SALT is not empty, Fix a PHP notice when AUTH_SALT is undefined.
Props jsonfry, mkomar, pento.
Merges [42119] and [42120] to the 4.1 branch.
Fixes #42431 and #42401 for 4.1.

Built from https://develop.svn.wordpress.org/branches/4.1@42237


git-svn-id: http://core.svn.wordpress.org/branches/4.1@42066 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-27 01:13:21 +00:00
John Blackbourn
194c36fa91 General: Remove the version number from the readme file in the 4.1 branch.
See #42386

Built from https://develop.svn.wordpress.org/branches/4.1@42095


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41924 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-10-31 17:47:25 +00:00
Gary Pendergast
1466683d48 Bump 4.1 branch to version 4.1.20.
Built from https://develop.svn.wordpress.org/branches/4.1@42076


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41905 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-10-31 13:43:26 +00:00
Gary Pendergast
16391a9641 Database: Restore numbered placeholders in wpdb::prepare().
[41496] removed support for numbered placeholders in queries send through `wpdb::prepare()`, which, despite being undocumented, were quite commonly used.

This change restores support for numbered placeholders (as well as a subset of placeholder formatting), while also adding extra checks to ensure the correct number of arguments are being passed to `wpdb::prepare()`, given the number of placeholders.

Merges [41662], [42056] to the 4.2 branch.
See #41925.


Built from https://develop.svn.wordpress.org/branches/4.1@42064


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41893 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-10-31 12:53:27 +00:00
Dominik Schilling
b2a9df1c79 Users: Use correct escaping function for URLs.
Merge of [41522] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@41530


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41363 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 21:39:26 +00:00
Aaron Campbell
6b3afa9678 Bump 4.1 branch to version 4.1.19.
Built from https://develop.svn.wordpress.org/branches/4.1@41517


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41350 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 20:07:25 +00:00
Aaron Campbell
89333247c9 Database: Hardening to bring wpdb::prepare() inline with documentation.
`wpdb::prepare()` supports %s, %d, and %F as placeholders in the query string. Any other non-escaped % will be escaped.

Merges [41496] to 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@41504


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41337 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 18:33:25 +00:00
Aaron Campbell
68b9288c14 Database: Don’t trigger _doing_it_wrong() for null values in wpdb::prepare().
While `wpdb::prepare()` does not support null values (see #12819) they still appear in the wild like in the WordPress Importer and other plugins.

Merges [41483] to 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@41491


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41324 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 16:26:18 +00:00
Aaron Campbell
688d186ddd Database: Hardening for wpdb::prepare()
Previously if you passed an array of values for placeholders, additional values could be passed as well. Now additional values will be ignored.

Merges [41470] to 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@41478


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41311 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 15:03:53 +00:00
John Blackbourn
6c7de13e11 Filesystem API: Ensure filenames are valid before attempting to unzip them to ensure malformed file paths don't cause issues.
Merges [41457] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@41465


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41298 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 14:44:20 +00:00
John Blackbourn
dc11b33974 General: Add missing URL-encoding and add extra hardening to plugin and template names when they're displayed in the admin area.
Merges [41434] with changes to the 4.1 branch.

See #13377

Built from https://develop.svn.wordpress.org/branches/4.1@41446


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41279 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 13:39:24 +00:00
Dominik Schilling
acc424ed10 TinyMCE: Improve the previews for shortcodes.
Merge of [41395] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@41442


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41275 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 12:44:54 +00:00
Dominik Schilling
8c8a907ba3 Users: Provide a fallback for incorrect HTTP referrers.
Merge of [41398] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@41424


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41257 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 11:14:59 +00:00
Dominik Schilling
900cd482a4 Editor: Prevent adding javascript: and data: URLs through the inline link dialog.
Merge of [41393] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@41407


git-svn-id: http://core.svn.wordpress.org/branches/4.1@41240 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 10:19:51 +00:00
Aaron Campbell
9eb95c11ff Bump 4.1 branch to version 4.1.18.
Built from https://develop.svn.wordpress.org/branches/4.1@40754


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40612 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-05-16 21:53:24 +00:00
Pascal Birchler
f4aa87318c Media: Simplify upload error message construction.
Merges [40736] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40743


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40601 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-05-16 18:04:19 +00:00
Aaron Campbell
1a65464490 Add nonce for updating file system credentials.
Merges [40723] to 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40730


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40588 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-05-16 14:56:48 +00:00
Dominik Schilling
f1dd14eb48 Customize: Ignore invalid customization sessions.
Merge of [40704] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@40711


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40574 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-05-16 12:20:25 +00:00
Pascal Birchler
03ff944f46 Adjust post meta checks
Merges [40692] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40699


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40562 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-05-16 08:53:19 +00:00
Pascal Birchler
c17688406b Whitelist post arguments in XML-RPC
Merges [40677] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40684


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40547 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-05-16 08:26:26 +00:00
Pascal Birchler
d4a45dc58d Bump 4.1 branch to version 4.1.17.
Built from https://develop.svn.wordpress.org/branches/4.1@40493


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40369 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-04-20 16:27:26 +00:00
Pascal Birchler
d0682377ef Fix broken audio/video functions when sanitizing ID3 data
This fixes a bug where running `wp_kses_post_deep()` on all the ID3
tag data corrupted blob data.

See #40075, #40085.

Merges [40400] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40466


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40342 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-04-17 13:29:25 +00:00
James Nylen
d19df5f1e4 Bump 4.1 branch to version 4.1.16.
Built from https://develop.svn.wordpress.org/branches/4.1@40208


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40147 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-03-06 16:35:25 +00:00
Aaron Campbell
0d1be6d9ca Strip control characters before validating redirect.
Merges [40183] to 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40190


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40129 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-03-06 13:45:27 +00:00
Aaron Campbell
a0922a8e99 Plugins: Add file check to plugin deletions.
Merges [40169] to 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@40176


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40115 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-03-06 13:03:54 +00:00
Dominik Schilling
c5c1dce809 Embeds: URL encode YouTube video IDs for broader compatibility.
Merge of [40160] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40167


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40106 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-03-06 12:08:26 +00:00
Jeremy Felt
2702705876 Validate video and audio metadata.
Merge of [40148] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@40155


git-svn-id: http://core.svn.wordpress.org/branches/4.1@40094 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-03-06 08:10:27 +00:00
Aaron Campbell
c0abe8d804 Bump 4.1 branch to version 4.1.15.
Built from https://develop.svn.wordpress.org/branches/4.1@40002


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39939 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-26 18:26:25 +00:00
John Blackbourn
64094ebb31 Posts, Post Types: When using Excerpt mode on the Posts list table, ensure the excerpt output matches what was manually entered into the Excerpt field.
Merges [39956] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@39985


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39922 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-26 14:18:24 +00:00
Dominik Schilling
474af50d38 Press This: Do not show Categories & Tags UI for users who cannot assign terms to posts anyways.
Merge of [39968] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@39976


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39913 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-26 14:13:55 +00:00
Dominik Schilling
0a69a201ad Query: Ensure that queries work correctly with post type names with special characters.
Merge of [39952] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@39962


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39899 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-26 13:52:26 +00:00
Aaron Campbell
edd582c69e Bump 4.1 branch to version 4.1.14.
Built from https://develop.svn.wordpress.org/branches/4.1@39866


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39803 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 16:58:53 +00:00
Joe McGill
8dd8485f19 Media: Fix exif_imagetype check in wp_get_image_mime
This is a follow up to [39831].

Merges [39850] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@39857


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39794 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 16:44:24 +00:00
Joe McGill
6fd71daf13 Media: Improve image filetype checking.
This adds a new function `wp_get_image_mime()` which is used by
`wp_check_filetype_and_ext()` to validate image files using
`exif_imagetype()` if available instead of `getimagesize()`.

`getimagesize()` is less performant than `exif_imagetype()` and is
dependent on GD. If `exif_imagetype()` is not available, it falls back to
`getimagesize()` as before.

If `wp_check_filetype_and_ext()` can't validate the filetype, we now return
`false` for ext/MIME values.

Merges [39831] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@39838


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39776 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 13:18:53 +00:00
Dominik Schilling
4167b5b2cf Updates: Translate plugin data on the Updates screen.
Merge of [39808] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@39826


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39764 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 11:42:50 +00:00
Dominik Schilling
cf41259781 Themes: Fix markup for theme name fallbacks.
Merge of [39807] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@39815


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 11:12:20 +00:00
Jeremy Felt
335301e8f6 Multisite: Use wp_rand() in signup key creation.
Merges [39795] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@39802


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39740 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 05:35:19 +00:00
Dion Hulse
e68653dd45 Update PHPMailer to 5.2.22.
The full list of changes is available here:
https://github.com/PHPMailer/PHPMailer/compare/v5.2.21...v5.2.22

Merges [39759] to the 4.1 branch.
Fixes #37210 for 4.1.

Built from https://develop.svn.wordpress.org/branches/4.1@39790


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39728 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 05:25:51 +00:00
Jeremy Felt
dc033d7009 Mail: Disable wp-mail.php when mailserver_url is mail.example.com.
Merges [39772] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@39779


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39717 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 05:19:50 +00:00
Aaron Campbell
be45faec74 Add nonce for widget accessibility mode.
Props vortfu.

See #23328.

Merges [39765] to 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@39767


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39705 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-11 01:50:26 +00:00
Dion Hulse
e754067ae9 Mail: Upgrade PHPMailer to 5.2.21.
Merges [39645], [36083], [33142], [33124] to the 4.1 branch.
See #37210.

Built from https://develop.svn.wordpress.org/branches/4.1@39727


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39667 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-06 22:06:24 +00:00
Joe McGill
9ee6a9ad66 Media: Improved media titles when created from filename.
Preserves spaces and generally creates more accurate, cleaner titles from filenames of uploaded media.

Merge of [38615] to the 4.1 branch.

Fixes #37989.

Built from https://develop.svn.wordpress.org/branches/4.1@39715


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39655 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-06 22:01:26 +00:00
Dion Hulse
dc2355312d General: Update copyright year to 2017 in license.txt.
Props Nikschavan.
Merges [39659] to the 4.1 branch.
Fixes #39433.

Built from https://develop.svn.wordpress.org/branches/4.1@39703


git-svn-id: http://core.svn.wordpress.org/branches/4.1@39643 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-01-06 21:35:24 +00:00
Jeremy Felt
9a9ecd5c32 Bump 4.1 branch to 4.1.13.
Built from https://develop.svn.wordpress.org/branches/4.1@38554


git-svn-id: http://core.svn.wordpress.org/branches/4.1@38497 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-09-07 15:00:58 +00:00
Jeremy Felt
98ead2d8bb Media: Sanitize upload filename.
Merge of [38538] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@38544


git-svn-id: http://core.svn.wordpress.org/branches/4.1@38487 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-09-07 13:59:54 +00:00
Pascal Birchler
0be5d63999 Upgrade/Install: Sanitize file name in File_Upload_Upgrader.
Merge of [38524] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@38530


git-svn-id: http://core.svn.wordpress.org/branches/4.1@38471 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-09-06 17:57:23 +00:00
Boone Gorges
3d28255a66 Bump 4.1 branch to 4.1.12.
Built from https://develop.svn.wordpress.org/branches/4.1@37832


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37797 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 16:39:24 +00:00
Joe McGill
8bb91d40a2 Media: Improve handling of extensionless filenames.
Merge of [37756] to the 4.1 branch.

See #37111.
Built from https://develop.svn.wordpress.org/branches/4.1@37818


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37783 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:57:40 +00:00
Nikolay Bachiyski
7fcd5f5219 Admin: escape URL-encoded permalinks
Merge of [37801] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@37815


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37780 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:56:22 +00:00
Rachel Baker
7e883711c3 Revisions: Change the capability needed to view revision diffs to edit_post.
Merge of [37779] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@37800


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37765 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:46:22 +00:00
Nikolay Bachiyski
25df9d65a8 Admin: Escape attachment name in case it contains special characters
Merge of [37774] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@37790


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37755 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:26:33 +00:00
Boone Gorges
79e7b2e6aa Taxonomy: More specific cap check when processing category data on post save.
Ports [37691] to the 4.1 branch.

Props dlh.
Fixes #36379.
Built from https://develop.svn.wordpress.org/branches/4.1@37781


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37746 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:22:56 +00:00
Dominik Schilling
65b88f9802 Customize: Make sure that preview and return URLs are URLs.
Merge of [37527] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@37773


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37738 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:20:25 +00:00
Jeremy Felt
8d2141b7ee Admin: Allow for the consistent filtering of auth_redirect_scheme
Merge of [37651] to the 4.1 branch.

See #37047.

Built from https://develop.svn.wordpress.org/branches/4.1@37762


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37727 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-21 14:13:23 +00:00
Dominik Schilling
2dbd645312 Bump 4.1 branch to 4.1.11.
Built from https://develop.svn.wordpress.org/branches/4.1@37388


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37354 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-06 18:14:22 +00:00
Nikolay Bachiyski
58a1804e9c External Libraries: Update plupload from upstream
Built from https://develop.svn.wordpress.org/branches/4.1@37378


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37344 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-06 17:57:22 +00:00
Nikolay Bachiyski
38154c01ce Taxonomies: make sure taxonomy functions work correctly with taxonomy names with special characters
The codex says that taxonomy names "should only contain lowercase letters and the underscore character", but that's not enforced. It's too late to enforce it, since some plugins haven't been following it and the official phpdoc doesn't mention this restriction.

Merge of [37133] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@37138


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37105 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-30 17:32:22 +00:00
Jeremy Felt
92c3f699a9 Multisite: Improve escaping in network settings.
Merge of [37124] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@37128


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37095 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-30 16:05:21 +00:00
Dominik Schilling
e73593c805 HTTP: Improve detection of valid IP addresses.
Merge of [37115] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@37119


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37086 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-30 15:52:33 +00:00
Dominik Schilling
cd0d7d699d Multisite: Validate new email address confirmations.
Merge of [37103] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@37107


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37074 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-30 14:50:48 +00:00
Nikolay Bachiyski
63bde8f97e Snoopy: use escapeshellarg instead of escapeshellcmd
We are escaping arguments, not commands, so we'd better use the semantically correct function, even though they are similar.

Merges [37094] to the 4.1 branch.

Built from https://develop.svn.wordpress.org/branches/4.1@37098


git-svn-id: http://core.svn.wordpress.org/branches/4.1@37065 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-30 14:10:23 +00:00
Dominik Schilling
7df345b1cc Bump 4.1 branch to 4.1.10.
Built from https://develop.svn.wordpress.org/branches/4.1@36458


git-svn-id: http://core.svn.wordpress.org/branches/4.1@36425 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-02 17:29:22 +00:00
Dominik Schilling
5b076e981c Better validation of the URL used in HTTP redirects.
Merges [36444] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@36450


git-svn-id: http://core.svn.wordpress.org/branches/4.1@36417 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-02 17:00:50 +00:00
Dominik Schilling
ac434506e1 HTTP: 0.1.2.3 is not a valid IP.
Merges [36435] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@36439


git-svn-id: http://core.svn.wordpress.org/branches/4.1@36406 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-02 13:04:42 +00:00
Dominik Schilling
197d5128b2 Bump 4.1 branch to 4.1.9.
Built from https://develop.svn.wordpress.org/branches/4.1@36199


git-svn-id: http://core.svn.wordpress.org/branches/4.1@36166 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-01-06 18:50:23 +00:00
Aaron Jorbin
e253e4e3d6 Theme: Escape error messages
[36185] for 4.1 branch

Built from https://develop.svn.wordpress.org/branches/4.1@36189


git-svn-id: http://core.svn.wordpress.org/branches/4.1@36156 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-01-06 17:26:50 +00:00
Dion Hulse
3ff8fa5386 Background Updates: Remove the 7am/7pm background update check.
This changeset is a more basic version of [36180], clearing the extra now redundant schedule.
As the functionality for this was introduced in 3.9, [28129] has been backported to 3.7/3.8, allowing the API TTL to be respected by those versions.

See #27772.
Fixes #35323.

Built from https://develop.svn.wordpress.org/trunk@36184


git-svn-id: http://core.svn.wordpress.org/branches/4.1@36151 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-01-06 13:24:33 +00:00
Dion Hulse
a86aa0bf8e Update Akismet externals
git-svn-id: http://core.svn.wordpress.org/branches/4.1@35107 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-13 17:19:01 +00:00
Helen Hou-Sandí
a39030c223 Finish bumping the 4.1 branch to 4.1.8.
Built from https://develop.svn.wordpress.org/branches/4.1@34192


git-svn-id: http://core.svn.wordpress.org/branches/4.1@34160 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-15 14:51:36 +00:00
Helen Hou-Sandí
a4add78415 Bump 4.1 branch to 4.1.8.
Built from https://develop.svn.wordpress.org/branches/4.1@34183


git-svn-id: http://core.svn.wordpress.org/branches/4.1@34151 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-15 14:28:10 +00:00
Dominik Schilling
d38d60223d XMLRPC: Don't allow private posts to be sticky.
Merge of [33325], [33612], and [34135] to the 4.1 branch.

See #20662.
Built from https://develop.svn.wordpress.org/branches/4.1@34153


git-svn-id: http://core.svn.wordpress.org/branches/4.1@34121 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-14 23:01:22 +00:00
Nikolay Bachiyski
76e13dd238 Shortcodes: don't allow unclosed HTML elements in attributes
Merges [34134] for 4.1 branch

Built from https://develop.svn.wordpress.org/branches/4.1@34146


git-svn-id: http://core.svn.wordpress.org/branches/4.1@34114 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-14 22:48:48 +00:00
Nikolay Bachiyski
0da231a2d9 List tables: escape user e-mails
Merges [34133] for 4.1 branch

Built from https://develop.svn.wordpress.org/branches/4.1@34139


git-svn-id: http://core.svn.wordpress.org/branches/4.1@34107 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-14 22:42:23 +00:00
Gary Pendergast
76718f2ec0 WPDB: get_table_from_query() didn't find table names with hyphens in them.
Merge of [33718] to the 4.1 branch.

Props dustinbolton, pento.

See #33470.


Built from https://develop.svn.wordpress.org/branches/4.1@33993


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33962 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-10 07:00:23 +00:00
Gary Pendergast
a3540aa14d Capabilities: Fall back to the edit_posts capability for orphaned comments.
Merge of the `capabilities.php` part of [33614] to the 4.2 branch.

Props pento, dd32.

See #33154.


Built from https://develop.svn.wordpress.org/branches/4.1@33973


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33942 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-09 06:06:23 +00:00
Dominik Schilling
9460b427a2 Bump 4.1 branch to version 4.1.7.
Built from https://develop.svn.wordpress.org/branches/4.1@33574


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33541 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-04 11:51:21 +00:00
Dion Hulse
c1e878721b Fix do_shortcode('<[shortcode]') edge case.
Props miqrogroove.

Merges [33499] to the 4.1 branch.
See #33116.

Built from https://develop.svn.wordpress.org/branches/4.1@33564


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33531 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-04 07:17:21 +00:00
Dominik Schilling
738c837a58 Comments: IDs are integers.
Merge of [33555] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@33557


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33524 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-04 04:59:20 +00:00
Dominik Schilling
e32ef74d05 Themes: Fix some broken links in the legacy theme preview.
Merge of [33549] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@33550


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33517 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-04 04:57:08 +00:00
Dominik Schilling
f5171862ba Heartbeat: Ensure post locks are released.
Merge of [33542] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@33544


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33511 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-04 04:55:19 +00:00
Dominik Schilling
a967da1a9e Customizer: Use hash_equals() for widgets.
Merge of [33535] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@33537


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33504 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-04 04:52:35 +00:00
Dominik Schilling
3b8a94550b Nav menus: Consistent titles in widgets.
Merge of [33529] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@33530


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33497 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-03 20:58:03 +00:00
Andrew Ozz
922040e867 Backport r33469 and r33470 to 4.1.
See #33106.
Built from https://develop.svn.wordpress.org/branches/4.1@33521


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33488 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-31 01:43:23 +00:00
Gary Pendergast
cec063ad22 WPDB: When checking the encoding of strings against the database, make sure we're only relying on the return value of strings that were sent to the database. Also make sure that we're not trying to sanity check strings that've been marked as not needing sanity checking.
Merge of [33455] to the 4.1 branch.

See #32279.


Built from https://develop.svn.wordpress.org/branches/4.1@33480


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33447 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-29 06:49:21 +00:00
Gary Pendergast
50e855410b WPDB: ::strip_text_from_query() doesn't pass a length to ::strip_invalid_text(), which was causing queries to fail when they contained characters that needed to be sanity checked by MySQL.
Props dd32, mdawaffe, pento.

Merges [33310] to the 4.1 branch.

See #32279.

Built from https://develop.svn.wordpress.org/branches/4.1@33479


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33446 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-29 06:46:21 +00:00
Gary Pendergast
0f529b177c WPDB: Remove some of the complexities in ::strip_invalid_text() associated with switching character sets between queries. Instead of trying to dynamically change connection character sets, we now rely on the value of ::charset. This also fixes the case where queries were being blocked when DB_CHARSET was utf8, but the column character set was non-utf8.
Merge of [33308] to the 4.1 branch.

See #32165.


Built from https://develop.svn.wordpress.org/branches/4.1@33478


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33445 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-29 06:35:21 +00:00
Gary Pendergast
eb9a250ae8 WPDB: When checking that text isn't too long to insert into a column, LONGTEXT columns could fail, as their length is longer than PHP_INT_MAX. Treating their length as a float instead of an int fixes this.
Merge of [33276] to the 4.1 branch.

See #32165.


Built from https://develop.svn.wordpress.org/branches/4.1@33477


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-29 06:29:22 +00:00
Gary Pendergast
fae5374051 Bump 4.1 branch to version 4.1.6.
Built from https://develop.svn.wordpress.org/branches/4.1@33396


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33364 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-23 11:05:21 +00:00
Gary Pendergast
00ffae7300 Shortcodes: Improve the reliablity of shortcodes inside HTML tags.
Merge of [33359] to the 4.1 branch.

Props miqrogroove.

See #15694.


Built from https://develop.svn.wordpress.org/branches/4.1@33380


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33351 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-23 04:37:22 +00:00
Gary Pendergast
a9e97c7ad5 Capabilities: When creating an auto-draft, ensure that the current user still has permission to do so.
Merge of [33357] to the 4.1 branch.


Built from https://develop.svn.wordpress.org/branches/4.1@33375


git-svn-id: http://core.svn.wordpress.org/branches/4.1@33346 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-07-23 03:54:21 +00:00
Michael Adams
3989e1f450 Upgrade: $wpdb->get_col_length() sanity check: bail on unexpected return value.
Merges [32429] for the 4.1 branch.

See #32165.

Built from https://develop.svn.wordpress.org/branches/4.1@32431


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32401 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 23:13:22 +00:00
Dominik Schilling
3e3300395a Add closing paragraph tag for the 4.1.5 changelog entry.
Built from https://develop.svn.wordpress.org/branches/4.1@32428


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32398 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 23:04:23 +00:00
Dominik Schilling
3aa108639d 4.1.5 version bumps.
Built from https://develop.svn.wordpress.org/branches/4.1@32425


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32395 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 22:18:23 +00:00
Michael Adams
2b8283ed89 Upgrade: Ensure unintelligible DB schemas don't result in content loss.
Merge of [32417] to the 4.1 branch.

See #32165.

Props ocean90.

Built from https://develop.svn.wordpress.org/branches/4.1@32419


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32389 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 21:51:24 +00:00
John Blackbourn
4d1c0c85a6 WPDB: Allow queries to reference tables in the dbname.tablename format, and allow table names to contain any valid character, rather than just ASCII.
Merge of [32368] to the 4.1 branch.

Props pento, willstedt for the initial patch.

See #32090.

Built from https://develop.svn.wordpress.org/branches/4.1@32412


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32382 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 21:02:23 +00:00
Dominik Schilling
dc0748284b WPDB: When sanity checking query character sets, there's no need to check queries that don't return user data.
Merges [32374] to the 4.1 branch.

props pento.
see #32104.
Built from https://develop.svn.wordpress.org/branches/4.1@32402


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32372 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 20:02:23 +00:00
Aaron Jorbin
26563868af When upgrading WordPress remove genericons example.html files
[32385] for 4.1 branch

Props @dd32, @boonebgorges, @johnjamesjacoby, @drewapicture, @jorbin


Built from https://develop.svn.wordpress.org/branches/4.1@32401


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32371 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 19:58:22 +00:00
Helen Hou-Sandí
e258184716 The UTF-8 regex can occasionally fail on very low memory machines. Reduce the amount of memory it uses.
Merges [32375] to the 4.1 branch.

props pento.
See #32204.

Built from https://develop.svn.wordpress.org/branches/4.1@32396


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32366 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 19:42:23 +00:00
Dominik Schilling
4f3aedcdbe Bundled Themes: Remove Genericons example.html files.
Merge [32392] to the 4.1 branch.
Built from https://develop.svn.wordpress.org/branches/4.1@32394


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32364 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 19:34:22 +00:00
Michael Adams
bb96e5b686 WPDB: When checking that a string can be sent to MySQL, we shouldn't use mb_convert_encoding(), as it behaves differently to MySQL's character encoding conversion.
Merge of [32364] to the 4.1 branch.

Props mdawaffe, pento, nbachiyski, jorbin, johnjamesjacoby, jeremyfelt.

See #32165.

Built from https://develop.svn.wordpress.org/branches/4.1@32387


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32357 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 19:07:25 +00:00
Andrew Ozz
f70e3c08da TinyMCE: work-around a bug in the tags matching regex.
For 4.1.
Built from https://develop.svn.wordpress.org/branches/4.1@32371


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32341 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-06 05:33:26 +00:00
Gary Pendergast
9037f65f7a 4.1: When upgrading, remove any suspicious comments.
Built from https://develop.svn.wordpress.org/branches/4.1@32312


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32283 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-04-27 17:13:24 +00:00
Andrew Nacin
dbe23fa6f9 WPDB: Sanity check that any strings being stored in the DB are not too long to store correctly.
Merge [32299] to the 4.1 and 4.2 branches.

Built from https://develop.svn.wordpress.org/@32307


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32278 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-04-27 15:31:44 +00:00
Gary Pendergast
b502bf4430 4.1 branch is now 4.1.4.
Built from https://develop.svn.wordpress.org/branches/4.1@32301


git-svn-id: http://core.svn.wordpress.org/branches/4.1@32272 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-04-27 14:07:23 +00:00
83 changed files with 4371 additions and 3300 deletions

View File

@@ -1,6 +1,6 @@
WordPress - Web publishing software
Copyright 2015 by the contributors
Copyright 2018 by the contributors
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@@ -9,7 +9,6 @@
<body>
<h1 id="logo">
<a href="https://wordpress.org/"><img alt="WordPress" src="wp-admin/images/wordpress-logo.png" /></a>
<br /> Version 4.1.3
</h1>
<p style="text-align: center">Semantic Personal Publishing Platform</p>

View File

@@ -18,6 +18,50 @@ if ( !is_multisite() ) {
die();
}
$valid_error_codes = array( 'already_active', 'blog_taken' );
list( $activate_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
$activate_cookie = 'wp-activate-' . COOKIEHASH;
$key = '';
$result = null;
if ( isset( $_GET['key'] ) && isset( $_POST['key'] ) && $_GET['key'] !== $_POST['key'] ) {
wp_die( __( 'A key value mismatch has been detected. Please follow the link provided in your activation email.' ), __( 'An error occurred during the activation' ), 400 );
} elseif ( ! empty( $_GET['key'] ) ) {
$key = $_GET['key'];
} elseif ( ! empty( $_POST['key'] ) ) {
$key = $_POST['key'];
}
if ( $key ) {
$redirect_url = remove_query_arg( 'key' );
if ( $redirect_url !== remove_query_arg( false ) ) {
setcookie( $activate_cookie, $key, 0, $activate_path, COOKIE_DOMAIN, is_ssl(), true );
wp_safe_redirect( $redirect_url );
exit;
} else {
$result = wpmu_activate_signup( $key );
}
}
if ( $result === null && isset( $_COOKIE[ $activate_cookie ] ) ) {
$key = $_COOKIE[ $activate_cookie ];
$result = wpmu_activate_signup( $key );
setcookie( $activate_cookie, ' ', time() - YEAR_IN_SECONDS, $activate_path, COOKIE_DOMAIN, is_ssl(), true );
}
if ( $result === null || ( is_wp_error( $result ) && 'invalid_key' === $result->get_error_code() ) ) {
status_header( 404 );
} elseif ( is_wp_error( $result ) ) {
$error_code = $result->get_error_code();
if ( ! in_array( $error_code, $valid_error_codes ) ) {
status_header( 400 );
}
}
if ( is_object( $wp_object_cache ) )
$wp_object_cache->cache_enabled = false;
@@ -63,12 +107,13 @@ function wpmu_activate_stylesheet() {
<?php
}
add_action( 'wp_head', 'wpmu_activate_stylesheet' );
add_action( 'wp_head', 'wp_sensitive_page_meta' );
get_header();
?>
<div id="content" class="widecolumn">
<?php if ( empty($_GET['key']) && empty($_POST['key']) ) { ?>
<?php if ( ! $key ) { ?>
<h2><?php _e('Activation Key Required') ?></h2>
<form name="activateform" id="activateform" method="post" action="<?php echo network_site_url('wp-activate.php'); ?>">
@@ -82,28 +127,25 @@ get_header();
</form>
<?php } else {
$key = !empty($_GET['key']) ? $_GET['key'] : $_POST['key'];
$result = wpmu_activate_signup( $key );
if ( is_wp_error($result) ) {
if ( 'already_active' == $result->get_error_code() || 'blog_taken' == $result->get_error_code() ) {
$signup = $result->get_error_data();
?>
<h2><?php _e('Your account is now active!'); ?></h2>
<?php
echo '<p class="lead-in">';
if ( $signup->domain . $signup->path == '' ) {
printf( __('Your account has been activated. You may now <a href="%1$s">log in</a> to the site using your chosen username of &#8220;%2$s&#8221;. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%4$s">reset your password</a>.'), network_site_url( 'wp-login.php', 'login' ), $signup->user_login, $signup->user_email, wp_lostpassword_url() );
} else {
printf( __('Your site at <a href="%1$s">%2$s</a> is active. You may now log in to your site using your chosen username of &#8220;%3$s&#8221;. Please check your email inbox at %4$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%5$s">reset your password</a>.'), 'http://' . $signup->domain, $signup->domain, $signup->user_login, $signup->user_email, wp_lostpassword_url() );
}
echo '</p>';
if ( is_wp_error( $result ) && in_array( $result->get_error_code(), $valid_error_codes ) ) {
$signup = $result->get_error_data();
?>
<h2><?php _e('Your account is now active!'); ?></h2>
<?php
echo '<p class="lead-in">';
if ( $signup->domain . $signup->path == '' ) {
printf( __('Your account has been activated. You may now <a href="%1$s">log in</a> to the site using your chosen username of &#8220;%2$s&#8221;. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%4$s">reset your password</a>.'), network_site_url( 'wp-login.php', 'login' ), $signup->user_login, $signup->user_email, wp_lostpassword_url() );
} else {
?>
<h2><?php _e('An error occurred during the activation'); ?></h2>
<?php
echo '<p>'.$result->get_error_message().'</p>';
printf( __('Your site at <a href="%1$s">%2$s</a> is active. You may now log in to your site using your chosen username of &#8220;%3$s&#8221;. Please check your email inbox at %4$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%5$s">reset your password</a>.'), 'http://' . $signup->domain, $signup->domain, $signup->user_login, $signup->user_email, wp_lostpassword_url() );
}
echo '</p>';
} elseif ( $result === null || is_wp_error( $result ) ) {
?>
<h2><?php _e('An error occurred during the activation'); ?></h2>
<?php if ( is_wp_error( $result ) ) {
echo '<p>' . $result->get_error_message() . '</p>';
} ?>
<?php
} else {
$url = isset( $result['blog_id'] ) ? get_blogaddress_by_id( (int) $result['blog_id'] ) : '';
$user = get_userdata( (int) $result['user_id'] );

View File

@@ -42,18 +42,169 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
</h2>
<div class="changelog point-releases">
<h3><?php echo _n( 'Maintenance and Security Release', 'Maintenance and Security Releases', 3 ); ?></h3>
<h3><?php echo _n( 'Maintenance and Security Release', 'Maintenance and Security Releases', 28 ); ?></h3>
<p>
<?php
printf(
/* translators: %s: WordPress version number */
__( '<strong>Version %s</strong> addressed some security issues.' ),
'4.1.28'
);
?>
<?php
printf(
/* translators: %s: HelpHub URL */
__( 'For more information, see <a href="%s">the release notes</a>.' ),
sprintf(
/* translators: %s: WordPress version */
esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
sanitize_title( '4.1.28' )
)
);
?>
</p>
<p>
<?php
printf(
/* translators: %s: WordPress version number */
__( '<strong>Version %s</strong> addressed some security issues.' ),
'4.1.27'
);
?>
<?php
printf(
/* translators: %s: HelpHub URL */
__( 'For more information, see <a href="%s">the release notes</a>.' ),
sprintf(
/* translators: %s: WordPress version */
esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
sanitize_title( '4.1.27' )
)
);
?>
</p>
<p>
<?php
printf(
/* translators: %s: WordPress version number */
__( '<strong>Version %s</strong> addressed a security issue.' ),
'4.1.26'
);
?>
<?php
printf(
/* translators: %s: HelpHub URL */
__( 'For more information, see <a href="%s">the release notes</a>.' ),
sprintf(
/* translators: %s: WordPress version */
esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
sanitize_title( '4.1.26' )
)
);
?>
</p>
<p>
<?php
/* translators: %s: WordPress version number */
printf( __( '<strong>Version %s</strong> addressed some security issues.' ), '4.1.25' );
?>
<?php
/* translators: %s: Codex URL */
printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.25' );
?>
</p>
<p><?php printf( __( '<strong>Version %s</strong> addressed one security issue.' ), '4.1.24' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.24' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 2 ), '4.1.23' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.23' ); ?>
</p>
<p><?php printf( __( '<strong>Version %s</strong> addressed one security issue.' ), '4.1.22' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.22' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 4 ), '4.1.21' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.21' ); ?>
</p>
<p><?php printf( __( '<strong>Version %s</strong> addressed one security issue.' ), '4.1.20' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.20' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 8 ), '4.1.19' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.19' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 5 ), '4.1.18' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.18' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed %2$s bug.',
'<strong>Version %1$s</strong> addressed %2$s bugs.', 1 ), '4.1.17', number_format_i18n( 1 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.17' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 5 ), '4.1.16' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.16' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 3 ), '4.1.15' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.15' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 8 ), '4.1.14' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.14' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 2 ), '4.1.13' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.13' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 9 ), '4.1.12' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.12' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 6 ), '4.1.11' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.11' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 2 ), '4.1.10' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.10' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 1 ), '4.1.9' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.9' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 2 ), '4.1.8', number_format_i18n( 2 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.8' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 4 ), '4.1.7', number_format_i18n( 4 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.7' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 2 ), '4.1.6' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.6' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 3 ), '4.1.5', number_format_i18n( 3 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.5' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 1 ), '4.1.4' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.4' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed %2$s bug.',
'<strong>Version %1$s</strong> addressed %2$s bugs.', 1 ), '4.1.3', number_format_i18n( 1 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.1.3' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.3' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.',
'<strong>Version %1$s</strong> addressed some security issues.', 8 ), '4.1.2' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.1.2' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.2' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed %2$s bug.',
'<strong>Version %1$s</strong> addressed %2$s bugs.', 21 ), '4.1.1', number_format_i18n( 21 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.1.1' ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.1.1' ); ?>
</p>
</div>
@@ -142,7 +293,7 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
<hr />
<div class="changelog feature-list">
<h2><?php _e( 'Under the Hood' ); ?></h3>
<h2><?php _e( 'Under the Hood' ); ?></h2>
<div class="feature-section col two-col">
<div>

View File

@@ -32,7 +32,7 @@ if ( ! ( isset( $_REQUEST['action'] ) && 'upload-attachment' == $_REQUEST['actio
require_once( ABSPATH . 'wp-admin/admin.php' );
header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
header( 'Content-Type: text/plain; charset=' . get_option( 'blog_charset' ) );
if ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {
include( ABSPATH . 'wp-admin/includes/ajax-actions.php' );

View File

@@ -18,9 +18,11 @@ if ( ! current_user_can( 'customize' ) ) {
wp_reset_vars( array( 'url', 'return' ) );
$url = wp_unslash( $url );
$url = esc_url_raw( $url );
$url = wp_validate_redirect( $url, home_url( '/' ) );
if ( $return ) {
$return = wp_unslash( $return );
$return = esc_url_raw( $return );
$return = wp_validate_redirect( $return );
}
if ( ! $return ) {
@@ -147,7 +149,7 @@ do_action( 'customize_controls_print_scripts' );
echo sprintf( __( 'You are previewing %s' ), '<strong class="theme-name">' . $wp_customize->theme()->display('Name') . '</strong>' );
} else {
/* translators: %s is the site/panel title in the Customize pane */
echo sprintf( __( 'You are customizing %s' ), '<strong class="theme-name site-title">' . get_bloginfo( 'name' ) . '</strong>' );
echo sprintf( __( 'You are customizing %s' ), '<strong class="theme-name site-title">' . get_bloginfo( 'name', 'display' ) . '</strong>' );
}
?></span>
</div>

View File

@@ -950,6 +950,8 @@ function wp_ajax_replyto_comment( $action ) {
if ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) {
kses_remove_filters(); // start with a clean slate
kses_init_filters(); // set up the filters
remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
add_filter( 'pre_comment_content', 'wp_filter_kses' );
}
}
} else {
@@ -1538,10 +1540,12 @@ function wp_ajax_inline_save() {
$data['parent_id'] = $data['post_parent'];
// Status.
if ( isset($data['keep_private']) && 'private' == $data['keep_private'] )
if ( isset( $data['keep_private'] ) && 'private' == $data['keep_private'] ) {
$data['visibility'] = 'private';
$data['post_status'] = 'private';
else
} else {
$data['post_status'] = $data['_status'];
}
if ( empty($data['comment_status']) )
$data['comment_status'] = 'closed';
@@ -1843,7 +1847,7 @@ function wp_ajax_upload_attachment() {
'success' => false,
'data' => array(
'message' => __( "You don't have permission to upload files." ),
'filename' => $_FILES['async-upload']['name'],
'filename' => esc_html( $_FILES['async-upload']['name'] ),
)
) );
@@ -1857,7 +1861,7 @@ function wp_ajax_upload_attachment() {
'success' => false,
'data' => array(
'message' => __( "You don't have permission to attach files to this post." ),
'filename' => $_FILES['async-upload']['name'],
'filename' => esc_html( $_FILES['async-upload']['name'] ),
)
) );
@@ -1867,7 +1871,11 @@ function wp_ajax_upload_attachment() {
$post_id = null;
}
$post_data = isset( $_REQUEST['post_data'] ) ? $_REQUEST['post_data'] : array();
$post_data = ! empty( $_REQUEST['post_data'] ) ? _wp_get_allowed_postdata( _wp_translate_postdata( false, (array) $_REQUEST['post_data'] ) ) : array();
if ( is_wp_error( $post_data ) ) {
wp_die( $post_data->get_error_message() );
}
// If the context is custom header or background, make sure the uploaded file is an image.
if ( isset( $post_data['context'] ) && in_array( $post_data['context'], array( 'custom-header', 'custom-background' ) ) ) {
@@ -1877,7 +1885,7 @@ function wp_ajax_upload_attachment() {
'success' => false,
'data' => array(
'message' => __( 'The uploaded file is not a valid image. Please try again.' ),
'filename' => $_FILES['async-upload']['name'],
'filename' => esc_html( $_FILES['async-upload']['name'] ),
)
) );
@@ -1892,7 +1900,7 @@ function wp_ajax_upload_attachment() {
'success' => false,
'data' => array(
'message' => $attachment_id->get_error_message(),
'filename' => $_FILES['async-upload']['name'],
'filename' => esc_html( $_FILES['async-upload']['name'] ),
)
) );
@@ -2573,7 +2581,7 @@ function wp_ajax_get_revision_diffs() {
if ( ! $post = get_post( (int) $_REQUEST['post_id'] ) )
wp_send_json_error();
if ( ! current_user_can( 'read_post', $post->ID ) )
if ( ! current_user_can( 'edit_post', $post->ID ) )
wp_send_json_error();
// Really just pre-loading the cache here.

View File

@@ -225,7 +225,7 @@ class WP_MS_Users_List_Table extends WP_List_Table {
break;
case 'email':
echo "<td $attributes><a href='mailto:$user->user_email'>$user->user_email</a></td>";
echo "<td $attributes><a href='" . esc_url( "mailto:$user->user_email" ) . "'>$user->user_email</a></td>";
break;
case 'registered':

View File

@@ -425,27 +425,27 @@ class WP_Plugins_List_Table extends WP_List_Table {
if ( $screen->in_admin( 'network' ) ) {
if ( $is_active ) {
if ( current_user_can( 'manage_network_plugins' ) )
$actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';
$actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';
} else {
if ( current_user_can( 'manage_network_plugins' ) )
$actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';
$actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';
if ( current_user_can( 'delete_plugins' ) && ! is_plugin_active( $plugin_file ) )
$actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&amp;checked[]=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins') . '" title="' . esc_attr__('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';
$actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&amp;checked[]=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins') . '" title="' . esc_attr__('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';
}
} else {
if ( $is_active ) {
$actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';
$actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';
} else {
$actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';
$actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';
if ( ! is_multisite() && current_user_can('delete_plugins') )
$actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&amp;checked[]=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins') . '" title="' . esc_attr__('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';
$actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&amp;checked[]=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins') . '" title="' . esc_attr__('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';
} // end if $is_active
} // end if $screen->in_admin( 'network' )
if ( ( ! is_multisite() || $screen->in_admin( 'network' ) ) && current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )
$actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . esc_attr__('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';
$actions['edit'] = '<a href="plugin-editor.php?file=' . urlencode( $plugin_file ) . '" title="' . esc_attr__('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';
} // end if $context
$prefix = $screen->in_admin( 'network' ) ? 'network_admin_' : '';

View File

@@ -691,8 +691,9 @@ class WP_Posts_List_Table extends WP_List_Table {
echo '<div class="locked-info"><span class="locked-avatar">' . $locked_avatar . '</span> <span class="locked-text">' . $locked_text . "</span></div>\n";
}
if ( ! $this->hierarchical_display && 'excerpt' == $mode && current_user_can( 'read_post', $post->ID ) )
the_excerpt();
if ( ! $this->hierarchical_display && 'excerpt' == $mode && current_user_can( 'read_post', $post->ID ) ) {
echo esc_html( get_the_excerpt() );
}
$actions = array();
if ( $can_edit_post && 'trash' != $post->post_status ) {

View File

@@ -2326,8 +2326,12 @@ class File_Upload_Upgrader {
if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
wp_die( $uploads['error'] );
$this->filename = $_GET[$urlholder];
$this->filename = sanitize_file_name( $_GET[ $urlholder ] );
$this->package = $uploads['basedir'] . '/' . $this->filename;
if ( 0 !== strpos( realpath( $this->package ), realpath( $uploads['basedir'] ) ) ) {
wp_die( __( 'Please select a file' ) );
}
}
}

View File

@@ -419,7 +419,7 @@ class WP_Users_List_Table extends WP_List_Table {
$r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";
break;
case 'email':
$r .= "<td $attributes><a href='mailto:$email' title='" . esc_attr( sprintf( __( 'E-mail: %s' ), $email ) ) . "'>$email</a></td>";
$r .= "<td $attributes><a href='" . esc_url( "mailto:$email" ) . "' title='" . esc_attr( sprintf( __( 'E-mail: %s' ), $email ) ) . "'>$email</a></td>";
break;
case 'role':
$r .= "<td $attributes>$role_name</td>";

View File

@@ -416,6 +416,10 @@ function wp_network_dashboard_right_now() {
function wp_dashboard_quick_press( $error_msg = false ) {
global $post_ID;
if ( ! current_user_can( 'edit_posts' ) ) {
return;
}
/* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */
$last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID
if ( $last_post_id ) {

View File

@@ -591,6 +591,10 @@ function _unzip_file_ziparchive($file, $to, $needed_dirs = array() ) {
if ( '__MACOSX/' === substr($info['name'], 0, 9) ) // Skip the OS X-created __MACOSX directory
continue;
if ( 0 !== validate_file( $info['name'] ) ) {
return new WP_Error( 'invalid_file_ziparchive', __( 'Could not extract file from archive.' ), $info['name'] );
}
$uncompressed_size += $info['size'];
if ( '/' == substr($info['name'], -1) ) // directory
@@ -744,6 +748,10 @@ function _unzip_file_pclzip($file, $to, $needed_dirs = array()) {
if ( '__MACOSX/' === substr($file['filename'], 0, 9) ) // Don't extract the OS X-created __MACOSX directory files
continue;
if ( 0 !== validate_file( $file['filename'] ) ) {
return new WP_Error( 'invalid_file_pclzip', __( 'Could not extract file from archive.' ), $file['filename'] );
}
if ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE) )
return new WP_Error( 'copy_failed_pclzip', __( 'Could not copy file.' ), $file['filename'] );
}
@@ -1018,14 +1026,28 @@ function request_filesystem_credentials($form_post, $type = '', $error = false,
$credentials = get_option('ftp_credentials', array( 'hostname' => '', 'username' => ''));
$submitted_form = wp_unslash( $_POST );
// Verify nonce, or unset submitted form field values on failure
if ( ! isset( $_POST['_fs_nonce'] ) || ! wp_verify_nonce( $_POST['_fs_nonce'], 'filesystem-credentials' ) ) {
unset(
$submitted_form['hostname'],
$submitted_form['username'],
$submitted_form['password'],
$submitted_form['public_key'],
$submitted_form['private_key'],
$submitted_form['connection_type']
);
}
// If defined, set it to that, Else, If POST'd, set it to that, If not, Set it to whatever it previously was(saved details in option)
$credentials['hostname'] = defined('FTP_HOST') ? FTP_HOST : (!empty($_POST['hostname']) ? wp_unslash( $_POST['hostname'] ) : $credentials['hostname']);
$credentials['username'] = defined('FTP_USER') ? FTP_USER : (!empty($_POST['username']) ? wp_unslash( $_POST['username'] ) : $credentials['username']);
$credentials['password'] = defined('FTP_PASS') ? FTP_PASS : (!empty($_POST['password']) ? wp_unslash( $_POST['password'] ) : '');
$credentials['hostname'] = defined('FTP_HOST') ? FTP_HOST : (!empty($submitted_form['hostname']) ? $submitted_form['hostname'] : $credentials['hostname']);
$credentials['username'] = defined('FTP_USER') ? FTP_USER : (!empty($submitted_form['username']) ? $submitted_form['username'] : $credentials['username']);
$credentials['password'] = defined('FTP_PASS') ? FTP_PASS : (!empty($submitted_form['password']) ? $submitted_form['password'] : '');
// Check to see if we are setting the public/private keys for ssh
$credentials['public_key'] = defined('FTP_PUBKEY') ? FTP_PUBKEY : (!empty($_POST['public_key']) ? wp_unslash( $_POST['public_key'] ) : '');
$credentials['private_key'] = defined('FTP_PRIKEY') ? FTP_PRIKEY : (!empty($_POST['private_key']) ? wp_unslash( $_POST['private_key'] ) : '');
$credentials['public_key'] = defined('FTP_PUBKEY') ? FTP_PUBKEY : (!empty($submitted_form['public_key']) ? $submitted_form['public_key'] : '');
$credentials['private_key'] = defined('FTP_PRIKEY') ? FTP_PRIKEY : (!empty($submitted_form['private_key']) ? $submitted_form['private_key'] : '');
// Sanitize the hostname, Some people might pass in odd-data:
$credentials['hostname'] = preg_replace('|\w+://|', '', $credentials['hostname']); //Strip any schemes off
@@ -1042,8 +1064,8 @@ function request_filesystem_credentials($form_post, $type = '', $error = false,
$credentials['connection_type'] = 'ssh';
else if ( (defined('FTP_SSL') && FTP_SSL) && 'ftpext' == $type ) //Only the FTP Extension understands SSL
$credentials['connection_type'] = 'ftps';
else if ( !empty($_POST['connection_type']) )
$credentials['connection_type'] = wp_unslash( $_POST['connection_type'] );
else if ( !empty($submitted_form['connection_type']) )
$credentials['connection_type'] = $submitted_form['connection_type'];
else if ( !isset($credentials['connection_type']) ) //All else fails (And it's not defaulted to something else saved), Default to FTP
$credentials['connection_type'] = 'ftp';
@@ -1183,11 +1205,14 @@ jQuery(function($){
<?php
foreach ( (array) $extra_fields as $field ) {
if ( isset( $_POST[ $field ] ) )
echo '<input type="hidden" name="' . esc_attr( $field ) . '" value="' . esc_attr( wp_unslash( $_POST[ $field ] ) ) . '" />';
if ( isset( $submitted_form[ $field ] ) )
echo '<input type="hidden" name="' . esc_attr( $field ) . '" value="' . esc_attr( $submitted_form[ $field ] ) . '" />';
}
submit_button( __( 'Proceed' ), 'button', 'upgrade' );
?>
<p class="request-filesystem-credentials-action-buttons">
<?php wp_nonce_field( 'filesystem-credentials', '_fs_nonce', false, true ); ?>
<?php submit_button( __( 'Proceed' ), 'button', 'upgrade', false ); ?>
</p>
</div>
</form>
<?php

View File

@@ -279,7 +279,7 @@ function media_handle_upload($file_id, $post_id, $post_data = array(), $override
$url = $file['url'];
$type = $file['type'];
$file = $file['file'];
$title = $name;
$title = sanitize_text_field( $name );
$content = '';
if ( preg_match( '#^audio#', $type ) ) {
@@ -2893,7 +2893,7 @@ function wp_add_id3_tag_data( &$metadata, $data ) {
if ( ! empty( $data[$version]['comments'] ) ) {
foreach ( $data[$version]['comments'] as $key => $list ) {
if ( 'length' !== $key && ! empty( $list ) ) {
$metadata[$key] = reset( $list );
$metadata[$key] = wp_kses_post( reset( $list ) );
// Fix bug in byte stream analysis.
if ( 'terms_of_use' === $key && 0 === strpos( $metadata[$key], 'yright notice.' ) )
$metadata[$key] = 'Cop' . $metadata[$key];

View File

@@ -165,9 +165,37 @@ function _wp_translate_postdata( $update = false, $post_data = null ) {
$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
}
if ( isset( $post_data['post_category'] ) ) {
$category_object = get_taxonomy( 'category' );
if ( ! current_user_can( $category_object->cap->assign_terms ) ) {
unset( $post_data['post_category'] );
}
}
return $post_data;
}
/**
* Returns only allowed post data fields
*
* @since 4.9.9
*
* @param array $post_data Array of post data. Defaults to the contents of $_POST.
* @return object|bool WP_Error on failure, true on success.
*/
function _wp_get_allowed_postdata( $post_data = null ) {
if ( empty( $post_data ) ) {
$post_data = $_POST;
}
// Pass through errors
if ( is_wp_error( $post_data ) ) {
return $post_data;
}
return array_diff_key( $post_data, array_flip( array( 'meta_input', 'file', 'guid' ) ) );
}
/**
* Update an existing post with values provided in $_POST.
*
@@ -234,6 +262,7 @@ function edit_post( $post_data = null ) {
$post_data = _wp_translate_postdata( true, $post_data );
if ( is_wp_error($post_data) )
wp_die( $post_data->get_error_message() );
$translated = _wp_get_allowed_postdata( $post_data );
// Post Formats
if ( isset( $post_data['post_format'] ) )
@@ -311,25 +340,25 @@ function edit_post( $post_data = null ) {
$attachment_data = isset( $post_data['attachments'][ $post_ID ] ) ? $post_data['attachments'][ $post_ID ] : array();
/** This filter is documented in wp-admin/includes/media.php */
$post_data = apply_filters( 'attachment_fields_to_save', $post_data, $attachment_data );
$translated = apply_filters( 'attachment_fields_to_save', $translated, $attachment_data );
}
add_meta( $post_ID );
update_post_meta( $post_ID, '_edit_last', get_current_user_id() );
$success = wp_update_post( $post_data );
$success = wp_update_post( $translated );
// If the save failed, see if we can sanity check the main fields and try again
if ( ! $success && is_callable( array( $wpdb, 'strip_invalid_text_for_column' ) ) ) {
$fields = array( 'post_title', 'post_content', 'post_excerpt' );
foreach( $fields as $field ) {
if ( isset( $post_data[ $field ] ) ) {
$post_data[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $post_data[ $field ] );
if ( isset( $translated[ $field ] ) ) {
$translated[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $translated[ $field ] );
}
}
wp_update_post( $post_data );
wp_update_post( $translated );
}
// Now that we have an ID we can fix any attachment anchor hrefs
@@ -487,9 +516,9 @@ function bulk_edit_posts( $post_data = null ) {
unset( $post_data['tax_input']['category'] );
}
$post_data['post_ID'] = $post_ID;
$post_data['post_type'] = $post->post_type;
$post_data['post_mime_type'] = $post->post_mime_type;
$post_data['guid'] = $post->guid;
foreach ( array( 'comment_status', 'ping_status', 'post_author' ) as $field ) {
if ( ! isset( $post_data[ $field ] ) ) {
@@ -497,14 +526,12 @@ function bulk_edit_posts( $post_data = null ) {
}
}
$post_data['ID'] = $post_ID;
$post_data['post_ID'] = $post_ID;
$post_data = _wp_translate_postdata( true, $post_data );
if ( is_wp_error( $post_data ) ) {
$skipped[] = $post_ID;
continue;
}
$post_data = _wp_get_allowed_postdata( $post_data );
$updated[] = wp_update_post( $post_data );
@@ -515,8 +542,8 @@ function bulk_edit_posts( $post_data = null ) {
unstick_post( $post_ID );
}
if ( isset( $post_data['post_format'] ) )
set_post_format( $post_ID, $post_data['post_format'] );
if ( isset( $shared_post_data['post_format'] ) )
set_post_format( $post_ID, $shared_post_data['post_format'] );
}
return array( 'updated' => $updated, 'skipped' => $skipped, 'locked' => $locked );
@@ -692,9 +719,10 @@ function wp_write_post() {
$translated = _wp_translate_postdata( false );
if ( is_wp_error($translated) )
return $translated;
$translated = _wp_get_allowed_postdata( $translated );
// Create the post.
$post_ID = wp_insert_post( $_POST );
$post_ID = wp_insert_post( $translated );
if ( is_wp_error( $post_ID ) )
return $post_ID;
@@ -1209,7 +1237,7 @@ function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
}
if ( false === strpos( $permalink, '%postname%' ) && false === strpos( $permalink, '%pagename%' ) ) {
$return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink" tabindex="-1">' . $permalink . "</span>\n";
$return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink" tabindex="-1">' . esc_html( $permalink ) . "</span>\n";
if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) ) {
$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-small" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
}
@@ -1228,14 +1256,14 @@ function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
}
}
$post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
$display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, urldecode( $permalink ) );
$post_name_html = '<span id="editable-post-name" title="' . $title . '">' . esc_html( $post_name_abridged ) . '</span>';
$display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, esc_html( urldecode( $permalink ) ) );
$return = '<strong>' . __( 'Permalink:' ) . "</strong>\n";
$return .= '<span id="sample-permalink" tabindex="-1">' . $display_link . "</span>\n";
$return .= '&lrm;'; // Fix bi-directional text display defect in RTL languages.
$return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug button button-small hide-if-no-js" onclick="editPermalink(' . $id . '); return false;">' . __( 'Edit' ) . "</a></span>\n";
$return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
$return .= '<span id="editable-post-name-full">' . esc_html( $post_name ) . "</span>\n";
}
if ( isset( $view_post ) ) {
@@ -1245,7 +1273,7 @@ function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
$preview_link = apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ), $post );
$return .= "<span id='view-post-btn'><a href='" . esc_url( $preview_link ) . "' class='button button-small' target='wp-preview-{$post->ID}'>$view_post</a></span>\n";
} else {
$return .= "<span id='view-post-btn'><a href='" . get_permalink( $post ) . "' class='button button-small'>$view_post</a></span>\n";
$return .= "<span id='view-post-btn'><a href='" . esc_url( get_permalink( $post ) ) . "' class='button button-small'>$view_post</a></span>\n";
}
}
@@ -1473,7 +1501,7 @@ function _admin_notice_post_locked() {
// Allow plugins to prevent some users overriding the post lock
if ( $override ) {
?>
<a class="button button-primary wp-tab-last" href="<?php echo esc_url( add_query_arg( 'get-post-lock', '1', get_edit_post_link( $post->ID, 'url' ) ) ); ?>"><?php _e('Take over'); ?></a>
<a class="button button-primary wp-tab-last" href="<?php echo esc_url( add_query_arg( 'get-post-lock', '1', wp_nonce_url( get_edit_post_link( $post->ID, 'url' ), 'lock-post_' . $post->ID ) ) ); ?>"><?php _e('Take over'); ?></a>
<?php
}
@@ -1532,6 +1560,7 @@ function wp_create_post_autosave( $post_data ) {
$post_data = _wp_translate_postdata( true, $post_data );
if ( is_wp_error( $post_data ) )
return $post_data;
$post_data = _wp_get_allowed_postdata( $post_data );
$post_author = get_current_user_id();

View File

@@ -448,7 +448,9 @@ final class WP_Screen {
switch ( $base ) {
case 'post' :
if ( isset( $_GET['post'] ) )
if ( isset( $_GET['post'] ) && isset( $_POST['post_ID'] ) && (int) $_GET['post'] !== (int) $_POST['post_ID'] )
wp_die( __( 'A post ID mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 );
elseif ( isset( $_GET['post'] ) )
$post_id = (int) $_GET['post'];
elseif ( isset( $_POST['post_ID'] ) )
$post_id = (int) $_POST['post_ID'];
@@ -970,7 +972,8 @@ final class WP_Screen {
switch ( $this->base ) {
case 'widgets':
$this->_screen_settings = '<p><a id="access-on" href="widgets.php?widgets-access=on">' . __('Enable accessibility mode') . '</a><a id="access-off" href="widgets.php?widgets-access=off">' . __('Disable accessibility mode') . "</a></p>\n";
$nonce = wp_create_nonce( 'widgets-access' );
$this->_screen_settings = '<p><a id="access-on" href="widgets.php?widgets-access=on&_wpnonce=' . urlencode( $nonce ) . '">' . __('Enable accessibility mode') . '</a><a id="access-off" href="widgets.php?widgets-access=off&_wpnonce=' . urlencode( $nonce ) . '">' . __('Disable accessibility mode') . "</a></p>\n";
break;
case 'post' :
$expand = '<div class="editor-expand hidden"><label for="editor-expand-toggle">';

View File

@@ -800,7 +800,7 @@ function page_template_dropdown( $default = '' ) {
ksort( $templates );
foreach ( array_keys( $templates ) as $template ) {
$selected = selected( $default, $templates[ $template ], false );
echo "\n\t<option value='" . $templates[ $template ] . "' $selected>$template</option>";
echo "\n\t<option value='" . esc_attr( $templates[ $template ] ) . "' $selected>" . esc_html( $template ) . "</option>";
}
}

View File

@@ -695,6 +695,9 @@ $_old_files = array(
'wp-includes/js/jquery/ui/jquery.ui.tooltip.min.js',
'wp-includes/js/jquery/ui/jquery.ui.widget.min.js',
'wp-includes/js/tinymce/skins/wordpress/images/dashicon-no-alt.png',
// 4.9.2
'wp-includes/js/mediaelement/flashmediaelement.swf',
'wp-includes/js/mediaelement/silverlightmediaelement.xap',
);
/**
@@ -1045,9 +1048,16 @@ function update_core($from, $to) {
$old_file = $to . $old_file;
if ( !$wp_filesystem->exists($old_file) )
continue;
$wp_filesystem->delete($old_file, true);
// If the file isn't deleted, try writing an empty string to the file instead.
if ( ! $wp_filesystem->delete( $old_file, true ) && $wp_filesystem->is_file( $old_file ) ) {
$wp_filesystem->put_contents( $old_file, '' );
}
}
// Remove any Genericons example.html's from the filesystem
_upgrade_422_remove_genericons();
// Upgrade DB with separate request
/** This filter is documented in wp-admin/includes/update-core.php */
apply_filters( 'update_feedback', __( 'Upgrading database&#8230;' ) );
@@ -1186,3 +1196,67 @@ window.location = 'about.php?updated';
exit();
}
add_action( '_core_updated_successfully', '_redirect_to_about_wordpress' );
/**
* Cleans up Genericons example files.
*
* @since 4.2.2
*/
function _upgrade_422_remove_genericons() {
global $wp_theme_directories, $wp_filesystem;
// A list of the affected files using the filesystem absolute paths.
$affected_files = array();
// Themes
foreach ( $wp_theme_directories as $directory ) {
$affected_theme_files = _upgrade_422_find_genericons_files_in_folder( $directory );
$affected_files = array_merge( $affected_files, $affected_theme_files );
}
// Plugins
$affected_plugin_files = _upgrade_422_find_genericons_files_in_folder( WP_PLUGIN_DIR );
$affected_files = array_merge( $affected_files, $affected_plugin_files );
foreach ( $affected_files as $file ) {
$gen_dir = $wp_filesystem->find_folder( trailingslashit( dirname( $file ) ) );
if ( empty( $gen_dir ) ) {
continue;
}
// The path when the file is accessed via WP_Filesystem may differ in the case of FTP
$remote_file = $gen_dir . basename( $file );
if ( ! $wp_filesystem->exists( $remote_file ) ) {
continue;
}
if ( ! $wp_filesystem->delete( $remote_file, false, 'f' ) ) {
$wp_filesystem->put_contents( $remote_file, '' );
}
}
}
/**
* Recursively find Genericons example files in a given folder.
*
* @ignore
* @since 4.2.2
*
* @param string $directory Directory path. Expects trailingslashed.
* @return array
*/
function _upgrade_422_find_genericons_files_in_folder( $directory ) {
$directory = trailingslashit( $directory );
$files = array();
if ( file_exists( "{$directory}example.html" ) && false !== strpos( file_get_contents( "{$directory}example.html" ), '<title>Genericons</title>' ) ) {
$files[] = "{$directory}example.html";
}
foreach ( glob( $directory . '*', GLOB_ONLYDIR ) as $dir ) {
$files = array_merge( $files, _upgrade_422_find_genericons_files_in_folder( $dir ) );
}
return $files;
}

View File

@@ -442,6 +442,9 @@ function upgrade_all() {
if ( $wp_current_db_version < 29630 )
upgrade_400();
if ( $wp_current_db_version < 30135 )
upgrade_415();
maybe_disable_link_manager();
maybe_disable_automattic_widgets();
@@ -1328,6 +1331,62 @@ function upgrade_400() {
}
}
/**
* Execute changes made in WordPress 4.1.4.
*
* @since 4.1.4
*/
function upgrade_414() {
}
/**
* Execute changes made in WordPress 4.1.5.
*
* @since 4.1.5
*/
function upgrade_415() {
global $wp_current_db_version, $wpdb;
if ( $wp_current_db_version < 30135 ) {
$content_length = $wpdb->get_col_length( $wpdb->comments, 'comment_content' );
if ( is_wp_error( $content_length ) ) {
return;
}
if ( false === $content_length ) {
$content_length = array(
'type' => 'byte',
'length' => 65535,
);
} elseif ( ! is_array( $content_length ) ) {
$length = (int) $content_length > 0 ? (int) $content_length : 65535;
$content_length = array(
'type' => 'byte',
'length' => $length
);
}
if ( 'byte' !== $content_length['type'] || 0 === $content_length['length'] ) {
// Sites with malformed DB schemas are on their own.
return;
}
$allowed_length = intval( $content_length['length'] ) - 10;
$comments = $wpdb->get_results(
"SELECT `comment_ID` FROM `{$wpdb->comments}`
WHERE `comment_date_gmt` > '2015-04-26'
AND LENGTH( `comment_content` ) >= {$allowed_length}
AND ( `comment_content` LIKE '%<%' OR `comment_content` LIKE '%>%' )"
);
foreach ( $comments as $comment ) {
wp_delete_comment( $comment->comment_ID, true );
}
}
}
/**
* Execute network level changes
*

View File

@@ -2003,6 +2003,16 @@
}
});
// Ensure preview nonce is included with every customized request, to allow post data to be read.
$.ajaxPrefilter( function injectPreviewNonce( options ) {
if ( ! /wp_customize=on/.test( options.data ) ) {
return;
}
options.data += '&' + $.param({
customize_preview_nonce: api.settings.nonce.preview
});
});
// Refresh the nonces if the preview sends updated nonces over.
api.previewer.bind( 'nonce', function( nonce ) {
$.extend( this.nonce, nonce );

File diff suppressed because one or more lines are too long

View File

@@ -272,7 +272,7 @@ if ( isset( $_GET['updated'] ) ) {
<tr>
<th scope="row"><label for="first_comment_author"><?php _e( 'First Comment Author' ) ?></label></th>
<td>
<input type="text" size="40" name="first_comment_author" id="first_comment_author" value="<?php echo get_site_option('first_comment_author') ?>" />
<input type="text" size="40" name="first_comment_author" id="first_comment_author" value="<?php echo esc_attr( get_site_option('first_comment_author') ); ?>" />
<p class="description">
<?php _e( 'The author of the first comment on a new site.' ) ?>
</p>

View File

@@ -93,9 +93,9 @@ default:
wp_die( $error );
if ( ( ! empty( $_GET['networkwide'] ) && ! is_plugin_active_for_network($file) ) || ! is_plugin_active($file) )
activate_plugin($file, "plugin-editor.php?file=$file&phperror=1", ! empty( $_GET['networkwide'] ) ); // we'll override this later if the plugin can be included without fatal error
activate_plugin($file, "plugin-editor.php?file=" . urlencode( $file ) . "&phperror=1", ! empty( $_GET['networkwide'] ) ); // we'll override this later if the plugin can be included without fatal error
wp_redirect( self_admin_url("plugin-editor.php?file=$file&a=te&scrollto=$scrollto") );
wp_redirect( self_admin_url("plugin-editor.php?file=" . urlencode( $file ) . "&a=te&scrollto=$scrollto") );
exit;
}
@@ -181,14 +181,14 @@ default:
<big><?php
if ( is_plugin_active($plugin) ) {
if ( is_writeable($real_file) )
echo sprintf(__('Editing <strong>%s</strong> (active)'), $file);
echo sprintf(__('Editing <strong>%s</strong> (active)'), esc_html( $file ) );
else
echo sprintf(__('Browsing <strong>%s</strong> (active)'), $file);
echo sprintf(__('Browsing <strong>%s</strong> (active)'), esc_html( $file ) );
} else {
if ( is_writeable($real_file) )
echo sprintf(__('Editing <strong>%s</strong> (inactive)'), $file);
echo sprintf(__('Editing <strong>%s</strong> (inactive)'), esc_html( $file ) );
else
echo sprintf(__('Browsing <strong>%s</strong> (inactive)'), $file);
echo sprintf(__('Browsing <strong>%s</strong> (inactive)'), esc_html( $file ) );
}
?></big>
</div>
@@ -232,7 +232,7 @@ foreach ( $plugin_files as $plugin_file ) :
continue;
}
?>
<li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>"><?php echo $plugin_file ?></a></li>
<li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>"><?php echo esc_html( $plugin_file ); ?></a></li>
<?php endforeach; ?>
</ul>
</div>

View File

@@ -17,7 +17,7 @@ $pagenum = $wp_list_table->get_pagenum();
$action = $wp_list_table->current_action();
$plugin = isset($_REQUEST['plugin']) ? $_REQUEST['plugin'] : '';
$plugin = isset($_REQUEST['plugin']) ? wp_unslash( $_REQUEST['plugin'] ) : '';
$s = isset($_REQUEST['s']) ? urlencode($_REQUEST['s']) : '';
// Clean up request URI from temporary args for screen options/paging uri's to work as expected.
@@ -37,10 +37,10 @@ if ( $action ) {
check_admin_referer('activate-plugin_' . $plugin);
$result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . $plugin), is_network_admin() );
$result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . urlencode( $plugin ) ), is_network_admin() );
if ( is_wp_error( $result ) ) {
if ( 'unexpected_output' == $result->get_error_code() ) {
$redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin . "&plugin_status=$status&paged=$page&s=$s");
$redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . urlencode( $plugin ) . "&plugin_status=$status&paged=$page&s=$s");
wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
exit;
} else {
@@ -67,7 +67,7 @@ if ( $action ) {
check_admin_referer('bulk-plugins');
$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
if ( is_network_admin() ) {
foreach ( $plugins as $i => $plugin ) {
@@ -107,9 +107,9 @@ if ( $action ) {
check_admin_referer( 'bulk-plugins' );
if ( isset( $_GET['plugins'] ) )
$plugins = explode( ',', $_GET['plugins'] );
$plugins = explode( ',', wp_unslash( $_GET['plugins'] ) );
elseif ( isset( $_POST['checked'] ) )
$plugins = (array) $_POST['checked'];
$plugins = (array) wp_unslash( $_POST['checked'] );
else
$plugins = array();
@@ -181,7 +181,7 @@ if ( $action ) {
check_admin_referer('bulk-plugins');
$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
// Do not deactivate plugins which are already deactivated.
if ( is_network_admin() ) {
$plugins = array_filter( $plugins, 'is_plugin_active_for_network' );
@@ -214,7 +214,7 @@ if ( $action ) {
check_admin_referer('bulk-plugins');
//$_POST = from the plugin form; $_GET = from the FTP details screen.
$plugins = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array();
$plugins = isset( $_REQUEST['checked'] ) ? (array) wp_unslash( $_REQUEST['checked'] ) : array();
if ( empty( $plugins ) ) {
wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
exit;
@@ -226,6 +226,14 @@ if ( $action ) {
exit;
}
// Bail on all if any paths are invalid.
// validate_file() returns truthy for invalid files
$invalid_plugin_files = array_filter( $plugins, 'validate_file' );
if ( $invalid_plugin_files ) {
wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
exit;
}
include(ABSPATH . 'wp-admin/update.php');
$parent_file = 'plugins.php';

View File

@@ -16,7 +16,9 @@ $submenu_file = 'edit.php';
wp_reset_vars( array( 'action' ) );
if ( isset( $_GET['post'] ) )
if ( isset( $_GET['post'] ) && isset( $_POST['post_ID'] ) && (int) $_GET['post'] !== (int) $_POST['post_ID'] )
wp_die( __( 'A post ID mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 );
elseif ( isset( $_GET['post'] ) )
$post_id = $post_ID = (int) $_GET['post'];
elseif ( isset( $_POST['post_ID'] ) )
$post_id = $post_ID = (int) $_POST['post_ID'];
@@ -82,6 +84,10 @@ function redirect_post($post_id = '') {
exit;
}
if ( isset( $_POST['post_type'] ) && $post && $post_type !== $_POST['post_type'] ) {
wp_die( __( 'A post type mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 );
}
if ( isset( $_POST['deletepost'] ) )
$action = 'delete';
elseif ( isset($_POST['wp-preview']) && 'dopreview' == $_POST['wp-preview'] )
@@ -113,8 +119,9 @@ case 'post-quickdraft-save':
if ( ! wp_verify_nonce( $nonce, 'add-post' ) )
$error_msg = __( 'Unable to submit this form, please refresh and try again.' );
if ( ! current_user_can( 'edit_posts' ) )
$error_msg = __( 'Oops, you don&#8217;t have access to add new drafts.' );
if ( ! current_user_can( 'edit_posts' ) ) {
exit;
}
if ( $error_msg )
return wp_dashboard_quick_press( $error_msg );
@@ -157,6 +164,7 @@ case 'edit':
wp_die( __( 'You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.' ) );
if ( ! empty( $_GET['get-post-lock'] ) ) {
check_admin_referer( 'lock-post_' . $post_id );
wp_set_post_lock( $post_id );
wp_redirect( get_edit_post_link( $post_id, 'url' ) );
exit();
@@ -219,7 +227,7 @@ case 'editattachment':
// Update the thumbnail filename
$newmeta = wp_get_attachment_metadata( $post_id, true );
$newmeta['thumb'] = $_POST['thumb'];
$newmeta['thumb'] = wp_basename( $_POST['thumb'] );
wp_update_attachment_metadata( $post_id, $newmeta );

View File

@@ -32,8 +32,25 @@ function press_it() {
if ( !current_user_can('edit_post', $post_ID) )
wp_die(__('You are not allowed to edit this post.'));
$post['post_category'] = isset($_POST['post_category']) ? $_POST['post_category'] : '';
$post['tax_input'] = isset($_POST['tax_input']) ? $_POST['tax_input'] : '';
// Only accept categories if the user actually can assign
$category_tax = get_taxonomy( 'category' );
if ( current_user_can( $category_tax->cap->assign_terms ) ) {
$post['post_category'] = ( ! empty( $_POST['post_category'] ) ) ? $_POST['post_category'] : array();
}
// Only accept taxonomies if the user can actually assign
if ( ! empty( $_POST['tax_input'] ) ) {
$tax_input = $_POST['tax_input'];
foreach ( $tax_input as $tax => $_ti ) {
$tax_object = get_taxonomy( $tax );
if ( ! $tax_object || ! current_user_can( $tax_object->cap->assign_terms ) ) {
unset( $tax_input[ $tax ] );
}
}
$post['tax_input'] = $tax_input;
}
$post['post_title'] = isset($_POST['title']) ? $_POST['title'] : '';
$content = isset($_POST['content']) ? $_POST['content'] : '';
@@ -523,75 +540,81 @@ $admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace(
</div>
</div>
<?php $tax = get_taxonomy( 'category' ); ?>
<div id="categorydiv" class="postbox">
<div class="handlediv" title="<?php esc_attr_e( 'Click to toggle' ); ?>"><br /></div>
<h3 class="hndle"><?php _e('Categories') ?></h3>
<div class="inside">
<div id="taxonomy-category" class="categorydiv">
<?php
<ul id="category-tabs" class="category-tabs">
<li class="tabs"><a href="#category-all"><?php echo $tax->labels->all_items; ?></a></li>
<li class="hide-if-no-js"><a href="#category-pop"><?php _e( 'Most Used' ); ?></a></li>
</ul>
$tax = get_taxonomy( 'category' );
if ( current_user_can( $tax->cap->assign_terms ) ) :
?>
<div id="categorydiv" class="postbox">
<div class="handlediv" title="<?php esc_attr_e( 'Click to toggle' ); ?>"><br /></div>
<h3 class="hndle"><?php _e('Categories') ?></h3>
<div class="inside">
<div id="taxonomy-category" class="categorydiv">
<div id="category-pop" class="tabs-panel" style="display: none;">
<ul id="categorychecklist-pop" class="categorychecklist form-no-clear" >
<?php $popular_ids = wp_popular_terms_checklist( 'category' ); ?>
<ul id="category-tabs" class="category-tabs">
<li class="tabs"><a href="#category-all"><?php echo $tax->labels->all_items; ?></a></li>
<li class="hide-if-no-js"><a href="#category-pop"><?php _e( 'Most Used' ); ?></a></li>
</ul>
</div>
<div id="category-all" class="tabs-panel">
<ul id="categorychecklist" data-wp-lists="list:category" class="categorychecklist form-no-clear">
<?php wp_terms_checklist($post_ID, array( 'taxonomy' => 'category', 'popular_cats' => $popular_ids ) ) ?>
</ul>
</div>
<?php if ( !current_user_can($tax->cap->assign_terms) ) : ?>
<p><em><?php _e('You cannot modify this Taxonomy.'); ?></em></p>
<?php endif; ?>
<?php if ( current_user_can($tax->cap->edit_terms) ) : ?>
<div id="category-adder" class="wp-hidden-children">
<h4>
<a id="category-add-toggle" href="#category-add" class="hide-if-no-js">
<?php printf( __( '+ %s' ), $tax->labels->add_new_item ); ?>
</a>
</h4>
<p id="category-add" class="category-add wp-hidden-child">
<label class="screen-reader-text" for="newcategory"><?php echo $tax->labels->add_new_item; ?></label>
<input type="text" name="newcategory" id="newcategory" class="form-required form-input-tip" value="<?php echo esc_attr( $tax->labels->new_item_name ); ?>" aria-required="true"/>
<label class="screen-reader-text" for="newcategory_parent">
<?php echo $tax->labels->parent_item_colon; ?>
</label>
<?php wp_dropdown_categories( array( 'taxonomy' => 'category', 'hide_empty' => 0, 'name' => 'newcategory_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $tax->labels->parent_item . ' &mdash;' ) ); ?>
<input type="button" id="category-add-submit" data-wp-lists="add:categorychecklist:category-add" class="button category-add-submit" value="<?php echo esc_attr( $tax->labels->add_new_item ); ?>" />
<?php wp_nonce_field( 'add-category', '_ajax_nonce-add-category', false ); ?>
<span id="category-ajax-response"></span>
</p>
<div id="category-pop" class="tabs-panel" style="display: none;">
<ul id="categorychecklist-pop" class="categorychecklist form-no-clear" >
<?php $popular_ids = wp_popular_terms_checklist( 'category' ); ?>
</ul>
</div>
<?php endif; ?>
</div>
</div>
</div>
<div id="tagsdiv-post_tag" class="postbox">
<div class="handlediv" title="<?php esc_attr_e( 'Click to toggle' ); ?>"><br /></div>
<h3><span><?php _e('Tags'); ?></span></h3>
<div class="inside">
<div class="tagsdiv" id="post_tag">
<div class="jaxtag">
<label class="screen-reader-text" for="newtag"><?php _e('Tags'); ?></label>
<input type="hidden" name="tax_input[post_tag]" class="the-tags" id="tax-input[post_tag]" value="" />
<div class="ajaxtag">
<input type="text" name="newtag[post_tag]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
<input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" />
<div id="category-all" class="tabs-panel">
<ul id="categorychecklist" data-wp-lists="list:category" class="categorychecklist form-no-clear">
<?php wp_terms_checklist($post_ID, array( 'taxonomy' => 'category', 'popular_cats' => $popular_ids ) ) ?>
</ul>
</div>
<?php if ( current_user_can($tax->cap->edit_terms) ) : ?>
<div id="category-adder" class="wp-hidden-children">
<h4>
<a id="category-add-toggle" href="#category-add" class="hide-if-no-js">
<?php printf( __( '+ %s' ), $tax->labels->add_new_item ); ?>
</a>
</h4>
<p id="category-add" class="category-add wp-hidden-child">
<label class="screen-reader-text" for="newcategory"><?php echo $tax->labels->add_new_item; ?></label>
<input type="text" name="newcategory" id="newcategory" class="form-required form-input-tip" value="<?php echo esc_attr( $tax->labels->new_item_name ); ?>" aria-required="true"/>
<label class="screen-reader-text" for="newcategory_parent">
<?php echo $tax->labels->parent_item_colon; ?>
</label>
<?php wp_dropdown_categories( array( 'taxonomy' => 'category', 'hide_empty' => 0, 'name' => 'newcategory_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $tax->labels->parent_item . ' &mdash;' ) ); ?>
<input type="button" id="category-add-submit" data-wp-lists="add:categorychecklist:category-add" class="button category-add-submit" value="<?php echo esc_attr( $tax->labels->add_new_item ); ?>" />
<?php wp_nonce_field( 'add-category', '_ajax_nonce-add-category', false ); ?>
<span id="category-ajax-response"></span>
</p>
</div>
</div>
<div class="tagchecklist"></div>
<?php endif; ?>
</div>
</div>
<p class="tagcloud-link"><a href="#titlediv" class="tagcloud-link" id="link-post_tag"><?php _e('Choose from the most used tags'); ?></a></p>
</div>
</div>
<?php endif;
$tax = get_taxonomy( 'post_tag' );
if ( current_user_can( $tax->cap->assign_terms ) ) :
?>
<div id="tagsdiv-post_tag" class="postbox">
<div class="handlediv" title="<?php esc_attr_e( 'Click to toggle' ); ?>"><br /></div>
<h3><span><?php _e('Tags'); ?></span></h3>
<div class="inside">
<div class="tagsdiv" id="post_tag">
<div class="jaxtag">
<label class="screen-reader-text" for="newtag"><?php _e('Tags'); ?></label>
<input type="hidden" name="tax_input[post_tag]" class="the-tags" id="tax-input[post_tag]" value="" />
<div class="ajaxtag">
<input type="text" name="newtag[post_tag]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
<input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" />
</div>
</div>
<div class="tagchecklist"></div>
</div>
<p class="tagcloud-link"><a href="#titlediv" class="tagcloud-link" id="link-post_tag"><?php _e('Choose from the most used tags'); ?></a></p>
</div>
</div>
<?php endif; ?>
</div>
</div>
<div class="posting">

View File

@@ -63,7 +63,7 @@ default :
if ( ! $post = get_post( $revision->post_parent ) )
break;
if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'read_post', $post->ID ) )
if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'edit_post', $revision->post_parent ) )
break;
// Revisions disabled and we're not looking at an autosave

View File

@@ -68,7 +68,7 @@ if ( empty( $file ) ) {
$relative_file = 'style.css';
$file = $allowed_files['style.css'];
} else {
$relative_file = $file;
$relative_file = wp_unslash( $file );
$file = $theme->get_stylesheet_directory() . '/' . $relative_file;
}
@@ -125,10 +125,12 @@ default:
<div id="message" class="updated"><p><?php _e( 'File edited successfully.' ) ?></p></div>
<?php endif;
$description = get_file_description( $file );
$file_description = get_file_description( $relative_file );
$file_show = array_search( $file, array_filter( $allowed_files ) );
if ( $description != $file_show )
$description .= ' <span>(' . $file_show . ')</span>';
$description = esc_html( $file_description );
if ( $file_description != $file_show ) {
$description .= ' <span>(' . esc_html( $file_show ) . ')</span>';
}
?>
<div class="wrap">
<h2><?php echo esc_html( $title ); ?></h2>
@@ -177,9 +179,9 @@ if ( $allowed_files ) :
if ( 'style.css' == $filename )
echo "\t</ul>\n\t<h3>" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . "</h3>\n\t<ul>\n";
$file_description = get_file_description( $absolute_filename );
$file_description = esc_html( get_file_description( $filename ) );
if ( $file_description != basename( $filename ) )
$file_description .= '<br /><span class="nonessential">(' . $filename . ')</span>';
$file_description .= '<br /><span class="nonessential">(' . esc_html( $filename ) . ')</span>';
if ( $absolute_filename == $file )
$file_description = '<span class="highlight">' . $file_description . '</span>';

View File

@@ -240,6 +240,8 @@ function list_plugin_updates() {
<tbody class="plugins">
<?php
foreach ( (array) $plugins as $plugin_file => $plugin_data) {
$plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
$info = plugins_api('plugin_information', array('slug' => $plugin_data->update->slug ));
if ( is_wp_error( $info ) ) {
$info = false;

View File

@@ -99,7 +99,7 @@ if ( is_multisite()
// Execute confirmed email change. See send_confirmation_on_profile_email().
if ( is_multisite() && IS_PROFILE_PAGE && isset( $_GET[ 'newuseremail' ] ) && $current_user->ID ) {
$new_email = get_option( $current_user->ID . '_new_email' );
if ( $new_email[ 'hash' ] == $_GET[ 'newuseremail' ] ) {
if ( $new_email && hash_equals( $new_email[ 'hash' ], $_GET[ 'newuseremail' ] ) ) {
$user = new stdClass;
$user->ID = $current_user->ID;
$user->user_email = esc_html( trim( $new_email[ 'newemail' ] ) );
@@ -110,7 +110,8 @@ if ( is_multisite() && IS_PROFILE_PAGE && isset( $_GET[ 'newuseremail' ] ) && $c
wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );
die();
}
} elseif ( is_multisite() && IS_PROFILE_PAGE && !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' == $_GET['dismiss'] ) {
} elseif ( is_multisite() && IS_PROFILE_PAGE && !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' === $_GET['dismiss'] ) {
check_admin_referer( 'dismiss-' . $current_user->ID . '_new_email' );
delete_option( $current_user->ID . '_new_email' );
wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );
die();
@@ -204,7 +205,7 @@ include(ABSPATH . 'wp-admin/admin-header.php');
<p><strong><?php _e('User updated.') ?></strong></p>
<?php endif; ?>
<?php if ( $wp_http_referer && !IS_PROFILE_PAGE ) : ?>
<p><a href="<?php echo esc_url( $wp_http_referer ); ?>"><?php _e('&larr; Back to Users'); ?></a></p>
<p><a href="<?php echo esc_url( wp_validate_redirect( esc_url_raw( $wp_http_referer ), self_admin_url( 'users.php' ) ) ); ?>"><?php _e('&larr; Back to Users'); ?></a></p>
<?php endif; ?>
</div>
<?php endif; ?>
@@ -413,7 +414,7 @@ if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_c
$new_email = get_option( $current_user->ID . '_new_email' );
if ( $new_email && $new_email['newemail'] != $current_user->user_email && $profileuser->ID == $current_user->ID ) : ?>
<div class="updated inline">
<p><?php printf( __('There is a pending change of your e-mail to <code>%1$s</code>. <a href="%2$s">Cancel</a>'), $new_email['newemail'], esc_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ) ) ); ?></p>
<p><?php printf( __('There is a pending change of your e-mail to <code>%1$s</code>. <a href="%2$s">Cancel</a>'), esc_html( $new_email['newemail'] ), esc_url( wp_nonce_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ), 'dismiss-' . $current_user->ID . '_new_email' ) ) ); ?></p>
</div>
<?php endif; ?>
</td>

View File

@@ -69,7 +69,7 @@ if ( isset($_REQUEST['action']) && 'adduser' == $_REQUEST['action'] ) {
add_existing_user_to_blog( array( 'user_id' => $user_id, 'role' => $_REQUEST[ 'role' ] ) );
$redirect = add_query_arg( array('update' => 'addnoconfirmation'), 'user-new.php' );
} else {
$newuser_key = substr( md5( $user_id ), 0, 5 );
$newuser_key = wp_generate_password( 20, false );
add_option( 'new_user_' . $newuser_key, array( 'user_id' => $user_id, 'email' => $user_details->user_email, 'role' => $_REQUEST[ 'role' ] ) );
$roles = get_editable_roles();

View File

@@ -17,6 +17,8 @@ if ( ! current_user_can('edit_theme_options') )
$widgets_access = get_user_setting( 'widgets_access' );
if ( isset($_GET['widgets-access']) ) {
check_admin_referer( 'widgets-access' );
$widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off';
set_user_setting( 'widgets_access', $widgets_access );
}

View File

@@ -108,6 +108,8 @@ if ( $user->exists() ) {
) {
kses_remove_filters(); // start with a clean slate
kses_init_filters(); // set up the filters
remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
add_filter( 'pre_comment_content', 'wp_filter_kses' );
}
}
} else {

View File

@@ -1,719 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Genericons</title>
<link rel="stylesheet" href="genericons.css">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style type="text/css">
/**
* Example page CSS
*/
body {
font-family: sans-serif;
line-height: 1.5;
margin: 0;
color: #2f2d2c;
background: #fff;
font-size: 11pt;
}
a {
color: #2f2d2c;
}
h4 {
margin-top: 40px;
}
#iconlist {
clear: both;
margin-bottom: 20px;
}
#iconlist div {
padding: 10px;
overflow: hidden;
white-space: nowrap;
font-size: 32px;
line-height: 1;
position: relative;
width: 32px;
height: 32px;
}
#iconlist div:before {
margin-right: 20px;
}
#iconlist div:hover {
cursor: pointer;
color: #e4c05c;
}
#primary {
background: #e4c05c;
overflow: hidden;
}
#content {
position: relative;
color: #fff;
max-width: 980px;
padding: 0 10px;
margin: 0 auto;
}
#icons {
background: #fbfbfb;
}
#icons #iconlist {
max-width: 980px;
box-sizing: border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
padding: 20px 0;
margin: 0 auto;
}
#glyph {
float: left;
width: 50%;
box-sizing: border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
-ms-box-sizing:border-box;
padding: 20px 0;
}
#glyph .info {
float: right;
width: 180px;
padding: 36px 0 0 0;
}
#glyph .info a {
color: #2f2d2c;
display: block;
padding: 8px 0 8px 15px;
}
#glyph .info strong {
font-weight: normal;
display: block;
padding: 8px 0;
}
#glyph .genericon {
font-size: 256px;
width: 256px;
height: 256px;
overflow: visible;
float: left;
}
.description {
margin-top: 50px;
width: 48%;
float: right;
padding-left: 40px;
margin-left: 2%;
box-sizing: border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
-ms-box-sizing:border-box;
background-size: 4px 4px;
}
#primary h2 {
color: white;
margin: 0 auto;
padding: 22px 0 0 20px;
max-width: 980px;
font-size: 2em;
}
#primary h2 span {
display: block;
font-weight: normal;
font-size: 12pt;
}
#footer {
clear: both;
max-width: 980px;
margin: 80px auto;
text-align: center;
text-transform: uppercase;
letter-spacing: .1em;
font-size: 7pt;
color: #ddd;
}
#footer a {
color: #ccc;
display: inline-block;
width: 150px;
overflow: hidden;
text-indent: 100%;
position: relative;
top: 2px;
opacity: .3;
background-repeat: no-repeat;
background-position: center top;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjQsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTUwcHgiIGhlaWdodD0iMTRweCIgdmlld0JveD0iMTAgMCAxNTAgMTQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMTAgMCAxNTAgMTQiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZmlsbD0iIzQ0NDQ0NCIgZD0iTTY1LjQzOCwxMi41Yy0zLjYyNiwwLTUuOTc2LTIuNjEyLTUuOTc2LTUuMzMxVjYuODMxYzAtMi43NjUsMi4zNTEtNS4zMyw1Ljk3Ni01LjMzDQoJCWMzLjY0MSwwLDUuOTksMi41NjUsNS45OSw1LjMzdjAuMzM5QzcxLjQyOCw5Ljg4OCw2OS4wNzksMTIuNSw2NS40MzgsMTIuNXogTTY5LjQ5Miw2Ljg2MWMwLTEuOTgtMS40NDQtMy43NDgtNC4wNTUtMy43NDgNCgkJcy00LjA0LDEuNzY4LTQuMDQsMy43NDh2MC4yNDZjMCwxLjk4MSwxLjQyOSwzLjc3OSw0LjA0LDMuNzc5czQuMDU1LTEuNzk4LDQuMDU1LTMuNzc5VjYuODYxeiIvPg0KCTxwYXRoIGZpbGw9IiM0NDQ0NDQiIGQ9Ik0yNC40OTgsMTIuMWwtMS4zNTItMi41MzVoLTYuMDA3TDE1LjgzNCwxMi4xaC0yLjAyOGw1LjUzMS0xMC4yM2gxLjU5N2w1LjYyMiwxMC4yM0gyNC40OThMMjQuNDk4LDEyLjF6DQoJCSBNMjAuMDksMy44NjZsLTIuMjI4LDQuMzAxaDQuNTMxTDIwLjA5LDMuODY2eiIvPg0KCTxwYXRoIGZpbGw9IiM0NDQ0NDQiIGQ9Ik0zNS4yODEsMTIuNWMtMy42NzEsMC01LjM3Ni0xLjk5Ni01LjM3Ni00LjY1NFYxLjg3aDEuOTA0djYuMDA2YzAsMS44OTEsMS4yNDUsMy4wMTMsMy42MSwzLjAxMw0KCQljMi40MjgsMCwzLjQyNi0xLjEyMiwzLjQyNi0zLjAxM1YxLjg3aDEuOTJ2NS45NzZDNDAuNzY3LDEwLjM4LDM5LjEzOCwxMi41LDM1LjI4MSwxMi41eiIvPg0KCTxwYXRoIGZpbGw9IiM0NDQ0NDQiIGQ9Ik01MS40NTgsMy40NjdWMTIuMWgtMS45MTlWMy40NjdoLTQuNDcxVjEuODdoMTAuODZ2MS41OThMNTEuNDU4LDMuNDY3TDUxLjQ1OCwzLjQ2N3oiLz4NCgk8cGF0aCBmaWxsPSIjNDQ0NDQ0IiBkPSJNODguNTQzLDEyLjFWNC4wMDRsLTAuNTA5LDAuODkxTDgzLjc0OSwxMi4xaC0wLjkzN2wtNC4yNC03LjIwNWwtMC41MDYtMC44OTFWMTIuMWgtMS44NzVWMS44N2gyLjY1OA0KCQlsNC4wNCw3LjAyMWwwLjQ3NiwwLjg2bDAuNDc3LTAuODZsMy45OTQtNy4wMjFoMi42MjdWMTIuMUg4OC41NDNMODguNTQzLDEyLjF6Ii8+DQoJPHBhdGggZmlsbD0iIzQ0NDQ0NCIgZD0iTTEwNC45NzgsMTIuMWwtMS4zNTItMi41MzVoLTYuMDA4TDk2LjMxMywxMi4xaC0yLjAyOGw1LjUzMS0xMC4yMzFoMS41OTlsNS42MjIsMTAuMjMxSDEwNC45Nzh6DQoJCSBNMTAwLjU3LDMuODY2bC0yLjIyOCw0LjMwMWg0LjUyOUwxMDAuNTcsMy44NjZ6Ii8+DQoJPHBhdGggZmlsbD0iIzQ0NDQ0NCIgZD0iTTExNC43NzgsMy40NjdWMTIuMWgtMS45MlYzLjQ2N2gtNC40N1YxLjg3aDEwLjg2djEuNTk4TDExNC43NzgsMy40NjdMMTE0Ljc3OCwzLjQ2N3oiLz4NCgk8cGF0aCBmaWxsPSIjNDQ0NDQ0IiBkPSJNMTI4Ljg2NiwzLjQ2N1YxMi4xaC0xLjkxOVYzLjQ2N2gtNC40NzJWMS44N2gxMC44NnYxLjU5OEwxMjguODY2LDMuNDY3TDEyOC44NjYsMy40Njd6Ii8+DQoJPHBhdGggZmlsbD0iIzQ0NDQ0NCIgZD0iTTEzOC4wNjcsMTIuMVYyLjgzN2MwLjc2OSwwLDEuMDc2LTAuNDE1LDEuMDc2LTAuOTY4aDAuODE0VjEyLjFIMTM4LjA2N0wxMzguMDY3LDEyLjF6Ii8+DQoJPHBhdGggZmlsbD0iIzQ0NDQ0NCIgZD0iTTE1NC45OTYsNC43NTdjLTAuOTIxLTAuODQ1LTIuMjc0LTEuNjQ0LTQuMTAyLTEuNjQ0Yy0yLjczMywwLTQuMjcsMS44NzUtNC4yNywzLjgyNXYwLjINCgkJYzAsMS45MzcsMS41NTEsMy43NDgsNC40MDgsMy43NDhjMS43MDUsMCwzLjExOC0wLjgxNCw0LjAwOS0xLjY0NGwxLjE1MiwxLjIxNWMtMS4xMjEsMS4xMDctMy4wMjYsMi4wNDMtNS4yODUsMi4wNDMNCgkJYy0zLjg3LDAtNi4yMjMtMi41MjEtNi4yMjMtNS4yODRWNi44NzdjMC0yLjc2NiwyLjU2Ni01LjM3Nyw2LjMxNC01LjM3N2MyLjE2NywwLDQuMTM2LDAuOTA2LDUuMTk0LDIuMDQzTDE1NC45OTYsNC43NTd6Ii8+DQoJPHBhdGggZmlsbD0iIzQ0NDQ0NCIgZD0iTTY2LjcwMiw1LjA2YzAuMzQ3LDAuMjI0LDAuNDQ0LDAuNjg3LDAuMjE5LDEuMDM3TDY1LjE2OSw4LjgxYy0wLjIyNSwwLjM0Ny0wLjY4OCwwLjQ0OC0xLjAzMywwLjIyOWwwLDANCgkJQzYzLjc5LDguODEyLDYzLjY5Miw4LjM1MSw2My45MTcsOGwxLjc1MS0yLjcxM0M2NS44OTMsNC45MzgsNjYuMzU1LDQuODM3LDY2LjcwMiw1LjA2TDY2LjcwMiw1LjA2eiIvPg0KPC9nPg0KPC9zdmc+DQo=');
}
#footer a:hover {
opacity: 1;
}
pre, code {
font: 14px/1.5 monospace;
}
.code {
display: block;
font: 14px/1.5 monospace;
width: 600px;
white-space: pre;
border: 1px solid #ccc;
padding: 10px;
overflow: auto;
min-height: 110px;
}
#iconlist .new, #iconlist .update {
position: relative;
}
#iconlist .new:after, #iconlist .update:after {
color: #e4c05c;
display: block;
content: "NEW";
font: bold 8px/1 sans-serif;
position: absolute;
top: 0px;
text-align: center;
z-index: 10;
width: 100%;
}
#iconlist .update:after {
content: "UPDATE";
left: -1px;
}
body.searching #iconlist span.update:after, body.searching #iconlist span.new:after {
display: none;
}
#search {
border: 0;
border-radius: 2px;
position: absolute;
right: 20px;
font: 11pt sans-serif;
padding: 10px;
top: 20px;
background: rgba(255,255,255,.8);
}
#search:focus {
background: #fff;
outline: none;
}
.genericon-404 {
display: none !important; /* This is an easter egg */
}
.genericon:after {
content: attr(alt);
display: block;
font-size: 9px;
color: #999;
text-align: center;
}
.hideUACs.genericon:after {
content: none;
}
@media only screen and ( max-width: 900px ) {
#glyph {
float: none;
width: 100%;
}
#glyph .info {
width: 30%;
}
#glyph .genericon {
width: 70%;
}
.description {
clear: both;
width: 100%;
background: none;
padding-left: 0;
float: none;
}
}
</style>
<script type="text/javascript">
/**
* Example page JS
*/
function copyToClipboard ( text, copyMode ) {
if ( copyMode == "css" ) {
window.prompt( "Copy this, then paste in your CSS :before selector.", text );
} else if ( copyMode == "html" ) {
window.prompt( "Copy this, then paste in your HTML.", text );
} else {
window.prompt( "Copy this, then paste in your Photoshop textfield.", text );
}
}
function pickRandomIcon() {
var divs = jQuery("#iconlist div").get().sort(function(){
return Math.round(Math.random())-0.5;
}).slice(0,1);
attr = jQuery(divs).attr('alt');
cssclass = jQuery(divs).attr('class');
displayGlyph( attr, cssclass );
}
function displayGlyph( attr, cssclass ) {
// set permalink
var permalink = cssclass.split(' genericon-')[1];
window.location.hash = permalink;
// css copy string
csstext = "content: \'\\" + attr + "';";
// html copy string
htmltext = '<span class="' + cssclass + '"></span>';
// glyph copy string
glyphtemp = "&#x" + attr + ";";
jQuery('#temp').html( glyphtemp );
glyphtext = jQuery('#temp').text();
// final output
output = '<div class="' + cssclass + '"></div>'
+ '<div class="info">'
+ '<strong>&larr; ' + cssclass.split( ' ' )[1] + '</strong>'
+ '<a href="javascript:copyToClipboard(csstext, \'css\')">Copy CSS</a>'
+ '<a href="javascript:copyToClipboard(htmltext, \'html\')">Copy HTML</a>'
+ '<a href="javascript:copyToClipboard(glyphtext)">Copy Glyph</a>'
+ '</div>';
jQuery( '#glyph' ).html( output );
}
function sortUnicode ( a, b ) {
var numberA = jQuery(a).attr('alt').replace('f', '');
var numberB = jQuery(b).attr('alt').replace('f', '');
var contentA =parseInt( numberA, 16 );
var contentB =parseInt( numberB, 16 );
return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0;
}
jQuery(document).ready(function() {
// pick random icon if no permalink, otherwise go to permalink
if ( window.location.hash ) {
permalink = "genericon-" + window.location.hash.split('#')[1];
attr = jQuery( '.' + permalink ).attr( 'alt' );
cssclass = jQuery( '.' + permalink ).attr('class');
displayGlyph( attr, cssclass );
} else {
pickRandomIcon();
}
jQuery( '#iconlist div' ).click(function() {
attr = jQuery( this ).attr( 'alt' );
cssclass = jQuery( this ).attr( 'class' );
displayGlyph( attr, cssclass );
});
var $rows = jQuery('#iconlist div');
jQuery('#search').keyup(function() {
// remove update text when using search
jQuery('body').addClass('searching');
var val = jQuery.trim(jQuery(this).val()).replace(/ +/g, ' ').toLowerCase();
$rows.show().filter(function() {
var text = jQuery(this).text().replace(/\s+/g, ' ').toLowerCase();
return !~text.indexOf(val);
}).hide();
});
jQuery('input#search').focus();
// sort based on number
jQuery('#iconlist div').sort( sortUnicode ).appendTo('#iconlist');
});
function toggleUACs() {
jQuery('.genericon').toggleClass('hideUACs');
}
</script>
</head>
<body>
<div id="main">
<div id="primary">
<div id="content">
<h2>Genericons <span>&mdash; A free, GPL, flexible icon font for blogs!</span></h2>
<input placeholder="Filter..." name="search" id="search" type="text" value="" maxlength="150" />
<div id="glyph">
</div>
<div class="description">
<p>Genericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic. Use for instant HiDPI or to easily change colors on the fly.</p>
</div>
</div>
</div>
<div id="icons">
<div id="iconlist">
<!-- note, the text inside the HTML elements is purely for the seach -->
<div alt="f423" class="genericon genericon-404" title="genericon-404">404</div>
<div alt="f508" class="genericon genericon-activity" title="genericon-activity">activity</div>
<div alt="f509" class="genericon genericon-anchor" title="genericon-anchor">anchor</div>
<div alt="f101" class="genericon genericon-aside" title="genericon-aside">aside</div>
<div alt="f416" class="genericon genericon-attachment" title="genericon-attachment">attachment</div>
<div alt="f109" class="genericon genericon-audio" title="genericon-audio">audio</div>
<div alt="f471" class="genericon genericon-bold" title="genericon-bold">bold</div>
<div alt="f444" class="genericon genericon-book" title="genericon-book">book</div>
<div alt="f50a" class="genericon genericon-bug" title="genericon-bug">bug</div>
<div alt="f447" class="genericon genericon-cart" title="genericon-cart">cart</div>
<div alt="f301" class="genericon genericon-category" title="genericon-category">category</div>
<div alt="f108" class="genericon genericon-chat" title="genericon-chat">chat</div>
<div alt="f418" class="genericon genericon-checkmark" title="genericon-checkmark">checkmark</div>
<div alt="f405" class="genericon genericon-close" title="genericon-close">close</div>
<div alt="f406" class="genericon genericon-close-alt" title="genericon-close-alt">close-alt</div>
<div alt="f426" class="genericon genericon-cloud" title="genericon-cloud">cloud</div>
<div alt="f440" class="genericon genericon-cloud-download" title="genericon-cloud-download">cloud-download</div>
<div alt="f441" class="genericon genericon-cloud-upload" title="genericon-cloud-upload">cloud-upload</div>
<div alt="f462" class="genericon genericon-code" title="genericon-code">code</div>
<div alt="f216" class="genericon genericon-codepen" title="genericon-codepen">codepen</div>
<div alt="f445" class="genericon genericon-cog" title="genericon-cog">cog</div>
<div alt="f432" class="genericon genericon-collapse" title="genericon-collapse">collapse</div>
<div alt="f300" class="genericon genericon-comment" title="genericon-comment">comment</div>
<div alt="f305" class="genericon genericon-day" title="genericon-day">day</div>
<div alt="f221" class="genericon genericon-digg" title="genericon-digg">digg</div>
<div alt="f443" class="genericon genericon-document" title="genericon-document">document</div>
<div alt="f428" class="genericon genericon-dot" title="genericon-dot">dot</div>
<div alt="f502" class="genericon genericon-downarrow" title="genericon-downarrow">downarrow</div>
<div alt="f50b" class="genericon genericon-download" title="genericon-download">download</div>
<div alt="f436" class="genericon genericon-draggable" title="genericon-draggable">draggable</div>
<div alt="f201" class="genericon genericon-dribbble" title="genericon-dribbble">dribbble</div>
<div alt="f225" class="genericon genericon-dropbox" title="genericon-dropbox">dropbox</div>
<div alt="f433" class="genericon genericon-dropdown" title="genericon-dropdown">dropdown</div>
<div alt="f434" class="genericon genericon-dropdown-left" title="genericon-dropdown-left">dropdown-left</div>
<div alt="f411" class="genericon genericon-edit" title="genericon-edit">edit</div>
<div alt="f476" class="genericon genericon-ellipsis" title="genericon-ellipsis">ellipsis</div>
<div alt="f431" class="genericon genericon-expand" title="genericon-expand">expand</div>
<div alt="f442" class="genericon genericon-external" title="genericon-external">external</div>
<div alt="f203" class="genericon genericon-facebook" title="genericon-facebook">facebook</div>
<div alt="f204" class="genericon genericon-facebook-alt" title="genericon-facebook-alt">facebook-alt</div>
<div alt="f458" class="genericon genericon-fastforward" title="genericon-fastforward">fastforward</div>
<div alt="f413" class="genericon genericon-feed" title="genericon-feed">feed</div>
<div alt="f468" class="genericon genericon-flag" title="genericon-flag">flag</div>
<div alt="f211" class="genericon genericon-flickr" title="genericon-flickr">flickr</div>
<div alt="f226" class="genericon genericon-foursquare" title="genericon-foursquare">foursquare</div>
<div alt="f474" class="genericon genericon-fullscreen" title="genericon-fullscreen">fullscreen</div>
<div alt="f103" class="genericon genericon-gallery" title="genericon-gallery">gallery</div>
<div alt="f200" class="genericon genericon-github" title="genericon-github">github</div>
<div alt="f206" class="genericon genericon-googleplus" title="genericon-googleplus">googleplus</div>
<div alt="f218" class="genericon genericon-googleplus-alt" title="genericon-googleplus-alt">googleplus-alt</div>
<div alt="f50c" class="genericon genericon-handset" title="genericon-handset">handset</div>
<div alt="f461" class="genericon genericon-heart" title="genericon-heart">heart</div>
<div alt="f457" class="genericon genericon-help" title="genericon-help">help</div>
<div alt="f404" class="genericon genericon-hide" title="genericon-hide">hide</div>
<div alt="f505" class="genericon genericon-hierarchy" title="genericon-hierarchy">hierarchy</div>
<div alt="f409" class="genericon genericon-home" title="genericon-home">home</div>
<div alt="f102" class="genericon genericon-image" title="genericon-image">image</div>
<div alt="f455" class="genericon genericon-info" title="genericon-info">info</div>
<div alt="f215" class="genericon genericon-instagram" title="genericon-instagram">instagram</div>
<div alt="f472" class="genericon genericon-italic" title="genericon-italic">italic</div>
<div alt="f427" class="genericon genericon-key" title="genericon-key">key</div>
<div alt="f503" class="genericon genericon-leftarrow" title="genericon-leftarrow">leftarrow</div>
<div alt="f107" class="genericon genericon-link" title="genericon-link">link</div>
<div alt="f207" class="genericon genericon-linkedin" title="genericon-linkedin">linkedin</div>
<div alt="f208" class="genericon genericon-linkedin-alt" title="genericon-linkedin-alt">linkedin-alt</div>
<div alt="f417" class="genericon genericon-location" title="genericon-location">location</div>
<div alt="f470" class="genericon genericon-lock" title="genericon-lock">lock</div>
<div alt="f410" class="genericon genericon-mail" title="genericon-mail">mail</div>
<div alt="f422" class="genericon genericon-maximize" title="genericon-maximize">maximize</div>
<div alt="f419" class="genericon genericon-menu" title="genericon-menu">menu</div>
<div alt="f50d" class="genericon genericon-microphone" title="genericon-microphone">microphone</div>
<div alt="f421" class="genericon genericon-minimize" title="genericon-minimize">minimize</div>
<div alt="f50e" class="genericon genericon-minus" title="genericon-minus">minus</div>
<div alt="f307" class="genericon genericon-month" title="genericon-month">month</div>
<div alt="f50f" class="genericon genericon-move" title="genericon-move">move</div>
<div alt="f429" class="genericon genericon-next" title="genericon-next">next</div>
<div alt="f456" class="genericon genericon-notice" title="genericon-notice">notice</div>
<div alt="f506" class="genericon genericon-paintbrush" title="genericon-paintbrush">paintbrush</div>
<div alt="f219" class="genericon genericon-path" title="genericon-path">path</div>
<div alt="f448" class="genericon genericon-pause" title="genericon-pause">pause</div>
<div alt="f437" class="genericon genericon-phone" title="genericon-phone">phone</div>
<div alt="f473" class="genericon genericon-picture" title="genericon-picture">picture</div>
<div alt="f308" class="genericon genericon-pinned" title="genericon-pinned">pinned</div>
<div alt="f209" class="genericon genericon-pinterest" title="genericon-pinterest">pinterest</div>
<div alt="f210" class="genericon genericon-pinterest-alt" title="genericon-pinterest-alt">pinterest-alt</div>
<div alt="f452" class="genericon genericon-play" title="genericon-play">play</div>
<div alt="f439" class="genericon genericon-plugin" title="genericon-plugin">plugin</div>
<div alt="f510" class="genericon genericon-plus" title="genericon-plus">plus</div>
<div alt="f224" class="genericon genericon-pocket" title="genericon-pocket">pocket</div>
<div alt="f217" class="genericon genericon-polldaddy" title="genericon-polldaddy">polldaddy</div>
<div alt="f460" class="genericon genericon-portfolio" title="genericon-portfolio">portfolio</div>
<div alt="f430" class="genericon genericon-previous" title="genericon-previous">previous</div>
<div alt="f469" class="genericon genericon-print" title="genericon-print">print</div>
<div alt="f106" class="genericon genericon-quote" title="genericon-quote">quote</div>
<div alt="f511" class="genericon genericon-rating-empty" title="genericon-rating-empty">rating-empty</div>
<div alt="f512" class="genericon genericon-rating-full" title="genericon-rating-full">rating-full</div>
<div alt="f513" class="genericon genericon-rating-half" title="genericon-rating-half">rating-half</div>
<div alt="f222" class="genericon genericon-reddit" title="genericon-reddit">reddit</div>
<div alt="f420" class="genericon genericon-refresh" title="genericon-refresh">refresh</div>
<div alt="f412" class="genericon genericon-reply" title="genericon-reply">reply</div>
<div alt="f466" class="genericon genericon-reply-alt" title="genericon-reply-alt">reply-alt</div>
<div alt="f467" class="genericon genericon-reply-single" title="genericon-reply-single">reply-single</div>
<div alt="f459" class="genericon genericon-rewind" title="genericon-rewind">rewind</div>
<div alt="f501" class="genericon genericon-rightarrow" title="genericon-rightarrow">rightarrow</div>
<div alt="f400" class="genericon genericon-search" title="genericon-search">search</div>
<div alt="f438" class="genericon genericon-send-to-phone" title="genericon-send-to-phone">send-to-phone</div>
<div alt="f454" class="genericon genericon-send-to-tablet" title="genericon-send-to-tablet">send-to-tablet</div>
<div alt="f415" class="genericon genericon-share" title="genericon-share">share</div>
<div alt="f403" class="genericon genericon-show" title="genericon-show">show</div>
<div alt="f514" class="genericon genericon-shuffle" title="genericon-shuffle">shuffle</div>
<div alt="f507" class="genericon genericon-sitemap" title="genericon-sitemap">sitemap</div>
<div alt="f451" class="genericon genericon-skip-ahead" title="genericon-skip-ahead">skip-ahead</div>
<div alt="f450" class="genericon genericon-skip-back" title="genericon-skip-back">skip-back</div>
<div alt="f220" class="genericon genericon-skype" title="genericon-skype">skype</div>
<div alt="f424" class="genericon genericon-spam" title="genericon-spam">spam</div>
<div alt="f515" class="genericon genericon-spotify" title="genericon-spotify">spotify</div>
<div alt="f100" class="genericon genericon-standard" title="genericon-standard">standard</div>
<div alt="f408" class="genericon genericon-star" title="genericon-star">star</div>
<div alt="f105" class="genericon genericon-status" title="genericon-status">status</div>
<div alt="f449" class="genericon genericon-stop" title="genericon-stop">stop</div>
<div alt="f223" class="genericon genericon-stumbleupon" title="genericon-stumbleupon">stumbleupon</div>
<div alt="f463" class="genericon genericon-subscribe" title="genericon-subscribe">subscribe</div>
<div alt="f465" class="genericon genericon-subscribed" title="genericon-subscribed">subscribed</div>
<div alt="f425" class="genericon genericon-summary" title="genericon-summary">summary</div>
<div alt="f453" class="genericon genericon-tablet" title="genericon-tablet">tablet</div>
<div alt="f302" class="genericon genericon-tag" title="genericon-tag">tag</div>
<div alt="f303" class="genericon genericon-time" title="genericon-time">time</div>
<div alt="f435" class="genericon genericon-top" title="genericon-top">top</div>
<div alt="f407" class="genericon genericon-trash" title="genericon-trash">trash</div>
<div alt="f214" class="genericon genericon-tumblr" title="genericon-tumblr">tumblr</div>
<div alt="f516" class="genericon genericon-twitch" title="genericon-twitch">twitch</div>
<div alt="f202" class="genericon genericon-twitter" title="genericon-twitter">twitter</div>
<div alt="f446" class="genericon genericon-unapprove" title="genericon-unapprove">unapprove</div>
<div alt="f464" class="genericon genericon-unsubscribe" title="genericon-unsubscribe">unsubscribe</div>
<div alt="f401" class="genericon genericon-unzoom" title="genericon-unzoom">unzoom</div>
<div alt="f500" class="genericon genericon-uparrow" title="genericon-uparrow">uparrow</div>
<div alt="f304" class="genericon genericon-user" title="genericon-user">user</div>
<div alt="f104" class="genericon genericon-video" title="genericon-video">video</div>
<div alt="f517" class="genericon genericon-videocamera" title="genericon-videocamera">videocamera</div>
<div alt="f212" class="genericon genericon-vimeo" title="genericon-vimeo">vimeo</div>
<div alt="f414" class="genericon genericon-warning" title="genericon-warning">warning</div>
<div alt="f475" class="genericon genericon-website" title="genericon-website">website</div>
<div alt="f306" class="genericon genericon-week" title="genericon-week">week</div>
<div alt="f205" class="genericon genericon-wordpress" title="genericon-wordpress">wordpress</div>
<div alt="f504" class="genericon genericon-xpost" title="genericon-xpost">xpost</div>
<div alt="f213" class="genericon genericon-youtube" title="genericon-youtube">youtube</div>
<div alt="f402" class="genericon genericon-zoom" title="genericon-zoom">zoom</div>
</div>
<div id="temp" style="display: none;"></div>
</div>
<div id="footer">
<p>An <a href="http://automattic.com" rel="nofollow">Automattic</a> Portrayal</p>
<p>No designers were harmed in the making of this icon font.</p>
</div>
</div>
</body>
</html>

View File

@@ -1,464 +0,0 @@
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<title>Genericons</title>
<link rel="stylesheet" href="genericons.css">
<style type="text/css">
body {
font-family: sans-serif;
line-height: 1.5;
width: 800px;
margin: 50px auto;
color: #777;
background: white;
}
.icons {
overflow: hidden;
padding: 10px 0;
}
.icons div {
cursor: pointer;
float: left;
margin: 0 30px 30px 0;
}
.icons:hover div {
background: #f7f7f7;
}
.code {
display: block;
font: 14px/1.5 monospace;
width: 740px;
white-space: pre;
border: 1px solid #ccc;
padding: 10px;
color: #777;
overflow: auto;
}
.my-icon:before {
content: '\f408';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/1 'Genericons';
vertical-align: middle;
}
/* For the Examples */
.my-checklist {
list-style-type: none;
text-indent: -16px;
}
.my-checklist li:before {
padding-right: 16px;
content: '\f418';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: text-top;
}
.my-blockquote {
background: #eee;
border-left: 32px solid #ddd;
padding: 10px;
}
.my-blockquote:before {
margin-left: -42px;
padding-right: 10px;
content: '\f106';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/20px 'Genericons';
vertical-align: bottom;
}
.my-button {
font-family: Helvetica, sans-serif;
font-size: 14px;
background: #e05d22; /* Old browsers */
background: -webkit-linear-gradient(top, #e05d22 0%, #d94412 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #e05d22 0%, #d94412 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #e05d22 0%, #d94412 100%); /* IE10+ */
background: -o-linear-gradient( top, #e05d22 0%, #d94412 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #e05d22 0%, #d94412 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e05d22', endColorstr='#d94412', GradientType=0); /* IE6-9 */
display: inline-block;
padding: 10px 16px 4px 16px;
color: #fff;
text-decoration: none;
border: none;
border-bottom: 3px solid #b93207;
border-radius: 2px;
}
.my-button:hover,
.my-button:focus {
background: #ed6a31; /* Old browsers */
background: -webkit-linear-gradient(top, #ed6a31 0%, #e55627 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* IE10+ */
background: -o-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #ed6a31 0%, #e55627 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ed6a31', endColorstr='#e55627', GradientType=0); /* IE6-9 */
outline: none;
}
.my-button:active {
background: #d94412; /* Old browsers */
background: -webkit-linear-gradient(top, #d94412 0%, #e05d22 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #d94412 0%, #e05d22 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #d94412 0%, #e05d22 100%); /* IE10+ */
background: -o-linear-gradient( top, #d94412 0%, #e05d22 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #d94412 0%, #e05d22 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d94412', endColorstr='#e05d22', GradientType=0); /* IE6-9 */
border: none;
border-top: 3px solid #b93207;
padding: 6px 16px 7px 16px;
}
</style>
</head>
<body>
<div class="section">
<h1>Genericons Usage</h1>
<p>Copy the <strong>font</strong> folder and the <strong>genericons.css</strong> file together into your project. Link the CSS in your HTML:</p>
<p><code>&lt;link href="path/to/genericons.css" rel="stylesheet"&gt;</code></p>
<p>Drop in the following HTML with the name of the icon you want to display:</p>
<p><code>&lt;div class="genericon genericon-standard"&gt;&lt;/div&gt;</code></p>
<div class="icons">
<!-- post formats -->
<div alt="f100" class="genericon genericon-standard"></div>
<div alt="f101" class="genericon genericon-aside"></div>
<div alt="f102" class="genericon genericon-image"></div>
<div alt="f103" class="genericon genericon-gallery"></div>
<div alt="f104" class="genericon genericon-video"></div>
<div alt="f105" class="genericon genericon-status"></div>
<div alt="f106" class="genericon genericon-quote"></div>
<div alt="f107" class="genericon genericon-link"></div>
<div alt="f108" class="genericon genericon-chat"></div>
<div alt="f109" class="genericon genericon-audio"></div>
<!-- social icons -->
<div alt="f200" class="genericon genericon-github"></div>
<div alt="f201" class="genericon genericon-dribbble"></div>
<div alt="f202" class="genericon genericon-twitter"></div>
<div alt="f203" class="genericon genericon-facebook"></div>
<div alt="f204" class="genericon genericon-facebook-alt"></div>
<div alt="f205" class="genericon genericon-wordpress"></div>
<div alt="f206" class="genericon genericon-googleplus"></div>
<div alt="f207" class="genericon genericon-linkedin"></div>
<div alt="f208" class="genericon genericon-linkedin-alt"></div>
<div alt="f209" class="genericon genericon-pinterest"></div>
<div alt="f210" class="genericon genericon-pinterest-alt"></div>
<div alt="f211" class="genericon genericon-flickr"></div>
<div alt="f212" class="genericon genericon-vimeo"></div>
<div alt="f213" class="genericon genericon-youtube"></div>
<div alt="f214" class="genericon genericon-tumblr"></div>
<div alt="f215" class="genericon genericon-instagram"></div>
<div alt="f216" class="genericon genericon-codepen"></div>
<div alt="f217" class="genericon genericon-polldaddy"></div>
<div alt="f218" class="genericon genericon-googleplus-alt"></div>
<div alt="f219" class="genericon genericon-path"></div>
<div alt="f220" class="genericon genericon-skype"></div>
<div alt="f221" class="genericon genericon-digg"></div>
<div alt="f222" class="genericon genericon-reddit"></div>
<div alt="f223" class="genericon genericon-stumbleupon"></div>
<div alt="f224" class="genericon genericon-pocket"></div>
<div alt="f225" class="genericon genericon-dropbox"></div>
<!-- meta icons -->
<div alt="f300" class="genericon genericon-comment"></div>
<div alt="f301" class="genericon genericon-category"></div>
<div alt="f302" class="genericon genericon-tag"></div>
<div alt="f303" class="genericon genericon-time"></div>
<div alt="f304" class="genericon genericon-user"></div>
<div alt="f305" class="genericon genericon-day"></div>
<div alt="f306" class="genericon genericon-week"></div>
<div alt="f307" class="genericon genericon-month"></div>
<div alt="f308" class="genericon genericon-pinned"></div>
<!-- other icons -->
<div alt="f400" class="genericon genericon-search"></div>
<div alt="f401" class="genericon genericon-unzoom"></div>
<div alt="f402" class="genericon genericon-zoom"></div>
<div alt="f403" class="genericon genericon-show"></div>
<div alt="f404" class="genericon genericon-hide"></div>
<div alt="f405" class="genericon genericon-close"></div>
<div alt="f406" class="genericon genericon-close-alt"></div>
<div alt="f407" class="genericon genericon-trash"></div>
<div alt="f408" class="genericon genericon-star"></div>
<div alt="f409" class="genericon genericon-home"></div>
<div alt="f410" class="genericon genericon-mail"></div>
<div alt="f411" class="genericon genericon-edit"></div>
<div alt="f412" class="genericon genericon-reply"></div>
<div alt="f413" class="genericon genericon-feed"></div>
<div alt="f414" class="genericon genericon-warning"></div>
<div alt="f415" class="genericon genericon-share"></div>
<div alt="f416" class="genericon genericon-attachment"></div>
<div alt="f417" class="genericon genericon-location"></div>
<div alt="f418" class="genericon genericon-checkmark"></div>
<div alt="f419" class="genericon genericon-menu"></div>
<div alt="f420" class="genericon genericon-refresh"></div>
<div alt="f421" class="genericon genericon-minimize"></div>
<div alt="f422" class="genericon genericon-maximize"></div>
<div alt="f423" class="genericon genericon-404"></div>
<div alt="f424" class="genericon genericon-spam"></div>
<div alt="f425" class="genericon genericon-summary"></div>
<div alt="f426" class="genericon genericon-cloud"></div>
<div alt="f427" class="genericon genericon-key"></div>
<div alt="f428" class="genericon genericon-dot"></div>
<div alt="f429" class="genericon genericon-next"></div>
<div alt="f430" class="genericon genericon-previous"></div>
<div alt="f431" class="genericon genericon-expand"></div>
<div alt="f432" class="genericon genericon-collapse"></div>
<div alt="f433" class="genericon genericon-dropdown"></div>
<div alt="f434" class="genericon genericon-dropdown-left"></div>
<div alt="f435" class="genericon genericon-top"></div>
<div alt="f436" class="genericon genericon-draggable"></div>
<div alt="f437" class="genericon genericon-phone"></div>
<div alt="f438" class="genericon genericon-send-to-phone"></div>
<div alt="f439" class="genericon genericon-plugin"></div>
<div alt="f440" class="genericon genericon-cloud-download"></div>
<div alt="f441" class="genericon genericon-cloud-upload"></div>
<div alt="f442" class="genericon genericon-external"></div>
<div alt="f443" class="genericon genericon-document"></div>
<div alt="f444" class="genericon genericon-book"></div>
<div alt="f445" class="genericon genericon-cog"></div>
<div alt="f446" class="genericon genericon-unapprove"></div>
<div alt="f447" class="genericon genericon-cart"></div>
<div alt="f448" class="genericon genericon-pause"></div>
<div alt="f449" class="genericon genericon-stop"></div>
<div alt="f450" class="genericon genericon-skip-back"></div>
<div alt="f451" class="genericon genericon-skip-ahead"></div>
<div alt="f452" class="genericon genericon-play"></div>
<div alt="f453" class="genericon genericon-tablet"></div>
<div alt="f454" class="genericon genericon-send-to-tablet"></div>
<div alt="f455" class="genericon genericon-info"></div>
<div alt="f456" class="genericon genericon-notice"></div>
<div alt="f457" class="genericon genericon-help"></div>
<div alt="f458" class="genericon genericon-fastforward"></div>
<div alt="f459" class="genericon genericon-rewind"></div>
<div alt="f460" class="genericon genericon-portfolio"></div>
<div alt="f461" class="genericon genericon-heart"></div>
<div alt="f462" class="genericon genericon-code"></div>
<div alt="f463" class="genericon genericon-subscribe"></div>
<div alt="f464" class="genericon genericon-unsubscribe"></div>
<div alt="f465" class="genericon genericon-subscribed"></div>
<div alt="f466" class="genericon genericon-reply-alt"></div>
<div alt="f467" class="genericon genericon-reply-single"></div>
<div alt="f468" class="genericon genericon-flag"></div>
<div alt="f469" class="genericon genericon-print"></div>
<div alt="f470" class="genericon genericon-lock"></div>
<div alt="f471" class="genericon genericon-bold"></div>
<div alt="f472" class="genericon genericon-italic"></div>
<div alt="f473" class="genericon genericon-picture"></div>
<div alt="f474" class="genericon genericon-fullscreen"></div>
<!-- generic shapes -->
<div alt="f500" class="genericon genericon-uparrow"></div>
<div alt="f501" class="genericon genericon-rightarrow"></div>
<div alt="f502" class="genericon genericon-downarrow"></div>
<div alt="f503" class="genericon genericon-leftarrow"></div>
</div>
<p>If you want to insert an icon manually using the <code>:before</code> selector, you can setup CSS rules like the following example. <strong>Make sure to set the size to a multiple of 16px</strong> or the icons could end up looking fuzzy:</p>
<p><textarea class="code" style="min-height: 150px;" onclick="select();">.my-icon:before {
content: '\f408';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/1 'Genericons';
vertical-align: middle;
}</textarea></p>
<p>Add a matching class to your HTML:</p>
<p><code>&lt;div class="my-icon"&gt;You're a Star!&lt;/div&gt;</code></p>
<p>Here's the result: <span class="my-icon">You're a Star!</span></p>
<h2>Examples</h2>
<p>Turn every icon a <span style="color: #fa8072;">Salmon</span> color:</p>
<p><textarea class="code" style="min-height: 70px" onclick="select();">
.genericon {
color: #fa8072;
}</textarea></p>
<p>Or turn the stars <span style="color: #ffd700;">Gold</span>:</p>
<p><textarea class="code" style="min-height: 70px" onclick="select();">
.genericon-star {
color: #fa8072;
}</textarea></p>
<p>Use icons for bulleted lists:</p>
<ul class="my-checklist">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul>
<p><textarea class="code" style="min-height: 130px" onclick="select();">
<ul class="my-checklist">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul></textarea></p>
<p><textarea class="code" style="min-height: 260px;" onclick="select();">
.my-checklist {
list-style-type: none;
text-indent: -16px;
}
.my-checklist li:before {
padding-right: 16px;
content: '\f418';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: text-top;
}</textarea></p>
<p>Use icons to style blockquotes:</p>
<blockquote class="my-blockquote">Sometimes I've believed as many as six impossible things before breakfast. &mdash;<em>Lewis Carroll</em></blockquote>
<blockquote class="my-blockquote">`Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe. "Beware the Jabberwock, my son! The jaws that bite, the claws that catch! Beware the Jubjub bird, and shun The frumious Bandersnatch!"</blockquote>
<p><textarea class="code" style="min-height: 40px;" onclick="select();"><blockquote class="my-blockquote">Sometimes I've believed as many as six impossible things before breakfast. &mdash;<em>Lewis Carroll</em></blockquote></textarea></p>
<p><textarea class="code" style="min-height: 300px;" onclick="select();">
.my-blockquote {
background: #eee;
border-left: 32px solid #ddd;
padding: 10px;
}
.my-blockquote:before {
margin-left: -42px;
padding-right: 10px;
content: '\f106';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/20px 'Genericons';
vertical-align: bottom;
} </textarea></p>
<p>Use icons to style buttons:</p>
<a class="my-button" href="javascript:void()"><i class="genericon genericon-show"></i> View</a>
<a class="my-button" href="javascript:void()"><i class="genericon genericon-audio"></i> Listen</a>
<p><textarea class="code" style="min-height: 40px;" onclick="select();"><a class="my-button" href="#"><i class="genericon genericon-show"></i> View</a>
<a class="my-button" href="#"><i class="genericon genericon-audio"></i> Listen</a></textarea></p>
<p><textarea class="code" style="min-height: 300px;" onclick="select();">
.my-button {
font-family: Helvetica, sans-serif;
background: #e05d22; /* Old browsers */
background: -webkit-linear-gradient(top, #e05d22 0%, #d94412 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #e05d22 0%, #d94412 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #e05d22 0%, #d94412 100%); /* IE10+ */
background: -o-linear-gradient( top, #e05d22 0%, #d94412 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #e05d22 0%, #d94412 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e05d22', endColorstr='#d94412', GradientType=0); /* IE6-9 */
display: inline-block;
padding: 10px 16px 6px 16px;
color: #fff;
text-decoration: none;
border: none;
border-bottom: 3px solid #b93207;
border-radius: 2px;
}
.my-button:hover,
.my-button:focus {
background: #ed6a31; /* Old browsers */
background: -webkit-linear-gradient(top, #ed6a31 0%, #e55627 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* IE10+ */
background: -o-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #ed6a31 0%, #e55627 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ed6a31', endColorstr='#e55627', GradientType=0); /* IE6-9 */
outline: none;
}
.my-button:active {
background: #d94412; /* Old browsers */
background: -webkit-linear-gradient(top, #d94412 0%, #e05d22 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #d94412 0%, #e05d22 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #d94412 0%, #e05d22 100%); /* IE10+ */
background: -o-linear-gradient( top, #d94412 0%, #e05d22 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #d94412 0%, #e05d22 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d94412', endColorstr='#e05d22', GradientType=0); /* IE6-9 */
border: none;
border-top: 3px solid #b93207;
padding: 6px 16px 10px 16px;
}</textarea>/</p>
<h2>CSS Preprocessors</h2>
<p>Preprocessing extensions such as Sass (SCSS Syntax) or LESS</a> can make it easier to manage CSS for a lot of things at once using things like variables and mixins.</p>
<p>This example will seup the basic genericon rules and sets a color you can use for all icons using Sass:</p>
<p><textarea class="code" style="min-height: 360px;" onclick="select();">$icon-color: "#fa8072";
.genericon {
color: $icon-color;
}
@mixin genericon-rules {
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: middle;
}
.my-icon:before {
content: '\f408';
@include genericon-rules;
}</textarea></p>
<p>Here is a similar example for LESS:</p>
<p><textarea class="code" style="min-height: 360px;" onclick="select();">@icon-color: "#fa8072";
.genericon {
color: @icon-color;
}
.genericon-rules {
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: middle;
}
.my-icon:before {
content: '\f408';
.genericon-rules;
}</textarea></p>
<h2>Fallback images for IE7 and below</h2>
<p>Genericons <strong>does not come with fallback icons by default</strong> -- therefore you have to create them yourself. If you are using HTML similar to this example:
<p><code>&lt;span class="genericon genericon-warning"&gt;&lt;/span&gt;</code></p>
<p>You can use the asterisk hack to serve a different icon to IE7 once you have saved the fallback icons to your project:</p>
<textarea class="code" style="min-height: 85px;" onclick="select();">.genericon-warning {
*background: url(fallback-icon.png) no-repeat center center;
*text-indent: 100%;
}</textarea>
</div>
</body>
</html>

View File

@@ -1,464 +0,0 @@
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<title>Genericons</title>
<link rel="stylesheet" href="genericons.css">
<style type="text/css">
body {
font-family: sans-serif;
line-height: 1.5;
width: 800px;
margin: 50px auto;
color: #777;
background: white;
}
.icons {
overflow: hidden;
padding: 10px 0;
}
.icons div {
cursor: pointer;
float: left;
margin: 0 30px 30px 0;
}
.icons:hover div {
background: #f7f7f7;
}
.code {
display: block;
font: 14px/1.5 monospace;
width: 740px;
white-space: pre;
border: 1px solid #ccc;
padding: 10px;
color: #777;
overflow: auto;
}
.my-icon:before {
content: '\f408';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/1 'Genericons';
vertical-align: middle;
}
/* For the Examples */
.my-checklist {
list-style-type: none;
text-indent: -16px;
}
.my-checklist li:before {
padding-right: 16px;
content: '\f418';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: text-top;
}
.my-blockquote {
background: #eee;
border-left: 32px solid #ddd;
padding: 10px;
}
.my-blockquote:before {
margin-left: -42px;
padding-right: 10px;
content: '\f106';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/20px 'Genericons';
vertical-align: bottom;
}
.my-button {
font-family: Helvetica, sans-serif;
font-size: 14px;
background: #e05d22; /* Old browsers */
background: -webkit-linear-gradient(top, #e05d22 0%, #d94412 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #e05d22 0%, #d94412 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #e05d22 0%, #d94412 100%); /* IE10+ */
background: -o-linear-gradient( top, #e05d22 0%, #d94412 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #e05d22 0%, #d94412 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e05d22', endColorstr='#d94412', GradientType=0); /* IE6-9 */
display: inline-block;
padding: 10px 16px 4px 16px;
color: #fff;
text-decoration: none;
border: none;
border-bottom: 3px solid #b93207;
border-radius: 2px;
}
.my-button:hover,
.my-button:focus {
background: #ed6a31; /* Old browsers */
background: -webkit-linear-gradient(top, #ed6a31 0%, #e55627 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* IE10+ */
background: -o-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #ed6a31 0%, #e55627 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ed6a31', endColorstr='#e55627', GradientType=0); /* IE6-9 */
outline: none;
}
.my-button:active {
background: #d94412; /* Old browsers */
background: -webkit-linear-gradient(top, #d94412 0%, #e05d22 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #d94412 0%, #e05d22 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #d94412 0%, #e05d22 100%); /* IE10+ */
background: -o-linear-gradient( top, #d94412 0%, #e05d22 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #d94412 0%, #e05d22 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d94412', endColorstr='#e05d22', GradientType=0); /* IE6-9 */
border: none;
border-top: 3px solid #b93207;
padding: 6px 16px 7px 16px;
}
</style>
</head>
<body>
<div class="section">
<h1>Genericons Usage</h1>
<p>Copy the <strong>font</strong> folder and the <strong>genericons.css</strong> file together into your project. Link the CSS in your HTML:</p>
<p><code>&lt;link href="path/to/genericons.css" rel="stylesheet"&gt;</code></p>
<p>Drop in the following HTML with the name of the icon you want to display:</p>
<p><code>&lt;div class="genericon genericon-standard"&gt;&lt;/div&gt;</code></p>
<div class="icons">
<!-- post formats -->
<div alt="f100" class="genericon genericon-standard"></div>
<div alt="f101" class="genericon genericon-aside"></div>
<div alt="f102" class="genericon genericon-image"></div>
<div alt="f103" class="genericon genericon-gallery"></div>
<div alt="f104" class="genericon genericon-video"></div>
<div alt="f105" class="genericon genericon-status"></div>
<div alt="f106" class="genericon genericon-quote"></div>
<div alt="f107" class="genericon genericon-link"></div>
<div alt="f108" class="genericon genericon-chat"></div>
<div alt="f109" class="genericon genericon-audio"></div>
<!-- social icons -->
<div alt="f200" class="genericon genericon-github"></div>
<div alt="f201" class="genericon genericon-dribbble"></div>
<div alt="f202" class="genericon genericon-twitter"></div>
<div alt="f203" class="genericon genericon-facebook"></div>
<div alt="f204" class="genericon genericon-facebook-alt"></div>
<div alt="f205" class="genericon genericon-wordpress"></div>
<div alt="f206" class="genericon genericon-googleplus"></div>
<div alt="f207" class="genericon genericon-linkedin"></div>
<div alt="f208" class="genericon genericon-linkedin-alt"></div>
<div alt="f209" class="genericon genericon-pinterest"></div>
<div alt="f210" class="genericon genericon-pinterest-alt"></div>
<div alt="f211" class="genericon genericon-flickr"></div>
<div alt="f212" class="genericon genericon-vimeo"></div>
<div alt="f213" class="genericon genericon-youtube"></div>
<div alt="f214" class="genericon genericon-tumblr"></div>
<div alt="f215" class="genericon genericon-instagram"></div>
<div alt="f216" class="genericon genericon-codepen"></div>
<div alt="f217" class="genericon genericon-polldaddy"></div>
<div alt="f218" class="genericon genericon-googleplus-alt"></div>
<div alt="f219" class="genericon genericon-path"></div>
<div alt="f220" class="genericon genericon-skype"></div>
<div alt="f221" class="genericon genericon-digg"></div>
<div alt="f222" class="genericon genericon-reddit"></div>
<div alt="f223" class="genericon genericon-stumbleupon"></div>
<div alt="f224" class="genericon genericon-pocket"></div>
<div alt="f225" class="genericon genericon-dropbox"></div>
<!-- meta icons -->
<div alt="f300" class="genericon genericon-comment"></div>
<div alt="f301" class="genericon genericon-category"></div>
<div alt="f302" class="genericon genericon-tag"></div>
<div alt="f303" class="genericon genericon-time"></div>
<div alt="f304" class="genericon genericon-user"></div>
<div alt="f305" class="genericon genericon-day"></div>
<div alt="f306" class="genericon genericon-week"></div>
<div alt="f307" class="genericon genericon-month"></div>
<div alt="f308" class="genericon genericon-pinned"></div>
<!-- other icons -->
<div alt="f400" class="genericon genericon-search"></div>
<div alt="f401" class="genericon genericon-unzoom"></div>
<div alt="f402" class="genericon genericon-zoom"></div>
<div alt="f403" class="genericon genericon-show"></div>
<div alt="f404" class="genericon genericon-hide"></div>
<div alt="f405" class="genericon genericon-close"></div>
<div alt="f406" class="genericon genericon-close-alt"></div>
<div alt="f407" class="genericon genericon-trash"></div>
<div alt="f408" class="genericon genericon-star"></div>
<div alt="f409" class="genericon genericon-home"></div>
<div alt="f410" class="genericon genericon-mail"></div>
<div alt="f411" class="genericon genericon-edit"></div>
<div alt="f412" class="genericon genericon-reply"></div>
<div alt="f413" class="genericon genericon-feed"></div>
<div alt="f414" class="genericon genericon-warning"></div>
<div alt="f415" class="genericon genericon-share"></div>
<div alt="f416" class="genericon genericon-attachment"></div>
<div alt="f417" class="genericon genericon-location"></div>
<div alt="f418" class="genericon genericon-checkmark"></div>
<div alt="f419" class="genericon genericon-menu"></div>
<div alt="f420" class="genericon genericon-refresh"></div>
<div alt="f421" class="genericon genericon-minimize"></div>
<div alt="f422" class="genericon genericon-maximize"></div>
<div alt="f423" class="genericon genericon-404"></div>
<div alt="f424" class="genericon genericon-spam"></div>
<div alt="f425" class="genericon genericon-summary"></div>
<div alt="f426" class="genericon genericon-cloud"></div>
<div alt="f427" class="genericon genericon-key"></div>
<div alt="f428" class="genericon genericon-dot"></div>
<div alt="f429" class="genericon genericon-next"></div>
<div alt="f430" class="genericon genericon-previous"></div>
<div alt="f431" class="genericon genericon-expand"></div>
<div alt="f432" class="genericon genericon-collapse"></div>
<div alt="f433" class="genericon genericon-dropdown"></div>
<div alt="f434" class="genericon genericon-dropdown-left"></div>
<div alt="f435" class="genericon genericon-top"></div>
<div alt="f436" class="genericon genericon-draggable"></div>
<div alt="f437" class="genericon genericon-phone"></div>
<div alt="f438" class="genericon genericon-send-to-phone"></div>
<div alt="f439" class="genericon genericon-plugin"></div>
<div alt="f440" class="genericon genericon-cloud-download"></div>
<div alt="f441" class="genericon genericon-cloud-upload"></div>
<div alt="f442" class="genericon genericon-external"></div>
<div alt="f443" class="genericon genericon-document"></div>
<div alt="f444" class="genericon genericon-book"></div>
<div alt="f445" class="genericon genericon-cog"></div>
<div alt="f446" class="genericon genericon-unapprove"></div>
<div alt="f447" class="genericon genericon-cart"></div>
<div alt="f448" class="genericon genericon-pause"></div>
<div alt="f449" class="genericon genericon-stop"></div>
<div alt="f450" class="genericon genericon-skip-back"></div>
<div alt="f451" class="genericon genericon-skip-ahead"></div>
<div alt="f452" class="genericon genericon-play"></div>
<div alt="f453" class="genericon genericon-tablet"></div>
<div alt="f454" class="genericon genericon-send-to-tablet"></div>
<div alt="f455" class="genericon genericon-info"></div>
<div alt="f456" class="genericon genericon-notice"></div>
<div alt="f457" class="genericon genericon-help"></div>
<div alt="f458" class="genericon genericon-fastforward"></div>
<div alt="f459" class="genericon genericon-rewind"></div>
<div alt="f460" class="genericon genericon-portfolio"></div>
<div alt="f461" class="genericon genericon-heart"></div>
<div alt="f462" class="genericon genericon-code"></div>
<div alt="f463" class="genericon genericon-subscribe"></div>
<div alt="f464" class="genericon genericon-unsubscribe"></div>
<div alt="f465" class="genericon genericon-subscribed"></div>
<div alt="f466" class="genericon genericon-reply-alt"></div>
<div alt="f467" class="genericon genericon-reply-single"></div>
<div alt="f468" class="genericon genericon-flag"></div>
<div alt="f469" class="genericon genericon-print"></div>
<div alt="f470" class="genericon genericon-lock"></div>
<div alt="f471" class="genericon genericon-bold"></div>
<div alt="f472" class="genericon genericon-italic"></div>
<div alt="f473" class="genericon genericon-picture"></div>
<div alt="f474" class="genericon genericon-fullscreen"></div>
<!-- generic shapes -->
<div alt="f500" class="genericon genericon-uparrow"></div>
<div alt="f501" class="genericon genericon-rightarrow"></div>
<div alt="f502" class="genericon genericon-downarrow"></div>
<div alt="f503" class="genericon genericon-leftarrow"></div>
</div>
<p>If you want to insert an icon manually using the <code>:before</code> selector, you can setup CSS rules like the following example. <strong>Make sure to set the size to a multiple of 16px</strong> or the icons could end up looking fuzzy:</p>
<p><textarea class="code" style="min-height: 150px;" onclick="select();">.my-icon:before {
content: '\f408';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/1 'Genericons';
vertical-align: middle;
}</textarea></p>
<p>Add a matching class to your HTML:</p>
<p><code>&lt;div class="my-icon"&gt;You're a Star!&lt;/div&gt;</code></p>
<p>Here's the result: <span class="my-icon">You're a Star!</span></p>
<h2>Examples</h2>
<p>Turn every icon a <span style="color: #fa8072;">Salmon</span> color:</p>
<p><textarea class="code" style="min-height: 70px" onclick="select();">
.genericon {
color: #fa8072;
}</textarea></p>
<p>Or turn the stars <span style="color: #ffd700;">Gold</span>:</p>
<p><textarea class="code" style="min-height: 70px" onclick="select();">
.genericon-star {
color: #fa8072;
}</textarea></p>
<p>Use icons for bulleted lists:</p>
<ul class="my-checklist">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul>
<p><textarea class="code" style="min-height: 130px" onclick="select();">
<ul class="my-checklist">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul></textarea></p>
<p><textarea class="code" style="min-height: 260px;" onclick="select();">
.my-checklist {
list-style-type: none;
text-indent: -16px;
}
.my-checklist li:before {
padding-right: 16px;
content: '\f418';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: text-top;
}</textarea></p>
<p>Use icons to style blockquotes:</p>
<blockquote class="my-blockquote">Sometimes I've believed as many as six impossible things before breakfast. &mdash;<em>Lewis Carroll</em></blockquote>
<blockquote class="my-blockquote">`Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe. "Beware the Jabberwock, my son! The jaws that bite, the claws that catch! Beware the Jubjub bird, and shun The frumious Bandersnatch!"</blockquote>
<p><textarea class="code" style="min-height: 40px;" onclick="select();"><blockquote class="my-blockquote">Sometimes I've believed as many as six impossible things before breakfast. &mdash;<em>Lewis Carroll</em></blockquote></textarea></p>
<p><textarea class="code" style="min-height: 300px;" onclick="select();">
.my-blockquote {
background: #eee;
border-left: 32px solid #ddd;
padding: 10px;
}
.my-blockquote:before {
margin-left: -42px;
padding-right: 10px;
content: '\f106';
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 32px/20px 'Genericons';
vertical-align: bottom;
} </textarea></p>
<p>Use icons to style buttons:</p>
<a class="my-button" href="javascript:void()"><i class="genericon genericon-show"></i> View</a>
<a class="my-button" href="javascript:void()"><i class="genericon genericon-audio"></i> Listen</a>
<p><textarea class="code" style="min-height: 40px;" onclick="select();"><a class="my-button" href="#"><i class="genericon genericon-show"></i> View</a>
<a class="my-button" href="#"><i class="genericon genericon-audio"></i> Listen</a></textarea></p>
<p><textarea class="code" style="min-height: 300px;" onclick="select();">
.my-button {
font-family: Helvetica, sans-serif;
background: #e05d22; /* Old browsers */
background: -webkit-linear-gradient(top, #e05d22 0%, #d94412 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #e05d22 0%, #d94412 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #e05d22 0%, #d94412 100%); /* IE10+ */
background: -o-linear-gradient( top, #e05d22 0%, #d94412 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #e05d22 0%, #d94412 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e05d22', endColorstr='#d94412', GradientType=0); /* IE6-9 */
display: inline-block;
padding: 10px 16px 6px 16px;
color: #fff;
text-decoration: none;
border: none;
border-bottom: 3px solid #b93207;
border-radius: 2px;
}
.my-button:hover,
.my-button:focus {
background: #ed6a31; /* Old browsers */
background: -webkit-linear-gradient(top, #ed6a31 0%, #e55627 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* IE10+ */
background: -o-linear-gradient( top, #ed6a31 0%, #e55627 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #ed6a31 0%, #e55627 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ed6a31', endColorstr='#e55627', GradientType=0); /* IE6-9 */
outline: none;
}
.my-button:active {
background: #d94412; /* Old browsers */
background: -webkit-linear-gradient(top, #d94412 0%, #e05d22 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient( top, #d94412 0%, #e05d22 100%); /* FF3.6+ */
background: -ms-linear-gradient( top, #d94412 0%, #e05d22 100%); /* IE10+ */
background: -o-linear-gradient( top, #d94412 0%, #e05d22 100%); /* Opera 11.10+ */
background: linear-gradient( to bottom, #d94412 0%, #e05d22 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d94412', endColorstr='#e05d22', GradientType=0); /* IE6-9 */
border: none;
border-top: 3px solid #b93207;
padding: 6px 16px 10px 16px;
}</textarea>/</p>
<h2>CSS Preprocessors</h2>
<p>Preprocessing extensions such as Sass (SCSS Syntax) or LESS</a> can make it easier to manage CSS for a lot of things at once using things like variables and mixins.</p>
<p>This example will seup the basic genericon rules and sets a color you can use for all icons using Sass:</p>
<p><textarea class="code" style="min-height: 360px;" onclick="select();">$icon-color: "#fa8072";
.genericon {
color: $icon-color;
}
@mixin genericon-rules {
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: middle;
}
.my-icon:before {
content: '\f408';
@include genericon-rules;
}</textarea></p>
<p>Here is a similar example for LESS:</p>
<p><textarea class="code" style="min-height: 360px;" onclick="select();">@icon-color: "#fa8072";
.genericon {
color: @icon-color;
}
.genericon-rules {
display: inline-block;
-webkit-font-smoothing: antialiased;
font: normal 16px/1 'Genericons';
vertical-align: middle;
}
.my-icon:before {
content: '\f408';
.genericon-rules;
}</textarea></p>
<h2>Fallback images for IE7 and below</h2>
<p>Genericons <strong>does not come with fallback icons by default</strong> -- therefore you have to create them yourself. If you are using HTML similar to this example:
<p><code>&lt;span class="genericon genericon-warning"&gt;&lt;/span&gt;</code></p>
<p>You can use the asterisk hack to serve a different icon to IE7 once you have saved the fallback icons to your project:</p>
<textarea class="code" style="min-height: 85px;" onclick="select();">.genericon-warning {
*background: url(fallback-icon.png) no-repeat center center;
*text-indent: 100%;
}</textarea>
</div>
</body>
</html>

View File

@@ -1117,8 +1117,10 @@ function map_meta_cap( $cap, $user_id ) {
case 'edit_post':
case 'edit_page':
$post = get_post( $args[0] );
if ( empty( $post ) )
if ( empty( $post ) ) {
$caps[] = 'do_not_allow';
break;
}
if ( 'revision' == $post->post_type ) {
$post = get_post( $post->post_parent );
@@ -1232,7 +1234,16 @@ function map_meta_cap( $cap, $user_id ) {
if ( empty( $comment ) )
break;
$post = get_post( $comment->comment_post_ID );
$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );
/*
* If the post doesn't exist, we have an orphaned comment.
* Fall back to the edit_posts capability, instead.
*/
if ( $post ) {
$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );
} else {
$caps = map_meta_cap( 'edit_posts', $user_id );
}
break;
case 'unfiltered_upload':
if ( defined('ALLOW_UNFILTERED_UPLOADS') && ALLOW_UNFILTERED_UPLOADS && ( !is_multisite() || is_super_admin( $user_id ) ) )

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -999,20 +999,23 @@ class Snoopy
if(!empty($this->user) || !empty($this->pass))
$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
for($curr_header = 0; $curr_header < count($headers); $curr_header++) {
$safer_header = strtr( $headers[$curr_header], "\"", " " );
$cmdline_params .= " -H \"".$safer_header."\"";
$headerfile = tempnam( $this->temp_dir, "sno" );
$cmdline_params = '-k -D ' . escapeshellarg( $headerfile );
foreach ( $headers as $header ) {
$cmdline_params .= ' -H ' . escapeshellarg( $header );
}
if(!empty($body))
$cmdline_params .= " -d \"$body\"";
if ( ! empty( $body ) ) {
$cmdline_params .= ' -d ' . escapeshellarg( $body );
}
if($this->read_timeout > 0)
$cmdline_params .= " -m ".$this->read_timeout;
if ( $this->read_timeout > 0 ) {
$cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout );
}
$headerfile = tempnam($this->temp_dir, "sno");
exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($URI)."\"",$results,$return);
exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return );
if($return)
{

View File

@@ -175,6 +175,24 @@ final class WP_Customize_Manager {
$this->theme = wp_get_theme( isset( $_REQUEST['theme'] ) ? $_REQUEST['theme'] : null );
/*
* Clear incoming post data if the user lacks a CSRF token (nonce). Note that the customizer
* application will inject the customize_preview_nonce query parameter into all Ajax requests.
* For similar behavior elsewhere in WordPress, see rest_cookie_check_errors() which logs out
* a user when a valid nonce isn't present.
*/
$has_post_data_nonce = (
check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'nonce', false )
||
check_ajax_referer( 'save-customize_' . $this->get_stylesheet(), 'nonce', false )
||
check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'customize_preview_nonce', false )
);
if ( ! $has_post_data_nonce ) {
unset( $_POST['customized'] );
unset( $_REQUEST['customized'] );
}
if ( $this->is_theme_active() ) {
// Once the theme is loaded, we'll validate it.
add_action( 'after_setup_theme', array( $this, 'after_setup_theme' ) );

View File

@@ -1199,7 +1199,7 @@ final class WP_Customize_Widgets {
return null;
}
if ( $this->get_instance_hash_key( $decoded ) !== $value['instance_hash_key'] ) {
if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) {
return null;
}

View File

@@ -57,7 +57,7 @@ class WP_Embed {
add_shortcode( 'embed', array( $this, 'shortcode' ) );
// Do the shortcode (only the [embed] one is registered)
$content = do_shortcode( $content );
$content = do_shortcode( $content, true );
// Put the original shortcodes back
$shortcode_tags = $orig_shortcode_tags;
@@ -312,7 +312,14 @@ class WP_Embed {
* @return string Potentially modified $content.
*/
public function autoembed( $content ) {
return preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', array( $this, 'autoembed_callback' ), $content );
// Replace line breaks from all HTML elements with placeholders.
$content = wp_replace_in_html_tags( $content, array( "\n" => '<!-- wp-line-break -->' ) );
// Find URLs that are on their own line.
$content = preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', array( $this, 'autoembed_callback' ), $content );
// Put the line breaks back.
return str_replace( '<!-- wp-line-break -->', "\n", $content );
}
/**

View File

@@ -217,7 +217,7 @@ final class WP_Theme implements ArrayAccess {
} elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) {
$this->headers['Name'] = $this->stylesheet;
if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) )
$this->errors = new WP_Error( 'theme_not_found', sprintf( __( 'The theme directory "%s" does not exist.' ), $this->stylesheet ) );
$this->errors = new WP_Error( 'theme_not_found', sprintf( __( 'The theme directory "%s" does not exist.' ), esc_html( $this->stylesheet ) ) );
else
$this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) );
$this->template = $this->stylesheet;
@@ -264,7 +264,7 @@ final class WP_Theme implements ArrayAccess {
$theme_root_template = $directories[ $this->template ]['theme_root'];
} else {
// Parent theme is missing.
$this->errors = new WP_Error( 'theme_no_parent', sprintf( __( 'The parent theme is missing. Please install the "%s" parent theme.' ), $this->template ) );
$this->errors = new WP_Error( 'theme_no_parent', sprintf( __( 'The parent theme is missing. Please install the "%s" parent theme.' ), esc_html( $this->template ) ) );
$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );
$this->parent = new WP_Theme( $this->template, $this->theme_root, $this );
return;
@@ -276,11 +276,11 @@ final class WP_Theme implements ArrayAccess {
// If we are a parent, then there is a problem. Only two generations allowed! Cancel things out.
if ( is_a( $_child, 'WP_Theme' ) && $_child->template == $this->stylesheet ) {
$_child->parent = null;
$_child->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The "%s" theme is not a valid parent theme.' ), $_child->template ) );
$_child->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The "%s" theme is not a valid parent theme.' ), esc_html( $_child->template ) ) );
$_child->cache_add( 'theme', array( 'headers' => $_child->headers, 'errors' => $_child->errors, 'stylesheet' => $_child->stylesheet, 'template' => $_child->template ) );
// The two themes actually reference each other with the Template header.
if ( $_child->stylesheet == $this->template ) {
$this->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The "%s" theme is not a valid parent theme.' ), $this->template ) );
$this->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The "%s" theme is not a valid parent theme.' ), esc_html( $this->template ) ) );
$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );
}
return;
@@ -655,8 +655,9 @@ final class WP_Theme implements ArrayAccess {
private function markup_header( $header, $value, $translate ) {
switch ( $header ) {
case 'Name' :
if ( empty( $value ) )
$value = $this->get_stylesheet();
if ( empty( $value ) ) {
$value = esc_html( $this->get_stylesheet() );
}
break;
case 'Description' :
$value = wptexturize( $value );

View File

@@ -331,6 +331,11 @@ class wp_xmlrpc_server extends IXR_Server {
if ( isset($meta['id']) ) {
$meta['id'] = (int) $meta['id'];
$pmeta = get_metadata_by_mid( 'post', $meta['id'] );
if ( ! $pmeta || $pmeta->post_id != $post_id ) {
continue;
}
if ( isset($meta['key']) ) {
$meta['key'] = wp_unslash( $meta['key'] );
if ( $meta['key'] !== $pmeta->meta_key )
@@ -1149,6 +1154,56 @@ class wp_xmlrpc_server extends IXR_Server {
return $count > 1;
}
private function _validate_boolean( $var ) {
if ( is_bool( $var ) ) {
return $var;
}
if ( is_string( $var ) && 'false' === strtolower( $var ) ) {
return false;
}
return (bool) $var;
}
/**
* Encapsulate the logic for sticking a post
* and determining if the user has permission to do so
*
* @since 4.3.0
* @access private
*
* @param array $post_data
* @param bool $update
* @return void|IXR_Error
*/
private function _toggle_sticky( $post_data, $update = false ) {
$post_type = get_post_type_object( $post_data['post_type'] );
// Private and password-protected posts cannot be stickied.
if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) {
// Error if the client tried to stick the post, otherwise, silently unstick.
if ( ! empty( $post_data['sticky'] ) ) {
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
}
if ( $update ) {
unstick_post( $post_data['ID'] );
}
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );
}
$sticky = $this->_validate_boolean( $post_data['sticky'] );
if ( $sticky ) {
stick_post( $post_data['ID'] );
} else {
unstick_post( $post_data['ID'] );
}
}
}
/**
* Helper method for wp_newPost and wp_editPost, containing shared logic.
*
@@ -1159,10 +1214,31 @@ class wp_xmlrpc_server extends IXR_Server {
* @param array|IXR_Error $content_struct Post data to insert.
*/
protected function _insert_post( $user, $content_struct ) {
$defaults = array( 'post_status' => 'draft', 'post_type' => 'post', 'post_author' => 0,
'post_password' => '', 'post_excerpt' => '', 'post_content' => '', 'post_title' => '' );
$defaults = array(
'post_status' => 'draft',
'post_type' => 'post',
'post_author' => null,
'post_password' => null,
'post_excerpt' => null,
'post_content' => null,
'post_title' => null,
'post_date' => null,
'post_date_gmt' => null,
'post_format' => null,
'post_name' => null,
'post_thumbnail' => null,
'post_parent' => null,
'ping_status' => null,
'comment_status' => null,
'custom_fields' => null,
'terms_names' => null,
'terms' => null,
'sticky' => null,
'enclosure' => null,
'ID' => null,
);
$post_data = wp_parse_args( $content_struct, $defaults );
$post_data = wp_parse_args( array_intersect_key( $content_struct, $defaults ), $defaults );
$post_type = get_post_type_object( $post_data['post_type'] );
if ( ! $post_type )
@@ -1241,20 +1317,9 @@ class wp_xmlrpc_server extends IXR_Server {
$post_ID = $post_data['ID'];
if ( $post_data['post_type'] == 'post' ) {
// Private and password-protected posts cannot be stickied.
if ( $post_data['post_status'] == 'private' || ! empty( $post_data['post_password'] ) ) {
// Error if the client tried to stick the post, otherwise, silently unstick.
if ( ! empty( $post_data['sticky'] ) )
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
if ( $update )
unstick_post( $post_ID );
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) )
return new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );
if ( $post_data['sticky'] )
stick_post( $post_ID );
else
unstick_post( $post_ID );
$error = $this->_toggle_sticky( $post_data, $update );
if ( $error ) {
return $error;
}
}
@@ -1354,9 +1419,6 @@ class wp_xmlrpc_server extends IXR_Server {
$post_data['tax_input'] = $terms;
unset( $post_data['terms'], $post_data['terms_names'] );
} else {
// do not allow direct submission of 'tax_input', clients must use 'terms' and/or 'terms_names'
unset( $post_data['tax_input'], $post_data['post_category'], $post_data['tags_input'] );
}
if ( isset( $post_data['post_format'] ) ) {
@@ -4583,10 +4645,12 @@ class wp_xmlrpc_server extends IXR_Server {
// Only posts can be sticky
if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) {
if ( $content_struct['sticky'] == true )
stick_post( $post_ID );
elseif ( $content_struct['sticky'] == false )
unstick_post( $post_ID );
$data = $postdata;
$data['sticky'] = $content_struct['sticky'];
$error = $this->_toggle_sticky( $data );
if ( $error ) {
return $error;
}
}
if ( isset($content_struct['custom_fields']) )
@@ -4872,11 +4936,12 @@ class wp_xmlrpc_server extends IXR_Server {
$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null;
if ( ('publish' == $post_status) ) {
if ( ( 'page' == $post_type ) && !current_user_can('publish_pages') )
return new IXR_Error(401, __('Sorry, you do not have the right to publish this page.'));
else if ( !current_user_can('publish_posts') )
return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.'));
if ( 'publish' == $post_status || 'private' == $post_status ) {
if ( 'page' == $post_type && ! current_user_can( 'publish_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this page.' ) );
} elseif ( ! current_user_can( 'publish_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) );
}
}
if ( $post_more )
@@ -4916,10 +4981,13 @@ class wp_xmlrpc_server extends IXR_Server {
// Only posts can be sticky
if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) {
if ( $content_struct['sticky'] == true )
stick_post( $post_ID );
elseif ( $content_struct['sticky'] == false )
unstick_post( $post_ID );
$data = $newpost;
$data['sticky'] = $content_struct['sticky'];
$data['post_type'] = 'post';
$error = $this->_toggle_sticky( $data, true );
if ( $error ) {
return $error;
}
}
if ( isset($content_struct['custom_fields']) )

View File

@@ -15,7 +15,7 @@ class WP {
* @access public
* @var array
*/
public $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type');
public $public_query_vars = array( 'm', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type', 'embed' );
/**
* Private query variables.
@@ -265,6 +265,8 @@ class WP {
foreach ( $this->public_query_vars as $wpvar ) {
if ( isset( $this->extra_query_vars[$wpvar] ) )
$this->query_vars[$wpvar] = $this->extra_query_vars[$wpvar];
elseif ( isset( $_GET[ $wpvar ] ) && isset( $_POST[ $wpvar ] ) && $_GET[ $wpvar ] !== $_POST[ $wpvar ] )
wp_die( __( 'A variable mismatch has been detected.' ), __( 'Sorry, you are not allowed to view this item.' ), 400 );
elseif ( isset( $_POST[$wpvar] ) )
$this->query_vars[$wpvar] = $_POST[$wpvar];
elseif ( isset( $_GET[$wpvar] ) )

View File

@@ -13,23 +13,141 @@ if ( !function_exists('_') ) {
}
}
if ( !function_exists('mb_substr') ):
function mb_substr( $str, $start, $length=null, $encoding=null ) {
return _mb_substr($str, $start, $length, $encoding);
/**
* Returns whether PCRE/u (PCRE_UTF8 modifier) is available for use.
*
* @ignore
* @since 4.2.2
* @access private
*
* @param bool $set - Used for testing only
* null : default - get PCRE/u capability
* false : Used for testing - return false for future calls to this function
* 'reset': Used for testing - restore default behavior of this function
*/
function _wp_can_use_pcre_u( $set = null ) {
static $utf8_pcre = 'reset';
if ( null !== $set ) {
$utf8_pcre = $set;
}
if ( 'reset' === $utf8_pcre ) {
$utf8_pcre = @preg_match( '/^./u', 'a' );
}
return $utf8_pcre;
}
if ( ! function_exists( 'mb_substr' ) ) :
function mb_substr( $str, $start, $length = null, $encoding = null ) {
return _mb_substr( $str, $start, $length, $encoding );
}
endif;
function _mb_substr( $str, $start, $length=null, $encoding=null ) {
// the solution below, works only for utf-8, so in case of a different
// charset, just use built-in substr
$charset = get_option( 'blog_charset' );
if ( !in_array( $charset, array('utf8', 'utf-8', 'UTF8', 'UTF-8') ) ) {
return is_null( $length )? substr( $str, $start ) : substr( $str, $start, $length);
/*
* Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit.
* For $encoding === UTF-8, the $str input is expected to be a valid UTF-8 byte sequence.
* The behavior of this function for invalid inputs is undefined.
*/
function _mb_substr( $str, $start, $length = null, $encoding = null ) {
if ( null === $encoding ) {
$encoding = get_option( 'blog_charset' );
}
// use the regex unicode support to separate the UTF-8 characters into an array
preg_match_all( '/./us', $str, $match );
$chars = is_null( $length )? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length );
return implode( '', $chars );
// The solution below works only for UTF-8,
// so in case of a different charset just use built-in substr()
if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) {
return is_null( $length ) ? substr( $str, $start ) : substr( $str, $start, $length );
}
if ( _wp_can_use_pcre_u() ) {
// Use the regex unicode support to separate the UTF-8 characters into an array
preg_match_all( '/./us', $str, $match );
$chars = is_null( $length ) ? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length );
return implode( '', $chars );
}
$regex = '/(
[\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xE1-\xEC][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| [\xEE-\xEF][\x80-\xBF]{2}
| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)/x';
$chars = array( '' ); // Start with 1 element instead of 0 since the first thing we do is pop
do {
// We had some string left over from the last round, but we counted it in that last round.
array_pop( $chars );
// Split by UTF-8 character, limit to 1000 characters (last array element will contain the rest of the string)
$pieces = preg_split( $regex, $str, 1000, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
$chars = array_merge( $chars, $pieces );
} while ( count( $pieces ) > 1 && $str = array_pop( $pieces ) ); // If there's anything left over, repeat the loop.
return join( '', array_slice( $chars, $start, $length ) );
}
if ( ! function_exists( 'mb_strlen' ) ) :
function mb_strlen( $str, $encoding = null ) {
return _mb_strlen( $str, $encoding );
}
endif;
/*
* Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit.
* For $encoding === UTF-8, the $str input is expected to be a valid UTF-8 byte sequence.
* The behavior of this function for invalid inputs is undefined.
*/
function _mb_strlen( $str, $encoding = null ) {
if ( null === $encoding ) {
$encoding = get_option( 'blog_charset' );
}
// The solution below works only for UTF-8,
// so in case of a different charset just use built-in strlen()
if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) {
return strlen( $str );
}
if ( _wp_can_use_pcre_u() ) {
// Use the regex unicode support to separate the UTF-8 characters into an array
preg_match_all( '/./us', $str, $match );
return count( $match[0] );
}
$regex = '/(?:
[\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xE1-\xEC][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| [\xEE-\xEF][\x80-\xBF]{2}
| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)/x';
$count = 1; // Start at 1 instead of 0 since the first thing we do is decrement
do {
// We had some string left over from the last round, but we counted it in that last round.
$count--;
// Split by UTF-8 character, limit to 1000 characters (last array element will contain the rest of the string)
$pieces = preg_split( $regex, $str, 1000 );
// Increment
$count += count( $pieces );
} while ( $str = array_pop( $pieces ) ); // If there's anything left over, repeat the loop.
// Fencepost: preg_split() always returns one extra item in the array
return --$count;
}
if ( !function_exists('hash_hmac') ):

View File

@@ -1354,7 +1354,7 @@ class WP_Widget_Tag_Cloud extends WP_Widget {
?>
<p>
<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:') ?></label>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo $title; ?>" />
<input type="text" class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo esc_attr( $title ); ?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('nav_menu'); ?>"><?php _e('Select Menu:'); ?></label>

View File

@@ -469,7 +469,7 @@ function rss_enclosure() {
*
* @param string $html_link_tag The HTML link tag with a URI and other attributes.
*/
echo apply_filters( 'rss_enclosure', '<enclosure url="' . trim( htmlspecialchars( $enclosure[0] ) ) . '" length="' . trim( $enclosure[1] ) . '" type="' . $type . '" />' . "\n" );
echo apply_filters( 'rss_enclosure', '<enclosure url="' . esc_url( trim( $enclosure[0] ) ) . '" length="' . absint( trim( $enclosure[1] ) ) . '" type="' . esc_attr( $type ) . '" />' . "\n" );
}
}
}
@@ -503,7 +503,7 @@ function atom_enclosure() {
*
* @param string $html_link_tag The HTML link tag with a URI and other attributes.
*/
echo apply_filters( 'atom_enclosure', '<link href="' . trim( htmlspecialchars( $enclosure[0] ) ) . '" rel="enclosure" length="' . trim( $enclosure[1] ) . '" type="' . trim( $enclosure[2] ) . '" />' . "\n" );
echo apply_filters( 'atom_enclosure', '<link href="' . esc_url( trim( $enclosure[0] ) ) . '" rel="enclosure" length="' . absint( trim( $enclosure[1] ) ) . '" type="' . esc_attr( trim( $enclosure[2] ) ) . '" />' . "\n" );
}
}
}

View File

@@ -410,6 +410,9 @@ function wpautop($pee, $br = true) {
$pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
// Find newlines in all elements and add placeholders.
$pee = wp_replace_in_html_tags( $pee, array( "\n" => " <!-- wpnl --> " ) );
if ( strpos( $pee, '<option' ) !== false ) {
// no P/BR around option
$pee = preg_replace( '|\s*<option|', '<option', $pee );
@@ -461,9 +464,109 @@ function wpautop($pee, $br = true) {
if ( !empty($pre_tags) )
$pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee);
// Restore newlines in all elements.
$pee = str_replace( " <!-- wpnl --> ", "\n", $pee );
return $pee;
}
/**
* Separate HTML elements and comments from the text.
*
* @since 4.2.4
*
* @param string $input The text which has to be formatted.
* @return array The formatted text.
*/
function wp_html_split( $input ) {
static $regex;
if ( ! isset( $regex ) ) {
$comments =
'!' // Start of comment, after the <.
. '(?:' // Unroll the loop: Consume everything until --> is found.
. '-(?!->)' // Dash not followed by end of comment.
. '[^\-]*+' // Consume non-dashes.
. ')*+' // Loop possessively.
. '(?:-->)?'; // End of comment. If not found, match all input.
$cdata =
'!\[CDATA\[' // Start of comment, after the <.
. '[^\]]*+' // Consume non-].
. '(?:' // Unroll the loop: Consume everything until ]]> is found.
. '](?!]>)' // One ] not followed by end of comment.
. '[^\]]*+' // Consume non-].
. ')*+' // Loop possessively.
. '(?:]]>)?'; // End of comment. If not found, match all input.
$regex =
'/(' // Capture the entire match.
. '<' // Find start of element.
. '(?(?=!--)' // Is this a comment?
. $comments // Find end of comment.
. '|'
. '(?(?=!\[CDATA\[)' // Is this a comment?
. $cdata // Find end of comment.
. '|'
. '[^>]*>?' // Find end of element. If not found, match all input.
. ')'
. ')'
. ')/s';
}
return preg_split( $regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE );
}
/**
* Replace characters or phrases within HTML elements only.
*
* @since 4.2.3
*
* @param string $haystack The text which has to be formatted.
* @param array $replace_pairs In the form array('from' => 'to', ...).
* @return string The formatted text.
*/
function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
// Find all elements.
$textarr = wp_html_split( $haystack );
$changed = false;
// Optimize when searching for one item.
if ( 1 === count( $replace_pairs ) ) {
// Extract $needle and $replace.
foreach ( $replace_pairs as $needle => $replace );
// Loop through delimeters (elements) only.
for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
if ( false !== strpos( $textarr[$i], $needle ) ) {
$textarr[$i] = str_replace( $needle, $replace, $textarr[$i] );
$changed = true;
}
}
} else {
// Extract all $needles.
$needles = array_keys( $replace_pairs );
// Loop through delimeters (elements) only.
for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
foreach ( $needles as $needle ) {
if ( false !== strpos( $textarr[$i], $needle ) ) {
$textarr[$i] = strtr( $textarr[$i], $replace_pairs );
$changed = true;
// After one strtr() break out of the foreach loop and look at next element.
break;
}
}
}
}
if ( $changed ) {
$haystack = implode( $textarr );
}
return $haystack;
}
/**
* Newline preservation help function for wpautop
*
@@ -1052,7 +1155,8 @@ function remove_accents($string) {
* operating systems and special characters requiring special escaping
* to manipulate at the command line. Replaces spaces and consecutive
* dashes with a single dash. Trims period, dash and underscore from beginning
* and end of filename.
* and end of filename. It is not guaranteed that this function will return a
* filename that is allowed to be uploaded.
*
* @since 2.1.0
*
@@ -1077,6 +1181,14 @@ function sanitize_file_name( $filename ) {
$filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
$filename = trim( $filename, '.-_' );
if ( false === strpos( $filename, '.' ) ) {
$mime_types = wp_get_mime_types();
$filetype = wp_check_filetype( 'test.' . $filename, $mime_types );
if ( $filetype['ext'] === $filename ) {
$filename = 'unnamed-file.' . $filetype['ext'];
}
}
// Split the filename into a base and extension[s]
$parts = explode('.', $filename);

View File

@@ -1492,6 +1492,11 @@ function wp_mkdir_p( $target ) {
if ( file_exists( $target ) )
return @is_dir( $target );
// Do not allow path traversals.
if ( false !== strpos( $target, '../' ) || false !== strpos( $target, '..' . DIRECTORY_SEPARATOR ) ) {
return false;
}
// We need to find the permissions of the parent folder that exists and inherit that.
$target_parent = dirname( $target );
while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
@@ -1575,18 +1580,38 @@ function path_join( $base, $path ) {
/**
* Normalize a filesystem path.
*
* Replaces backslashes with forward slashes for Windows systems, and ensures
* no duplicate slashes exist.
* On windows systems, replaces backslashes with forward slashes
* and forces upper-case drive letters.
* Allows for two leading slashes for Windows network shares, but
* ensures that all other duplicate slashes are reduced to a single.
*
* @since 3.9.0
* @since 4.4.0 Ensures upper-case drive letters on Windows systems.
* @since 4.5.0 Allows for Windows network shares.
* @since 4.9.7 Allows for PHP file wrappers.
*
* @param string $path Path to normalize.
* @return string Normalized path.
*/
function wp_normalize_path( $path ) {
$wrapper = '';
if ( wp_is_stream( $path ) ) {
list( $wrapper, $path ) = explode( '://', $path, 2 );
$wrapper .= '://';
}
// Standardise all paths to use /
$path = str_replace( '\\', '/', $path );
$path = preg_replace( '|/+|','/', $path );
return $path;
// Replace multiple slashes down to a singular, allowing for network shares having two slashes.
$path = preg_replace( '|(?<=.)/+|', '/', $path );
// Windows paths should uppercase the drive letter
if ( ':' === substr( $path, 1, 1 ) ) {
$path = ucfirst( $path );
}
return $wrapper . $path;
}
/**
@@ -2068,7 +2093,7 @@ function wp_check_filetype( $filename, $mimes = null ) {
* If it's determined that the extension does not match the file's real type,
* then the "proper_filename" value will be set with a proper filename and extension.
*
* Currently this function only supports validating images known to getimagesize().
* Currently this function only supports renaming images validated via wp_get_image_mime().
*
* @since 3.0.0
*
@@ -2093,14 +2118,15 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
return compact( 'ext', 'type', 'proper_filename' );
}
// We're able to validate images using GD
if ( $type && 0 === strpos( $type, 'image/' ) && function_exists('getimagesize') ) {
// Validate image types.
if ( $type && 0 === strpos( $type, 'image/' ) ) {
// Attempt to figure out what type of image it actually is
$imgstats = @getimagesize( $file );
$real_mime = wp_get_image_mime( $file );
// If getimagesize() knows what kind of image it really is and if the real MIME doesn't match the claimed MIME
if ( !empty($imgstats['mime']) && $imgstats['mime'] != $type ) {
if ( ! $real_mime ) {
$type = $ext = false;
} elseif ( $real_mime != $type ) {
/**
* Filter the list mapping image mime types to their respective extensions.
*
@@ -2117,10 +2143,10 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
) );
// Replace whatever is after the last period in the filename with the correct extension
if ( ! empty( $mime_to_ext[ $imgstats['mime'] ] ) ) {
if ( ! empty( $mime_to_ext[ $real_mime ] ) ) {
$filename_parts = explode( '.', $filename );
array_pop( $filename_parts );
$filename_parts[] = $mime_to_ext[ $imgstats['mime'] ];
$filename_parts[] = $mime_to_ext[ $real_mime ];
$new_filename = implode( '.', $filename_parts );
if ( $new_filename != $filename ) {
@@ -2130,10 +2156,67 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
$wp_filetype = wp_check_filetype( $new_filename, $mimes );
$ext = $wp_filetype['ext'];
$type = $wp_filetype['type'];
} else {
$type = $ext = false;
}
}
}
// Validate files that didn't get validated during previous checks.
if ( $type && ! $real_mime && extension_loaded( 'fileinfo' ) ) {
$finfo = finfo_open( FILEINFO_MIME_TYPE );
$real_mime = finfo_file( $finfo, $file );
finfo_close( $finfo );
// fileinfo often misidentifies obscure files as one of these types
$nonspecific_types = array(
'application/octet-stream',
'application/encrypted',
'application/CDFV2-encrypted',
'application/zip',
);
/*
* If $real_mime doesn't match the content type we're expecting from the file's extension,
* we need to do some additional vetting. Media types and those listed in $nonspecific_types are
* allowed some leeway, but anything else must exactly match the real content type.
*/
if ( in_array( $real_mime, $nonspecific_types, true ) ) {
// File is a non-specific binary type. That's ok if it's a type that generally tends to be binary.
if ( !in_array( substr( $type, 0, strcspn( $type, '/' ) ), array( 'application', 'video', 'audio' ) ) ) {
$type = $ext = false;
}
} elseif ( 0 === strpos( $real_mime, 'video/' ) || 0 === strpos( $real_mime, 'audio/' ) ) {
/*
* For these types, only the major type must match the real value.
* This means that common mismatches are forgiven: application/vnd.apple.numbers is often misidentified as application/zip,
* and some media files are commonly named with the wrong extension (.mov instead of .mp4)
*/
if ( substr( $real_mime, 0, strcspn( $real_mime, '/' ) ) !== substr( $type, 0, strcspn( $type, '/' ) ) ) {
$type = $ext = false;
}
} else {
if ( $type !== $real_mime ) {
/*
* Everything else including image/* and application/*:
* If the real content type doesn't match the file extension, assume it's dangerous.
*/
$type = $ext = false;
}
}
}
// The mime type must be allowed
if ( $type ) {
$allowed = get_allowed_mime_types();
if ( ! in_array( $type, $allowed ) ) {
$type = $ext = false;
}
}
/**
* Filter the "real" file type of the given file.
*
@@ -2149,6 +2232,38 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes );
}
/**
* Returns the real mime type of an image file.
*
* This depends on exif_imagetype() or getimagesize() to determine real mime types.
*
* @since 4.7.1
*
* @param string $file Full path to the file.
* @return string|false The actual mime type or false if the type cannot be determined.
*/
function wp_get_image_mime( $file ) {
/*
* Use exif_imagetype() to check the mimetype if available or fall back to
* getimagesize() if exif isn't avaialbe. If either function throws an Exception
* we assume the file could not be validated.
*/
try {
if ( is_callable( 'exif_imagetype' ) ) {
$mime = image_type_to_mime_type( exif_imagetype( $file ) );
} elseif ( function_exists( 'getimagesize' ) ) {
$imagesize = getimagesize( $file );
$mime = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false;
} else {
$mime = false;
}
} catch ( Exception $e ) {
$mime = false;
}
return $mime;
}
/**
* Retrieve list of mime types and file extensions.
*
@@ -2285,8 +2400,9 @@ function get_allowed_mime_types( $user = null ) {
if ( function_exists( 'current_user_can' ) )
$unfiltered = $user ? user_can( $user, 'unfiltered_html' ) : current_user_can( 'unfiltered_html' );
if ( empty( $unfiltered ) )
unset( $t['htm|html'] );
if ( empty( $unfiltered ) ) {
unset( $t['htm|html'], $t['js'] );
}
/**
* Filter list of allowed mime types and file extensions.
@@ -4809,3 +4925,29 @@ function wp_validate_boolean( $var ) {
return (bool) $var;
}
/**
* Deletes a file if its path is within the given directory.
*
* @since 4.9.7
*
* @param string $file Absolute path to the file to delete.
* @param string $directory Absolute path to a directory.
* @return bool True on success, false on failure.
*/
function wp_delete_file_from_directory( $file, $directory ) {
$real_file = realpath( wp_normalize_path( $file ) );
$real_directory = realpath( wp_normalize_path( $directory ) );
if ( false === $real_file || false === $real_directory || strpos( wp_normalize_path( $real_file ), trailingslashit( wp_normalize_path( $real_directory ) ) ) !== 0 ) {
return false;
}
/** This filter is documented in wp-admin/custom-header.php */
$delete = apply_filters( 'wp_delete_file', $file );
if ( ! empty( $delete ) ) {
@unlink( $delete );
}
return true;
}

View File

@@ -2363,6 +2363,24 @@ function wp_no_robots() {
echo "<meta name='robots' content='noindex,follow' />\n";
}
/**
* Display a noindex,noarchive meta tag and referrer origin-when-cross-origin meta tag.
*
* Outputs a noindex,noarchive meta tag that tells web robots not to index or cache the page content.
* Outputs a referrer origin-when-cross-origin meta tag that tells the browser not to send the full
* url as a referrer to other sites when cross-origin assets are loaded.
*
* Typical usage is as a wp_head callback. add_action( 'wp_head', 'wp_sensitive_page_meta' );
*
* @since 5.0.0
*/
function wp_sensitive_page_meta() {
?>
<meta name='robots' content='noindex,noarchive' />
<meta name='referrer' content='strict-origin-when-cross-origin' />
<?php
}
/**
* Whether the user should have a WYSIWIG editor.
*
@@ -2513,12 +2531,14 @@ function language_attributes($doctype = 'html') {
if ( function_exists( 'is_rtl' ) && is_rtl() )
$attributes[] = 'dir="rtl"';
if ( $lang = get_bloginfo('language') ) {
if ( get_option('html_type') == 'text/html' || $doctype == 'html' )
$attributes[] = "lang=\"$lang\"";
if ( $lang = get_bloginfo( 'language' ) ) {
if ( get_option( 'html_type' ) == 'text/html' || $doctype == 'html' ) {
$attributes[] = 'lang="' . esc_attr( $lang ) . '"';
}
if ( get_option('html_type') != 'text/html' || $doctype == 'xhtml' )
$attributes[] = "xml:lang=\"$lang\"";
if ( get_option( 'html_type' ) != 'text/html' || $doctype == 'xhtml' ) {
$attributes[] = 'xml:lang="' . esc_attr( $lang ) . '"';
}
}
$output = implode(' ', $attributes);
@@ -2997,25 +3017,25 @@ function get_the_generator( $type = '' ) {
switch ( $type ) {
case 'html':
$gen = '<meta name="generator" content="WordPress ' . get_bloginfo( 'version' ) . '">';
$gen = '<meta name="generator" content="WordPress ' . esc_attr( get_bloginfo( 'version' ) ) . '">';
break;
case 'xhtml':
$gen = '<meta name="generator" content="WordPress ' . get_bloginfo( 'version' ) . '" />';
$gen = '<meta name="generator" content="WordPress ' . esc_attr( get_bloginfo( 'version' ) ) . '" />';
break;
case 'atom':
$gen = '<generator uri="http://wordpress.org/" version="' . get_bloginfo_rss( 'version' ) . '">WordPress</generator>';
$gen = '<generator uri="https://wordpress.org/" version="' . esc_attr( get_bloginfo_rss( 'version' ) ) . '">WordPress</generator>';
break;
case 'rss2':
$gen = '<generator>http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '</generator>';
$gen = '<generator>' . esc_url_raw( 'https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) ) . '</generator>';
break;
case 'rdf':
$gen = '<admin:generatorAgent rdf:resource="http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '" />';
$gen = '<admin:generatorAgent rdf:resource="' . esc_url_raw( 'https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) ) . '" />';
break;
case 'comment':
$gen = '<!-- generator="WordPress/' . get_bloginfo( 'version' ) . '" -->';
$gen = '<!-- generator="WordPress/' . esc_attr( get_bloginfo( 'version' ) ) . '" -->';
break;
case 'export':
$gen = '<!-- generator="WordPress/' . get_bloginfo_rss('version') . '" created="'. date('Y-m-d H:i') . '" -->';
$gen = '<!-- generator="WordPress/' . esc_attr( get_bloginfo_rss( 'version' ) ) . '" created="' . date( 'Y-m-d H:i' ) . '" -->';
break;
}

View File

@@ -466,16 +466,17 @@ function wp_http_validate_url( $url ) {
if ( ! $same_host ) {
$host = trim( $parsed_url['host'], '.' );
if ( preg_match( '#^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $host ) ) {
if ( preg_match( '#^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$#', $host ) ) {
$ip = $host;
} else {
$ip = gethostbyname( $host );
if ( $ip === $host ) // Error condition for gethostbyname()
$ip = false;
if ( $ip === $host ) { // Error condition for gethostbyname()
return false;
}
}
if ( $ip ) {
$parts = array_map( 'intval', explode( '.', $ip ) );
if ( 127 === $parts[0] || 10 === $parts[0]
if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]
|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
|| ( 192 === $parts[0] && 168 === $parts[1] )
) {

View File

@@ -131,6 +131,14 @@ window.wp = window.wp || {};
importStyles = this.type === 'video' || this.type === 'audio' || this.type === 'playlist';
if ( head || body.indexOf( '<script' ) !== -1 ) {
if ( body.indexOf( '[' ) !== -1 && body.indexOf( ']' ) !== -1 ) {
var shortcodesRegExp = new RegExp( '\\[\\/?(?:' + window.mceViewL10n.shortcodes.join( '|' ) + ')[^\\]]*?\\]', 'g' );
// Escape tags inside shortcode previews.
body = body.replace( shortcodesRegExp, function( match ) {
return match.replace( /</g, '&lt;' ).replace( />/g, '&gt;' );
} );
}
this.getNodes( function ( editor, node, content ) {
var dom = editor.dom,
styles = '',

File diff suppressed because one or more lines are too long

View File

@@ -328,15 +328,24 @@ function uploadError(fileObj, errorCode, message, uploader) {
}
}
function uploadSizeError( up, file, over100mb ) {
var message;
function uploadSizeError( up, file ) {
var message, errorDiv;
if ( over100mb )
message = pluploadL10n.big_upload_queued.replace('%s', file.name) + ' ' + pluploadL10n.big_upload_failed.replace('%1$s', '<a class="uploader-html" href="#">').replace('%2$s', '</a>');
else
message = pluploadL10n.file_exceeds_size_limit.replace('%s', file.name);
message = pluploadL10n.file_exceeds_size_limit.replace('%s', file.name);
jQuery('#media-items').append('<div id="media-item-' + file.id + '" class="media-item error"><p>' + message + '</p></div>');
// Construct the error div.
errorDiv = jQuery( '<div />' )
.attr( {
'id': 'media-item-' + file.id,
'class': 'media-item error'
} )
.append(
jQuery( '<p />' )
.text( message )
);
// Append the error.
jQuery('#media-items').append( errorDiv );
up.removeFile(file);
}

File diff suppressed because one or more lines are too long

View File

@@ -106,6 +106,10 @@ tinymce.PluginManager.add( 'wordpress', function( editor ) {
'<img src="' + tinymce.Env.transparentSrc + '" data-wp-more="nextpage" class="wp-more-tag mce-wp-nextpage" ' +
'title="' + title + '" data-mce-resize="false" data-mce-placeholder="1" />' );
}
if ( e.content.indexOf( '<?"' ) !== -1 ) {
e.content = e.content.replace( /<\?"/g, '' );
}
}
});

File diff suppressed because one or more lines are too long

View File

@@ -210,6 +210,13 @@ var wpLink;
attrs = wpLink.getAttrs();
var parser = document.createElement( 'a' );
parser.href = attrs.href;
if ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line
attrs.href = '';
}
// If there's no href, return.
if ( ! attrs.href || attrs.href == 'http://' )
return;
@@ -223,7 +230,7 @@ var wpLink;
}
if ( attrs.target ) {
html += ' target="' + attrs.target + '"';
html += ' rel="noopener" target="' + attrs.target + '"';
}
html += '>';
@@ -275,6 +282,13 @@ var wpLink;
link = editor.dom.getParent( editor.selection.getNode(), 'a[href]' );
var parser = document.createElement( 'a' );
parser.href = attrs.href;
if ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line
attrs.href = '';
}
// If the values are empty, unlink and return
if ( ! attrs.href || attrs.href == 'http://' ) {
editor.execCommand( 'unlink' );

File diff suppressed because one or more lines are too long

View File

@@ -180,15 +180,6 @@ if ( ! CUSTOM_TAGS ) {
'lang' => true,
'xml:lang' => true,
),
'form' => array(
'action' => true,
'accept' => true,
'accept-charset' => true,
'enctype' => true,
'method' => true,
'name' => true,
'target' => true,
),
'h1' => array(
'align' => true,
),
@@ -527,10 +518,87 @@ function wp_kses( $string, $allowed_html, $allowed_protocols = array() ) {
return wp_kses_split($string, $allowed_html, $allowed_protocols);
}
/**
* Filters one attribute only and ensures its value is allowed.
*
* This function has the advantage of being more secure than esc_attr() and can
* escape data in some situations where wp_kses() must strip the whole attribute.
*
* @since 4.2.3
*
* @param string $string The 'whole' attribute, including name and value.
* @param string $element The element name to which the attribute belongs.
* @return string Filtered attribute.
*/
function wp_kses_one_attr( $string, $element ) {
$uris = wp_kses_uri_attributes();
$allowed_html = wp_kses_allowed_html( 'post' );
$allowed_protocols = wp_allowed_protocols();
$string = wp_kses_no_null( $string, array( 'slash_zero' => 'keep' ) );
$string = wp_kses_js_entities( $string );
$string = wp_kses_normalize_entities( $string );
// Preserve leading and trailing whitespace.
$matches = array();
preg_match('/^\s*/', $string, $matches);
$lead = $matches[0];
preg_match('/\s*$/', $string, $matches);
$trail = $matches[0];
if ( empty( $trail ) ) {
$string = substr( $string, strlen( $lead ) );
} else {
$string = substr( $string, strlen( $lead ), -strlen( $trail ) );
}
// Parse attribute name and value from input.
$split = preg_split( '/\s*=\s*/', $string, 2 );
$name = $split[0];
if ( count( $split ) == 2 ) {
$value = $split[1];
// Remove quotes surrounding $value.
// Also guarantee correct quoting in $string for this one attribute.
if ( '' == $value ) {
$quote = '';
} else {
$quote = $value[0];
}
if ( '"' == $quote || "'" == $quote ) {
if ( substr( $value, -1 ) != $quote ) {
return '';
}
$value = substr( $value, 1, -1 );
} else {
$quote = '"';
}
// Sanitize quotes and angle braces.
$value = htmlspecialchars( $value, ENT_QUOTES, null, false );
// Sanitize URI values.
if ( in_array( strtolower( $name ), $uris ) ) {
$value = wp_kses_bad_protocol( $value, $allowed_protocols );
}
$string = "$name=$quote$value$quote";
$vless = 'n';
} else {
$value = '';
$vless = 'y';
}
// Sanitize attribute by name.
wp_kses_attr_check( $name, $value, $string, $vless, $element, $allowed_html );
// Restore whitespace.
return $lead . $string . $trail;
}
/**
* Return a list of allowed tags and attributes for a given context.
*
* @since 3.5.0
* @since 5.0.1 `form` removed as allowable HTML tag.
*
* @param string $context The context for which to retrieve tags. Allowed values are
* post | strip | data | entities or the name of a field filter such as pre_user_description.
@@ -555,8 +623,27 @@ function wp_kses_allowed_html( $context = '' ) {
switch ( $context ) {
case 'post':
/** This filter is documented in wp-includes/kses.php */
return apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );
break;
$tags = apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );
// 5.0.1 removed the `<form>` tag, allow it if a filter is allowing it's sub-elements `<input>` or `<select>`.
if ( ! CUSTOM_TAGS && ! isset( $tags['form'] ) && ( isset( $tags['input'] ) || isset( $tags['select'] ) ) ) {
$tags = $allowedposttags;
$tags['form'] = array(
'action' => true,
'accept' => true,
'accept-charset' => true,
'enctype' => true,
'method' => true,
'name' => true,
'target' => true,
);
/** This filter is documented in wp-includes/kses.php */
$tags = apply_filters( 'wp_kses_allowed_html', $tags, $context );
}
return $tags;
case 'user_description':
case 'pre_user_description':
$tags = $allowedtags;
@@ -636,6 +723,56 @@ function wp_kses_split( $string, $allowed_html, $allowed_protocols ) {
return preg_replace_callback( '%(<!--.*?(-->|$))|(<[^>]*(>|$)|>)%', '_wp_kses_split_callback', $string );
}
/**
* Helper function listing HTML attributes containing a URL.
*
* This function returns a list of all HTML attributes that must contain
* a URL according to the HTML specification.
*
* This list includes URI attributes both allowed and disallowed by KSES.
*
* @link https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes
*
* @since 5.0.1
*
* @return array HTML attributes that must include a URL.
*/
function wp_kses_uri_attributes() {
$uri_attributes = array(
'action',
'archive',
'background',
'cite',
'classid',
'codebase',
'data',
'formaction',
'href',
'icon',
'longdesc',
'manifest',
'poster',
'profile',
'src',
'usemap',
'xmlns',
);
/**
* Filters the list of attributes that are required to contain a URL.
*
* Use this filter to add any `data-` attributes that are required to be
* validated as a URL.
*
* @since 5.0.1
*
* @param array $uri_attributes HTML attributes requiring validation as a URL.
*/
$uri_attributes = apply_filters( 'wp_kses_uri_attributes', $uri_attributes );
return $uri_attributes;
}
/**
* Callback for wp_kses_split.
*
@@ -747,45 +884,11 @@ function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols) {
# Go through $attrarr, and save the allowed attributes for this element
# in $attr2
$attr2 = '';
$allowed_attr = $allowed_html[strtolower($element)];
foreach ($attrarr as $arreach) {
if ( ! isset( $allowed_attr[strtolower($arreach['name'])] ) )
continue; # the attribute is not allowed
$current = $allowed_attr[strtolower($arreach['name'])];
if ( $current == '' )
continue; # the attribute is not allowed
if ( strtolower( $arreach['name'] ) == 'style' ) {
$orig_value = $arreach['value'];
$value = safecss_filter_attr( $orig_value );
if ( empty( $value ) )
continue;
$arreach['value'] = $value;
$arreach['whole'] = str_replace( $orig_value, $value, $arreach['whole'] );
}
if ( ! is_array($current) ) {
foreach ( $attrarr as $arreach ) {
if ( wp_kses_attr_check( $arreach['name'], $arreach['value'], $arreach['whole'], $arreach['vless'], $element, $allowed_html ) ) {
$attr2 .= ' '.$arreach['whole'];
# there are no checks
} else {
# there are some checks
$ok = true;
foreach ($current as $currkey => $currval) {
if ( ! wp_kses_check_attr_val($arreach['value'], $arreach['vless'], $currkey, $currval) ) {
$ok = false;
break;
}
}
if ( $ok )
$attr2 .= ' '.$arreach['whole']; # it passed them
} # if !is_array($current)
} # foreach
}
}
# Remove any "<" or ">" characters
$attr2 = preg_replace('/[<>]/', '', $attr2);
@@ -793,6 +896,53 @@ function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols) {
return "<$element$attr2$xhtml_slash>";
}
/**
* Determine whether an attribute is allowed.
*
* @since 4.2.3
*
* @param string $name The attribute name. Returns empty string when not allowed.
* @param string $value The attribute value. Returns a filtered value.
* @param string $whole The name=value input. Returns filtered input.
* @param string $vless 'y' when attribute like "enabled", otherwise 'n'.
* @param string $element The name of the element to which this attribute belongs.
* @param array $allowed_html The full list of allowed elements and attributes.
* @return bool Is the attribute allowed?
*/
function wp_kses_attr_check( &$name, &$value, &$whole, $vless, $element, $allowed_html ) {
$allowed_attr = $allowed_html[strtolower( $element )];
$name_low = strtolower( $name );
if ( ! isset( $allowed_attr[$name_low] ) || '' == $allowed_attr[$name_low] ) {
$name = $value = $whole = '';
return false;
}
if ( 'style' == $name_low ) {
$new_value = safecss_filter_attr( $value );
if ( empty( $new_value ) ) {
$name = $value = $whole = '';
return false;
}
$whole = str_replace( $value, $new_value, $whole );
$value = $new_value;
}
if ( is_array( $allowed_attr[$name_low] ) ) {
// there are some checks
foreach ( $allowed_attr[$name_low] as $currkey => $currval ) {
if ( ! wp_kses_check_attr_val( $value, $vless, $currkey, $currval ) ) {
$name = $value = $whole = '';
return false;
}
}
}
return true;
}
/**
* Builds an attribute list from string containing attributes.
*
@@ -814,7 +964,7 @@ function wp_kses_hair($attr, $allowed_protocols) {
$attrarr = array();
$mode = 0;
$attrname = '';
$uris = array('xmlns', 'profile', 'href', 'src', 'cite', 'classid', 'codebase', 'data', 'usemap', 'longdesc', 'action');
$uris = wp_kses_uri_attributes();
# Loop through the whole attribute list
@@ -922,6 +1072,109 @@ function wp_kses_hair($attr, $allowed_protocols) {
return $attrarr;
}
/**
* Finds all attributes of an HTML element.
*
* Does not modify input. May return "evil" output.
*
* Based on wp_kses_split2() and wp_kses_attr()
*
* @since 4.2.3
*
* @param string $element HTML element/tag
* @return array|bool List of attributes found in $element. Returns false on failure.
*/
function wp_kses_attr_parse( $element ) {
$valid = preg_match('%^(<\s*)(/\s*)?([a-zA-Z0-9]+\s*)([^>]*)(>?)$%', $element, $matches);
if ( 1 !== $valid ) {
return false;
}
$begin = $matches[1];
$slash = $matches[2];
$elname = $matches[3];
$attr = $matches[4];
$end = $matches[5];
if ( '' !== $slash ) {
// Closing elements do not get parsed.
return false;
}
// Is there a closing XHTML slash at the end of the attributes?
if ( 1 === preg_match( '%\s*/\s*$%', $attr, $matches ) ) {
$xhtml_slash = $matches[0];
$attr = substr( $attr, 0, -strlen( $xhtml_slash ) );
} else {
$xhtml_slash = '';
}
// Split it
$attrarr = wp_kses_hair_parse( $attr );
if ( false === $attrarr ) {
return false;
}
// Make sure all input is returned by adding front and back matter.
array_unshift( $attrarr, $begin . $slash . $elname );
array_push( $attrarr, $xhtml_slash . $end );
return $attrarr;
}
/**
* Builds an attribute list from string containing attributes.
*
* Does not modify input. May return "evil" output.
* In case of unexpected input, returns false instead of stripping things.
*
* Based on wp_kses_hair() but does not return a multi-dimensional array.
*
* @since 4.2.3
*
* @param string $attr Attribute list from HTML element to closing HTML element tag
* @return array|bool List of attributes found in $attr. Returns false on failure.
*/
function wp_kses_hair_parse( $attr ) {
if ( '' === $attr ) {
return array();
}
$regex =
'(?:'
. '[-a-zA-Z:]+' // Attribute name.
. '|'
. '\[\[?[^\[\]]+\]\]?' // Shortcode in the name position implies unfiltered_html.
. ')'
. '(?:' // Attribute value.
. '\s*=\s*' // All values begin with '='
. '(?:'
. '"[^"]*"' // Double-quoted
. '|'
. "'[^']*'" // Single-quoted
. '|'
. '[^\s"\']+' // Non-quoted
. '(?:\s|$)' // Must have a space
. ')'
. '|'
. '(?:\s|$)' // If attribute has no value, space is required.
. ')'
. '\s*'; // Trailing space is optional except as mentioned above.
// Although it is possible to reduce this procedure to a single regexp,
// we must run that regexp twice to get exactly the expected result.
$validation = "%^($regex)+$%";
$extraction = "%$regex%";
if ( 1 === preg_match( $validation, $attr ) ) {
preg_match_all( $extraction, $attr, $attrarr );
return $attrarr[0];
} else {
return false;
}
}
/**
* Performs different checks for attribute values.
*
@@ -1120,6 +1373,7 @@ function wp_kses_html_error($string) {
* @return string Sanitized content
*/
function wp_kses_bad_protocol_once($string, $allowed_protocols, $count = 1 ) {
$string = preg_replace( '/(&#0*58(?![;0-9])|&#x0*3a(?![;a-f0-9]))/i', '$1;', $string );
$string2 = preg_split( '/:|&#0*58;|&#x0*3a;/i', $string, 2 );
if ( isset($string2[1]) && ! preg_match('%/\?%', $string2[0]) ) {
$string = trim( $string2[1] );

View File

@@ -813,6 +813,8 @@ function img_caption_shortcode( $attr, $content = null ) {
$content = $matches[1];
$attr['caption'] = trim( $matches[2] );
}
} elseif ( strpos( $attr['caption'], '<' ) !== false ) {
$attr['caption'] = wp_kses( $attr['caption'], 'post' );
}
/**
@@ -2295,7 +2297,7 @@ function wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) {
*/
function wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) {
global $wp_embed;
$embed = $wp_embed->autoembed( "https://youtube.com/watch?v={$matches[2]}" );
$embed = $wp_embed->autoembed( sprintf( "https://youtube.com/watch?v=%s", urlencode( $matches[2] ) ) );
/**
* Filter the YoutTube embed output.
*

View File

@@ -239,10 +239,13 @@ function wpmu_admin_do_redirect( $url = '' ) {
_deprecated_function( __FUNCTION__, '3.3' );
$ref = '';
if ( isset( $_GET['ref'] ) )
$ref = $_GET['ref'];
if ( isset( $_POST['ref'] ) )
$ref = $_POST['ref'];
if ( isset( $_GET['ref'] ) && isset( $_POST['ref'] ) && $_GET['ref'] !== $_POST['ref'] ) {
wp_die( __( 'A variable mismatch has been detected.' ), __( 'Sorry, you are not allowed to view this item.' ), 400 );
} elseif ( isset( $_POST['ref'] ) ) {
$ref = $_POST[ 'ref' ];
} elseif ( isset( $_GET['ref'] ) ) {
$ref = $_GET[ 'ref' ];
}
if ( $ref ) {
$ref = wpmu_admin_redirect_add_updated_param( $ref );
@@ -255,7 +258,9 @@ function wpmu_admin_do_redirect( $url = '' ) {
}
$url = wpmu_admin_redirect_add_updated_param( $url );
if ( isset( $_GET['redirect'] ) ) {
if ( isset( $_GET['redirect'] ) && isset( $_POST['redirect'] ) && $_GET['redirect'] !== $_POST['redirect'] ) {
wp_die( __( 'A variable mismatch has been detected.' ), __( 'Sorry, you are not allowed to view this item.' ), 400 );
} elseif ( isset( $_GET['redirect'] ) ) {
if ( substr( $_GET['redirect'], 0, 2 ) == 's_' )
$url .= '&action=blogs&s='. esc_html( substr( $_GET['redirect'], 2 ) );
} elseif ( isset( $_POST['redirect'] ) ) {

View File

@@ -713,7 +713,7 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) {
function wpmu_signup_blog( $domain, $path, $title, $user, $user_email, $meta = array() ) {
global $wpdb;
$key = substr( md5( time() . rand() . $domain ), 0, 16 );
$key = substr( md5( time() . wp_rand() . $domain ), 0, 16 );
$meta = serialize($meta);
$wpdb->insert( $wpdb->signups, array(
@@ -748,7 +748,7 @@ function wpmu_signup_user( $user, $user_email, $meta = array() ) {
// Format data
$user = preg_replace( '/\s+/', '', sanitize_user( $user, true ) );
$user_email = sanitize_email( $user_email );
$key = substr( md5( time() . rand() . $user_email ), 0, 16 );
$key = substr( md5( time() . wp_rand() . $user_email ), 0, 16 );
$meta = serialize($meta);
$wpdb->insert( $wpdb->signups, array(

View File

@@ -1007,18 +1007,14 @@ function auth_redirect() {
}
}
if ( is_user_admin() ) {
$scheme = 'logged_in';
} else {
/**
* Filter the authentication redirect scheme.
*
* @since 2.9.0
*
* @param string $scheme Authentication redirect scheme. Default empty.
*/
$scheme = apply_filters( 'auth_redirect_scheme', '' );
}
/**
* Filters the authentication redirect scheme.
*
* @since 2.9.0
*
* @param string $scheme Authentication redirect scheme. Default empty.
*/
$scheme = apply_filters( 'auth_redirect_scheme', '' );
if ( $user_id = wp_validate_auth_cookie( '', $scheme) ) {
/**
@@ -1067,9 +1063,9 @@ if ( !function_exists('check_admin_referer') ) :
* @param int|string $action Action nonce
* @param string $query_arg Where to look for nonce in $_REQUEST (since 2.5)
*/
function check_admin_referer($action = -1, $query_arg = '_wpnonce') {
if ( -1 == $action )
_doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' );
function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
if ( -1 === $action )
_doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2.0' );
$adminurl = strtolower(admin_url());
$referer = strtolower(wp_get_referer());
@@ -1088,6 +1084,12 @@ function check_admin_referer($action = -1, $query_arg = '_wpnonce') {
* @param bool $result Whether the admin request nonce was validated.
*/
do_action( 'check_admin_referer', $action, $result );
if ( ! $result && ! ( -1 === $action && strpos( $referer, $adminurl ) === 0 ) ) {
wp_nonce_ays( $action );
die();
}
return $result;
}
endif;
@@ -1102,6 +1104,9 @@ if ( !function_exists('check_ajax_referer') ) :
* @param string $query_arg Where to look for nonce in $_REQUEST (since 2.5)
*/
function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
if ( -1 === $action )
_doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2.0' );
$nonce = '';
if ( $query_arg && isset( $_REQUEST[ $query_arg ] ) )
@@ -1244,7 +1249,7 @@ if ( !function_exists('wp_validate_redirect') ) :
* @return string redirect-sanitized URL
**/
function wp_validate_redirect($location, $default = '') {
$location = trim( $location );
$location = trim( $location, " \t\n\r\0\x08\x0B" );
// browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//'
if ( substr($location, 0, 2) == '//' )
$location = 'http:' . $location;
@@ -1252,7 +1257,8 @@ function wp_validate_redirect($location, $default = '') {
// In php 5 parse_url may fail if the URL query part contains http://, bug #38143
$test = ( $cut = strpos($location, '?') ) ? substr( $location, 0, $cut ) : $location;
$lp = parse_url($test);
// @-operator is used to prevent possible warnings in PHP < 5.3.3.
$lp = @parse_url($test);
// Give up if malformed URL
if ( false === $lp )
@@ -1262,9 +1268,25 @@ function wp_validate_redirect($location, $default = '') {
if ( isset($lp['scheme']) && !('http' == $lp['scheme'] || 'https' == $lp['scheme']) )
return $default;
// Reject if scheme is set but host is not. This catches urls like https:host.com for which parse_url does not set the host field.
if ( isset($lp['scheme']) && !isset($lp['host']) )
if ( ! isset( $lp['host'] ) && ! empty( $lp['path'] ) && '/' !== $lp['path'][0] ) {
$path = '';
if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
$path = dirname( parse_url( 'http://placeholder' . $_SERVER['REQUEST_URI'], PHP_URL_PATH ) . '?' );
}
$location = '/' . ltrim( $path . '/', '/' ) . $location;
}
// Reject if certain components are set but host is not. This catches urls like https:host.com for which parse_url does not set the host field.
if ( ! isset( $lp['host'] ) && ( isset( $lp['scheme'] ) || isset( $lp['user'] ) || isset( $lp['pass'] ) || isset( $lp['port'] ) ) ) {
return $default;
}
// Reject malformed components parse_url() can return on odd inputs.
foreach ( array( 'user', 'pass', 'host' ) as $component ) {
if ( isset( $lp[ $component ] ) && strpbrk( $lp[ $component ], ':/?#@' ) ) {
return $default;
}
}
$wpp = parse_url(home_url());
@@ -2276,4 +2298,3 @@ function wp_text_diff( $left_string, $right_string, $args = null ) {
return $r;
}
endif;

View File

@@ -290,24 +290,9 @@ function get_the_content( $more_link_text = null, $strip_teaser = false ) {
}
}
if ( $preview ) // Preview fix for JavaScript bug with foreign languages.
$output = preg_replace_callback( '/\%u([0-9A-F]{4})/', '_convert_urlencoded_to_entities', $output );
return $output;
}
/**
* Preview fix for JavaScript bug with foreign languages.
*
* @since 3.1.0
* @access private
* @param array $match Match array from preg_replace_callback
* @return string
*/
function _convert_urlencoded_to_entities( $match ) {
return '&#' . base_convert( $match[1], 16, 10 ) . ';';
}
/**
* Display the post excerpt.
*
@@ -1506,7 +1491,7 @@ function wp_get_attachment_link( $id = 0, $size = 'thumbnail', $permalink = fals
* @param bool $icon Whether to include an icon. Default false.
* @param string|bool $text If string, will be link text. Default false.
*/
return apply_filters( 'wp_get_attachment_link', "<a href='$url'>$link_text</a>", $id, $size, $permalink, $icon, $text );
return apply_filters( 'wp_get_attachment_link', "<a href='" . esc_url( $url ) . "'>$link_text</a>", $id, $size, $permalink, $icon, $text );
}
/**

View File

@@ -2888,10 +2888,11 @@ function wp_untrash_post_comments( $post = null ) {
foreach ( $group_by_status as $status => $comments ) {
// Sanity check. This shouldn't happen.
if ( 'post-trashed' == $status )
if ( 'post-trashed' == $status ) {
$status = '0';
$comments_in = implode( "', '", $comments );
$wpdb->query( "UPDATE $wpdb->comments SET comment_approved = '$status' WHERE comment_ID IN ('" . $comments_in . "')" );
}
$comments_in = implode( ', ', array_map( 'intval', $comments ) );
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_approved = %s WHERE comment_ID IN ($comments_in)", $status ) );
}
clean_comment_cache( array_keys($statuses) );
@@ -4175,10 +4176,10 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) {
$page_path = str_replace('%2F', '/', $page_path);
$page_path = str_replace('%20', ' ', $page_path);
$parts = explode( '/', trim( $page_path, '/' ) );
$parts = esc_sql( $parts );
$parts = array_map( 'sanitize_title_for_query', $parts );
$escaped_parts = esc_sql( $parts );
$in_string = "'" . implode( "','", $parts ) . "'";
$in_string = "'" . implode( "','", $escaped_parts ) . "'";
if ( is_array( $post_type ) ) {
$post_types = $post_type;
@@ -4805,46 +4806,79 @@ function wp_delete_attachment( $post_id, $force_delete = false ) {
/** This action is documented in wp-includes/post.php */
do_action( 'deleted_post', $post_id );
wp_delete_attachment_files( $post_id, $meta, $backup_sizes, $file );
clean_post_cache( $post );
return $post;
}
/**
* Deletes all files that belong to the given attachment.
*
* @since 4.9.7
*
* @param int $post_id Attachment ID.
* @param array $meta The attachment's meta data.
* @param array $backup_sizes The meta data for the attachment's backup images.
* @param string $file Absolute path to the attachment's file.
* @return bool True on success, false on failure.
*/
function wp_delete_attachment_files( $post_id, $meta, $backup_sizes, $file ) {
global $wpdb;
$uploadpath = wp_upload_dir();
$deleted = true;
if ( ! empty($meta['thumb']) ) {
// Don't delete the thumb if another attachment uses it.
if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id)) ) {
$thumbfile = str_replace(basename($file), $meta['thumb'], $file);
/** This filter is documented in wp-admin/custom-header.php */
$thumbfile = apply_filters( 'wp_delete_file', $thumbfile );
@ unlink( path_join($uploadpath['basedir'], $thumbfile) );
if ( ! empty( $thumbfile ) ) {
$thumbfile = path_join( $uploadpath['basedir'], $thumbfile );
$thumbdir = path_join( $uploadpath['basedir'], dirname( $file ) );
if ( ! wp_delete_file_from_directory( $thumbfile, $thumbdir ) ) {
$deleted = false;
}
}
}
}
// Remove intermediate and backup images if there are any.
if ( isset( $meta['sizes'] ) && is_array( $meta['sizes'] ) ) {
$intermediate_dir = path_join( $uploadpath['basedir'], dirname( $file ) );
foreach ( $meta['sizes'] as $size => $sizeinfo ) {
$intermediate_file = str_replace( basename( $file ), $sizeinfo['file'], $file );
/** This filter is documented in wp-admin/custom-header.php */
$intermediate_file = apply_filters( 'wp_delete_file', $intermediate_file );
@ unlink( path_join( $uploadpath['basedir'], $intermediate_file ) );
if ( ! empty( $intermediate_file ) ) {
$intermediate_file = path_join( $uploadpath['basedir'], $intermediate_file );
if ( ! wp_delete_file_from_directory( $intermediate_file, $intermediate_dir ) ) {
$deleted = false;
}
}
}
}
if ( is_array($backup_sizes) ) {
$del_dir = path_join( $uploadpath['basedir'], dirname( $meta['file'] ) );
foreach ( $backup_sizes as $size ) {
$del_file = path_join( dirname($meta['file']), $size['file'] );
/** This filter is documented in wp-admin/custom-header.php */
$del_file = apply_filters( 'wp_delete_file', $del_file );
@ unlink( path_join($uploadpath['basedir'], $del_file) );
if ( ! empty( $del_file ) ) {
$del_file = path_join( $uploadpath['basedir'], $del_file );
if ( ! wp_delete_file_from_directory( $del_file, $del_dir ) ) {
$deleted = false;
}
}
}
}
/** This filter is documented in wp-admin/custom-header.php */
$file = apply_filters( 'wp_delete_file', $file );
if ( ! wp_delete_file_from_directory( $file, $uploadpath['basedir'] ) ) {
$deleted = false;
}
if ( ! empty($file) )
@ unlink($file);
clean_post_cache( $post );
return $post;
return $deleted;
}
/**

View File

@@ -1396,7 +1396,6 @@ class WP_Query {
, 'attachment'
, 'attachment_id'
, 'name'
, 'static'
, 'pagename'
, 'page_id'
, 'second'
@@ -1595,7 +1594,7 @@ class WP_Query {
// If year, month, day, hour, minute, and second are set, a single
// post is being queried.
$this->is_single = true;
} elseif ( '' != $qv['static'] || '' != $qv['pagename'] || !empty($qv['page_id']) ) {
} elseif ( '' != $qv['pagename'] || !empty($qv['page_id']) ) {
$this->is_page = true;
$this->is_single = false;
} else {
@@ -2910,14 +2909,15 @@ class WP_Query {
if ( 'any' == $post_type ) {
$in_search_post_types = get_post_types( array('exclude_from_search' => false) );
if ( empty( $in_search_post_types ) )
if ( empty( $in_search_post_types ) ) {
$where .= ' AND 1=0 ';
else
$where .= " AND $wpdb->posts.post_type IN ('" . join("', '", $in_search_post_types ) . "')";
} else {
$where .= " AND {$wpdb->posts}.post_type IN ('" . join( "', '", array_map( 'esc_sql', $in_search_post_types ) ) . "')";
}
} elseif ( !empty( $post_type ) && is_array( $post_type ) ) {
$where .= " AND $wpdb->posts.post_type IN ('" . join("', '", $post_type) . "')";
$where .= " AND {$wpdb->posts}.post_type IN ('" . join("', '", esc_sql( $post_type ) ) . "')";
} elseif ( ! empty( $post_type ) ) {
$where .= " AND $wpdb->posts.post_type = '$post_type'";
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $post_type );
$post_type_object = get_post_type_object ( $post_type );
} elseif ( $this->is_attachment ) {
$where .= " AND $wpdb->posts.post_type = 'attachment'";

View File

@@ -706,6 +706,9 @@ function wp_just_in_time_script_localization() {
'blog_id' => get_current_blog_id(),
) );
wp_localize_script( 'mce-view', 'mceViewL10n', array(
'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array()
) );
}
/**

View File

@@ -181,9 +181,10 @@ function has_shortcode( $content, $tag ) {
* @uses $shortcode_tags
*
* @param string $content Content to search for shortcodes
* @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped.
* @return string Content with shortcodes filtered out.
*/
function do_shortcode($content) {
function do_shortcode( $content, $ignore_html = false ) {
global $shortcode_tags;
if ( false === strpos( $content, '[' ) ) {
@@ -193,8 +194,24 @@ function do_shortcode($content) {
if (empty($shortcode_tags) || !is_array($shortcode_tags))
return $content;
$tagnames = array_keys($shortcode_tags);
$tagregexp = join( '|', array_map('preg_quote', $tagnames) );
$pattern = "/\\[($tagregexp)/s";
if ( 1 !== preg_match( $pattern, $content ) ) {
// Avoids parsing HTML when there are no shortcodes or embeds anyway.
return $content;
}
$content = do_shortcodes_in_html_tags( $content, $ignore_html );
$pattern = get_shortcode_regex();
return preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $content );
$content = preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $content );
// Always restore square braces so we don't break things like <!--[if IE ]>
$content = unescape_invalid_shortcodes( $content );
return $content;
}
/**
@@ -287,6 +304,127 @@ function do_shortcode_tag( $m ) {
}
}
/**
* Search only inside HTML elements for shortcodes and process them.
*
* Any [ or ] characters remaining inside elements will be HTML encoded
* to prevent interference with shortcodes that are outside the elements.
* Assumes $content processed by KSES already. Users with unfiltered_html
* capability may get unexpected output if angle braces are nested in tags.
*
* @since 4.2.3
*
* @param string $content Content to search for shortcodes
* @param bool $ignore_html When true, all square braces inside elements will be encoded.
* @return string Content with shortcodes filtered out.
*/
function do_shortcodes_in_html_tags( $content, $ignore_html ) {
// Normalize entities in unfiltered HTML before adding placeholders.
$trans = array( '&#91;' => '&#091;', '&#93;' => '&#093;' );
$content = strtr( $content, $trans );
$trans = array( '[' => '&#91;', ']' => '&#93;' );
$pattern = get_shortcode_regex();
$textarr = wp_html_split( $content );
foreach ( $textarr as &$element ) {
if ( '' == $element || '<' !== $element[0] ) {
continue;
}
$noopen = false === strpos( $element, '[' );
$noclose = false === strpos( $element, ']' );
if ( $noopen || $noclose ) {
// This element does not contain shortcodes.
if ( $noopen xor $noclose ) {
// Need to encode stray [ or ] chars.
$element = strtr( $element, $trans );
}
continue;
}
if ( $ignore_html || '<!--' === substr( $element, 0, 4 ) || '<![CDATA[' === substr( $element, 0, 9 ) ) {
// Encode all [ and ] chars.
$element = strtr( $element, $trans );
continue;
}
$attributes = wp_kses_attr_parse( $element );
if ( false === $attributes ) {
// Some plugins are doing things like [name] <[email]>.
if ( 1 === preg_match( '%^<\s*\[\[?[^\[\]]+\]%', $element ) ) {
$element = preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $element );
}
// Looks like we found some crazy unfiltered HTML. Skipping it for sanity.
$element = strtr( $element, $trans );
continue;
}
// Get element name
$front = array_shift( $attributes );
$back = array_pop( $attributes );
$matches = array();
preg_match('%[a-zA-Z0-9]+%', $front, $matches);
$elname = $matches[0];
// Look for shortcodes in each attribute separately.
foreach ( $attributes as &$attr ) {
$open = strpos( $attr, '[' );
$close = strpos( $attr, ']' );
if ( false === $open || false === $close ) {
continue; // Go to next attribute. Square braces will be escaped at end of loop.
}
$double = strpos( $attr, '"' );
$single = strpos( $attr, "'" );
if ( ( false === $single || $open < $single ) && ( false === $double || $open < $double ) ) {
// $attr like '[shortcode]' or 'name = [shortcode]' implies unfiltered_html.
// In this specific situation we assume KSES did not run because the input
// was written by an administrator, so we should avoid changing the output
// and we do not need to run KSES here.
$attr = preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $attr );
} else {
// $attr like 'name = "[shortcode]"' or "name = '[shortcode]'"
// We do not know if $content was unfiltered. Assume KSES ran before shortcodes.
$count = 0;
$new_attr = preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $attr, -1, $count );
if ( $count > 0 ) {
// Sanitize the shortcode output using KSES.
$new_attr = wp_kses_one_attr( $new_attr, $elname );
if ( '' !== $new_attr ) {
// The shortcode is safe to use now.
$attr = $new_attr;
}
}
}
}
$element = $front . implode( '', $attributes ) . $back;
// Now encode any remaining [ or ] chars.
$element = strtr( $element, $trans );
}
$content = implode( '', $textarr );
return $content;
}
/**
* Remove placeholders added by do_shortcodes_in_html_tags().
*
* @since 4.2.3
*
* @param string $content Content to search for placeholders.
* @return string Content with placeholders removed.
*/
function unescape_invalid_shortcodes( $content ) {
// Clean up entire string, avoids re-parsing HTML.
$trans = array( '&#91;' => '[', '&#93;' => ']' );
$content = strtr( $content, $trans );
return $content;
}
/**
* Retrieve all attributes from the shortcodes tag.
*
@@ -316,6 +454,15 @@ function shortcode_parse_atts($text) {
elseif (isset($m[8]))
$atts[] = stripcslashes($m[8]);
}
// Reject any unclosed HTML elements
foreach( $atts as &$value ) {
if ( false !== strpos( $value, '<' ) ) {
if ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) {
$value = '';
}
}
}
} else {
$atts = ltrim($text);
}
@@ -386,9 +533,15 @@ function strip_shortcodes( $content ) {
if (empty($shortcode_tags) || !is_array($shortcode_tags))
return $content;
$pattern = get_shortcode_regex();
$content = do_shortcodes_in_html_tags( $content, true );
return preg_replace_callback( "/$pattern/s", 'strip_shortcode_tag', $content );
$pattern = get_shortcode_regex();
$content = preg_replace_callback( "/$pattern/s", 'strip_shortcode_tag', $content );
// Always restore square braces so we don't break things like <!--[if IE ]>
$content = unescape_invalid_shortcodes( $content );
return $content;
}
function strip_shortcode_tag( $m ) {

View File

@@ -593,7 +593,7 @@ function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {
$term_ids = array_map('intval', $term_ids );
$taxonomies = "'" . implode( "', '", $taxonomies ) . "'";
$taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'";
$term_ids = "'" . implode( "', '", $term_ids ) . "'";
$object_ids = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order");
@@ -1735,7 +1735,7 @@ function get_terms( $taxonomies, $args = '' ) {
$order = 'ASC';
}
$where = "tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')";
$where = "tt.taxonomy IN ('" . implode("', '", array_map( 'esc_sql', $taxonomies ) ) . "')";
$exclude = $args['exclude'];
$exclude_tree = $args['exclude_tree'];
@@ -2638,7 +2638,7 @@ function wp_get_object_terms($object_ids, $taxonomies, $args = array()) {
if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ) ) )
$order = 'ASC';
$taxonomies = "'" . implode("', '", $taxonomies) . "'";
$taxonomies = "'" . implode("', '", array_map( 'esc_sql', $taxonomies ) ) . "'";
$object_ids = implode(', ', $object_ids);
$select_this = '';

View File

@@ -672,8 +672,6 @@ function preview_theme() {
// Prevent theme mods to current theme being used on theme being previewed
add_filter( 'pre_option_theme_mods_' . get_option( 'stylesheet' ), '__return_empty_array' );
ob_start( 'preview_theme_ob_filter' );
}
add_action('setup_theme', 'preview_theme');
@@ -711,7 +709,7 @@ function _preview_theme_stylesheet_filter() {
* @return string
*/
function preview_theme_ob_filter( $content ) {
return preg_replace_callback( "|(<a.*?href=([\"']))(.*?)([\"'].*?>)|", 'preview_theme_ob_filter_callback', $content );
return $content;
}
/**
@@ -726,26 +724,7 @@ function preview_theme_ob_filter( $content ) {
* @return string
*/
function preview_theme_ob_filter_callback( $matches ) {
if ( strpos($matches[4], 'onclick') !== false )
$matches[4] = preg_replace('#onclick=([\'"]).*?(?<!\\\)\\1#i', '', $matches[4]); //Strip out any onclicks from rest of <a>. (?<!\\\) means to ignore the '" if it's escaped by \ to prevent breaking mid-attribute.
if (
( false !== strpos($matches[3], '/wp-admin/') )
||
( false !== strpos( $matches[3], '://' ) && 0 !== strpos( $matches[3], home_url() ) )
||
( false !== strpos($matches[3], '/feed/') )
||
( false !== strpos($matches[3], '/trackback/') )
)
return $matches[1] . "#$matches[2] onclick=$matches[2]return false;" . $matches[4];
$stylesheet = isset( $_GET['stylesheet'] ) ? $_GET['stylesheet'] : '';
$template = isset( $_GET['template'] ) ? $_GET['template'] : '';
$link = add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => 1 ), $matches[3] );
if ( 0 === strpos($link, 'preview=1') )
$link = "?$link";
return $matches[1] . esc_attr( $link ) . $matches[4];
return $matches[0];
}
/**

View File

@@ -633,19 +633,8 @@ function wp_schedule_update_checks() {
if ( !wp_next_scheduled('wp_update_themes') && !defined('WP_INSTALLING') )
wp_schedule_event(time(), 'twicedaily', 'wp_update_themes');
if ( ! wp_next_scheduled( 'wp_maybe_auto_update' ) && ! defined( 'WP_INSTALLING' ) ) {
// Schedule auto updates for 7 a.m. and 7 p.m. in the timezone of the site.
$next = strtotime( 'today 7am' );
$now = time();
// Find the next instance of 7 a.m. or 7 p.m., but skip it if it is within 3 hours from now.
while ( ( $now + 3 * HOUR_IN_SECONDS ) > $next ) {
$next += 12 * HOUR_IN_SECONDS;
}
$next = $next - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
// Add a random number of minutes, so we don't have all sites trying to update exactly on the hour
$next = $next + rand( 0, 59 ) * MINUTE_IN_SECONDS;
wp_schedule_event( $next, 'twicedaily', 'wp_maybe_auto_update' );
}
if ( ( wp_next_scheduled( 'wp_maybe_auto_update' ) > ( time() + HOUR_IN_SECONDS ) ) && ! defined('WP_INSTALLING') )
wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
}
/**

View File

@@ -4,21 +4,21 @@
*
* @global string $wp_version
*/
$wp_version = '4.1.3';
$wp_version = '4.1.28';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
*
* @global int $wp_db_version
*/
$wp_db_version = 30133;
$wp_db_version = 30135;
/**
* Holds the TinyMCE version
*
* @global string $tinymce_version
*/
$tinymce_version = '4107-20150118';
$tinymce_version = '4107-20150505';
/**
* Holds the required PHP version

View File

@@ -1076,19 +1076,22 @@ class wpdb {
function _real_escape( $string ) {
if ( $this->dbh ) {
if ( $this->use_mysqli ) {
return mysqli_real_escape_string( $this->dbh, $string );
$escaped = mysqli_real_escape_string( $this->dbh, $string );
} else {
return mysql_real_escape_string( $string, $this->dbh );
$escaped = mysql_real_escape_string( $string, $this->dbh );
}
} else {
$class = get_class( $this );
if ( function_exists( '__' ) ) {
/* translators: %s: database access abstraction class, usually wpdb or a class extending wpdb */
_doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), '3.6.0' );
} else {
_doing_it_wrong( $class, sprintf( '%s must set a database connection for use with escaping.', $class ), '3.6.0' );
}
$escaped = addslashes( $string );
}
$class = get_class( $this );
if ( function_exists( '__' ) ) {
_doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), E_USER_NOTICE );
} else {
_doing_it_wrong( $class, sprintf( '%s must set a database connection for use with escaping.', $class ), E_USER_NOTICE );
}
return addslashes( $string );
return $this->add_placeholder_escape( $escaped );
}
/**
@@ -1162,58 +1165,120 @@ class wpdb {
/**
* Prepares a SQL query for safe execution. Uses sprintf()-like syntax.
*
* The following directives can be used in the query format string:
* The following placeholders can be used in the query string:
* %d (integer)
* %f (float)
* %s (string)
* %% (literal percentage sign - no argument needed)
*
* All of %d, %f, and %s are to be left unquoted in the query string and they need an argument passed for them.
* Literals (%) as parts of the query must be properly written as %%.
* All placeholders MUST be left unquoted in the query string. A corresponding argument MUST be passed for each placeholder.
*
* This function only supports a small subset of the sprintf syntax; it only supports %d (integer), %f (float), and %s (string).
* Does not support sign, padding, alignment, width or precision specifiers.
* Does not support argument numbering/swapping.
* For compatibility with old behavior, numbered or formatted string placeholders (eg, %1$s, %5s) will not have quotes
* added by this function, so should be passed with appropriate quotes around them for your usage.
*
* May be called like {@link http://php.net/sprintf sprintf()} or like {@link http://php.net/vsprintf vsprintf()}.
* Literal percentage signs (%) in the query string must be written as %%. Percentage wildcards (for example,
* to use in LIKE syntax) must be passed via a substitution argument containing the complete LIKE string, these
* cannot be inserted directly in the query string. Also see {@see esc_like()}.
*
* Both %d and %s should be left unquoted in the query string.
* Arguments may be passed as individual arguments to the method, or as a single array containing all arguments. A combination
* of the two is not supported.
*
* wpdb::prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d", 'foo', 1337 )
* wpdb::prepare( "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo' );
* Examples:
* $wpdb->prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d OR `other_field` LIKE %s", array( 'foo', 1337, '%bar' ) );
* $wpdb->prepare( "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo' );
*
* @link http://php.net/sprintf Description of syntax.
* @link https://secure.php.net/sprintf Description of syntax.
* @since 2.3.0
*
* @param string $query Query statement with sprintf()-like placeholders
* @param array|mixed $args The array of variables to substitute into the query's placeholders if being called like
* {@link http://php.net/vsprintf vsprintf()}, or the first variable to substitute into the query's placeholders if
* being called like {@link http://php.net/sprintf sprintf()}.
* @param mixed $args,... further variables to substitute into the query's placeholders if being called like
* {@link http://php.net/sprintf sprintf()}.
* @return null|false|string Sanitized query string, null if there is no query, false if there is an error and string
* if there was something to prepare
* @param string $query Query statement with sprintf()-like placeholders
* @param array|mixed $args The array of variables to substitute into the query's placeholders if being called with an array of arguments,
* or the first variable to substitute into the query's placeholders if being called with individual arguments.
* @param mixed $args,... further variables to substitute into the query's placeholders if being called wih individual arguments.
* @return string|void Sanitized query string, if there is a query to prepare.
*/
public function prepare( $query, $args ) {
if ( is_null( $query ) )
if ( is_null( $query ) ) {
return;
}
// This is not meant to be foolproof -- but it will catch obviously incorrect usage.
if ( strpos( $query, '%' ) === false ) {
_doing_it_wrong( 'wpdb::prepare', sprintf( __( 'The query argument of %s must have a placeholder.' ), 'wpdb::prepare()' ), '3.9' );
wp_load_translations_early();
_doing_it_wrong( 'wpdb::prepare', sprintf( __( 'The query argument of %s must have a placeholder.' ), 'wpdb::prepare()' ), '3.9.0' );
}
$args = func_get_args();
array_shift( $args );
// If args were passed as an array (as in vsprintf), move them up
if ( isset( $args[0] ) && is_array($args[0]) )
// If args were passed as an array (as in vsprintf), move them up.
$passed_as_array = false;
if ( is_array( $args[0] ) && count( $args ) == 1 ) {
$passed_as_array = true;
$args = $args[0];
$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
}
foreach ( $args as $arg ) {
if ( ! is_scalar( $arg ) && ! is_null( $arg ) ) {
wp_load_translations_early();
_doing_it_wrong( 'wpdb::prepare', sprintf( __( 'Unsupported value type (%s).' ), gettype( $arg ) ), '4.8.2' );
}
}
/*
* Specify the formatting allowed in a placeholder. The following are allowed:
*
* - Sign specifier. eg, $+d
* - Numbered placeholders. eg, %1$s
* - Padding specifier, including custom padding characters. eg, %05s, %'#5s
* - Alignment specifier. eg, %05-s
* - Precision specifier. eg, %.2f
*/
$allowed_format = '(?:[1-9][0-9]*[$])?[-+0-9]*(?: |0|\'.)?[-+0-9]*(?:\.[0-9]+)?';
/*
* If a %s placeholder already has quotes around it, removing the existing quotes and re-inserting them
* ensures the quotes are consistent.
*
* For backwards compatibility, this is only applied to %s, and not to placeholders like %1$s, which are frequently
* used in the middle of longer strings, or as table name placeholders.
*/
$query = str_replace( "'%s'", '%s', $query ); // Strip any existing single quotes.
$query = str_replace( '"%s"', '%s', $query ); // Strip any existing double quotes.
$query = preg_replace( '/(?<!%)%s/', "'%s'", $query ); // Quote the strings, avoiding escaped strings like %%s.
$query = preg_replace( "/(?<!%)(%($allowed_format)?f)/" , '%\\2F', $query ); // Force floats to be locale unaware.
$query = preg_replace( "/%(?:%|$|(?!($allowed_format)?[sdF]))/", '%%\\1', $query ); // Escape any unescaped percents.
// Count the number of valid placeholders in the query.
$placeholders = preg_match_all( "/(^|[^%]|(%%)+)%($allowed_format)?[sdF]/", $query, $matches );
if ( count( $args ) !== $placeholders ) {
if ( 1 === $placeholders && $passed_as_array ) {
// If the passed query only expected one argument, but the wrong number of arguments were sent as an array, bail.
wp_load_translations_early();
_doing_it_wrong( 'wpdb::prepare', __( 'The query only expected one placeholder, but an array of multiple placeholders was sent.' ), '4.9.0' );
return;
} else {
/*
* If we don't have the right number of placeholders, but they were passed as individual arguments,
* or we were expecting multiple arguments in an array, throw a warning.
*/
wp_load_translations_early();
_doing_it_wrong( 'wpdb::prepare',
/* translators: 1: number of placeholders, 2: number of arguments passed */
sprintf( __( 'The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d).' ),
$placeholders,
count( $args ) ),
'4.8.3'
);
}
}
array_walk( $args, array( $this, 'escape_by_ref' ) );
return @vsprintf( $query, $args );
$query = @vsprintf( $query, $args );
return $this->add_placeholder_escape( $query );
}
/**
@@ -1728,6 +1793,64 @@ class wpdb {
}
}
/**
* Generates and returns a placeholder escape string for use in queries returned by ::prepare().
*
* @since 4.8.3
*
* @return string String to escape placeholders.
*/
public function placeholder_escape() {
static $placeholder;
if ( ! $placeholder ) {
// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';
// Old WP installs may not have AUTH_SALT defined.
$salt = defined( 'AUTH_SALT' ) && AUTH_SALT ? AUTH_SALT : (string) rand();
$placeholder = '{' . hash_hmac( $algo, uniqid( $salt, true ), $salt ) . '}';
}
/*
* Add the filter to remove the placeholder escaper. Uses priority 0, so that anything
* else attached to this filter will recieve the query with the placeholder string removed.
*/
if ( ! has_filter( 'query', array( $this, 'remove_placeholder_escape' ) ) ) {
add_filter( 'query', array( $this, 'remove_placeholder_escape' ), 0 );
}
return $placeholder;
}
/**
* Adds a placeholder escape string, to escape anything that resembles a printf() placeholder.
*
* @since 4.8.3
*
* @param string $query The query to escape.
* @return string The query with the placeholder escape string inserted where necessary.
*/
public function add_placeholder_escape( $query ) {
/*
* To prevent returning anything that even vaguely resembles a placeholder,
* we clobber every % we can find.
*/
return str_replace( '%', $this->placeholder_escape(), $query );
}
/**
* Removes the placeholder escape strings from a query.
*
* @since 4.8.3
*
* @param string $query The query from which the placeholder will be removed.
* @return string The query with the placeholder removed.
*/
public function remove_placeholder_escape( $query ) {
return str_replace( $this->placeholder_escape(), '%', $query );
}
/**
* Insert a row into a table.
*
@@ -1789,6 +1912,8 @@ class wpdb {
* @return int|false The number of rows affected, or false on error.
*/
function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) {
$this->insert_id = 0;
if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) {
return false;
}
@@ -1809,7 +1934,6 @@ class wpdb {
$sql = "$type INTO `$table` ($fields) VALUES ($formats)";
$this->insert_id = 0;
$this->check_current_query = false;
return $this->query( $this->prepare( $sql, $values ) );
}
@@ -1926,11 +2050,20 @@ class wpdb {
*/
protected function process_fields( $table, $data, $format ) {
$data = $this->process_field_formats( $data, $format );
if ( false === $data ) {
return false;
}
$data = $this->process_field_charsets( $data, $table );
if ( false === $data ) {
return false;
}
$data = $this->process_field_lengths( $data, $table );
if ( false === $data ) {
return false;
}
$converted_data = $this->strip_invalid_text( $data );
if ( $data !== $converted_data ) {
@@ -1992,17 +2125,41 @@ class wpdb {
// We can skip this field if we know it isn't a string.
// This checks %d/%f versus ! %s because it's sprintf() could take more.
$value['charset'] = false;
} elseif ( $this->check_ascii( $value['value'] ) ) {
// If it's ASCII, then we don't need the charset. We can skip this field.
$value['charset'] = false;
} else {
$value['charset'] = $this->get_col_charset( $table, $field );
if ( is_wp_error( $value['charset'] ) ) {
return false;
}
}
// This isn't ASCII. Don't have strip_invalid_text() re-check.
$value['ascii'] = false;
$data[ $field ] = $value;
}
return $data;
}
/**
* For string fields, record the maximum string length that field can safely save.
*
* @since 4.2.1
* @access protected
*
* @param array $data As it comes from the wpdb::process_field_charsets() method.
* @param string $table Table name.
* @return array|False The same array as $data with additional 'length' keys, or false if
* any of the values were too long for their corresponding field.
*/
protected function process_field_lengths( $data, $table ) {
foreach ( $data as $field => $value ) {
if ( '%d' === $value['format'] || '%f' === $value['format'] ) {
// We can skip this field if we know it isn't a string.
// This checks %d/%f versus ! %s because it's sprintf() could take more.
$value['length'] = false;
} else {
$value['length'] = $this->get_col_length( $table, $field );
if ( is_wp_error( $value['length'] ) ) {
return false;
}
}
$data[ $field ] = $value;
@@ -2028,7 +2185,7 @@ class wpdb {
public function get_var( $query = null, $x = 0, $y = 0 ) {
$this->func_call = "\$db->get_var(\"$query\", $x, $y)";
if ( $this->check_safe_collation( $query ) ) {
if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
$this->check_current_query = false;
}
@@ -2061,7 +2218,7 @@ class wpdb {
public function get_row( $query = null, $output = OBJECT, $y = 0 ) {
$this->func_call = "\$db->get_row(\"$query\",$output,$y)";
if ( $this->check_safe_collation( $query ) ) {
if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
$this->check_current_query = false;
}
@@ -2102,7 +2259,7 @@ class wpdb {
* @return array Database query result. Array indexed from 0 by SQL result row number.
*/
public function get_col( $query = null , $x = 0 ) {
if ( $this->check_safe_collation( $query ) ) {
if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
$this->check_current_query = false;
}
@@ -2134,7 +2291,7 @@ class wpdb {
public function get_results( $query = null, $output = OBJECT ) {
$this->func_call = "\$db->get_results(\"$query\", $output)";
if ( $this->check_safe_collation( $query ) ) {
if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
$this->check_current_query = false;
}
@@ -2212,7 +2369,10 @@ class wpdb {
}
$charsets = $columns = array();
$results = $this->get_results( "SHOW FULL COLUMNS FROM `$table`" );
$table_parts = explode( '.', $table );
$table = '`' . implode( '`.`', $table_parts ) . '`';
$results = $this->get_results( "SHOW FULL COLUMNS FROM $table" );
if ( ! $results ) {
return new WP_Error( 'wpdb_get_table_charset_failure' );
}
@@ -2335,6 +2495,99 @@ class wpdb {
return $charset;
}
/**
* Retrieve the maximum string length allowed in a given column.
* The length may either be specified as a byte length or a character length.
*
* @since 4.2.1
* @access public
*
* @param string $table Table name.
* @param string $column Column name.
* @return mixed array( 'length' => (int), 'type' => 'byte' | 'char' )
* false if the column has no length (for example, numeric column)
* WP_Error object if there was an error.
*/
public function get_col_length( $table, $column ) {
$tablekey = strtolower( $table );
$columnkey = strtolower( $column );
// Skip this entirely if this isn't a MySQL database.
if ( false === $this->is_mysql ) {
return false;
}
if ( empty( $this->col_meta[ $tablekey ] ) ) {
// This primes column information for us.
$table_charset = $this->get_table_charset( $table );
if ( is_wp_error( $table_charset ) ) {
return $table_charset;
}
}
if ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) {
return false;
}
$typeinfo = explode( '(', $this->col_meta[ $tablekey ][ $columnkey ]->Type );
$type = strtolower( $typeinfo[0] );
if ( ! empty( $typeinfo[1] ) ) {
$length = trim( $typeinfo[1], ')' );
} else {
$length = false;
}
switch( $type ) {
case 'char':
case 'varchar':
return array(
'type' => 'char',
'length' => (int) $length,
);
break;
case 'binary':
case 'varbinary':
return array(
'type' => 'byte',
'length' => (int) $length,
);
break;
case 'tinyblob':
case 'tinytext':
return array(
'type' => 'byte',
'length' => 255, // 2^8 - 1
);
break;
case 'blob':
case 'text':
return array(
'type' => 'byte',
'length' => 65535, // 2^16 - 1
);
break;
case 'mediumblob':
case 'mediumtext':
return array(
'type' => 'byte',
'length' => 16777215, // 2^24 - 1
);
break;
case 'longblob':
case 'longtext':
return array(
'type' => 'byte',
'length' => 4294967295, // 2^32 - 1
);
break;
default:
return false;
}
return false;
}
/**
* Check if a string is ASCII.
*
@@ -2375,7 +2628,7 @@ class wpdb {
// We don't need to check the collation for queries that don't read data.
$query = ltrim( $query, "\r\n\t (" );
if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN)\s/i', $query ) ) {
if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $query ) ) {
return true;
}
@@ -2433,50 +2686,58 @@ class wpdb {
*/
// If any of the columns don't have one of these collations, it needs more sanity checking.
protected function strip_invalid_text( $data ) {
// Some multibyte character sets that we can check in PHP.
$mb_charsets = array(
'ascii' => 'ASCII',
'big5' => 'BIG-5',
'eucjpms' => 'eucJP-win',
'gb2312' => 'EUC-CN',
'ujis' => 'EUC-JP',
'utf32' => 'UTF-32',
);
$supported_charsets = array();
if ( function_exists( 'mb_list_encodings' ) ) {
$supported_charsets = mb_list_encodings();
}
$db_check_string = false;
foreach ( $data as &$value ) {
$charset = $value['charset'];
// Column isn't a string, or is latin1, which will will happily store anything.
if ( false === $charset || 'latin1' === $charset ) {
if ( is_array( $value['length'] ) ) {
$length = $value['length']['length'];
$truncate_by_byte_length = 'byte' === $value['length']['type'];
} else {
$length = false;
// Since we have no length, we'll never truncate.
// Initialize the variable to false. true would take us
// through an unnecessary (for this case) codepath below.
$truncate_by_byte_length = false;
}
// There's no charset to work with.
if ( false === $charset ) {
continue;
}
// Column isn't a string.
if ( ! is_string( $value['value'] ) ) {
continue;
}
// ASCII is always OK.
if ( ! isset( $value['ascii'] ) && $this->check_ascii( $value['value'] ) ) {
continue;
$needs_validation = true;
if (
// latin1 can store any byte sequence
'latin1' === $charset
||
// ASCII is always OK.
( ! isset( $value['ascii'] ) && $this->check_ascii( $value['value'] ) )
) {
$truncate_by_byte_length = true;
$needs_validation = false;
}
// Convert the text locally.
if ( $supported_charsets ) {
if ( isset( $mb_charsets[ $charset ] ) && in_array( $mb_charsets[ $charset ], $supported_charsets ) ) {
$value['value'] = mb_convert_encoding( $value['value'], $mb_charsets[ $charset ], $mb_charsets[ $charset ] );
if ( $truncate_by_byte_length ) {
mbstring_binary_safe_encoding();
if ( false !== $length && strlen( $value['value'] ) > $length ) {
$value['value'] = substr( $value['value'], 0, $length );
}
reset_mbstring_encoding();
if ( ! $needs_validation ) {
continue;
}
}
// utf8 can be handled by regex, which is a bunch faster than a DB lookup.
if ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) {
if ( ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) && function_exists( 'mb_strlen' ) ) {
$regex = '/
(
(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
@@ -2486,7 +2747,7 @@ class wpdb {
| \xED[\x80-\x9F][\x80-\xBF]
| [\xEE-\xEF][\x80-\xBF]{2}';
if ( 'utf8mb4' === $charset) {
if ( 'utf8mb4' === $charset ) {
$regex .= '
| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3
| [\xF1-\xF3][\x80-\xBF]{3}
@@ -2494,11 +2755,16 @@ class wpdb {
';
}
$regex .= '){1,50} # ...one or more times
$regex .= '){1,40} # ...one or more times
)
| . # anything else
/x';
$value['value'] = preg_replace( $regex, '$1', $value['value'] );
if ( false !== $length && mb_strlen( $value['value'], 'UTF-8' ) > $length ) {
$value['value'] = mb_substr( $value['value'], 0, $length, 'UTF-8' );
}
continue;
}
@@ -2511,46 +2777,45 @@ class wpdb {
$queries = array();
foreach ( $data as $col => $value ) {
if ( ! empty( $value['db'] ) ) {
if ( ! isset( $queries[ $value['charset'] ] ) ) {
$queries[ $value['charset'] ] = array();
// We're going to need to truncate by characters or bytes, depending on the length value we have.
if ( 'byte' === $value['length']['type'] ) {
// Using binary causes LEFT() to truncate by bytes.
$charset = 'binary';
} else {
$charset = $value['charset'];
}
if ( is_array( $value['length'] ) ) {
$length = sprintf( '%.0f', $value['length']['length'] );
$queries[ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING $charset ), $length ) USING {$this->charset} )", $value['value'] );
} else if ( 'binary' !== $charset ) {
// If we don't have a length, there's no need to convert binary - it will always return the same result.
$queries[ $col ] = $this->prepare( "CONVERT( CONVERT( %s USING $charset ) USING {$this->charset} )", $value['value'] );
}
// Split the CONVERT() calls by charset, so we can make sure the connection is right
$queries[ $value['charset'] ][ $col ] = $this->prepare( "CONVERT( %s USING {$value['charset']} )", $value['value'] );
unset( $data[ $col ]['db'] );
}
}
$connection_charset = $this->charset;
foreach ( $queries as $charset => $query ) {
$sql = array();
foreach ( $queries as $column => $query ) {
if ( ! $query ) {
continue;
}
// Change the charset to match the string(s) we're converting
if ( $charset !== $connection_charset ) {
$connection_charset = $charset;
$this->set_charset( $this->dbh, $charset );
}
$this->check_current_query = false;
$row = $this->get_row( "SELECT " . implode( ', ', $query ), ARRAY_N );
if ( ! $row ) {
$this->set_charset( $this->dbh, $connection_charset );
return new WP_Error( 'wpdb_strip_invalid_text_failure' );
}
$cols = array_keys( $query );
$col_count = count( $cols );
for ( $ii = 0; $ii < $col_count; $ii++ ) {
$data[ $cols[ $ii ] ]['value'] = $row[ $ii ];
}
$sql[] = $query . " AS x_$column";
}
// Don't forget to change the charset back!
if ( $connection_charset !== $this->charset ) {
$this->set_charset( $this->dbh );
$this->check_current_query = false;
$row = $this->get_row( "SELECT " . implode( ', ', $sql ), ARRAY_A );
if ( ! $row ) {
return new WP_Error( 'wpdb_strip_invalid_text_failure' );
}
foreach ( array_keys( $data ) as $column ) {
if ( isset( $row["x_$column"] ) ) {
$data[ $column ]['value'] = $row["x_$column"];
}
}
}
@@ -2567,6 +2832,12 @@ class wpdb {
* @return string|WP_Error The converted query, or a {@see WP_Error} object if the conversion fails.
*/
protected function strip_invalid_text_from_query( $query ) {
// We don't need to check the collation for queries that don't read data.
$trimmed_query = ltrim( $query, "\r\n\t (" );
if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $trimmed_query ) ) {
return $query;
}
$table = $this->get_table_from_query( $query );
if ( $table ) {
$charset = $this->get_table_charset( $table );
@@ -2586,6 +2857,7 @@ class wpdb {
'value' => $query,
'charset' => $charset,
'ascii' => false,
'length' => false,
);
$data = $this->strip_invalid_text( array( $data ) );
@@ -2608,7 +2880,7 @@ class wpdb {
* @return string|WP_Error The converted string, or a `WP_Error` object if the conversion fails.
*/
public function strip_invalid_text_for_column( $table, $column, $value ) {
if ( ! is_string( $value ) || $this->check_ascii( $value ) ) {
if ( ! is_string( $value ) ) {
return $value;
}
@@ -2625,7 +2897,7 @@ class wpdb {
$column => array(
'value' => $value,
'charset' => $charset,
'ascii' => false,
'length' => $this->get_col_length( $table, $column ),
)
);
@@ -2666,16 +2938,16 @@ class wpdb {
. '|REPLACE(?:\s+LOW_PRIORITY|\s+DELAYED)?(?:\s+INTO)?'
. '|UPDATE(?:\s+LOW_PRIORITY)?(?:\s+IGNORE)?'
. '|DELETE(?:\s+LOW_PRIORITY|\s+QUICK|\s+IGNORE)*(?:\s+FROM)?'
. ')\s+`?([\w-]+)`?/is', $query, $maybe ) ) {
return $maybe[1];
. ')\s+((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)/is', $query, $maybe ) ) {
return str_replace( '`', '', $maybe[1] );
}
// SHOW TABLE STATUS and SHOW TABLES
if ( preg_match( '/^\s*(?:'
. 'SHOW\s+TABLE\s+STATUS.+(?:LIKE\s+|WHERE\s+Name\s*=\s*)'
. '|SHOW\s+(?:FULL\s+)?TABLES.+(?:LIKE\s+|WHERE\s+Name\s*=\s*)'
. ')\W([\w-]+)\W/is', $query, $maybe ) ) {
return $maybe[1];
. ')\W((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)\W/is', $query, $maybe ) ) {
return str_replace( '`', '', $maybe[1] );
}
// Big pattern for the rest of the table-related queries.
@@ -2693,8 +2965,8 @@ class wpdb {
. '|LOAD\s+DATA.*INFILE.*INTO\s+TABLE'
. '|(?:GRANT|REVOKE).*ON\s+TABLE'
. '|SHOW\s+(?:.*FROM|.*TABLE)'
. ')\s+\(*\s*`?([\w-]+)`?\s*\)*/is', $query, $maybe ) ) {
return $maybe[1];
. ')\s+\(*\s*((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)\s*\)*/is', $query, $maybe ) ) {
return str_replace( '`', '', $maybe[1] );
}
return false;

View File

@@ -14,10 +14,10 @@ require( dirname(__FILE__) . '/wp-load.php' );
// Redirect to https login if forced to use SSL
if ( force_ssl_admin() && ! is_ssl() ) {
if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
wp_safe_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
exit();
} else {
wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
wp_safe_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
exit();
}
}
@@ -34,7 +34,7 @@ function login_header( $title = 'Log In', $message = '', $wp_error = '' ) {
global $error, $interim_login, $action;
// Don't index any of these forms
add_action( 'login_head', 'wp_no_robots' );
add_action( 'login_head', 'wp_sensitive_page_meta' );
if ( wp_is_mobile() )
add_action( 'login_head', 'wp_login_viewport_meta' );

View File

@@ -14,6 +14,12 @@ require(dirname(__FILE__) . '/wp-load.php');
if ( ! apply_filters( 'enable_post_by_email_configuration', true ) )
wp_die( __( 'This action has been disabled by the administrator.' ) );
$mailserver_url = get_option( 'mailserver_url' );
if ( 'mail.example.com' === $mailserver_url || empty( $mailserver_url ) ) {
wp_die( __( 'This action has been disabled by the administrator.' ), 403 );
}
/**
* Fires to allow a plugin to do a complete takeover of Post by Email.
*