mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Underscores in model names results in broken permissions #8160
Closed
opened 2025-12-29 20:33:12 +01:00 by adam
·
13 comments
No Branch/Tag Specified
main
update-changelog-comments-docs
feature-removal-issue-type
20911-dropdown
20239-plugin-menu-classes-mutable-state
21097-graphql-id-lookups
feature
fix_module_substitution
20923-dcim-templates
20044-elevation-stuck-lightmode
feature-ip-prefix-link
v4.5-beta1-release
20068-import-moduletype-attrs
20766-fix-german-translation-code-literals
20378-del-script
7604-filter-modifiers-v3
circuit-swap
12318-case-insensitive-uniqueness
20637-improve-device-q-filter
20660-script-load
19724-graphql
20614-update-ruff
14884-script
02496-max-page
19720-macaddress-interface-generic-relation
19408-circuit-terminations-export-templates
20203-openapi-check
fix-19669-api-image-download
7604-filter-modifiers
19275-fixes-interface-bulk-edit
fix-17794-get_field_value_return_list
11507-show-aggregate-and-rir-on-api
9583-add_column_specific_search_field_to_tables
v4.5.0
v4.4.10
v4.4.9
v4.5.0-beta1
v4.4.8
v4.4.7
v4.4.6
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
v4.3.7
v4.4.0-beta1
v4.3.6
v4.3.5
v4.3.4
v4.3.3
v4.3.2
v4.3.1
v4.3.0
v4.2.9
v4.3.0-beta2
v4.2.8
v4.3.0-beta1
v4.2.7
v4.2.6
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.11
v4.1.10
v4.1.9
v4.1.8
v4.2-beta1
v4.1.7
v4.1.6
v4.1.5
v4.1.4
v4.1.3
v4.1.2
v4.1.1
v4.1.0
v4.0.11
v4.0.10
v4.0.9
v4.1-beta1
v4.0.8
v4.0.7
v4.0.6
v4.0.5
v4.0.3
v4.0.2
v4.0.1
v4.0.0
v3.7.8
v3.7.7
v4.0-beta2
v3.7.6
v3.7.5
v4.0-beta1
v3.7.4
v3.7.3
v3.7.2
v3.7.1
v3.7.0
v3.6.9
v3.6.8
v3.6.7
v3.7-beta1
v3.6.6
v3.6.5
v3.6.4
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.5.9
v3.6-beta2
v3.5.8
v3.6-beta1
v3.5.7
v3.5.6
v3.5.5
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.4.10
v3.4.9
v3.5-beta2
v3.4.8
v3.5-beta1
v3.4.7
v3.4.6
v3.4.5
v3.4.4
v3.4.3
v3.4.2
v3.4.1
v3.4.0
v3.3.10
v3.3.9
v3.4-beta1
v3.3.8
v3.3.7
v3.3.6
v3.3.5
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.2.9
v3.2.8
v3.3-beta2
v3.2.7
v3.3-beta1
v3.2.6
v3.2.5
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.11
v3.1.10
v3.2-beta2
v3.1.9
v3.2-beta1
v3.1.8
v3.1.7
v3.1.6
v3.1.5
v3.1.4
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.0.12
v3.0.11
v3.0.10
v3.1-beta1
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.11.12
v3.0-beta2
v2.11.11
v2.11.10
v3.0-beta1
v2.11.9
v2.11.8
v2.11.7
v2.11.6
v2.11.5
v2.11.4
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.10
v2.10.9
v2.11-beta1
v2.10.8
v2.10.7
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.11
v2.10-beta2
v2.9.10
v2.10-beta1
v2.9.9
v2.9.8
v2.9.7
v2.9.6
v2.9.5
v2.9.4
v2.9.3
v2.9.2
v2.9.1
v2.9.0
v2.9-beta2
v2.8.9
v2.9-beta1
v2.8.8
v2.8.7
v2.8.6
v2.8.5
v2.8.4
v2.8.3
v2.8.2
v2.8.1
v2.8.0
v2.7.12
v2.7.11
v2.7.10
v2.7.9
v2.7.8
v2.7.7
v2.7.6
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.12
v2.6.11
v2.6.10
v2.6.9
v2.7-beta1
Solcon-2020-01-06
v2.6.8
v2.6.7
v2.6.6
v2.6.5
v2.6.4
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.13
v2.5.12
v2.6-beta1
v2.5.11
v2.5.10
v2.5.9
v2.5.8
v2.5.7
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.9
v2.5-beta2
v2.4.8
v2.5-beta1
v2.4.7
v2.4.6
v2.4.5
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.7
v2.4-beta1
v2.3.6
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.3-beta2
v2.2.9
v2.3-beta1
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.6
v2.2-beta2
v2.1.5
v2.2-beta1
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.10
v2.1-beta1
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v2.0-beta3
v1.9.6
v1.9.5
v2.0-beta2
v1.9.4-r1
v1.9.3
v2.0-beta1
v1.9.2
v1.9.1
v1.9.0-r1
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.3
v1.7.2-r1
v1.7.1
v1.7.0
v1.6.3
v1.6.2-r1
v1.6.1-r1
1.6.1
v1.6.0
v1.5.2
v1.5.1
v1.5.0
v1.4.2
v1.4.1
v1.4.0
v1.3.2
v1.3.1
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.7-r1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3-r1
v1.0.3
1.0.0
Labels
Clear labels
beta
breaking change
complexity: high
complexity: low
complexity: medium
needs milestone
netbox
pending closure
plugin candidate
pull-request
severity: high
severity: low
severity: medium
status: accepted
status: backlog
status: blocked
status: duplicate
status: needs owner
status: needs triage
status: revisions needed
status: under review
topic: GraphQL
topic: Internationalization
topic: OpenAPI
topic: UI/UX
topic: cabling
topic: event rules
topic: htmx navigation
topic: industrialization
topic: migrations
topic: plugins
topic: scripts
topic: templating
topic: testing
type: bug
type: deprecation
type: documentation
type: feature
type: housekeeping
type: translation
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#8160
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Dominic-Walther on GitHub (Jun 4, 2023).
Originally assigned to: @arthanson on GitHub.
NetBox version
3.5.3
Python version
3.9
Steps to Reproduce
Expected Behavior
User can perform whatever actions they have permissions for
Observed Behavior
Permissions for non-superusers are broken.
Issue:
In commit
85e932bfc1#, a bug was introduced in the splitting of permission names. Specifically in theresolve_permission()function:By using
.rsplit()instead of.split()on for example modelBGP_PEwith permission"view_bgp_pe"results inaction="view_bgp"andmodel_name="pe", neither of which is valid.@abhi1693 commented on GitHub (Jun 4, 2023):
I dont think this qualifies as a bug in the core code. The commit you have mentioned is just refactored code. NetBox follows PEP8 conventions very strictly. I'd suggest to do the same in your plugin as well.
https://peps.python.org/pep-0008/#class-names
@Dominic-Walther commented on GitHub (Jun 4, 2023):
Refactors generally don't intend to change behaviour and nowhere in the "Plugins" documentation is this requirement mentioned.
So either it is a bug, or an error should be raised and the documentation needs updating. As it stands, this just leads to unexpected behaviour by failing silently.
@ubaumann commented on GitHub (Jun 5, 2023):
Hi @abhi1693 @jeremystretch
I understand your wish to close bug reports as fast as possible, but I would appreciate it if we could discuss further if this is a bug.
As it is an undocumented change in refactoring that could lead to breaking changes, I tend to classify it as a bug.
If this is not a bug, I agree with @Dominic-Walther that this should raise an error because otherwise, unexpected behaviour could lead to security issues, and this would not be classified as a bug and more like a vulnerability. The documentation should be updated and clarified.
@kkthxbye-code commented on GitHub (Jun 5, 2023):
How do you mean? The commits implementing object based permissions and the commit that you refer to as a refactor are all part of the same PR. Looking at the changes there was never a release of netbox with the code that you wish to restore, so not sure how this is a breaking change when it has never been released in the state you claim.
So it's not an undocumented change as far as I can tell, it's how object based permissions have always worked. If I misunderstood, please link the netbox release before and after the claimed undocumentated change.
That being said, it doesn't seem logical to use rsplit unless it is expected that the action can contain underscores, which I don't think is a valid expectation.
@ubaumann commented on GitHub (Jun 5, 2023):
My apologies. I did not check if the refactoring was in the same PR as the introduced feature. In this case, it is not a breaking change.
Still unexpected behavior, in my opinion, and it would be good to discuss it.
@DanSheps commented on GitHub (Jun 5, 2023):
I don't think this is a fixable problem, at least not without some not-so-insignificant code refactoring.
The issue is we are using rsplit() for this to handle bulk actions because the actions for "Bulk Edit", and "Bulk Delete", on devices for example, are:
bulk_edit_devicebulk_delete_deviceThis results in it being
device_bulk_edit. When evaluating permissions, you getbulk_editorbulk_deletefor the action, as you should.I can see where this goes off the rails if there is an underscore in the name. You could fix this if you switched to a regex with defined permission actions, however the issue is there is the option to have custom permissions actions assigned to objects and those are not accountable in using defined names.
@kkthxbye-code commented on GitHub (Jun 5, 2023):
Good catch, forgot about bulk actions. I guess a small note in the plugin docs stating that model names can't contain underscores would be the way to go then.
Luckily the object permissions have behaved this way since they were added, so only post-2.8 and pre-2.9 plugins can possible be affected, and since that's ages ago the actual issue here is probably not that common.
@Dominic-Walther commented on GitHub (Jun 5, 2023):
I'm not too fond of a name restriction since it invalidates otherwise valid Python code for what is effectively a stylistic choice and an oversight, but I'm not sure there is a clean path short of a rework and/or breaking changes either. The use of a token which is also a valid input is hard to fix retroactively given custom actions.
Sanitizing the class name could be a workaround as, since no models with underscores have ever worked properly, there is nothing to break, but I imagine that would require the sanitation to become a permanent feature even if a rework does eventually occur.
The model providing a sanitized name for itself through the Meta class could be an option, but would require proper warnings (if not provided where needed) as it's not an intuitive requirement.
@kkthxbye-code commented on GitHub (Jun 5, 2023):
I personally don't think any more time investment here is worth it, but if you can figure out a solution that doesn't break any existing plugins or permissions, you are free to submit a PR.
@DanSheps commented on GitHub (Jun 5, 2023):
We could keep it open, incase someone comes up with an option to do this without breaking the bulk actions (could be as simple as checking for the presence of "bulk" in the action and handling it accordinly).
Howver, I do think underscores in model names are a good thing to "ban", as a practice and maybe that is the way to resolve this issue is to "ban" it. As mentioned by @abhi1693, we follow PEP8:
According to PEP8, class names should be CapWords.
@DanSheps commented on GitHub (Jun 5, 2023):
@Dominic-Walther What plugin are you using, or is this an internal plugin?
@Dominic-Walther commented on GitHub (Jun 5, 2023):
It's not really public yet.
PEP8 is all well and good, but when dealing with long acronyms such as
MPLS L3 VPNit becomes hard to read in all-caps without demarcations (as PEP8 suggests) and unwieldy when spelled out. Granted, it's a niche case, but one for which I'm happy to break with convention.@jeremystretch commented on GitHub (Jun 14, 2023):
To summarize the above, it's not possible to accommodate the proposal because Django convention dictates that an underscore is used to separate the permission action (which may be custom) from the model name. For example, a permission named
myplugin.foo_x_barCould indicate the
foo_xaction for a model namedBar, or thefooaction for a model namedX_Bar. AFAICT, the Django documentation does not address this conflict (likely because it's an exceedingly rare circumstance).This would not suffice as plugin models can introduce their own custom actions, which would be impossible to predict.