See #75: added a preference do enable/disable the subsonic API on the instance level
This commit is contained in:
parent
632aca5153
commit
7595936260
|
@ -133,6 +133,7 @@ LOCAL_APPS = (
|
|||
'funkwhale_api.providers.audiofile',
|
||||
'funkwhale_api.providers.youtube',
|
||||
'funkwhale_api.providers.acoustid',
|
||||
'funkwhale_api.subsonic',
|
||||
)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
from dynamic_preferences import types
|
||||
from dynamic_preferences.registries import global_preferences_registry
|
||||
|
||||
from funkwhale_api.common import preferences
|
||||
|
||||
subsonic = types.Section('subsonic')
|
||||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class APIAutenticationRequired(types.BooleanPreference):
|
||||
section = subsonic
|
||||
show_in_api = True
|
||||
name = 'enabled'
|
||||
default = True
|
||||
verbose_name = 'Enabled Subsonic API'
|
||||
help_text = (
|
||||
'Funkwhale supports a subset of the Subsonic API, that makes '
|
||||
'it compatible with existing clients such as DSub for Android '
|
||||
'or Clementine for desktop. However, Subsonic protocol is less '
|
||||
'than ideal in terms of security and you can disable this feature '
|
||||
'completely using this flag.'
|
||||
)
|
|
@ -4,11 +4,13 @@ from django.utils import timezone
|
|||
|
||||
from rest_framework import exceptions
|
||||
from rest_framework import permissions as rest_permissions
|
||||
from rest_framework import renderers
|
||||
from rest_framework import response
|
||||
from rest_framework import viewsets
|
||||
from rest_framework.decorators import list_route
|
||||
from rest_framework.serializers import ValidationError
|
||||
|
||||
from funkwhale_api.common import preferences
|
||||
from funkwhale_api.favorites.models import TrackFavorite
|
||||
from funkwhale_api.music import models as music_models
|
||||
from funkwhale_api.music import utils
|
||||
|
@ -61,6 +63,15 @@ class SubsonicViewSet(viewsets.GenericViewSet):
|
|||
authentication_classes = [authentication.SubsonicAuthentication]
|
||||
permissions_classes = [rest_permissions.IsAuthenticated]
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not preferences.get('subsonic__enabled'):
|
||||
r = response.Response({}, status=405)
|
||||
r.accepted_renderer = renderers.JSONRenderer()
|
||||
r.accepted_media_type = 'application/json'
|
||||
r.renderer_context = {}
|
||||
return r
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def handle_exception(self, exc):
|
||||
# subsonic API sends 200 status code with custom error
|
||||
# codes in the payload
|
||||
|
|
|
@ -24,6 +24,11 @@ export default {
|
|||
value: true
|
||||
}
|
||||
},
|
||||
subsonic: {
|
||||
enabled: {
|
||||
value: true
|
||||
}
|
||||
},
|
||||
raven: {
|
||||
front_enabled: {
|
||||
value: false
|
||||
|
|
Loading…
Reference in New Issue