From 3dd1a20b68f5fc89d2381ffee6e97df0836f5aa1 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 12:20:42 +0100 Subject: [PATCH 1/9] Fix #58: enabling registrations is now done via a preference --- api/funkwhale_api/users/adapters.py | 11 +++-------- .../users/dynamic_preferences_registry.py | 15 +++++++++++++++ api/tests/users/test_views.py | 8 ++++---- 3 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 api/funkwhale_api/users/dynamic_preferences_registry.py diff --git a/api/funkwhale_api/users/adapters.py b/api/funkwhale_api/users/adapters.py index 792b4860f..96d1b8b1d 100644 --- a/api/funkwhale_api/users/adapters.py +++ b/api/funkwhale_api/users/adapters.py @@ -1,15 +1,10 @@ from allauth.account.adapter import DefaultAccountAdapter -from django.conf import settings +from dynamic_preferences.registries import global_preferences_registry class FunkwhaleAccountAdapter(DefaultAccountAdapter): def is_open_for_signup(self, request): - - if settings.REGISTRATION_MODE == "disabled": - return False - if settings.REGISTRATION_MODE == "public": - return True - - return False + manager = global_preferences_registry.manager() + return manager['users__registration_enabled'] diff --git a/api/funkwhale_api/users/dynamic_preferences_registry.py b/api/funkwhale_api/users/dynamic_preferences_registry.py new file mode 100644 index 000000000..16d79da14 --- /dev/null +++ b/api/funkwhale_api/users/dynamic_preferences_registry.py @@ -0,0 +1,15 @@ +from dynamic_preferences import types +from dynamic_preferences.registries import global_preferences_registry + +users = types.Section('users') + + +@global_preferences_registry.register +class RegistrationEnabled(types.BooleanPreference): + show_in_api = True + section = users + name = 'registration_enabled' + default = False + verbose_name = ( + 'Can visitors open a new account on this instance?' + ) diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py index 1eb8ef222..569acbd15 100644 --- a/api/tests/users/test_views.py +++ b/api/tests/users/test_views.py @@ -6,7 +6,7 @@ from django.urls import reverse from funkwhale_api.users.models import User -def test_can_create_user_via_api(settings, client, db): +def test_can_create_user_via_api(preferences, client, db): url = reverse('rest_register') data = { 'username': 'test1', @@ -14,7 +14,7 @@ def test_can_create_user_via_api(settings, client, db): 'password1': 'testtest', 'password2': 'testtest', } - settings.REGISTRATION_MODE = "public" + preferences['users__registration_enabled'] = True response = client.post(url, data) assert response.status_code == 201 @@ -22,7 +22,7 @@ def test_can_create_user_via_api(settings, client, db): assert u.username == 'test1' -def test_can_disable_registration_view(settings, client, db): +def test_can_disable_registration_view(preferences, client, db): url = reverse('rest_register') data = { 'username': 'test1', @@ -30,7 +30,7 @@ def test_can_disable_registration_view(settings, client, db): 'password1': 'testtest', 'password2': 'testtest', } - settings.REGISTRATION_MODE = "disabled" + preferences['users__registration_enabled'] = False response = client.post(url, data) assert response.status_code == 403 From d1b5895b784a9952a017a1fe4faaa29e0b2e1217 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 12:21:02 +0100 Subject: [PATCH 2/9] Removed now useless REGISTRATION_MODE setting --- api/config/settings/common.py | 1 - deploy/env.prod.sample | 5 ----- 2 files changed, 6 deletions(-) diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 5fe55e53a..927e754d0 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -317,7 +317,6 @@ CORS_ORIGIN_ALLOW_ALL = True # ) CORS_ALLOW_CREDENTIALS = True API_AUTHENTICATION_REQUIRED = env.bool("API_AUTHENTICATION_REQUIRED", True) -REGISTRATION_MODE = env('REGISTRATION_MODE', default='disabled') REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', diff --git a/deploy/env.prod.sample b/deploy/env.prod.sample index 5bdfeb9c6..6a4b15b67 100644 --- a/deploy/env.prod.sample +++ b/deploy/env.prod.sample @@ -74,11 +74,6 @@ DJANGO_SECRET_KEY= # If True, unauthenticated users won't be able to query the API API_AUTHENTICATION_REQUIRED=True -# What is the workflow for registration on funkwhale ? Possible values: -# public: anybody can register an account -# disabled: nobody can register an account -REGISTRATION_MODE=disabled - # Sentry/Raven error reporting (server side) # Enable Raven if you want to help improve funkwhale by # automatically sending error reports our Sentry instance. From a91670f379430b160205f25181ee5e244060d7f4 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 12:21:56 +0100 Subject: [PATCH 3/9] Changelog for #58 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 07d1dedbd..d5311057a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,7 @@ Changelog - Front: Now reset player colors when track has no cover (#46) - Front: play button now disabled for unplayable tracks +- API: You can now enable or disable registration on the fly, via a preference (#58) Transcoding: From a14e0acbe9cdcf1dc2004988b07de8ffed845b0d Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 14:05:27 +0100 Subject: [PATCH 4/9] Correct path for rest auth urls --- api/config/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/config/urls.py b/api/config/urls.py index de67ebb57..8f7e37bc2 100644 --- a/api/config/urls.py +++ b/api/config/urls.py @@ -13,8 +13,8 @@ urlpatterns = [ url(settings.ADMIN_URL, admin.site.urls), url(r'^api/', include(("config.api_urls", 'api'), namespace="api")), - url(r'^api/auth/', include('rest_auth.urls')), - url(r'^api/auth/registration/', include('funkwhale_api.users.rest_auth_urls')), + url(r'^api/v1/auth/', include('rest_auth.urls')), + url(r'^api/v1/auth/registration/', include('funkwhale_api.users.rest_auth_urls')), url(r'^accounts/', include('allauth.urls')), # Your stuff: custom urls includes go here From 0ed3f68305da35d54a4dbf929b87bc5b8436a4c0 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 14:27:50 +0100 Subject: [PATCH 5/9] Allow login with email or username --- api/config/settings/common.py | 2 +- front/src/components/auth/Login.vue | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 927e754d0..491babdd1 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -264,7 +264,7 @@ AUTHENTICATION_BACKENDS = ( ) # Some really nice defaults -ACCOUNT_AUTHENTICATION_METHOD = 'username' +ACCOUNT_AUTHENTICATION_METHOD = 'username_email' ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_EMAIL_VERIFICATION = 'mandatory' diff --git a/front/src/components/auth/Login.vue b/front/src/components/auth/Login.vue index 99b439af8..b02a3ed07 100644 --- a/front/src/components/auth/Login.vue +++ b/front/src/components/auth/Login.vue @@ -12,13 +12,13 @@
- +
From 55b38a3f6e2a126362fdc58e93c6a9acdbf045f5 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 14:28:48 +0100 Subject: [PATCH 6/9] Fixed broken error handling on user login and settings --- front/src/components/auth/Login.vue | 6 +++--- front/src/components/auth/Settings.vue | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/front/src/components/auth/Login.vue b/front/src/components/auth/Login.vue index b02a3ed07..f84ad9295 100644 --- a/front/src/components/auth/Login.vue +++ b/front/src/components/auth/Login.vue @@ -73,9 +73,9 @@ export default { // to properly make use of http in the auth service this.$store.dispatch('auth/login', { credentials, - next: this.next, - onError: response => { - if (response.status === 400) { + next: '/library', + onError: error => { + if (error.response.status === 400) { self.error = 'invalid_credentials' } else { self.error = 'unknown_error' diff --git a/front/src/components/auth/Settings.vue b/front/src/components/auth/Settings.vue index f090581ef..4e8f33289 100644 --- a/front/src/components/auth/Settings.vue +++ b/front/src/components/auth/Settings.vue @@ -37,7 +37,6 @@ + + + diff --git a/front/src/router/index.js b/front/src/router/index.js index ea8854bbe..c1d03e059 100644 --- a/front/src/router/index.js +++ b/front/src/router/index.js @@ -3,6 +3,7 @@ import Router from 'vue-router' import PageNotFound from '@/components/PageNotFound' import Home from '@/components/Home' import Login from '@/components/auth/Login' +import Signup from '@/components/auth/Signup' import Profile from '@/components/auth/Profile' import Settings from '@/components/auth/Settings' import Logout from '@/components/auth/Logout' @@ -38,6 +39,11 @@ export default new Router({ component: Login, props: (route) => ({ next: route.query.next || '/library' }) }, + { + path: '/signup', + name: 'signup', + component: Signup + }, { path: '/logout', name: 'logout', diff --git a/front/src/store/instance.js b/front/src/store/instance.js index a0071f096..dd20a8b1d 100644 --- a/front/src/store/instance.js +++ b/front/src/store/instance.js @@ -6,6 +6,11 @@ export default { namespaced: true, state: { settings: { + users: { + registration_enabled: { + value: true + } + }, raven: { front_enabled: { value: false @@ -23,7 +28,7 @@ export default { }, actions: { // Send a request to the login URL and save the returned JWT - fetchSettings ({commit}) { + fetchSettings ({commit}, {callback}) { return axios.get('instance/settings/').then(response => { logger.default.info('Successfully fetched instance settings') let sections = {} @@ -34,6 +39,9 @@ export default { sections[e.section][e.name] = e }) commit('settings', sections) + if (callback) { + callback() + } }, response => { logger.default.error('Error while fetching settings', response.data) }) From ea4d8b1010f964dc189755a037d2e77b47bb05c0 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 14:40:55 +0100 Subject: [PATCH 8/9] Changelog --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index d5311057a..d010c076e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -8,6 +8,9 @@ Changelog - Front: Now reset player colors when track has no cover (#46) - Front: play button now disabled for unplayable tracks - API: You can now enable or disable registration on the fly, via a preference (#58) +- Front: can now signup via the web interface (#35) +- Front: Fixed broken redirection on login +- Front: Fixed broken error handling on settings and login form Transcoding: From f398d40ecc9a85b6b7822ad1b81d6f3c42cdb479 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 24 Feb 2018 14:55:08 +0100 Subject: [PATCH 9/9] Fixed failing test --- front/src/store/instance.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/front/src/store/instance.js b/front/src/store/instance.js index dd20a8b1d..80003db0d 100644 --- a/front/src/store/instance.js +++ b/front/src/store/instance.js @@ -28,7 +28,7 @@ export default { }, actions: { // Send a request to the login URL and save the returned JWT - fetchSettings ({commit}, {callback}) { + fetchSettings ({commit}, payload) { return axios.get('instance/settings/').then(response => { logger.default.info('Successfully fetched instance settings') let sections = {} @@ -39,7 +39,7 @@ export default { sections[e.section][e.name] = e }) commit('settings', sections) - if (callback) { + if (payload && payload.callback) { callback() } }, response => {