WebBox Klassenbibliothek
ulrich
2021-01-28 96dfd62fbfe771616045a253bbeb1415538e815f
commit | author | age
fe6b5c 1 package de.uhilger.wbx.web;
U 2
3 /*
4     WebBox - Dein Server.
5     Copyright (C) 2019 Ulrich Hilger, http://uhilger.de
6
7     This program is free software: you can redistribute it and/or modify
8     it under the terms of the GNU Affero General Public License as
9     published by the Free Software Foundation, either version 3 of the
10     License, or (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU Affero General Public License for more details.
16
17     You should have received a copy of the GNU Affero General Public License
18     along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21
22 import java.io.IOException;
23 import java.security.Principal;
24 import java.util.logging.Level;
25 import java.util.logging.Logger;
26 import javax.servlet.ServletException;
27 import javax.servlet.ServletOutputStream;
828ffa 28 import javax.servlet.http.HttpServlet;
fe6b5c 29 import javax.servlet.http.HttpServletRequest;
U 30 import javax.servlet.http.HttpServletResponse;
f826e7 31 import org.apache.catalina.servlets.DefaultServlet;
fe6b5c 32
U 33 /**
34  * Das MdServlet f&uuml;gt dem DefaultServlet von Tomcat 
35  * Methoden hinzu, mit denen Markdown-Inhalte (*.md) 
36  * zu ganzen HTML-Seiten 
37  * mit head und body tags sowie Stylesheet-Verweisen 
38  * erg&auml;nzt werden
39  * 
40  * Die hier hinzugefuegten Inhalte verweisen lediglich auf 
41  * die Javscript-Biliothek strapdown.js 
42  * (http://strapdownjs.com), das Rendern 
43  * des Markdown zu HTML geschieht dann auf dem Client.
44  * 
45  * TODO: Stylesheets dynamisch einbinden
46  */
f826e7 47 public class MdServlet extends DefaultServlet {
fe6b5c 48   
U 49   private static final Logger logger = Logger.getLogger(MdServlet.class.getName());
50   private static final String HOME_CTX = "/home";
51
52   private String getTitle() {
53     String title = null;
54     return title;
55   }
56   
57   private void seiteAusgeben(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
58     ServletOutputStream out = response.getOutputStream();
59     printHeader(out, request);
60     super.doGet(request, response);
61     printFooter(out);
62   }
63   
64   private void printHeader(ServletOutputStream out, HttpServletRequest request) throws IOException {
65     out.print("<!DOCTYPE html>\r\n");
66     out.print("<html><head>\r\n");
67     out.print("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\r\n");
68     out.print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
69     out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/jslib/sd/strapdown.css\">\r\n");
70     String title = getTitle();
71     if(title != null) {
72       out.print("<title>");
73       out.print(title);
74       out.print(" ");
75       out.print(request.getRequestURI());
76       out.print("</title>\r\n");
77     }
78     out.print("</head><body>\r\n");
79     out.print("<xmp theme=\"united\" style=\"display:none;\">\r\n");
80   }
81   
82   private void printFooter(ServletOutputStream out) throws IOException {
83     out.print("\r\n</xmp>\r\n");
84     out.print("<script src=\"/jslib/sd/strapdown.js\"></script>\r\n");
85     out.print("</body></html>");
86   }
87   
88   /**
89    * Handles the HTTP <code>GET</code> method.
90    *
91    * @param request servlet request
92    * @param response servlet response
93    * @throws ServletException if a servlet-specific error occurs
94    * @throws IOException if an I/O error occurs
95    */
96   @Override
97   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
98     String contextPath = request.getContextPath();
99     if(HOME_CTX.equals(contextPath)) {
100       String userName = getUserName(request);
101       if (userName != null) {
102         String urlUser = getUrlUser(request, userName);
103         if(userName.equals(urlUser)) {
104           seiteAusgeben(request, response);
105         } else {
106           logger.fine("Wrong user.");
107         }
108       } else {
109         logger.fine("Missing login.");
110       }
111     } else {
112       seiteAusgeben(request, response);
113     }
114   }
115   
116   protected String getUrlUser(HttpServletRequest request, String userName) {
117     String result = "";
118     String requestUrlStr = request.getRequestURL().toString();
119     String contextPath = request.getContextPath();
120     if(contextPath != null && requestUrlStr != null && userName != null) {
121       int start = requestUrlStr.indexOf(contextPath);
122       start += contextPath.length();
123       start++;
124       int end = start + userName.length();
125       try {
126         result = requestUrlStr.substring(start, end);
127       } catch(Exception ex) {
128         logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
129       }
130     }
131     return result;
132   }
133   
134   protected String getUserName(HttpServletRequest hr) {
135     String userName = null;
136     Object p = hr.getUserPrincipal();
137     if (p instanceof Principal) {
138       userName = ((Principal) p).getName();
139     }
140     return userName;
141   }
142   
143   /**
144    * Returns a short description of the servlet.
145    *
146    * @return a String containing servlet description
147    */
148   @Override
149   public String getServletInfo() {
150     return "MarkdownWrapper Servlet";
151   }
152
153 }