예제 #1
0
파일: views.py 프로젝트: xeor/wwwhisper
    def post(self, request, email, path):
        """If the email owner can access the site, sends the login token.

        Token is not sent if the email owner is not allowed to access
        the site in order to avoid abusing this end point to send a
        flood of emails to unknown addresses.

        Token is signed (but not encrypted) and valid only for the
        current site.

        The login url contains a path to which the user should be
        redirected after successful verification.
        """
        if email == None:
            return http.HttpResponseBadRequest('Email not set.')
        if not models.is_email_valid(email):
            return http.HttpResponseBadRequest('Email has invalid format.')
        if path is None or not url_utils.validate_redirection_target(path):
            path = '/'

        if request.site.users.find_item_by_email(email) is None:
            # The email owner can not access the site. The token is
            # not sent, but the response is identical to the response
            # returned when the token is sent. This way it is not
            # possible to use the login form to query which emails are
            # allowed access. Such queries can still be possible by
            # response timing.
            return http.HttpResponseNoContent()

        token = login_token.generate_login_token(request.site,
                                                 site_url=request.site_url,
                                                 email=email)

        params = urllib.urlencode(dict(next=path, token=token))
        url = '{0}{1}?{2}'.format(request.site_url, reverse('login'), params)
        subject = '{0} access token'.format(request.site_url)
        body = (
            'Hello,\n\n'
            'You have requested access to {0}.\n'.format(request.site_url) +
            'Open this link to verify your email address:\n\n'
            '{0}\n\n'.format(url) +
            'If you have not requested such access, please ignore this email.\n'
            'The link is valid for the next 30 minutes and can be used once.\n'
        )
        from_email = settings.TOKEN_EMAIL_FROM
        success = False
        try:
            success = (send_mail(
                subject, body, from_email, [email], fail_silently=False) > 0)
        except Exception as ex:
            logger.warning(ex)
        if not success:
            # This probaly can be also due to invalid email address,
            # in these cases 400 would be better.
            msg = 'Email delivery problem. ' \
                'Check the entered address or try again in a few minutes.'
            return http.HttpResponseInternalError(msg)
        return http.HttpResponseNoContent()
예제 #2
0
    def post(self, request, email, path):
        """Emails login url with secret token to verify email ownership.

        Token is signed (but not encrypted) and valid only for the
        current site.

        The login url contains a path to which the user should be
        redirected after successful verification.
        """
        if email == None:
            return http.HttpResponseBadRequest('Email not set.')
        if not models.is_email_valid(email):
            return http.HttpResponseBadRequest('Email has invalid format.')
        if path is None or not url_utils.validate_redirection_target(path):
            path = '/'

        token = login_token.generate_login_token(request.site,
                                                 site_url=request.site_url,
                                                 email=email)

        params = urllib.urlencode(dict(next=path, token=token))
        url = '{0}{1}?{2}'.format(request.site_url, reverse('login'), params)
        subject = '[{0}] email verification'.format(request.site_url)
        from_email = settings.TOKEN_EMAIL_FROM
        body = (
            'Follow the link to verify your email address\n' +
            '{0}\n'.format(url) + '\n' +
            'Ignore this email if you have not requested such verification.')
        send_mail(subject, body, from_email, [email], fail_silently=False)
        return http.HttpResponseNoContent()
예제 #3
0
    def post(self, request, assertion):
        """Logs a user in (establishes a session cookie).

        Verifies BrowserID assertion and check that a user with an
        email verified by the BrowserID is known (added to users
        list).
        """
        if assertion == None:
            return http.HttpResponseBadRequest('BrowserId assertion not set.')
        try:
            user = auth.authenticate(site=request.site,
                                     site_url=request.site_url,
                                     assertion=assertion)
        except AssertionVerificationException as ex:
            logger.debug('Assertion verification failed.')
            return http.HttpResponseBadRequest(str(ex))
        if user is not None:
            auth.login(request, user)

            # Store all user data needed by Auth view in session, this
            # way, user table does not need to be queried during the
            # performance critical request (sessions are cached).
            request.session['user_id'] = user.id
            logger.debug('%s successfully logged.' % (user.email))
            return http.HttpResponseNoContent()
        else:
            # Unkown user.
            # Return not authorized because request was well formed (400
            # doesn't seem appropriate).
            return http.HttpResponseNotAuthorized()
예제 #4
0
파일: views.py 프로젝트: xeor/wwwhisper
 def delete(self, request, uuid):
     """Deletes a resource with a given uuid."""
     deleted = self.collection.delete_item(uuid)
     if not deleted:
         return http.HttpResponseNotFound(
             '%s not found' % self.collection.item_name.capitalize())
     return http.HttpResponseNoContent()
예제 #5
0
 def test_different_origin_framing_not_allowed(self):
     middleware = SecuringHeadersMiddleware()
     request = HttpRequest()
     response = http.HttpResponseNoContent()
     self.assertFalse('X-Frame-Options' in response)
     self.assertFalse('X-Content-Type-Options' in response)
     response = middleware.process_response(request, response)
     self.assertEqual('SAMEORIGIN', response['X-Frame-Options'])
     self.assertEqual('nosniff', response['X-Content-Type-Options'])
예제 #6
0
    def test_secure_flag_not_set_for_http_request(self):
        middleware = ProtectCookiesMiddleware()
        request = HttpRequest()
        request.https = False
        response = http.HttpResponseNoContent()
        response.set_cookie('session', value='foo', secure=None)

        self.assertFalse(response.cookies['session']['secure'])
        response = middleware.process_response(request, response)
        self.assertFalse(response.cookies['session']['secure'])
예제 #7
0
    def get(self, request):
        """Sets a cookie with CSRF protection token.

        The method must be called if the cookie is missing before any
        CSRF protected HTTP method is called (all HTTP methods of
        views that extend RestView). Returned token must be set in
        'X-CSRFToken' header when the protected method is called,
        otherwise the call fails. It is enough to get the token once
        and reuse it for all subsequent calls to CSRF protected
        methods.
        """
        return http.HttpResponseNoContent()
예제 #8
0
파일: views.py 프로젝트: xeor/wwwhisper
    def delete(self, request, location_uuid):
        """Deletes a resource.

        Disables open access to a given location.
        """
        location = request.site.locations.find_item(location_uuid)
        if location is None:
            return http.HttpResponseNotFound('Location not found.')
        if not location.open_access_granted():
            return http.HttpResponseNotFound(
                'Open access to location already disallowed.')
        location.revoke_open_access()
        return http.HttpResponseNoContent()
예제 #9
0
파일: views.py 프로젝트: xeor/wwwhisper
    def delete(self, request, location_uuid, user_uuid):
        """Deletes a resource.

        Revokes access to a given location by a given user. If the
        location is open, the user will still be able to access the
        location after this call succeeds.
        """
        location = request.site.locations.find_item(location_uuid)
        if not location:
            return http.HttpResponseNotFound('Location not found.')
        try:
            location.revoke_access(user_uuid)
            return http.HttpResponseNoContent()
        except LookupError as ex:
            return http.HttpResponseNotFound(str(ex))
예제 #10
0
 def post(self, request):
     """Logs a user out (invalidates a session cookie)."""
     auth.logout(request)
     # TODO: send a message to all processes to discard cached user session.
     response = http.HttpResponseNoContent()
     return response