From 759593626070117930e72df7b0ee12fcaef9733d Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Wed, 9 May 2018 22:13:04 +0200 Subject: [PATCH] See #75: added a preference do enable/disable the subsonic API on the instance level --- api/config/settings/common.py | 1 + .../subsonic/dynamic_preferences_registry.py | 22 +++++++++++++++++++ api/funkwhale_api/subsonic/views.py | 11 ++++++++++ front/src/store/instance.js | 5 +++++ 4 files changed, 39 insertions(+) create mode 100644 api/funkwhale_api/subsonic/dynamic_preferences_registry.py diff --git a/api/config/settings/common.py b/api/config/settings/common.py index f88aa5dd5..5fed9f25e 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -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 diff --git a/api/funkwhale_api/subsonic/dynamic_preferences_registry.py b/api/funkwhale_api/subsonic/dynamic_preferences_registry.py new file mode 100644 index 000000000..93482702f --- /dev/null +++ b/api/funkwhale_api/subsonic/dynamic_preferences_registry.py @@ -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.' + ) diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index 252afe81a..475e61aa7 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -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 diff --git a/front/src/store/instance.js b/front/src/store/instance.js index 245acaf03..e78e80489 100644 --- a/front/src/store/instance.js +++ b/front/src/store/instance.js @@ -24,6 +24,11 @@ export default { value: true } }, + subsonic: { + enabled: { + value: true + } + }, raven: { front_enabled: { value: false