[feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229#694
[feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229#694UltraBot05 wants to merge 4 commits into
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe changes add CIDR and whitespace-tolerant parsing for FreeRADIUS allowed hosts. Model parsing and validation now trim comma-separated entries, drop empties, and validate with Sequence Diagram(s)sequenceDiagram
participant Client
participant FreeradiusApiAuthentication
participant AbstractOrganizationRadiusSettings
participant ipaddress
Client->>FreeradiusApiAuthentication: request from client IP
FreeradiusApiAuthentication->>AbstractOrganizationRadiusSettings: freeradius_allowed_hosts_list
AbstractOrganizationRadiusSettings-->>FreeradiusApiAuthentication: trimmed allowlist entries
FreeradiusApiAuthentication->>ipaddress: ip_network((ip or '').strip(), strict=False)
ipaddress-->>FreeradiusApiAuthentication: network object
FreeradiusApiAuthentication->>FreeradiusApiAuthentication: compare client IP to allowed network
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@openwisp_radius/base/models.py`:
- Around line 1388-1390: The loop over allowed_hosts_set redundantly calls
str(...).strip() before validating with ipaddress.ip_network; since
allowed_hosts_set is built from freeradius_allowed_hosts_list which already
strips and yields strings, replace ipaddress.ip_network(str(ip_address).strip(),
strict=False) with ipaddress.ip_network(ip_address, strict=False) in the
validation loop (keep strict=False).
In `@openwisp_radius/tests/test_api/test_freeradius_api.py`:
- Around line 2388-2447: Add parallel CIDR-related tests to the TestClientIpApi
class mirroring the new tests in TestTransactionClientIpApi: create tests named
like test_ip_from_radsetting_cidr_range_valid,
test_ip_from_radsetting_spaces_and_host_bits_valid, and
test_ip_outside_cidr_range_rejected that manipulate
OrganizationRadiusSettings.freeradius_allowed_hosts, patch
openwisp_radius.api.freeradius_views.get_client_ip, and assert the same
responses as in the Transaction tests; also add edge-case tests in
TestClientIpApi for IPv6 CIDR ranges (e.g., ::1/128 and 2001:db8::/32) and a
regression test for a single IP without CIDR to ensure existing behavior from
test_ip_from_radsetting_invalid is preserved.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 3ea97a6c-6e92-4dc2-8af3-995aba4b7baa
📒 Files selected for processing (3)
openwisp_radius/api/freeradius_views.pyopenwisp_radius/base/models.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
- GitHub Check: Python==3.13 | django~=5.2.0
- GitHub Check: Python==3.10 | django~=5.2.0
- GitHub Check: Python==3.12 | django~=5.1.0
- GitHub Check: Python==3.11 | django~=4.2.0
- GitHub Check: Python==3.12 | django~=4.2.0
- GitHub Check: Python==3.10 | django~=4.2.0
- GitHub Check: Python==3.13 | django~=5.1.0
- GitHub Check: Python==3.12 | django~=5.2.0
- GitHub Check: Python==3.11 | django~=5.2.0
- GitHub Check: Python==3.10 | django~=5.1.0
- GitHub Check: Python==3.11 | django~=5.1.0
🔇 Additional comments (5)
openwisp_radius/base/models.py (1)
1342-1346: LGTM!The list comprehension correctly strips whitespace from each entry and filters out empty strings, ensuring robust parsing of comma-separated IP addresses with accidental spaces.
openwisp_radius/api/freeradius_views.py (1)
106-118: LGTM! Correct implementation of CIDR range matching.The logic correctly:
- Uses
ip_network(str(ip).strip(), strict=False)to parse allowed hosts as networks, supporting both single IPs and CIDR ranges.- Checks if the client IP falls within any allowed network using the
inoperator withip_address()andip_network().- Preserves the existing error handling for invalid IP configurations.
The
str(ip).strip()is slightly redundant (values should already be stripped strings), but serves as defensive coding and doesn't impact functionality.openwisp_radius/tests/test_api/test_freeradius_api.py (3)
2388-2403: LGTM! Good test coverage for CIDR range matching.This test correctly validates that an IP address within a CIDR range (172.18.0.10 in 172.18.0.0/16) is accepted for authorization.
2405-2425: LGTM! Comprehensive test for whitespace and host bits handling.This test effectively validates:
- Whitespace trimming in allowed hosts parsing (space after comma).
- Host bits in CIDR notation (172.18.0.5/16 instead of canonical 172.18.0.0/16) working with
strict=False.- Cache correctness after save.
- Client IP within the range is accepted.
2427-2447: LGTM! Good negative test case for CIDR rejection.This test correctly validates that an IP address outside the allowed CIDR range (10.0.0.5 not in 172.18.0.0/16) is rejected with the appropriate 403 status and error message.
…isp#229 Closes openwisp#229 Added strict=False to ipaddress.ip_network parsing and strip() to string inputs to allow networks with host bits and spaces to be correctly parsed and authenticated.
e2ee205 to
f31bb3a
Compare
|
Hi, some information on this: On CodeRabbitAI's input: CIs have passed, please check. |
nemesifier
left a comment
There was a problem hiding this comment.
Thanks @UltraBot05, this is a clean and well-tested feature for #229. Passing strict=False to ip_network so entries with host bits are accepted, and stripping whitespace from comma-separated entries, is exactly right, and you applied it consistently in the runtime check, the property, and the validation. The tests cover the CIDR-range and spaces/host-bits cases.
Minor points:
- In
freeradius_allowed_hosts_list, the leadingaddresses = []is now dead (immediately reassigned by the comprehension). Drop it. - Docs are unchecked. Please document that
FREERADIUS_ALLOWED_HOSTSnow accepts CIDR ranges (and tolerates spaces), since that is a user-facing behavior change. - Worth a test asserting that a client IP outside the configured CIDR is correctly rejected, to complement the accept cases.
Good, small, and correct. Add the docs note and the negative test and it is ready.
9ad22ec to
f4c1390
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
openwisp_radius/base/models.py (1)
1404-1406: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winNormalize the global allowlist before these set checks.
allowed_hosts_setnow uses stripped/non-empty tokens, butsettings_allowed_hosts_setstill uses the rawapp_settings.FREERADIUS_ALLOWED_HOSTS. With a setting like[" "], Line 1406 treats the global fallback as configured here, then_check_client_ip_and_return()strips it to""and rejects every request later. Apply the same trim-and-drop-empty normalization on the settings side before the emptiness/equality checks.Suggested fix
- settings_allowed_hosts_set = set(app_settings.FREERADIUS_ALLOWED_HOSTS) + settings_allowed_hosts_set = { + (ip or "").strip() + for ip in (app_settings.FREERADIUS_ALLOWED_HOSTS or []) + if (ip or "").strip() + }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@openwisp_radius/base/models.py` around lines 1404 - 1406, Normalize the global allowlist in the same way as the instance allowlist before the emptiness/equality checks in the logic around self.freeradius_allowed_hosts_list and app_settings.FREERADIUS_ALLOWED_HOSTS. The issue is that allowed_hosts_set is already stripped and filtered, but settings_allowed_hosts_set still uses raw values, so whitespace-only entries can be treated as configured and later fail in _check_client_ip_and_return(). Apply the same trim-and-drop-empty normalization to the settings side before the set checks so both sources are compared consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@openwisp_radius/base/models.py`:
- Around line 1421-1425: The allowed-hosts validation in the model no longer
rejects surrounding whitespace, so the existing “no spaces” hint is stale and
misleading. Update the validation path in the allowed-hosts parsing/validation
logic around the ipaddress.ip_network check to remove that hint from the error
message, keeping the message aligned with the actual behavior while preserving
the current trimming and network validation.
---
Outside diff comments:
In `@openwisp_radius/base/models.py`:
- Around line 1404-1406: Normalize the global allowlist in the same way as the
instance allowlist before the emptiness/equality checks in the logic around
self.freeradius_allowed_hosts_list and app_settings.FREERADIUS_ALLOWED_HOSTS.
The issue is that allowed_hosts_set is already stripped and filtered, but
settings_allowed_hosts_set still uses raw values, so whitespace-only entries can
be treated as configured and later fail in _check_client_ip_and_return(). Apply
the same trim-and-drop-empty normalization to the settings side before the set
checks so both sources are compared consistently.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: c4229bfe-7a32-41b8-95e1-1acc2bcb5cf1
📒 Files selected for processing (4)
docs/user/settings.rstopenwisp_radius/api/freeradius_views.pyopenwisp_radius/base/models.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
📜 Review details
⏰ Context from checks skipped due to timeout. (11)
- GitHub Check: Python==3.11 | django~=5.1.0
- GitHub Check: Python==3.12 | django~=4.2.0
- GitHub Check: Python==3.13 | django~=5.1.0
- GitHub Check: Python==3.13 | django~=5.2.0
- GitHub Check: Python==3.11 | django~=5.2.0
- GitHub Check: Python==3.12 | django~=5.1.0
- GitHub Check: Python==3.11 | django~=4.2.0
- GitHub Check: Python==3.12 | django~=5.2.0
- GitHub Check: Python==3.10 | django~=5.2.0
- GitHub Check: Python==3.10 | django~=4.2.0
- GitHub Check: Python==3.10 | django~=5.1.0
🧰 Additional context used
📓 Path-based instructions (2)
**/{docs,documentation}/**/*.{md,rst,adoc,html}
📄 CodeRabbit inference engine (Custom checks)
**/{docs,documentation}/**/*.{md,rst,adoc,html}: Documentation must be updated if a change affects behavior that is already documented
Feature documentation must mention the new feature. If the feature is heavily UI-related, a new section or page is appropriate
Files:
docs/user/settings.rst
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Place imports at the top of the file. Only defer imports when necessary (e.g., Django model imports inside functions or methods where the app registry is not yet ready).
Avoid unnecessary blank lines inside function and method bodies.
Mark user-facing strings for translation with Django i18n helpers in Django code.
Write comments and docstrings only when they explain why code is shaped a certain way. Put comments before the relevant code block instead of scattering them inside it.
Files:
openwisp_radius/base/models.pyopenwisp_radius/api/freeradius_views.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
🔇 Additional comments (4)
openwisp_radius/base/models.py (1)
1375-1379: LGTM!openwisp_radius/api/freeradius_views.py (1)
109-111: LGTM!openwisp_radius/tests/test_api/test_freeradius_api.py (1)
2483-2523: LGTM!Also applies to: 2563-2622
docs/user/settings.rst (1)
193-195: LGTM!
f4c1390 to
a34671e
Compare
|
Hi @nemesifier, I've addressed all of your points:
All checks passing, and the tests too. |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
openwisp_radius/base/models.py (1)
1421-1425: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winCompare normalized networks before collapsing to the global default.
With
strict=False,172.18.0.5/16and172.18.0.0/16now authorize the same range, but theallowed_hosts_set == settings_allowed_hosts_setcheck still compares raw strings. If the default uses one form and an organization saves the other,freeradius_allowed_hostsis persisted instead of reset toNone, so that org stops inheriting later changes toOPENWISP_RADIUS_FREERADIUS_ALLOWED_HOSTS.Suggested fix
allowed_hosts_set = set(self.freeradius_allowed_hosts_list) - settings_allowed_hosts_set = set(app_settings.FREERADIUS_ALLOWED_HOSTS) + settings_allowed_hosts_set = { + (ip or "").strip() + for ip in app_settings.FREERADIUS_ALLOWED_HOSTS + if (ip or "").strip() + } + normalized_allowed_hosts_set = { + str(ipaddress.ip_network(ip_address, strict=False)) + for ip_address in allowed_hosts_set + } + normalized_settings_allowed_hosts_set = { + str(ipaddress.ip_network(ip_address, strict=False)) + for ip_address in settings_allowed_hosts_set + } @@ - if allowed_hosts_set == settings_allowed_hosts_set: + if normalized_allowed_hosts_set == normalized_settings_allowed_hosts_set: self.freeradius_allowed_hosts = None🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@openwisp_radius/base/models.py` around lines 1421 - 1425, The allowed-hosts reset logic is comparing raw strings, so equivalent CIDR forms like 172.18.0.5/16 and 172.18.0.0/16 are treated as different in the `freeradius_allowed_hosts` handling. Update the comparison in the `allowed_hosts_set`/`settings_allowed_hosts_set` flow to normalize each entry with `ipaddress.ip_network(..., strict=False)` before checking equality, so organizations that match the global default by range are reset to `None` and keep inheriting future `OPENWISP_RADIUS_FREERADIUS_ALLOWED_HOSTS` changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@openwisp_radius/base/models.py`:
- Around line 1421-1425: The allowed-hosts reset logic is comparing raw strings,
so equivalent CIDR forms like 172.18.0.5/16 and 172.18.0.0/16 are treated as
different in the `freeradius_allowed_hosts` handling. Update the comparison in
the `allowed_hosts_set`/`settings_allowed_hosts_set` flow to normalize each
entry with `ipaddress.ip_network(..., strict=False)` before checking equality,
so organizations that match the global default by range are reset to `None` and
keep inheriting future `OPENWISP_RADIUS_FREERADIUS_ALLOWED_HOSTS` changes.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 37e4d228-c2db-4099-8800-8497da984be7
📒 Files selected for processing (3)
docs/user/settings.rstopenwisp_radius/base/models.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
📜 Review details
⏰ Context from checks skipped due to timeout. (11)
- GitHub Check: Python==3.13 | django~=5.2.0
- GitHub Check: Python==3.12 | django~=5.1.0
- GitHub Check: Python==3.11 | django~=4.2.0
- GitHub Check: Python==3.12 | django~=4.2.0
- GitHub Check: Python==3.13 | django~=5.1.0
- GitHub Check: Python==3.10 | django~=5.2.0
- GitHub Check: Python==3.12 | django~=5.2.0
- GitHub Check: Python==3.11 | django~=5.1.0
- GitHub Check: Python==3.10 | django~=4.2.0
- GitHub Check: Python==3.10 | django~=5.1.0
- GitHub Check: Python==3.11 | django~=5.2.0
🧰 Additional context used
📓 Path-based instructions (2)
**/{docs,documentation}/**/*.{md,rst,adoc,html}
📄 CodeRabbit inference engine (Custom checks)
**/{docs,documentation}/**/*.{md,rst,adoc,html}: Documentation must be updated if a change affects behavior that is already documented
Feature documentation must mention the new feature. If the feature is heavily UI-related, a new section or page is appropriate
Files:
docs/user/settings.rst
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Place imports at the top of the file. Only defer imports when necessary (e.g., Django model imports inside functions or methods where the app registry is not yet ready).
Avoid unnecessary blank lines inside function and method bodies.
Mark user-facing strings for translation with Django i18n helpers in Django code.
Write comments and docstrings only when they explain why code is shaped a certain way. Put comments before the relevant code block instead of scattering them inside it.
Files:
openwisp_radius/base/models.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
🔇 Additional comments (3)
openwisp_radius/base/models.py (1)
1375-1379: LGTM!openwisp_radius/tests/test_api/test_freeradius_api.py (1)
2483-2523: LGTM!Also applies to: 2563-2622
docs/user/settings.rst (1)
193-195: LGTM!
Test Failure: Invalid IP ListHello @UltraBot05, The test Fix: |
…penwisp#229 freeradius_allowed_hosts_list had a dead `addresses = []` immediately overwritten by the comprehension; removed it. Also removed the stale "(no spaces)" hint from the validation error message since whitespace is now accepted. Updated OPENWISP_RADIUS_FREERADIUS_ALLOWED_HOSTS documentation to note that entries with host bits set and extra whitespace are handled gracefully. Added CIDR accept and reject tests to TestClientIpApi mirroring the existing tests in TestTransactionClientIpApi. Fixes openwisp#229
a34671e to
0734295
Compare
|
my bad, have recitified it and now CI passes |
|
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
openwisp_radius/tests/test_admin.py (1)
503-588: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd an admin round-trip for the newly accepted inputs.
This method only updates the rejection text. Please add a positive subtest that posts something like
127.0.0.1, 172.18.0.5/16through the organization form and asserts the save succeeds, so the admin path is covered end-to-end for the new whitespace/host-bit behavior.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@openwisp_radius/tests/test_admin.py` around lines 503 - 588, The admin test for OrganizationRadiusSettings only covers rejection cases and the single-host save path, so add a positive subtest in test_organization_radsettings_freeradius_allowed_hosts that posts a comma-separated value like 127.0.0.1, 172.18.0.5/16 through the organization admin form and asserts the response is a redirect and the saved freeradius_allowed_hosts matches the accepted normalized value. Use the existing form_data, self.client.post, and radsetting.refresh_from_db() flow so the new whitespace/host-bit behavior is covered end-to-end.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@openwisp_radius/tests/test_admin.py`:
- Around line 503-588: The admin test for OrganizationRadiusSettings only covers
rejection cases and the single-host save path, so add a positive subtest in
test_organization_radsettings_freeradius_allowed_hosts that posts a
comma-separated value like 127.0.0.1, 172.18.0.5/16 through the organization
admin form and asserts the response is a redirect and the saved
freeradius_allowed_hosts matches the accepted normalized value. Use the existing
form_data, self.client.post, and radsetting.refresh_from_db() flow so the new
whitespace/host-bit behavior is covered end-to-end.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: e5cdcc4f-1297-4700-931a-d144a93318e7
📒 Files selected for processing (4)
docs/user/settings.rstopenwisp_radius/base/models.pyopenwisp_radius/tests/test_admin.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
📜 Review details
⚠️ CI failures not shown inline (22)
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.10 django~=5.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.12 django~=4.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.11 django~=5.1.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.10 django~=5.1.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.13 django~=5.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.11 django~=4.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.10 django~=4.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.12 django~=5.1.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.13 django~=5.1.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.12 django~=5.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / 3_Python==3.12 django~=5.1.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
ds/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.2)
Requirement already satisfied: vine<6.0,>=5.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.1.0)
Requirement already satisfied: click<9.0,>=8.1.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (8.4.2)
Requirement already satisfied: click-didyoumean>=0.3.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-pac...
GitHub Actions: OpenWISP RADIUS CI Build / Python==3.11 django~=5.2.0: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/openwisp-radius/openwisp-radius --files-from manifest.txt --use-compress-program zstdmt
/usr/bin/tar: ../../../../../var/cache/apt/archives/partial: Cannot open: Permission denied
/usr/bin/tar: ../../../../../var/cache/apt/archives/lock: Cannot open: Permission denied
/usr/bin/tar: Exiting with failure status due to previous errors
##[warning]Failed to save: "/usr/bin/tar" failed with error: The process '/usr/bin/tar' failed with exit code 2
GitHub Actions: OpenWISP RADIUS CI Build / 4_Python==3.11 django~=5.1.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.2)
Requirement already satisfied: vine<6.0,>=5.1.0 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from celery~=5.6.1->openwisp-utils @ https://github...
GitHub Actions: OpenWISP RADIUS CI Build / 2_Python==3.10 django~=5.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
te-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (2.7.0)
Requirement already satisfied: distro~=1.9.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (1.9.0)
Requirement already satisfied: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: djangorestframework~=3.17.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (3.17.1)
Requirement already satisfied: django-filter<26.0,>=25.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://githu...
GitHub Actions: OpenWISP RADIUS CI Build / 8_Python==3.10 django~=4.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
isp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (2.7.0)
Requirement already satisfied: distro~=1.9.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (1.9.0)
Requirement already satisfied: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: djangorestframework~=3.17.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archiv...
GitHub Actions: OpenWISP RADIUS CI Build / 6_Python==3.11 django~=4.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
hub.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (25.2)
Requirement already satisfied: drf-yasg<1.22.0,>=1.21.14 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (1.21.15)
Requirement already satisfied: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /...
GitHub Actions: OpenWISP RADIUS CI Build / 5_Python==3.13 django~=5.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (3.17.1)
Requirement already satisfied: django-filter<26.0,>=25.1 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (25.2)
Requirement already satisfied: drf-yasg<1.22.0,>=1.21.14 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (1.21.15)
Requirement already satisfied: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=...
GitHub Actions: OpenWISP RADIUS CI Build / 1_Python==3.12 django~=4.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
ges (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.2)
Requirement already satisfied: vine<6.0,>=5.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest...
GitHub Actions: OpenWISP RADIUS CI Build / 7_Python==3.10 django~=5.1.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
atisfied: urllib3<3.0.0,>=2.0.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (2.7.0)
Requirement already satisfied: distro~=1.9.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (1.9.0)
Requirement already satisfied: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: djangorestframework~=3.17.1 in /opt/hostedtoolcache/Python/3.10.20/x64/lib/python3.10/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-u...
GitHub Actions: OpenWISP RADIUS CI Build / 9_Python==3.13 django~=5.1.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
edtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.2)
Requirement already satisfied: vine<6.0,>=5.1.0 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.1.0)
Requirement already satisfied: click<9.0,>=8.1.2 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (8.4.2)
Requirement already satisfied: click-didyoumean>=0.3.0 in /opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads...
GitHub Actions: OpenWISP RADIUS CI Build / 11_Python==3.11 django~=5.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
nwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (25.2)
Requirement already satisfied: drf-yasg<1.22.0,>=1.21.14 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (1.21.15)
Requirement already satisfied: channels~=4.3.0 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from channels[daphne]~=4.3.0; extra == "channels"->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.2)
Requirement already satisfied: channels_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /opt/hostedtoolcache/...
GitHub Actions: OpenWISP RADIUS CI Build / 10_Python==3.12 django~=5.2.0.txt: [feature] Added CIDR and subnet support to FREERADIUS_ALLOWED_HOSTS #229
Conclusion: failure
els_redis<4.4.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.3.0)
Requirement already satisfied: celery~=5.6.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.3)
Requirement already satisfied: billiard<5.0,>=4.2.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (4.2.4)
Requirement already satisfied: kombu>=5.6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.6.2)
Requirement already satisfied: vine<6.0,>=5.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-utils[celery,rest] @ https://github.com/openwisp/openwisp-utils/archive/refs/heads/1.3.tar.gz->openwisp-radius==1.3a0) (5.1.0)
Requirement already satisfied: click<9.0,>=8.1.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from celery~=5.6.1->openwisp-utils @ https://github.com/openwisp/openwisp-utils/archive...
🧰 Additional context used
📓 Path-based instructions (2)
**/{docs,documentation}/**/*.{md,rst,adoc,html}
📄 CodeRabbit inference engine (Custom checks)
**/{docs,documentation}/**/*.{md,rst,adoc,html}: Documentation must be updated if a change affects behavior that is already documented
Feature documentation must mention the new feature. If the feature is heavily UI-related, a new section or page is appropriate
Files:
docs/user/settings.rst
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Place imports at the top of the file. Only defer imports when necessary (e.g., Django model imports inside functions or methods where the app registry is not yet ready).
Avoid unnecessary blank lines inside function and method bodies.
Mark user-facing strings for translation with Django i18n helpers in Django code.
Write comments and docstrings only when they explain why code is shaped a certain way. Put comments before the relevant code block instead of scattering them inside it.
Files:
openwisp_radius/tests/test_admin.pyopenwisp_radius/base/models.pyopenwisp_radius/tests/test_api/test_freeradius_api.py
🔇 Additional comments (3)
openwisp_radius/base/models.py (1)
1375-1379: LGTM!Also applies to: 1421-1431
openwisp_radius/tests/test_api/test_freeradius_api.py (1)
2483-2522: LGTM!Also applies to: 2580-2622
docs/user/settings.rst (1)
193-195: LGTM!
Added
strict=Falsetoipaddress.ip_networkparsing andstrip() to string inputs to allow networks with host bits and spaces to be correctly parsed and authenticated.Checklist
Reference to Existing Issue
Closes #229.
Description of Changes
This PR enables CIDR and subnet support for
FREERADIUS_ALLOWED_HOSTSby addingstrict=Falsetoipaddress.ip_network()parsing in base/models.py and api/freeradius_views.py.This change prevents
ValueErrorcrashes when host bits are set and allows authentication for any client IP within a defined network range. Additionally,.strip()was added to handle accidental whitespace in input strings. New test cases intest_freeradius_api.pyverify correct range-based authentication and resilient string parsing.