mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-13 07:12:16 -06:00
Compare commits
5 Commits
21097-grap
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e14934e5a5 | ||
|
|
ae03723e43 | ||
|
|
c0f79df91f | ||
|
|
edbfd0bae6 | ||
|
|
c11f4b3716 |
16
.github/ISSUE_TEMPLATE/06-deprecation.yaml
vendored
16
.github/ISSUE_TEMPLATE/06-deprecation.yaml
vendored
@@ -1,20 +1,26 @@
|
||||
---
|
||||
name: 🗑️ Deprecation
|
||||
name: ⚠️ Deprecation
|
||||
type: Deprecation
|
||||
description: The removal of an existing feature or resource
|
||||
description: Designation of a feature or behavior that will be removed in a future release
|
||||
labels: ["netbox", "type: deprecation"]
|
||||
body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Proposed Changes
|
||||
label: Deprecated Functionality
|
||||
description: >
|
||||
Describe in detail the proposed changes. What is being removed?
|
||||
Describe the feature(s) and/or behavior that is being flagged for deprecation.
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Scheduled removal
|
||||
description: In what future release will the deprecated functionality be removed?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Justification
|
||||
description: Please provide justification for the proposed change(s).
|
||||
description: Please provide justification for the deprecation.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
||||
20
.github/ISSUE_TEMPLATE/07-feature_removal.yaml
vendored
Normal file
20
.github/ISSUE_TEMPLATE/07-feature_removal.yaml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: 🗑️ Feature Removal
|
||||
type: Removal
|
||||
description: The removal of a deprecated feature or resource
|
||||
labels: ["netbox", "type: removal"]
|
||||
body:
|
||||
- type: input
|
||||
attributes:
|
||||
label: Deprecation Issue
|
||||
description: Specify the issue in which this deprecation was announced.
|
||||
placeholder: "#1234"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Summary of Changes
|
||||
description: >
|
||||
List all changes necessary to remove the deprecated feature or resource.
|
||||
validations:
|
||||
required: true
|
||||
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING
|
||||
|
||||
import strawberry_django
|
||||
from strawberry import ID
|
||||
from strawberry_django import ComparisonFilterLookup, FilterLookup
|
||||
from strawberry_django import FilterLookup
|
||||
|
||||
from core.graphql.filter_mixins import ChangeLoggingMixin
|
||||
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, JournalEntriesFilterMixin, TagsFilterMixin
|
||||
@@ -23,7 +23,7 @@ __all__ = (
|
||||
|
||||
@dataclass
|
||||
class BaseModelFilter:
|
||||
id: ComparisonFilterLookup[ID] | None = strawberry_django.filter_field()
|
||||
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
||||
|
||||
|
||||
class ChangeLoggedModelFilter(ChangeLoggingMixin, BaseModelFilter):
|
||||
|
||||
@@ -232,7 +232,7 @@ VPN_MENU = Menu(
|
||||
label=_('L2VPNs'),
|
||||
items=(
|
||||
get_model_item('vpn', 'l2vpn', _('L2VPNs')),
|
||||
get_model_item('vpn', 'l2vpntermination', _('Terminations')),
|
||||
get_model_item('vpn', 'l2vpntermination', _('L2VPN Terminations')),
|
||||
),
|
||||
),
|
||||
MenuGroup(
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-01-08 05:04+0000\n"
|
||||
"POT-Creation-Date: 2026-01-13 05:05+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -1822,7 +1822,6 @@ msgid "ASN Count"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/tables/virtual_circuits.py:64
|
||||
#: netbox/netbox/navigation/menu.py:235
|
||||
#: netbox/templates/circuits/virtualcircuit.html:87
|
||||
#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:72
|
||||
#: netbox/vpn/tables/tunnels.py:59
|
||||
@@ -12190,6 +12189,10 @@ msgstr ""
|
||||
msgid "L2VPNs"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/netbox/navigation/menu.py:235
|
||||
msgid "L2VPN Terminations"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/netbox/navigation/menu.py:241
|
||||
msgid "IKE Proposals"
|
||||
msgstr ""
|
||||
@@ -15938,7 +15941,7 @@ msgstr ""
|
||||
#: netbox/users/forms/model_forms.py:126
|
||||
msgid ""
|
||||
"Tokens must be at least 40 characters in length. <strong>Be sure to record "
|
||||
"your key</strong> prior to submitting this form, as it will no longer be "
|
||||
"your token</strong> prior to submitting this form, as it will no longer be "
|
||||
"accessible once the token has been created."
|
||||
msgstr ""
|
||||
|
||||
@@ -16077,7 +16080,7 @@ msgid "write enabled"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/models/tokens.py:72
|
||||
msgid "Permit create/update/delete operations using this key"
|
||||
msgid "Permit create/update/delete operations using this token"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/models/tokens.py:76
|
||||
@@ -16126,12 +16129,16 @@ msgstr ""
|
||||
msgid "tokens"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/models/tokens.py:219
|
||||
#: netbox/users/models/tokens.py:217
|
||||
msgid "Unable to save v2 tokens: API_TOKEN_PEPPERS is not defined."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/models/tokens.py:222
|
||||
#, python-brace-format
|
||||
msgid "Invalid pepper ID: {id}. Check configured API_TOKEN_PEPPERS."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/models/tokens.py:232
|
||||
#: netbox/users/models/tokens.py:235
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Expiration time must be in the future. Current server time is {current_time} "
|
||||
|
||||
@@ -123,7 +123,7 @@ class UserTokenForm(forms.ModelForm):
|
||||
token = forms.CharField(
|
||||
label=_('Token'),
|
||||
help_text=_(
|
||||
'Tokens must be at least 40 characters in length. <strong>Be sure to record your key</strong> prior to '
|
||||
'Tokens must be at least 40 characters in length. <strong>Be sure to record your token</strong> prior to '
|
||||
'submitting this form, as it will no longer be accessible once the token has been created.'
|
||||
),
|
||||
widget=forms.TextInput(
|
||||
|
||||
@@ -69,7 +69,7 @@ class Token(models.Model):
|
||||
write_enabled = models.BooleanField(
|
||||
verbose_name=_('write enabled'),
|
||||
default=True,
|
||||
help_text=_('Permit create/update/delete operations using this key')
|
||||
help_text=_('Permit create/update/delete operations using this token')
|
||||
)
|
||||
# For legacy v1 tokens, this field stores the plaintext 40-char token value. Not used for v2.
|
||||
plaintext = models.CharField(
|
||||
@@ -213,6 +213,9 @@ class Token(models.Model):
|
||||
def clean(self):
|
||||
super().clean()
|
||||
|
||||
if self.version == TokenVersionChoices.V2 and not settings.API_TOKEN_PEPPERS:
|
||||
raise ValidationError(_("Unable to save v2 tokens: API_TOKEN_PEPPERS is not defined."))
|
||||
|
||||
if self._state.adding:
|
||||
if self.pepper_id is not None and self.pepper_id not in settings.API_TOKEN_PEPPERS:
|
||||
raise ValidationError(_(
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
from datetime import timedelta
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.test import TestCase
|
||||
from django.test import TestCase, override_settings
|
||||
from django.utils import timezone
|
||||
|
||||
from users.choices import TokenVersionChoices
|
||||
from users.models import User, Token
|
||||
from utilities.testing import create_test_user
|
||||
|
||||
@@ -94,6 +95,15 @@ class TokenTest(TestCase):
|
||||
token.refresh_from_db()
|
||||
self.assertEqual(token.description, 'New Description')
|
||||
|
||||
@override_settings(API_TOKEN_PEPPERS={})
|
||||
def test_v2_without_peppers_configured(self):
|
||||
"""
|
||||
Attempting to save a v2 token without API_TOKEN_PEPPERS defined should raise a ValidationError.
|
||||
"""
|
||||
token = Token(version=TokenVersionChoices.V2)
|
||||
with self.assertRaises(ValidationError):
|
||||
token.clean()
|
||||
|
||||
|
||||
class UserConfigTest(TestCase):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user