Add ALLOWED_URL_SCHEMES

This commit is contained in:
jeremystretch 2021-10-26 10:24:33 -04:00
parent 7c0f32e8ee
commit 559dc2f865
6 changed files with 26 additions and 16 deletions

View File

@ -16,11 +16,9 @@ class ConfigRevisionAdmin(admin.ModelAdmin):
('IPAM', { ('IPAM', {
'fields': ('ENFORCE_GLOBAL_UNIQUE', 'PREFER_IPV4'), 'fields': ('ENFORCE_GLOBAL_UNIQUE', 'PREFER_IPV4'),
}), }),
# ('Security', { ('Security', {
# 'fields': ( 'fields': ('ALLOWED_URL_SCHEMES',),
# 'ALLOWED_URL_SCHEMES', 'EXEMPT_VIEW_PERMISSIONS', }),
# ),
# }),
('Banners', { ('Banners', {
'fields': ('BANNER_LOGIN', 'BANNER_TOP', 'BANNER_BOTTOM'), 'fields': ('BANNER_LOGIN', 'BANNER_TOP', 'BANNER_BOTTOM'),
}), }),

View File

@ -1,4 +1,5 @@
from django import forms from django import forms
from django.contrib.postgres.forms import SimpleArrayField
class OptionalBooleanSelect(forms.Select): class OptionalBooleanSelect(forms.Select):
@ -68,4 +69,17 @@ PARAMS = (
field=forms.IntegerField field=forms.IntegerField
), ),
# Security
ConfigParam(
name='ALLOWED_URL_SCHEMES',
label='Allowed URL schemes',
default=(
'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc',
'xmpp',
),
description="Permitted schemes for URLs in user-provided content",
field=SimpleArrayField,
field_kwargs={'base_field': forms.CharField()}
),
) )

View File

@ -72,11 +72,6 @@ ADMINS = [
# ('John Doe', 'jdoe@example.com'), # ('John Doe', 'jdoe@example.com'),
] ]
# URL schemes that are allowed within links in NetBox
ALLOWED_URL_SCHEMES = (
'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp',
)
# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set: # Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
# BASE_PATH = 'netbox/' # BASE_PATH = 'netbox/'
BASE_PATH = '' BASE_PATH = ''

View File

@ -122,9 +122,6 @@ for param in PARAMS:
if hasattr(configuration, param.name): if hasattr(configuration, param.name):
globals()[param.name] = getattr(configuration, param.name) globals()[param.name] = getattr(configuration, param.name)
ALLOWED_URL_SCHEMES = getattr(configuration, 'ALLOWED_URL_SCHEMES', (
'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp',
))
CHANGELOG_RETENTION = getattr(configuration, 'CHANGELOG_RETENTION', 90) CHANGELOG_RETENTION = getattr(configuration, 'CHANGELOG_RETENTION', 90)
EXEMPT_VIEW_PERMISSIONS = getattr(configuration, 'EXEMPT_VIEW_PERMISSIONS', []) EXEMPT_VIEW_PERMISSIONS = getattr(configuration, 'EXEMPT_VIEW_PERMISSIONS', [])
GRAPHQL_ENABLED = getattr(configuration, 'GRAPHQL_ENABLED', True) GRAPHQL_ENABLED = getattr(configuration, 'GRAPHQL_ENABLED', True)

View File

@ -14,6 +14,7 @@ from django.utils.html import strip_tags
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from markdown import markdown from markdown import markdown
from netbox.config import Config
from utilities.forms import get_selected_values, TableConfigForm from utilities.forms import get_selected_values, TableConfigForm
from utilities.utils import foreground_color from utilities.utils import foreground_color
@ -44,7 +45,7 @@ def render_markdown(value):
value = strip_tags(value) value = strip_tags(value)
# Sanitize Markdown links # Sanitize Markdown links
schemes = '|'.join(settings.ALLOWED_URL_SCHEMES) schemes = '|'.join(Config().ALLOWED_URL_SCHEMES)
pattern = fr'\[(.+)\]\((?!({schemes})).*:(.+)\)' pattern = fr'\[(.+)\]\((?!({schemes})).*:(.+)\)'
value = re.sub(pattern, '[\\1](\\3)', value, flags=re.IGNORECASE) value = re.sub(pattern, '[\\1](\\3)', value, flags=re.IGNORECASE)

View File

@ -1,9 +1,10 @@
import re import re
from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import _lazy_re_compile, BaseValidator, URLValidator from django.core.validators import _lazy_re_compile, BaseValidator, URLValidator
from netbox.config import Config
class EnhancedURLValidator(URLValidator): class EnhancedURLValidator(URLValidator):
""" """
@ -19,7 +20,11 @@ class EnhancedURLValidator(URLValidator):
r'(?::\d{2,5})?' # Port number r'(?::\d{2,5})?' # Port number
r'(?:[/?#][^\s]*)?' # Path r'(?:[/?#][^\s]*)?' # Path
r'\Z', re.IGNORECASE) r'\Z', re.IGNORECASE)
schemes = settings.ALLOWED_URL_SCHEMES
def __init__(self, schemes=None, **kwargs):
super().__init__(**kwargs)
if schemes is not None:
self.schemes = Config().ALLOWED_URL_SCHEMES
class ExclusionValidator(BaseValidator): class ExclusionValidator(BaseValidator):