[Yanel-commits] rev 21464 -
public/yanel/trunk/src/core/java/org/wyona/yanel/servlet
michi at wyona.com
michi at wyona.com
Fri Jan 5 12:16:22 CET 2007
Author: michi
Date: 2007-01-05 12:16:21 +0100 (Fri, 05 Jan 2007)
New Revision: 21464
Modified:
public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java
Log:
layout of login screen made configurable within XSLT
Modified: public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java
===================================================================
--- public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java 2007-01-05 11:15:39 UTC (rev 21463)
+++ public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java 2007-01-05 11:16:21 UTC (rev 21464)
@@ -71,7 +71,8 @@
Map map;
Yanel yanel;
- File xsltFile;
+ File xsltInfoAndException;
+ File xsltLoginScreen;
private static String IDENTITY_KEY = "identity";
@@ -90,8 +91,8 @@
public void init(ServletConfig config) throws ServletException {
this.config = config;
- xsltFile = org.wyona.commons.io.FileUtil.file(config.getServletContext().getRealPath("/"), config.getInitParameter("exception-and-info-screen-xslt"));
-
+ xsltInfoAndException = org.wyona.commons.io.FileUtil.file(config.getServletContext().getRealPath("/"), config.getInitParameter("exception-and-info-screen-xslt"));
+ xsltLoginScreen = org.wyona.commons.io.FileUtil.file(config.getServletContext().getRealPath("/"), config.getInitParameter("login-screen-xslt"));
try {
yanel = Yanel.getInstance();
yanel.init();
@@ -1049,12 +1050,18 @@
String loginUsername = request.getParameter("yanel.login.username");
if(loginUsername != null) {
HttpSession session = request.getSession(true);
- if (realm.getIdentityManager().authenticate(loginUsername, request.getParameter("yanel.login.password"))) {
- log.debug("Realm: " + realm);
- session.setAttribute(IDENTITY_KEY, new Identity(loginUsername, null));
- return null;
- } else {
- log.warn("Login failed: " + loginUsername);
+ try {
+ if (realm.getIdentityManager().authenticate(loginUsername, request.getParameter("yanel.login.password"))) {
+ log.debug("Realm: " + realm);
+ session.setAttribute(IDENTITY_KEY, new Identity(loginUsername, null));
+ return null;
+ } else {
+ log.warn("Login failed: " + loginUsername);
+ getXHTMLAuthenticationForm(request, response, realm, "Login failed!");
+ return response;
+ }
+ } catch (Exception e) {
+ log.warn("Login failed: " + loginUsername + " " + e);
getXHTMLAuthenticationForm(request, response, realm, "Login failed!");
return response;
}
@@ -1258,7 +1265,7 @@
out.close();
} else {
response.setContentType("application/xhtml+xml");
- Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltInfoAndException));
transformer.transform(new javax.xml.transform.dom.DOMSource(doc), new javax.xml.transform.stream.StreamResult(response.getWriter()));
}
} catch (Exception e) {
@@ -1271,31 +1278,39 @@
* Custom XHTML Form for authentication
*/
public void getXHTMLAuthenticationForm(HttpServletRequest request, HttpServletResponse response, Realm realm, String message) throws ServletException, IOException {
- // TODO: Use configurable XSLT for layout, whereas each realm should be able to overwrite ...
- StringBuffer sb = new StringBuffer();
- sb.append("<?xml version=\"1.0\"?>");
- sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
- sb.append("<body>");
- if (message != null) {
- sb.append("<p>NOTE: " + message + "</p>");
- }
- sb.append("<p>Authorization denied: " + getRequestURLQS(request, null, true) + "</p>");
- sb.append("<p>Enter username and password for realm \"" + realm.getName() + "\" at \"" + realm.getMountPoint() + "\" (Context Path: " + request.getContextPath() + ")</p>");
- sb.append("<form method=\"POST\">");
- sb.append("<p>");
- sb.append("<table>");
- sb.append("<tr><td>Username:</td><td> </td><td><input type=\"text\" name=\"yanel.login.username\"/></td></tr>");
- sb.append("<tr><td>Password:</td><td> </td><td><input type=\"password\" name=\"yanel.login.password\"/></td></tr>");
- sb.append("<tr><td colspan=\"2\"> </td><td align=\"right\"><input type=\"submit\" value=\"Login\"/></td></tr>");
- sb.append("</table>");
- sb.append("</p>");
- sb.append("</form>");
- sb.append("</body>");
- sb.append("</html>");
- response.setContentType("application/xhtml+xml");
- response.setStatus(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
- PrintWriter w = response.getWriter();
- w.print(sb);
+
+ org.w3c.dom.Document doc = null;
+ javax.xml.parsers.DocumentBuilderFactory dbf= javax.xml.parsers.DocumentBuilderFactory.newInstance();
+ try {
+ javax.xml.parsers.DocumentBuilder parser = dbf.newDocumentBuilder();
+ org.w3c.dom.DOMImplementation impl = parser.getDOMImplementation();
+ org.w3c.dom.DocumentType doctype = null;
+ doc = impl.createDocument("http://www.wyona.org/yanel/1.0", "yanel", doctype);
+
+ Element rootElement = doc.getDocumentElement();
+
+ if (message != null) {
+ Element messageElement = (Element) rootElement.appendChild(doc.createElement("message"));
+ messageElement.appendChild(doc.createTextNode(message));
+ }
+
+ Element requestElement = (Element) rootElement.appendChild(doc.createElement("request"));
+ requestElement.setAttribute("urlqs", getRequestURLQS(request, null, true));
+
+ Element realmElement = (Element) rootElement.appendChild(doc.createElement("realm"));
+ realmElement.setAttribute("name", realm.getName());
+ realmElement.setAttribute("mount-point", realm.getMountPoint().toString());
+
+ response.setContentType("application/xhtml+xml; charset=UTF-8");
+ response.setStatus(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltLoginScreen));
+ transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
+ new javax.xml.transform.stream.StreamResult(response.getWriter()));
+
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ throw new ServletException(e.getMessage());
+ }
}
/**
More information about the Yanel-commits
mailing list