[DigitalPoint] App for Cloudflare®

[DigitalPoint] App for Cloudflare® 1.9.8

No permission to download
Hi! In the latest version, I get this error when viewing a user IP list from the admin panel:

Code:
Server error log
ValueError: Template admin:user_ip_list error: inet_pton(): Argument #1 ($ip) must not contain any null bytes src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php:31
Generated by: Rhodium Dec 17, 2025 at 4:57 PM
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php(31): inet_pton([invalid])
#1 src/XF/Template/Templater.php(1186): DigitalPoint\Cloudflare\XF\Template\Templater->filterGeo(Object(SV\StandardLib\XF\Template\Templater), [invalid], false)
#2 internal_data/code_cache/templates/l1/s0/admin/user_ip_list.php(28): XF\Template\Templater->filter([invalid], Array, false)
#3 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#4 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('user_ip_list', Array)
#5 src/XF/Mvc/Renderer/Json.php(86): XF\Template\Template->render()
#6 src/XF/Mvc/Renderer/Json.php(70): XF\Mvc\Renderer\Json->renderHtmlFallback('XF:User\\IpList', 'admin:user_ip_l...', Array)
#7 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Json->renderView('XF:User\\IpList', 'admin:user_ip_l...', Array)
#8 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#9 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#10 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'json')
#11 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#12 src/XF.php(806): XF\App->run()
#13 admin.php(15): XF::runApp('XF\\Admin\\App')
#14 {main}
Request state
array(4) {
  ["url"] => string(197) "/admin.php?users/troy-mcclon.301320/user-ips&_xfResponseType=json&_xfWithData=1&_xfRequestUri=%2Fadmin.php%3Fusers%2Ftroy-mcclon.301320%2Fedit&_xfToken=****"
  ["referrer"] => string(58) "https://****.com/admin.php?users/troy-mcclon.301320/edit"
  ["_GET"] => array(5) {
    ["users/troy-mcclon_301320/user-ips"] => string(0) ""
    ["_xfResponseType"] => string(4) "json"
    ["_xfWithData"] => string(1) "1"
    ["_xfRequestUri"] => string(40) "/admin.php?users/troy-mcclon.301320/edit"
    ["_xfToken"] => string(43) "****"
  }
  ["_POST"] => array(0) {
  }
}
What version of PHP are you using? No matter how I try, I've not been able to even get that error at the most basic level with inet_pton. Tried with PHP 7, PHP 8, tried forcing null characters into the function, etc.

Side note, it's also the exact same way XenForo core is using inet_pton in 2.3...
 
What version of PHP are you using? No matter how I try, I've not been able to even get that error at the most basic level with inet_pton. Tried with PHP 7, PHP 8, tried forcing null characters into the function, etc.

Side note, it's also the exact same way XenForo core is using inet_pton in 2.3...
I just updated to php 8.3.29 earlier today (from 8.3.28) and started seeing similar IP related errors.

Perhaps related to a security fix:

 
Last edited:
What version of PHP are you using? No matter how I try, I've not been able to even get that error at the most basic level with inet_pton. Tried with PHP 7, PHP 8, tried forcing null characters into the function, etc.

Side note, it's also the exact same way XenForo core is using inet_pton in 2.3...

I’m on PHP 8.3.29. I tested a backup in a different environment with no errors, so I think its what @azzurro pointed.
 
I got the same error now after I updated to PHP 8.4.16; there was no issue with 8.4.15.

PHP:
ValueError: Template public:member_self_ip_list error: inet_pton(): Argument #1 ($ip) must not contain any null bytes src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php:31
 
In the src\addons\DigitalPoint\Cloudflare\XF\Template.php file, if you change this:

PHP:
$binaryValue = @inet_pton($value);
if ($binaryValue === false)
{
    $binaryValue = $value;
}

PHP:
if (strpos($value, "\0") !== false)
{
    $binaryValue = $value;
}
else
{
    $binaryValue = @inet_pton($value);
    if ($binaryValue === false)
    {
        $binaryValue = $value;
    }
}

...does that sort it out for whatever versions of PHP it's an issue with?
 
In the src\addons\DigitalPoint\Cloudflare\XF\Template.php file, if you change this:

PHP:
$binaryValue = @inet_pton($value);
if ($binaryValue === false)
{
    $binaryValue = $value;
}

PHP:
if (strpos($value, "\0") !== false)
{
    $binaryValue = $value;
}
else
{
    $binaryValue = @inet_pton($value);
    if ($binaryValue === false)
    {
        $binaryValue = $value;
    }
}

...does that sort it out for whatever versions of PHP it's an issue with?

Yep, it's working fine with that, thanks!
 
I'm trying to use @AndyB's STL viewer add-on but I'm getting an error:

ErrorException: [E_WARNING] rewind(): Stream does not support seeking in src/addons/DigitalPoint/Cloudflare/Api/Advanced.php at line 794
  1. XF::handlePhpError()
  2. rewind() in src/addons/DigitalPoint/Cloudflare/Api/Advanced.php at line 794
  3. DigitalPoint\Cloudflare\Api\Advanced->signS3Request() in src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php at line 689
  4. DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest() in src/addons/DigitalPoint/Cloudflare/Api/Advanced.php at line 750
  5. DigitalPoint\Cloudflare\Api\Advanced->createR2Object() in src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php at line 103
  6. DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->writeStream() in src/vendor/league/flysystem/src/Filesystem.php at line 87
  7. League\Flysystem\Filesystem->writeStream() in src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php at line 430
  8. League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod() in src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php at line 395
  9. League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall() in src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php at line 275
  10. League\Flysystem\EventableFilesystem\EventableFilesystem->writeStream() in src/vendor/league/flysystem/src/MountManager.php at line 462
  11. League\Flysystem\MountManager->writeStream() in src/addons/Andy/STLViewer/Pub/Controller/STLViewer.php at line 99
  12. Andy\STLViewer\Pub\Controller\STLViewer->actionIndex() in src/XF/Mvc/Dispatcher.php at line 362
  13. XF\Mvc\Dispatcher->dispatchClass() in src/XF/Mvc/Dispatcher.php at line 264
  14. XF\Mvc\Dispatcher->dispatchFromMatch() in src/XF/Mvc/Dispatcher.php at line 121
  15. XF\Mvc\Dispatcher->dispatchLoop() in src/XF/Mvc/Dispatcher.php at line 63
  16. XF\Mvc\Dispatcher->run() in src/XF/App.php at line 2824
  17. XF\App->run() in src/XF.php at line 806
  18. XF::runApp() in index.php at line 23
 
I'm trying to use @AndyB's STL viewer add-on but I'm getting an error:
Don't know anything about that addon, but if it's trying to save something to an R2 bucket (within data or internal_data, the source "file" stream would need to be seekable. My guess is it's trying to save a "file" with a URL as a source possibly?

If I knew what the source file type is, I could probably whip up something to work around it.
 
I'm trying to use @AndyB's STL viewer add-on but I'm getting an error:
If you edit the src\addons\DigitalPoint\Cloudflare\Api\Advanced.php file, and change this:
PHP:
if (!empty($params['body']) && is_resource($params['body']))

...to this:
PHP:
        if (!empty($params['body']) && is_resource($params['body']) && empty(stream_get_meta_data($params['body'])['seekable']))
        {
            $params['body'] = stream_get_contents($params['body']);
        }

        if (!empty($params['body']) && is_resource($params['body']))

...basically adding a check to make sure something is seekable, if it's not just go ahead and read the whole thing into memory and deal with it that way. Not as efficient as a stream, but at least it will work.
 
If you edit the src\addons\DigitalPoint\Cloudflare\Api\Advanced.php file, and change this:
PHP:
if (!empty($params['body']) && is_resource($params['body']))

...to this:
PHP:
        if (!empty($params['body']) && is_resource($params['body']) && empty(stream_get_meta_data($params['body'])['seekable']))
        {
            $params['body'] = stream_get_contents($params['body']);
        }

        if (!empty($params['body']) && is_resource($params['body']))

...basically adding a check to make sure something is seekable, if it's not just go ahead and read the whole thing into memory and deal with it that way. Not as efficient as a stream, but at least it will work.
Thank you. I'll bring this to @AndyB's attention.
 
Getting a couple of errors:

Code:
Server error log
ValueError: Template public:approval_item_user error: inet_pton(): Argument #1 ($ip) must not contain any null bytes src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php:31
Generated by: anthony Dec 30, 2025 at 8:06 PM
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php(31): inet_pton([invalid])
#1 src/XF/Template/Templater.php(1186): DigitalPoint\Cloudflare\XF\Template\Templater->filterGeo(Object(SV\StandardLib\XF\Template\Templater), [invalid], false)
#2 internal_data/code_cache/templates/l1/s89/public/approval_item_user.php(14): XF\Template\Templater->filter([invalid], Array, false)
#3 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#4 src/XF/ApprovalQueue/AbstractHandler.php(139): XF\Template\Templater->renderTemplate('approval_item_u...', Array)
#5 src/XF/Template/Templater.php(1282): XF\ApprovalQueue\AbstractHandler->render(Object(XF\Entity\ApprovalQueue))
#6 internal_data/code_cache/templates/l1/s89/public/approval_queue.php(100): XF\Template\Templater->method(Object(DigitalPoint\Cloudflare\XF\ApprovalQueue\User), 'render', Array)
#7 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#8 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('approval_queue', Array)
#9 src/XF/Mvc/Renderer/Html.php(50): XF\Template\Template->render()
#10 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Html->renderView('XF:ApprovalQueu...', 'public:approval...', Array)
#11 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#12 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#13 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'html')
#14 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#15 src/XF.php(806): XF\App->run()
#16 index.php(23): XF::runApp('XF\\Pub\\App')
#17 {main}
Request state
array(4) {
  ["url"] => string(16) "/approval-queue/"
  ["referrer"] => string(45) "https://www.myptsd.com/forums/general-ptsd.5/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Code:
Server error log
ValueError: Macro public:helper_ip :: ip_block() error: inet_pton(): Argument #1 ($ip) must not contain any null bytes src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php:31
Generated by: anthony Dec 30, 2025 at 8:06 PM
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php(31): inet_pton([invalid])
#1 src/XF/Template/Templater.php(1186): DigitalPoint\Cloudflare\XF\Template\Templater->filterGeo(Object(SV\StandardLib\XF\Template\Templater), [invalid], false)
#2 internal_data/code_cache/templates/l1/s89/public/helper_ip.php(28): XF\Template\Templater->filter([invalid], Array, false)
#3 src/XF/Template/Templater.php(921): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#4 internal_data/code_cache/templates/l1/s89/public/content_ip_view.php(14): XF\Template\Templater->callMacro('helper_ip', 'ip_block', Array, Array)
#5 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#6 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('content_ip_view', Array)
#7 src/XF/Mvc/Renderer/Json.php(86): XF\Template\Template->render()
#8 src/XF/Mvc/Renderer/Json.php(70): XF\Mvc\Renderer\Json->renderHtmlFallback('XF:Ip\\Ip', 'public:content_...', Array)
#9 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Json->renderView('XF:Ip\\Ip', 'public:content_...', Array)
#10 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#11 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#12 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'json')
#13 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#14 src/XF.php(806): XF\App->run()
#15 index.php(23): XF::runApp('XF\\Pub\\App')
#16 {main}
Request state
array(4) {
  ["url"] => string(191) "/posts/1989039/ip?_xfResponseType=json&_xfWithData=1&_xfRequestUri=%2Fthreads%2Fshop-https-www-facebook-com-lumenlight-reviews.108113%2F&_xfToken=1767085582%2C4425b15b58483bb70af7ca99b5c6aed8"
  ["referrer"] => string(85) "https://www.myptsd.com/threads/shop-https-www-facebook-com-lumenlight-reviews.108113/"
  ["_GET"] => array(4) {
    ["_xfResponseType"] => string(4) "json"
    ["_xfWithData"] => string(1) "1"
    ["_xfRequestUri"] => string(63) "/threads/shop-https-www-facebook-com-lumenlight-reviews.108113/"
    ["_xfToken"] => string(43) "1767085582,4425b15b58483bb70af7ca99b5c6aed8"
  }
  ["_POST"] => array(0) {
  }
}
 
Getting a couple of errors:

Code:
Server error log
ValueError: Template public:approval_item_user error: inet_pton(): Argument #1 ($ip) must not contain any null bytes src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php:31
Generated by: anthony Dec 30, 2025 at 8:06 PM
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php(31): inet_pton([invalid])
#1 src/XF/Template/Templater.php(1186): DigitalPoint\Cloudflare\XF\Template\Templater->filterGeo(Object(SV\StandardLib\XF\Template\Templater), [invalid], false)
#2 internal_data/code_cache/templates/l1/s89/public/approval_item_user.php(14): XF\Template\Templater->filter([invalid], Array, false)
#3 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#4 src/XF/ApprovalQueue/AbstractHandler.php(139): XF\Template\Templater->renderTemplate('approval_item_u...', Array)
#5 src/XF/Template/Templater.php(1282): XF\ApprovalQueue\AbstractHandler->render(Object(XF\Entity\ApprovalQueue))
#6 internal_data/code_cache/templates/l1/s89/public/approval_queue.php(100): XF\Template\Templater->method(Object(DigitalPoint\Cloudflare\XF\ApprovalQueue\User), 'render', Array)
#7 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#8 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('approval_queue', Array)
#9 src/XF/Mvc/Renderer/Html.php(50): XF\Template\Template->render()
#10 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Html->renderView('XF:ApprovalQueu...', 'public:approval...', Array)
#11 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#12 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#13 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'html')
#14 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#15 src/XF.php(806): XF\App->run()
#16 index.php(23): XF::runApp('XF\\Pub\\App')
#17 {main}
Request state
array(4) {
  ["url"] => string(16) "/approval-queue/"
  ["referrer"] => string(45) "https://www.myptsd.com/forums/general-ptsd.5/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Code:
Server error log
ValueError: Macro public:helper_ip :: ip_block() error: inet_pton(): Argument #1 ($ip) must not contain any null bytes src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php:31
Generated by: anthony Dec 30, 2025 at 8:06 PM
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/XF/Template/Templater.php(31): inet_pton([invalid])
#1 src/XF/Template/Templater.php(1186): DigitalPoint\Cloudflare\XF\Template\Templater->filterGeo(Object(SV\StandardLib\XF\Template\Templater), [invalid], false)
#2 internal_data/code_cache/templates/l1/s89/public/helper_ip.php(28): XF\Template\Templater->filter([invalid], Array, false)
#3 src/XF/Template/Templater.php(921): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#4 internal_data/code_cache/templates/l1/s89/public/content_ip_view.php(14): XF\Template\Templater->callMacro('helper_ip', 'ip_block', Array, Array)
#5 src/XF/Template/Templater.php(1799): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#6 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('content_ip_view', Array)
#7 src/XF/Mvc/Renderer/Json.php(86): XF\Template\Template->render()
#8 src/XF/Mvc/Renderer/Json.php(70): XF\Mvc\Renderer\Json->renderHtmlFallback('XF:Ip\\Ip', 'public:content_...', Array)
#9 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Json->renderView('XF:Ip\\Ip', 'public:content_...', Array)
#10 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#11 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Json), Object(XF\Mvc\Reply\View))
#12 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'json')
#13 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#14 src/XF.php(806): XF\App->run()
#15 index.php(23): XF::runApp('XF\\Pub\\App')
#16 {main}
Request state
array(4) {
  ["url"] => string(191) "/posts/1989039/ip?_xfResponseType=json&_xfWithData=1&_xfRequestUri=%2Fthreads%2Fshop-https-www-facebook-com-lumenlight-reviews.108113%2F&_xfToken=1767085582%2C4425b15b58483bb70af7ca99b5c6aed8"
  ["referrer"] => string(85) "https://www.myptsd.com/threads/shop-https-www-facebook-com-lumenlight-reviews.108113/"
  ["_GET"] => array(4) {
    ["_xfResponseType"] => string(4) "json"
    ["_xfWithData"] => string(1) "1"
    ["_xfRequestUri"] => string(63) "/threads/shop-https-www-facebook-com-lumenlight-reviews.108113/"
    ["_xfToken"] => string(43) "1767085582,4425b15b58483bb70af7ca99b5c6aed8"
  }
  ["_POST"] => array(0) {
  }
}
A change to the latest version of PHP causes that. Update to the latest version of the addon?
 
Hi! First, thanks for this fantastic add-on :)

If I was partially through a dp:migrate-data process to move internal_data/attachments, and then decided to keep things in the local filesystem, I don't need to do anything other than flip the toggle in the admincp right? Because no files were actually deleted locally?

edit: I guess there are all the attachments uploaded by users during the data migration that went to R2, that will have to be moved....
 
Hi! First, thanks for this fantastic add-on :)

If I was partially through a dp:migrate-data process to move internal_data/attachments, and then decided to keep things in the local filesystem, I don't need to do anything other than flip the toggle in the admincp right? Because no files were actually deleted locally?

edit: I guess there are all the attachments uploaded by users during the data migration that went to R2, that will have to be moved....
Correct... if you were on R2, any additions (or deletions) during that time wouldn't be reflected in the local filesystem.
 
Back
Top Bottom