diff options
-rw-r--r-- | service/pixelated/application.py | 14 | ||||
-rw-r--r-- | service/pixelated/resources/__init__.py | 4 | ||||
-rw-r--r-- | service/test/unit/resources/test_helpers.py | 30 |
3 files changed, 44 insertions, 4 deletions
diff --git a/service/pixelated/application.py b/service/pixelated/application.py index af29bc5f..ce1e0258 100644 --- a/service/pixelated/application.py +++ b/service/pixelated/application.py @@ -14,12 +14,14 @@ # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. +import os import logging from OpenSSL import SSL from OpenSSL import crypto from leap.common.events import (server as events_server, register, catalog as events) +from leap.soledad.common.errors import InvalidAuthTokenError from twisted.cred import portal from twisted.cred.checkers import AllowAnonymousAccess from twisted.internet import defer @@ -210,12 +212,20 @@ def _start_in_single_user_mode(args, resource, services_factory): args.leap_provider_cert_fingerprint, args.credentials_file, args.leap_home) - deferred.addCallback( + + def _handle_error(exception): + if(exception.type is InvalidAuthTokenError): + log.critical('Got an invalid soledad token, the user agent can\'t synchronize data, exiting') + os._exit(1) + else: + exception.raiseException() + + deferred.addCallbacks( lambda leap_session: start_user_agent_in_single_user_mode( resource, services_factory, args.leap_home, - leap_session)) + leap_session), _handle_error) return deferred diff --git a/service/pixelated/resources/__init__.py b/service/pixelated/resources/__init__.py index 9ccca7ee..cd27fab0 100644 --- a/service/pixelated/resources/__init__.py +++ b/service/pixelated/resources/__init__.py @@ -36,14 +36,14 @@ class SetEncoder(json.JSONEncoder): def respond_json(entity, request, status_code=200): json_response = json.dumps(entity, cls=SetEncoder) - request.responseHeaders.addRawHeader(b"content-type", [b"application/json"]) + request.responseHeaders.setRawHeaders(b"content-type", [b"application/json"]) request.code = status_code return json_response def respond_json_deferred(entity, request, status_code=200): json_response = json.dumps(entity, cls=SetEncoder) - request.responseHeaders.addRawHeader(b"content-type", [b"application/json"]) + request.responseHeaders.setRawHeaders(b"content-type", [b"application/json"]) request.code = status_code request.write(json_response) request.finish() diff --git a/service/test/unit/resources/test_helpers.py b/service/test/unit/resources/test_helpers.py new file mode 100644 index 00000000..a17ce755 --- /dev/null +++ b/service/test/unit/resources/test_helpers.py @@ -0,0 +1,30 @@ +import unittest +import re + +from pixelated.resources import respond_json, respond_json_deferred +from test.unit.resources import DummySite +from twisted.web.test.requesthelper import DummyRequest + + +class TestHelpers(unittest.TestCase): + + def setUp(self): + pass + + def test_respond_json_should_populate_response(self): + request = DummyRequest(['']) + body = respond_json({"test": "yep"}, request) + + self.assertEqual(200, request.code) + self.assertEqual(b"{\"test\": \"yep\"}", body) + self.assertEqual([b"application/json"], + request.responseHeaders.getRawHeaders("Content-Type")) + + def test_respond_json_deferred_should_populate_response(self): + request = DummyRequest(['']) + body = respond_json_deferred({"test": "yep"}, request) + + self.assertEqual(200, request.code) + self.assertEqual(b"{\"test\": \"yep\"}", request.written[0]) + self.assertEqual([b"application/json"], + request.responseHeaders.getRawHeaders("Content-Type")) |