mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-17 13:08:16 -06:00
Remove betteradminfield
Move IP verification to authenticate()
This commit is contained in:
parent
a4cd082c39
commit
d3774801c4
@ -113,7 +113,3 @@ svgwrite
|
|||||||
# Tabular dataset library (for table-based exports)
|
# Tabular dataset library (for table-based exports)
|
||||||
# https://github.com/jazzband/tablib
|
# https://github.com/jazzband/tablib
|
||||||
tablib
|
tablib
|
||||||
|
|
||||||
# It changes comma separated widget to list based in admin panel
|
|
||||||
# https://github.com/gradam/django-better-admin-arrayfield
|
|
||||||
django_better_admin_arrayfield
|
|
||||||
|
@ -10,11 +10,24 @@ class TokenAuthentication(authentication.TokenAuthentication):
|
|||||||
A custom authentication scheme which enforces Token expiration times.
|
A custom authentication scheme which enforces Token expiration times.
|
||||||
"""
|
"""
|
||||||
model = Token
|
model = Token
|
||||||
__request = False
|
|
||||||
|
|
||||||
def authenticate(self, request):
|
def authenticate(self, request):
|
||||||
self.request = request
|
token_user, token = super().authenticate(request)
|
||||||
return super().authenticate(request)
|
|
||||||
|
# Verify source IP is allowed
|
||||||
|
if token.allowed_ips:
|
||||||
|
# Replace 'HTTP_X_REAL_IP' with the settings variable choosen in #8867
|
||||||
|
if 'HTTP_X_REAL_IP' in request.META:
|
||||||
|
clientip = request.META['HTTP_X_REAL_IP'].split(",")[0].strip()
|
||||||
|
elif 'REMOTE_ADDR' in request.META:
|
||||||
|
clientip = request.META['REMOTE_ADDR']
|
||||||
|
else:
|
||||||
|
raise exceptions.AuthenticationFailed(f"A HTTP header containing the SourceIP (HTTP_X_REAL_IP, REMOTE_ADDR) is missing from the request.")
|
||||||
|
|
||||||
|
if not token.validate_client_ip(clientip):
|
||||||
|
raise exceptions.AuthenticationFailed(f"Source IP {clientip} is not allowed to use this token.")
|
||||||
|
|
||||||
|
return token_user, token
|
||||||
|
|
||||||
def authenticate_credentials(self, key):
|
def authenticate_credentials(self, key):
|
||||||
model = self.get_model()
|
model = self.get_model()
|
||||||
@ -23,20 +36,6 @@ class TokenAuthentication(authentication.TokenAuthentication):
|
|||||||
except model.DoesNotExist:
|
except model.DoesNotExist:
|
||||||
raise exceptions.AuthenticationFailed("Invalid token")
|
raise exceptions.AuthenticationFailed("Invalid token")
|
||||||
|
|
||||||
# Verify source IP is allowed
|
|
||||||
request = self.request
|
|
||||||
if token.allowed_ips and request:
|
|
||||||
# Replace 'HTTP_X_REAL_IP' with the settings variable choosen in #8867
|
|
||||||
if 'HTTP_X_REAL_IP' in request.META:
|
|
||||||
clientip = request.META['HTTP_X_REAL_IP'].split(",")[0].strip()
|
|
||||||
elif 'REMOTE_ADDR' in request.META:
|
|
||||||
clientip = request.META['REMOTE_ADDR']
|
|
||||||
else:
|
|
||||||
raise exceptions.AuthenticationFailed(f"The request HTTP headers (HTTP_X_REAL_IP, REMOTE_ADDR) are missing or do not contain a valid source IP.")
|
|
||||||
|
|
||||||
if not token.validate_client_ip(clientip):
|
|
||||||
raise exceptions.AuthenticationFailed(f"Source IP {clientip} is not allowed to use this token.")
|
|
||||||
|
|
||||||
# Enforce the Token's expiration time, if one has been set.
|
# Enforce the Token's expiration time, if one has been set.
|
||||||
if token.is_expired:
|
if token.is_expired:
|
||||||
raise exceptions.AuthenticationFailed("Token expired")
|
raise exceptions.AuthenticationFailed("Token expired")
|
||||||
|
@ -321,7 +321,6 @@ INSTALLED_APPS = [
|
|||||||
'wireless',
|
'wireless',
|
||||||
'django_rq', # Must come after extras to allow overriding management commands
|
'django_rq', # Must come after extras to allow overriding management commands
|
||||||
'drf_yasg',
|
'drf_yasg',
|
||||||
'django_better_admin_arrayfield',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Middleware
|
# Middleware
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib.auth.admin import UserAdmin as UserAdmin_
|
from django.contrib.auth.admin import UserAdmin as UserAdmin_
|
||||||
from django.contrib.auth.models import Group, User
|
from django.contrib.auth.models import Group, User
|
||||||
from django_better_admin_arrayfield.admin.mixins import DynamicArrayMixin
|
|
||||||
|
|
||||||
from users.models import ObjectPermission, Token
|
from users.models import ObjectPermission, Token
|
||||||
from . import filters, forms, inlines
|
from . import filters, forms, inlines
|
||||||
@ -56,7 +55,7 @@ class UserAdmin(UserAdmin_):
|
|||||||
#
|
#
|
||||||
|
|
||||||
@admin.register(Token)
|
@admin.register(Token)
|
||||||
class TokenAdmin(admin.ModelAdmin, DynamicArrayMixin):
|
class TokenAdmin(admin.ModelAdmin):
|
||||||
form = forms.TokenAdminForm
|
form = forms.TokenAdminForm
|
||||||
list_display = [
|
list_display = [
|
||||||
'key', 'user', 'created', 'expires', 'write_enabled', 'description', 'list_allowed_ips'
|
'key', 'user', 'created', 'expires', 'write_enabled', 'description', 'list_allowed_ips'
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Generated by Django 3.2.12 on 2022-03-15 13:08
|
# Generated by Django 3.2.12 on 2022-03-18 08:25
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
from django.db import migrations
|
from django.db import migrations
|
||||||
import django_better_admin_arrayfield.models.fields
|
|
||||||
import ipam.fields
|
import ipam.fields
|
||||||
|
|
||||||
|
|
||||||
@ -15,6 +15,6 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='token',
|
model_name='token',
|
||||||
name='allowed_ips',
|
name='allowed_ips',
|
||||||
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=ipam.fields.IPNetworkField(), blank=True, null=True, size=None),
|
field=django.contrib.postgres.fields.ArrayField(base_field=ipam.fields.IPNetworkField(), blank=True, null=True, size=None),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -10,7 +10,6 @@ from django.db import models
|
|||||||
from django.db.models.signals import post_save
|
from django.db.models.signals import post_save
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django_better_admin_arrayfield.models.fields import ArrayField as betterArrayField
|
|
||||||
|
|
||||||
from netbox.models import BigIDModel
|
from netbox.models import BigIDModel
|
||||||
from ipam.fields import IPNetworkField
|
from ipam.fields import IPNetworkField
|
||||||
@ -208,7 +207,7 @@ class Token(BigIDModel):
|
|||||||
max_length=200,
|
max_length=200,
|
||||||
blank=True
|
blank=True
|
||||||
)
|
)
|
||||||
allowed_ips = betterArrayField(
|
allowed_ips = ArrayField(
|
||||||
base_field=IPNetworkField(),
|
base_field=IPNetworkField(),
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
|
Loading…
Reference in New Issue
Block a user