Make WordPress Core

Opened 3 years ago

Last modified 3 months ago

#58161 new defect (bug)

WordPress post editor pagination uses inconsistent URL variable to rest of site

Reported by: roballshouse Owned by:
Priority: normal Milestone: Awaiting Review
Component: Administration Version: 6.2
Severity: normal Keywords: has-test-info has-patch has-unit-tests
Cc: Focuses:

Description (last modified by sabernhardt)

/wp-admin/edit.php

uses functions in class-wp-list-table.php

Which uses
$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );

While all other pages use
WP_SITE_URL

Thus, when in the post editor, the "Next page" goes to (in my case) https://127.0.0.1:8090/wp-admin/edit.php?paged=2, instead of to <my_url>/wp-admin/edit.php?paged=2 like the rest of wp_admin

Change History (10)

#1 @sabernhardt
3 years ago

  • Description modified (diff)

#2 @sabernhardt
3 years ago

  • Component Editor → Administration

Related: #16858, #36201

#3 @sabernhardt
3 years ago

also related: #53998

This ticket was mentioned in ​Slack in #core-test by ironprogrammer. ​View the logs.


3 years ago

#5 @ironprogrammer
3 years ago

  • Keywords needs-testing-info added

Welcome to Trac, @roballshouse, and thank you for the report!

This ticket could use some ​testing steps that would make reproduction of the issue more straightforward, so I've added the appropriate keyword.

Version 0, edited 3 years ago by ironprogrammer (next)

#6 @roballshouse
3 years ago

Testing Instructions

Setup a WP environment with separate SERVERHTTP_HOST values (such as 127.0.0.1) and WP_SITE_URL value (such as a custom domain, pointing to the host)

Navigate to Post editor, and look at "Next Page" URL

Steps to Test

  1. Navigate to <server>/wp-admin/edit.php on remote system using domain (e.g. ww.myblog.com/wp-admin/edit.php)
  2. Attempt to click <Next Page>
  3. Fail due to invalid URL (such as ​https://127.0.0.1:8090/wp-admin/edit.php?paged=2)

Expected Results

Lists each expected result or behavior, i.e. what should happen when running the test(s):

  • ✅ Able to navigate between post edit pages

#7 @wordpressdotorg
17 months ago

  • Keywords needs-test-info added; needs-testing-info removed

#8 @jorgelopezrepiso
3 months ago

I confirm that this issue is reproducible on a standard wordpress-develop installation using Docker.

Simply set $_SERVER['HTTP_HOST'] = '127.0.0.1:8889'; in your wp-config.php, navigate to the Posts page, and add enough posts to activate the pagination buttons. Then, check or click the "Next Page" link; it will point to 127.0.0.1:8889/wp-admin/... instead of localhost:8889/wp-admin/..., which kicks you out of the admin and forces you to log in again.

Additionally, PHPCS warns that the following line of code:

$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );

triggers the following errors:

phpcs: error
WordPress.Security.ValidatedSanitizedInput.InputNotValidated - Detected usage of a possibly undefined superglobal array index: $_SERVERHTTP_HOST. Check that the array index exists before using it.

phpcs: error
WordPress.Security.ValidatedSanitizedInput.MissingUnslash - $_SERVERHTTP_HOST not unslashed before sanitization. Use wp_unslash() or similar

phpcs: error
WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - Detected usage of a non-sanitized input variable: $_SERVERHTTP_HOST

phpcs: error
WordPress.Security.ValidatedSanitizedInput.InputNotValidated - Detected usage of a possibly undefined superglobal array index: $_SERVERREQUEST_URI. Check that the array index exists before using it.

phpcs: error
WordPress.Security.ValidatedSanitizedInput.MissingUnslash - $_SERVERREQUEST_URI not unslashed before sanitization. Use wp_unslash() or similar

phpcs: error
WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - Detected usage of a non-sanitized input variable: $_SERVERREQUEST_URI

Might it be necessary to rewrite this variable using native WP functions instead, so that it complies with PHPCS?

#9 @sukhendu2002
3 months ago

  • Keywords has-test-info added; needs-test-info removed

I checked this on the latest trunk.

WP_List_Table::pagination() and WP_List_Table::print_column_headers() still build URLs from $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']:

So when HTTP_HOST differs from the configured site/admin URL, list table links can use the wrong host, e.g. 127.0.0.1:8090, instead of the configured admin domain.

This affects pagination links and sortable column header links, and it is not limited to /wp-admin/edit.php; it applies to WP_List_Table consumers generally.

This looks related to #36201 / #16858. A fix should avoid using HTTP_HOST here and derive the URL from WordPress admin URL APIs instead.

This ticket was mentioned in ​PR #12456 on ​WordPress/wordpress-develop by ​@sukhendu2002.


3 months ago
#10

  • Keywords has-patch has-unit-tests added
Note: See TracTickets for help on using tickets.