X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/7b554fbe7a0a6d553f1928b6a144110773da1975..6b22f44c53cf0d72a7b2b068f51cae01e1129e23:/forum/views/auth.py diff --git a/forum/views/auth.py b/forum/views/auth.py index ddc5e95..90af33b 100644 --- a/forum/views/auth.py +++ b/forum/views/auth.py @@ -2,13 +2,18 @@ from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.core.urlresolvers import reverse from forum.models import User -from django.http import HttpResponseRedirect, Http404, HttpResponseForbidden +from django.http import HttpResponseRedirect, Http404 +from forum.http_responses import HttpResponseUnauthorized from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.utils.http import urlquote_plus from django.contrib.auth.decorators import login_required from django.contrib.auth import login, logout from django.http import get_host +from forum.actions import SuspendAction +from forum.utils import html +from forum import settings +from writers import manage_pending_data import types import datetime import logging @@ -23,12 +28,8 @@ from forum.authentication import AUTH_PROVIDERS from forum.models import AuthKeyUserAssociation, ValidationHash, Question, Answer from forum.actions import UserJoinsAction -def signin_page(request, action=None): - if action is None: - request.session['on_signin_url'] = request.META.get('HTTP_REFERER', '/') - else: - request.session['on_signin_action'] = action - request.session['on_signin_url'] = reverse('auth_action_signin', kwargs={'action': action}) +def signin_page(request): + request.session['on_signin_url'] = request.META.get('HTTP_REFERER', '/') all_providers = [provider.context for provider in AUTH_PROVIDERS.values()] @@ -165,7 +166,8 @@ def external_register(request): auth_provider = request.session['auth_provider'] except: request.session['auth_error'] = _( - "Oops, something went wrong in the middle of this process. Please try again.") + "Oops, something went wrong in the middle of this process. Please try again. Note that you need to have cookies enabled for the authentication to work." + ) logging.error("Missing session data when trying to complete user registration: %s" % ", ".join( ["%s: %s" % (k, v) for k, v in request.META.items()])) return HttpResponseRedirect(reverse('auth_signin')) @@ -226,6 +228,9 @@ def request_temp_login(request): if form.is_valid(): user = form.user_cache + if user.is_suspended(): + return forward_suspended_user(request, user, False) + try: hash = get_object_or_404(ValidationHash, user=user, type='templogin') if hash.expiration < datetime.datetime.now(): @@ -257,6 +262,24 @@ def temp_signin(request, user, code): else: raise Http404() +def send_validation_email(request): + if not request.user.is_authenticated(): + return HttpResponseUnauthorized(request) + else: + try: + hash = ValidationHash.objects.get(user=request.user, type='email') + if hash.expiration < datetime.datetime.now(): + hash.delete() + return send_validation_email(request) + except: + hash = ValidationHash.objects.create_new(request.user, 'email', [request.user.email]) + + send_template_email([request.user], "auth/mail_validation.html", {'validation_code': hash}) + request.user.message_set.create(message=_("A message with an email validation link was just sent to your address.")) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + + + def validate_email(request, user, code): user = get_object_or_404(User, id=user) @@ -272,7 +295,7 @@ def auth_settings(request, id): user_ = get_object_or_404(User, id=id) if not (request.user.is_superuser or request.user == user_): - return HttpResponseForbidden() + return HttpResponseUnauthorized(request) auth_keys = user_.auth_keys.all() @@ -326,68 +349,57 @@ def auth_settings(request, id): def remove_external_provider(request, id): association = get_object_or_404(AuthKeyUserAssociation, id=id) if not (request.user.is_superuser or request.user == association.user): - return HttpResponseForbidden() + return HttpResponseUnauthorized(request) request.user.message_set.create(message=_("You removed the association with %s") % association.provider) association.delete() return HttpResponseRedirect(reverse('user_authsettings', kwargs={'id': association.user.id})) -def newquestion_signin_action(user): - question = Question.objects.filter(author=user).order_by('-added_at')[0] - return question.get_absolute_url() - -def newanswer_signin_action(user): - answer = Answer.objects.filter(author=user).order_by('-added_at')[0] - return answer.get_absolute_url() - -POST_SIGNIN_ACTIONS = { -'newquestion': newquestion_signin_action, -'newanswer': newanswer_signin_action, -} - def login_and_forward(request, user, forward=None, message=None): - old_session = request.session.session_key + if user.is_suspended(): + return forward_suspended_user(request, user) + user.backend = "django.contrib.auth.backends.ModelBackend" login(request, user) - temp_data = request.session.pop('temp_node_data', None) - if temp_data: - request.POST = temp_data - node_type = request.session.pop('temp_node_type') - - if node_type == "question": - from forum.views.writers import ask - return ask(request) - elif node_type == "answer": - from forum.views.writers import answer - return answer(request, request.session.pop('temp_question_id')) - - if not forward: - signin_action = request.session.get('on_signin_action', None) - if not signin_action: - forward = request.session.get('on_signin_url', None) - - if not forward: - forward = reverse('index') - else: - try: - forward = POST_SIGNIN_ACTIONS[signin_action](user) - except: - forward = reverse('index') - if message is None: message = _("Welcome back %s, you are now logged in") % user.username request.user.message_set.create(message=message) + + forward = request.session.get('on_signin_url', reverse('index')) + pending_data = request.session.get('pending_submission_data', None) + + if pending_data and (user.email_isvalid or pending_data['type'] not in settings.REQUIRE_EMAIL_VALIDATION_TO): + submission_time = pending_data['time'] + if submission_time < datetime.datetime.now() - datetime.timedelta(minutes=int(settings.HOLD_PENDING_POSTS_MINUTES)): + del request.session['pending_submission_data'] + elif submission_time < datetime.datetime.now() - datetime.timedelta(minutes=int(settings.WARN_PENDING_POSTS_MINUTES)): + user.message_set.create(message=(_("You have a %s pending submission.") % pending_data['data_name']) + " %s, %s, %s" % ( + html.hyperlink(reverse('manage_pending_data', kwargs={'action': _('save')}), _("save it")), + html.hyperlink(reverse('manage_pending_data', kwargs={'action': _('review')}), _("review")), + html.hyperlink(reverse('manage_pending_data', kwargs={'action': _('cancel')}), _("cancel")) + )) + else: + return manage_pending_data(request, _('save'), forward) + return HttpResponseRedirect(forward) -@login_required -def signout(request): - """ - signout from the website. Remove openid from session and kill it. +def forward_suspended_user(request, user, show_private_msg=True): + message = _("Sorry, but this account is suspended") + if show_private_msg: + msg_type = 'privatemsg' + else: + msg_type = 'publicmsg' - url : /signout/" - """ + suspension = user.suspension + if suspension: + message += (":
" + suspension.extra.get(msg_type, '')) + request.user.message_set.create(message) + return HttpResponseRedirect(reverse('index')) + +@login_required +def signout(request): logout(request) return HttpResponseRedirect(reverse('index')) \ No newline at end of file