summaryrefslogtreecommitdiff
path: root/service/src/pixelated/resources/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'service/src/pixelated/resources/__init__.py')
-rw-r--r--service/src/pixelated/resources/__init__.py159
1 files changed, 159 insertions, 0 deletions
diff --git a/service/src/pixelated/resources/__init__.py b/service/src/pixelated/resources/__init__.py
new file mode 100644
index 00000000..58b56786
--- /dev/null
+++ b/service/src/pixelated/resources/__init__.py
@@ -0,0 +1,159 @@
+#
+# Copyright (c) 2014 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# 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 json
+import os
+
+from twisted.web.http import UNAUTHORIZED
+from twisted.web.resource import Resource
+from twisted.logger import Logger
+
+from pixelated.resources.session import IPixelatedSession
+
+from twisted.web.http import INTERNAL_SERVER_ERROR, SERVICE_UNAVAILABLE
+
+log = Logger()
+
+
+STATIC = None
+
+
+class SetEncoder(json.JSONEncoder):
+ def default(self, obj):
+ if isinstance(obj, set):
+ return list(obj)
+ return super(SetEncoder, self).default(obj)
+
+
+def respond_json(entity, request, status_code=200):
+ json_response = json.dumps(entity, cls=SetEncoder)
+ 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.setRawHeaders(b"content-type", [b"application/json"])
+ request.code = status_code
+ request.write(json_response)
+ request.finish()
+
+
+def handle_error_deferred(e, request):
+ log.error(e)
+ request.setResponseCode(INTERNAL_SERVER_ERROR)
+ request.write('Something went wrong!')
+ request.finish()
+
+
+def set_static_folder(static_folder):
+ global STATIC
+ STATIC = static_folder
+
+
+def get_protected_static_folder(static_folder=None):
+ static = static_folder or _get_static_folder()
+ return os.path.join(static, 'protected')
+
+
+def get_public_static_folder(static_folder=None):
+ static = static_folder or _get_static_folder()
+ return os.path.join(static, 'public')
+
+
+def _get_static_folder():
+ if not STATIC:
+ static_folder = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "web-ui", "dist"))
+ if not os.path.exists(static_folder):
+ static_folder = os.path.join('/', 'usr', 'share', 'pixelated-user-agent')
+ else:
+ static_folder = STATIC
+ return static_folder
+
+
+class BaseResource(Resource):
+
+ def __init__(self, services_factory):
+ Resource.__init__(self)
+ self._services_factory = services_factory
+
+ def _get_user_id_from_request(self, request):
+ if self._services_factory.mode.is_single_user:
+ return None # it doesn't matter
+ session = self.get_session(request)
+ if session.is_logged_in():
+ return session.user_uuid
+ raise ValueError('Not logged in')
+
+ def is_logged_in(self, request):
+ session = self.get_session(request)
+ return session.is_logged_in() and self._services_factory.has_session(session.user_uuid)
+
+ def get_session(self, request):
+ return IPixelatedSession(request.getSession())
+
+ def is_admin(self, request):
+ services = self._services(request)
+ return services._leap_session.user_auth.is_admin()
+
+ def _services(self, request):
+ user_id = self._get_user_id_from_request(request)
+ return self._services_factory.services(user_id)
+
+ def _service(self, request, attribute):
+ return getattr(self._services(request), attribute)
+
+ def keymanager(self, request):
+ return self._service(request, 'keymanager')
+
+ def mail_service(self, request):
+ return self._service(request, 'mail_service')
+
+ def search_engine(self, request):
+ return self._service(request, 'search_engine')
+
+ def draft_service(self, request):
+ return self._service(request, 'draft_service')
+
+ def feedback_service(self, request):
+ return self._service(request, 'feedback_service')
+
+ def soledad(self, request):
+ return self._service(request, '_leap_session').soledad
+
+
+class UnAuthorizedResource(Resource):
+
+ def __init__(self):
+ Resource.__init__(self)
+
+ def render_GET(self, request):
+ request.setResponseCode(UNAUTHORIZED)
+ return "Unauthorized!"
+
+ def render_POST(self, request):
+ request.setResponseCode(UNAUTHORIZED)
+ return "Unauthorized!"
+
+
+class UnavailableResource(Resource):
+ def __init__(self):
+ Resource.__init__(self)
+
+ def render(self, request):
+ request.setResponseCode(SERVICE_UNAVAILABLE)
+ return "Service Unavailable"