From 7f600c988e0a1626ca0e24a1d7a1fa7797771915 Mon Sep 17 00:00:00 2001 From: Giovane Date: Thu, 3 Sep 2015 18:37:03 -0300 Subject: #304 Adds PixelatedSite class to hold custom request configuration and remove foundation inline javascript. --- service/pixelated/application.py | 9 ++++---- service/pixelated/config/site.py | 11 ++++++++++ .../test/support/integration/app_test_client.py | 6 ++++-- service/test/unit/config/test_site.py | 24 ++++++++++++++++++++++ web-ui/app/index.html | 5 +---- web-ui/app/js/foundation/initialize_foundation.js | 3 +++ 6 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 service/pixelated/config/site.py create mode 100644 service/test/unit/config/test_site.py create mode 100644 web-ui/app/js/foundation/initialize_foundation.js diff --git a/service/pixelated/application.py b/service/pixelated/application.py index b44a9893..e7afa341 100644 --- a/service/pixelated/application.py +++ b/service/pixelated/application.py @@ -15,9 +15,7 @@ # along with Pixelated. If not, see . from twisted.internet import reactor -from twisted.internet.threads import deferToThread from twisted.internet import defer -from twisted.web.server import Site from twisted.internet import ssl from OpenSSL import SSL from OpenSSL import crypto @@ -26,6 +24,7 @@ from pixelated.config import arguments from pixelated.config.services import Services from pixelated.config.leap import initialize_leap from pixelated.config import logger +from pixelated.config.site import PixelatedSite from pixelated.resources.loading_page import LoadingResource from pixelated.resources.root_resource import RootResource @@ -46,9 +45,9 @@ def start_user_agent(loading_app, host, port, sslkey, sslcert, leap_home, leap_s services.draft_service) if sslkey and sslcert: - reactor.listenSSL(port, Site(resource), _ssl_options(sslkey, sslcert), interface=host) + reactor.listenSSL(port, PixelatedSite(resource), _ssl_options(sslkey, sslcert), interface=host) else: - reactor.listenTCP(port, Site(resource), interface=host) + reactor.listenTCP(port, PixelatedSite(resource), interface=host) # soledad needs lots of threads reactor.threadpool.adjustPoolsize(5, 15) @@ -73,7 +72,7 @@ def initialize(): args = arguments.parse_user_agent_args() logger.init(debug=args.debug) - loading_app = reactor.listenTCP(args.port, Site(LoadingResource()), interface=args.host) + loading_app = reactor.listenTCP(args.port, PixelatedSite(LoadingResource()), interface=args.host) deferred = initialize_leap(args.leap_provider_cert, args.leap_provider_cert_fingerprint, diff --git a/service/pixelated/config/site.py b/service/pixelated/config/site.py new file mode 100644 index 00000000..c6e55102 --- /dev/null +++ b/service/pixelated/config/site.py @@ -0,0 +1,11 @@ +from twisted.web.server import Site, Request + + +class AddCSPHeaderRequest(Request): + def process(self): + self.setHeader("Content-Security-Policy", "default-src 'self'; style-src 'self' 'unsafe-inline'") + Request.process(self) + + +class PixelatedSite(Site): + requestFactory = AddCSPHeaderRequest diff --git a/service/test/support/integration/app_test_client.py b/service/test/support/integration/app_test_client.py index 51fbf483..e44a8c10 100644 --- a/service/test/support/integration/app_test_client.py +++ b/service/test/support/integration/app_test_client.py @@ -30,7 +30,9 @@ from mock import Mock from twisted.internet import reactor, defer from twisted.internet.defer import succeed from twisted.web.resource import getChildForRequest -from twisted.web.server import Site +# from twisted.web.server import Site as PixelatedSite +from pixelated.config.site import PixelatedSite + from pixelated.adapter.mailstore import LeapMailStore from pixelated.adapter.mailstore.searchable_mailstore import SearchableMailStore @@ -106,7 +108,7 @@ class AppTestClient(object): return d, request def listenTCP(self, port=4567, host='127.0.0.1'): - reactor.listenTCP(port, Site(self.resource), interface=host) + reactor.listenTCP(port, PixelatedSite(self.resource), interface=host) def run_on_a_thread(self, logfile='/tmp/app_test_client.log', port=4567, host='127.0.0.1'): def _start(): diff --git a/service/test/unit/config/test_site.py b/service/test/unit/config/test_site.py new file mode 100644 index 00000000..77d42ed8 --- /dev/null +++ b/service/test/unit/config/test_site.py @@ -0,0 +1,24 @@ +import unittest +from mockito import mock +from pixelated.config.site import PixelatedSite +from twisted.protocols.basic import LineReceiver + + +class TestPixelatedSite(unittest.TestCase): + def test_add_csp_header_request(self): + request = self.create_request() + request.process() + headers = request.headers + self.assertEqual(headers.get("Content-Security-Policy"), "default-src 'self'; style-src 'self' 'unsafe-inline'") + + def create_request(self): + channel = LineReceiver() + channel.site = PixelatedSite(mock()) + request = PixelatedSite.requestFactory(channel=channel, queued=True) + request.method = "GET" + request.uri = "localhost" + request.clientproto = 'HTTP/1.1' + request.prepath = [] + request.postpath = request.uri.split('/')[1:] + request.path = "/" + return request diff --git a/web-ui/app/index.html b/web-ui/app/index.html index cbdae267..0f4a36f8 100644 --- a/web-ui/app/index.html +++ b/web-ui/app/index.html @@ -16,7 +16,6 @@ -