Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(feat:) in the REST API controllers support passing all request params to WP_Query #25

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

colin-yard-nl
Copy link
Collaborator

Ik heb het doorgeven van de params uit het request nu net zo gedaan als in de OpenPub-plugin gebeurt (in \OWC\OpenPub\Base\RestAPI\Controllers\BaseController::getPaginatorParams()).

Sommige van de controllers doen na die aanroep nog andere dingen om de AbstractRepository::$queryArgs vervolgens nog te manipuleren/overschrijven (bijv. in ItemController::convertParameters()), maar door deze wijziging kunnen in principe alle params uit het request (zoals tax_query en meta_query) aan WP_Query doorgegeven worden.

@SimonvanWijhe
Copy link
Contributor

Aha. Ik kon het al niet zo snel vinden in openpub. Niet geheel logisch om de method dan nog getPaginatorParams te noemen. En moeten we de query parameters niet eerst escapen voor we die doorgeven aan de WP_Query?

@colin-yard-nl
Copy link
Collaborator Author

Aha. Ik kon het al niet zo snel vinden in openpub. Niet geheel logisch om de method dan nog getPaginatorParams te noemen. En moeten we de query parameters niet eerst escapen voor we die doorgeven aan de WP_Query?

Nee, dat gaat zo te zien allemaal al goed: de call vanuit portal naar PDC wordt nu dan bijv. zoiets: https://buren-pdc.lndo.site/wp-json/owc/pdc/v1/items/?limit=-1&include-connected=true&tax_query%5B0%5D%5Btaxonomy%5D=pdc-type&tax_query%5B0%5D%5Bfield%5D=slug&tax_query%5B0%5D%5Bterms%5D=melding, en in \OWC\PDC\Base\Repositories\AbstractRepository::all() zijn de $args dan dit:

image

@colin-yard-nl
Copy link
Collaborator Author

Aha. Ik kon het al niet zo snel vinden in openpub. Niet geheel logisch om de method dan nog getPaginatorParams te noemen. En moeten we de query parameters niet eerst escapen voor we die doorgeven aan de WP_Query?

Method hernoemen: ja, willen we dat wel? In OpenPub heet ie dus ook zo — en dan moeten we het waarschijnlijk wel in alle branches wijzigen, om te voorkomen dat er verwarrende verschillen ontstaan?

Copy link
Contributor

@SimonvanWijhe SimonvanWijhe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je hebt gelijk. Let's keep it simple.

@mvdhoek1
Copy link
Contributor

@SimonvanWijhe had je de query al getest op gevoelige data als output?

@colin-yard-nl
Copy link
Collaborator Author

@SimonvanWijhe had je de query al getest op gevoelige data als output?

@SimonvanWijhe @mvdhoek1 De zorg was of door deze wijziging niet ongewenste queries uitgevoerd / ongewenste data opgehaald kan worden, niet waar?

Volgens mij niet (maar misschien zie ik iets over het hoofd): want door deze wijziging worden weliswaar alle ge-poste query-vars doorgegeven aan WP-query, maar die leiden volgens mij altijd tot additionale AND-clauses (zeg maar), dus je kunt hierdoor je query enkel verder beperken, niet uitbreiden?

En ook het overschrijven van bijv. het filter op _owc_pdc_active=true (uit \OWC\PDC\Base\Support\Traits\QueryHelpers::excludeInactiveItemsQuery) lukt niet, omdat die later toegepast wordt: weliswaar krijg je met metaquery%5B0%5D%5Bkey%5D=_owc_pdc_active&metaquery%5B0%5D%5Bvalue%5D=0&metaquery%5B0%5D%5Bcompare%5D=%3D in de URL dan wel twee meta_query-elementen in de query-vars:

image

maar die latere overschrijft de eerdere en in de SQL die uitgevoerd wordt, staat dan enkel de "juiste": … AND ( 0wc_pdc_postmeta.meta_key = '_owc_pdc_active' AND 0wc_pdc_postmeta.meta_value = '1' ) ….

@sanderdekroon
Copy link
Member

Zonder goed door de code te spitten: kun je de post_status, post_type, etc. wijzigen via de URL parameters? Want dat is wellicht wel problematisch.

@colin-yard-nl
Copy link
Collaborator Author

Zonder goed door de code te spitten: kun je de post_status, post_type, etc. wijzigen via de URL parameters? Want dat is wellicht wel problematisch.

@sanderdekroon Ha, inderdaad, dat had ik niet gezien, de post_status-conditie kan zo wèl overschreven worden! post_type niet, want die wordt hard-coded altijd toegepast, maar dat gebeurt bij post_status dus blijkbaar niet. Dank — wordt vervolgd : )

@colin-yard-nl colin-yard-nl marked this pull request as draft December 13, 2023 13:10
@mvdhoek1
Copy link
Contributor

Interne chat:

Mike:
Ik zou een draft status alleen toestaan wanneer iemand is ingelogd of de api aanroept met een application-password.

if (! is_user_logged_in()) {
    // force post status to be 'published'
}

Simon:
Goed idee. Ik zou dan applicatie password verplichten voor het gebruik van de query parameter. Dan zitten we goed. We hebben ook nog pdc items met het taxonomy type "internal" en die moeten ook niet zonder wachtwoord kunnen worden opgehaald.

@sanderdekroon
Copy link
Member

sanderdekroon commented Dec 14, 2023

Kunnen we niet een allowlist/blocklist implementeren? Dingen als order, orderby, limit, etc. zijn allemaal queryable, maar niet op elke endpoint. De naamgeving wijkt soms ook af t.o.v. de query parameters in WordPress.

Je kan dan een lijst van toegestane parameters bijhouden voor niet-ingelogde requests. Als iemand geauthenticeerd is sta je (nagenoeg) alles toe.

Of rek ik deze PR dan weer heel erg op? 😬

@mvdhoek1
Copy link
Contributor

mvdhoek1 commented Jan 4, 2024

@colin-yard-nl ik heb vast een opzet/voorbeeld gemaakt met de whitelisting en wat extra validaties. Kijk maar even wat jullie hiervan vinden. -> 9b0fc04

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants