Problem
As seen in #396, calling gethostbyname in PHP generates a random local IP address. Emscripten then re-routes it to the correct location, but the fact we even have local IP in the mix causes wp_safe_remote_get to fail since it refuses to connect to a local IP address.
A workaround discussed in that issue silences the warning, which works in a dev environment, but for production use we need a proper fix that doesn't open up a possibility of local network traversal.
Proposed solution
Hardcoding host resolution won’t cut it and we need to defer to the OS gethostbyname implementation.
The DNS.lookup() implementation that comes with node.js is asynchronous so there are two ways to go about it:
- Find a synchronous alternative, plug it into Emscripten, done
- Plug in the asynchronous version via Asyncify, which perhaps wouldn’t be that much harder but would create additional stack switching code paths
Unrelated trivia: I just learned that dns.lookup() pretends to be asynchronous, but in reality it calls a blocking function:
https://httptoolkit.com/blog/configuring-nodejs-dns/
The author discusses a cacheable-lookup library that exposes a synchronous lookup() function - perhaps it could „just work” for us?
https://www.npmjs.com/package/cacheable-lookup
Related info
This is also solved by enabling the networking access by adding networking=yes to the URL, for example:
https://playground.wordpress.net/?plugin=create-block-theme&url=/wp-admin/admin.php?page=create-block-theme&networking=yes
Or with the following Blueprint:
{
"features": {
"networking": true
}
}
cc @akirk @dmsnell @danielbachhuber
Problem
As seen in #396, calling
gethostbynamein PHP generates a random local IP address. Emscripten then re-routes it to the correct location, but the fact we even have local IP in the mix causeswp_safe_remote_getto fail since it refuses to connect to a local IP address.A workaround discussed in that issue silences the warning, which works in a dev environment, but for production use we need a proper fix that doesn't open up a possibility of local network traversal.
Proposed solution
Hardcoding host resolution won’t cut it and we need to defer to the OS
gethostbynameimplementation.The
DNS.lookup()implementation that comes with node.js is asynchronous so there are two ways to go about it:Unrelated trivia: I just learned that dns.lookup() pretends to be asynchronous, but in reality it calls a blocking function:
https://httptoolkit.com/blog/configuring-nodejs-dns/
The author discusses a
cacheable-lookuplibrary that exposes a synchronouslookup()function - perhaps it could „just work” for us?https://www.npmjs.com/package/cacheable-lookup
Related info
This is also solved by enabling the networking access by adding networking=yes to the URL, for example:
https://playground.wordpress.net/?plugin=create-block-theme&url=/wp-admin/admin.php?page=create-block-theme&networking=yes
Or with the following Blueprint:
{ "features": { "networking": true } }cc @akirk @dmsnell @danielbachhuber