summaryrefslogtreecommitdiff
path: root/service/pixelated/resources/login_resource.py
diff options
context:
space:
mode:
authorFolker Bernitt <fbernitt@thoughtworks.com>2016-01-22 17:42:35 +0100
committerFolker Bernitt <fbernitt@thoughtworks.com>2016-01-22 17:43:21 +0100
commit18123f6745beaba99b40a4db6d9aad1dbcdf6925 (patch)
tree037465bfdcd0825a3142d23339ed383b1bc23633 /service/pixelated/resources/login_resource.py
parentdacc69ea5cc3a35faf05a95e8976cd9a1fdec621 (diff)
Show sensible error message for failed login
- Issue #576 - Use of twisted templating
Diffstat (limited to 'service/pixelated/resources/login_resource.py')
-rw-r--r--service/pixelated/resources/login_resource.py65
1 files changed, 41 insertions, 24 deletions
diff --git a/service/pixelated/resources/login_resource.py b/service/pixelated/resources/login_resource.py
index b249a67e..e7586bf6 100644
--- a/service/pixelated/resources/login_resource.py
+++ b/service/pixelated/resources/login_resource.py
@@ -16,26 +16,58 @@
import logging
import os
-from string import Template
from twisted.cred import credentials
from twisted.internet import defer
from twisted.web.resource import IResource
from twisted.web.server import NOT_DONE_YET
from twisted.web.static import File
+from twisted.web.template import Element, XMLFile, renderElement, renderer, tags
+from twisted.python.filepath import FilePath
from pixelated.resources import BaseResource, UnAuthorizedResource
log = logging.getLogger(__name__)
+def _get_startup_folder():
+ path = os.path.dirname(os.path.abspath(__file__))
+ return os.path.join(path, '..', 'assets')
+
+
+def _get_static_folder():
+ static_folder = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "web-ui", "app"))
+ # this is a workaround for packaging
+ if not os.path.exists(static_folder):
+ static_folder = os.path.abspath(
+ os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "web-ui", "app"))
+ if not os.path.exists(static_folder):
+ static_folder = os.path.join('/', 'usr', 'share', 'pixelated-user-agent')
+ return static_folder
+
+
+class LoginWebSite(Element):
+ loader = XMLFile(FilePath(os.path.join(_get_startup_folder(), 'login.html')))
+
+ def __init__(self, error_msg=None):
+ super(LoginWebSite, self).__init__()
+ self._error_msg = error_msg
+
+ @renderer
+ def error_msg(self, request, tag):
+ if self._error_msg is not None:
+ return tag(self._error_msg)
+ else:
+ return tag('')
+
+
class LoginResource(BaseResource):
BASE_URL = 'login'
def __init__(self, services_factory, portal=None):
BaseResource.__init__(self, services_factory)
- self._static_folder = self._get_static_folder()
- self._startup_folder = self._get_startup_folder()
+ self._static_folder = _get_static_folder()
+ self._startup_folder = _get_startup_folder()
self._html_template = open(os.path.join(self._startup_folder, 'login.html')).read()
self._portal = portal
self.putChild('startup-assets', File(self._startup_folder))
@@ -51,8 +83,11 @@ class LoginResource(BaseResource):
return UnAuthorizedResource()
def render_GET(self, request):
- response = Template(self._html_template).safe_substitute()
- return str(response)
+ return self._render_template(request)
+
+ def _render_template(self, request, error_msg=None):
+ site = LoginWebSite(error_msg=error_msg)
+ return renderElement(request, site)
def render_POST(self, request):
@@ -61,12 +96,8 @@ class LoginResource(BaseResource):
request.finish()
def render_error(error):
- login_form = self.render_GET(request)
request.status = 500
- request.write('We got an error:\n')
- request.write(str(error))
- request.write(login_form)
- request.finish()
+ return self._render_template(request, 'Invalid credentials')
d = self._handle_login(request)
d.addCallbacks(render_response, render_error)
@@ -90,17 +121,3 @@ class LoginResource(BaseResource):
leap_user.init_http_session(request)
log.info('about to redirect to home page')
-
- def _get_startup_folder(self):
- path = os.path.dirname(os.path.abspath(__file__))
- return os.path.join(path, '..', 'assets')
-
- def _get_static_folder(self):
- static_folder = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "web-ui", "app"))
- # this is a workaround for packaging
- if not os.path.exists(static_folder):
- static_folder = os.path.abspath(
- os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "web-ui", "app"))
- if not os.path.exists(static_folder):
- static_folder = os.path.join('/', 'usr', 'share', 'pixelated-user-agent')
- return static_folder