diff --git a/seahub/urls.py b/seahub/urls.py index 30214e6d655..e0522e6adc8 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -4,6 +4,7 @@ from seahub.auth.views import multi_adfs_sso from seahub.views import * +from seahub.views.mobile import mobile_login from seahub.views.sysadmin import * from seahub.views.ajax import * from seahub.views.sso import * @@ -206,6 +207,7 @@ urlpatterns = [ path('accounts/', include('seahub.base.registration_urls')), + path('mobile-login/', mobile_login, name="mobile_login"), path('sso/', sso, name='sso'), path('multi_adfs_sso/', multi_adfs_sso, name='multi_adfs_sso'), diff --git a/seahub/views/mobile.py b/seahub/views/mobile.py new file mode 100644 index 00000000000..c175842a70c --- /dev/null +++ b/seahub/views/mobile.py @@ -0,0 +1,44 @@ +from django.http import HttpResponseRedirect +from django.utils.translation import gettext as _ + +from seahub.utils import render_error +from seahub.settings import SITE_ROOT +from seahub.api2.models import Token, TokenV2 +from seahub.auth import REDIRECT_FIELD_NAME, login +from seahub.base.accounts import User, AuthBackend + + +def mobile_login(request): + + """ + Login user via seahub web api auth token + """ + + auth = request.headers.get('authorization', '').split() + if not auth or auth[0].lower() != 'token': + return render_error(request, 'token invalid.') + + key = auth[1] + try: + token = Token.objects.get(key=key) + except Token.DoesNotExist: + try: + token = TokenV2.objects.get(key=key) + except TokenV2.DoesNotExist: + return render_error(request, 'token invalid.') + + try: + user = User.objects.get(email=token.user) + except User.DoesNotExist: + error_msg = _(f'User {token.user} not found.') + return render_error(request, error_msg) + + if not user.is_active: + error_msg = _(f'User {token.user} inactive.') + return render_error(request, error_msg) + + user.backend = AuthBackend.__module__ + ".AuthBackend" + login(request, user) + + redirect_to = request.GET.get(REDIRECT_FIELD_NAME, SITE_ROOT) + return HttpResponseRedirect(redirect_to)