1-n-content-media, tomcat-session-tracking without cookies, and more
[mir.git] / source / Mir.java
1 import java.io.*;
2 import java.util.*;
3 import java.net.*;
4 import java.lang.reflect.*;
5 import javax.servlet.*;
6 import javax.servlet.http.*;
7 import java.sql.*;
8
9 import freemarker.template.*;
10
11 import mir.misc.*;
12 import mir.servlet.*;
13
14 import mircoders.servlet.*;
15 import mircoders.module.*;
16 import mircoders.entity.*;
17 import mircoders.storage.*;
18
19 /**
20  *  Mir.java - main servlet, that dispatches to servletmodules
21  *
22  *  @author RK 1999-2001
23  *
24  */
25
26
27 public class Mir extends AbstractServlet
28 {
29
30   private static ModuleUsers usersModule=null;
31   private static ModuleMessage messageModule=null;
32   private static boolean confed=false;
33
34
35   public void doGet(HttpServletRequest req, HttpServletResponse res)
36     throws ServletException, IOException {
37     doPost(req,res);
38   }
39
40   public void doPost(HttpServletRequest req, HttpServletResponse res)
41     throws ServletException, IOException {
42
43     long            startTime = (new java.util.Date()).getTime();
44     Class           theServletModule;
45     ServletModule   smod;
46     long            sessionConnectTime=0;
47     String          http="";
48
49     // get the configration
50     if (!confed){
51       confed = getConfig(req);
52     }
53
54                 HttpSession session = req.getSession(true);
55                         
56     if (req.getServerPort() == 443) http="https"; else http="http";
57     res.setContentType("text/html");
58     String moduleName = req.getParameter("module");
59     
60
61     if(session.getAttribute("Language")==null){
62       setLanguage(req,getAcceptLanguage(req));
63     }
64
65     // Authentifizierung
66     if (moduleName!=null && moduleName.equals("login")) {
67       String user=req.getParameter("login");
68       String passwd= req.getParameter("password");
69       String lang = req.getParameter("lang");
70       theLog.printDebugInfo("--login: evaluating for user: "+user);
71       EntityUsers userEntity = allowedUser(user,passwd);
72       if (userEntity==null) {
73         // login failed: redirecting to login
74         theLog.printWarning("--login: failed!");
75         _sendLoginPage(res,req,res.getWriter());
76         return;
77       } else {
78         // login successful
79
80         //if accept-language!=selected language change language
81         if(!getLanguage(req).equals(lang)){
82           setLanguage(req,lang);
83         }
84
85         theLog.printInfo("--login: successful! setting uid: " + userEntity.getId());
86         session.setAttribute("login.uid", userEntity);
87         theLog.printDebugInfo("--login: trying to retrieve login.target");
88         String target = (String)session.getAttribute("login.target");
89         if (target != null) {
90           theLog.printDebugInfo("Redirect: "+target);
91           int serverPort = req.getServerPort();
92           String redirect = "";
93           if(serverPort==80){
94             redirect = "<html><head><meta http-equiv=refresh content=\0421;URL="
95                     + res.encodeURL(http +"://" + req.getServerName() + target)
96                     + "\"></head><body>going " + target + "</body></html>";
97           } else {
98             redirect = "<html><head><meta http-equiv=refresh content=\0421;URL="
99                     + res.encodeURL(http +"://" + req.getServerName() +":"+ serverPort + target)
100                     + "\"></head><body>going " + target + "</body></html>";
101           }
102           //res.getWriter().println(redirect);
103                                         
104                                         res.encodeRedirectURL(http + "://" + req.getServerName()
105                                                                                                                                         + ":" +req.getServerPort() + target);
106                                         
107         } else {
108                                         theLog.printDebugInfo("testurl: "+res.encodeURL(""));
109                                         theLog.printDebugInfo("querystring: "+req.getQueryString());
110           // redirecting to default target
111           //theLog.printDebugInfo("--login: no target - redirecting to default");
112           _sendStartPage(res,req, res.getWriter(),userEntity);
113         }
114         return;
115       } // if login succesful
116     } // if login
117
118     if (moduleName!=null && moduleName.equals("logout")) {
119       theLog.printDebugInfo("--logout");
120       session.invalidate();
121       _sendLoginPage(res,req,res.getWriter());
122       return;
123     }
124
125     // Check if authed!
126     EntityUsers userEntity = (EntityUsers)session.getAttribute("login.uid");
127     if (userEntity == null) {
128       // redirect to loginpage
129       String redirectString = req.getRequestURI();
130       if (req.getQueryString()!=null) redirectString += "?" + req.getQueryString();
131       theLog.printDebugInfo("STORING: " + redirectString);
132       session.setAttribute("login.target", redirectString);
133       _sendLoginPage(res,req,res.getWriter());
134       return;
135     }
136
137     // Bei blossem Serveltaufruf redirect auf Standardstarttemplate
138     if (moduleName == null || moduleName.equals("")) {
139       _sendStartPage(res,req, res.getWriter(),userEntity);
140       return;
141     }
142
143     //From now on normal Dispatching...
144     try {
145       try {
146         theServletModule = Class.forName("mircoders.servlet.ServletModule" + moduleName);
147       } catch (ClassNotFoundException e) {
148         // searching Servlet webdb.servlet-classes
149         theServletModule = Class.forName("mir.servlet.ServletModule" + moduleName);
150       }
151       //Instanciate the ServletModule
152       Method m = theServletModule.getMethod("getInstance",null);
153       smod = (ServletModule)m.invoke(null,null);
154       ServletModuleDispatch.dispatch(smod,req,res);
155     }
156     catch (NoSuchMethodException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " getInstance() nicht gefunden."); }
157     catch (InvocationTargetException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " target nicht gefunden."); }
158     catch (ClassNotFoundException e) { handleError(res, res.getWriter(), "ServletModule" + moduleName + " nicht gefunden."); }
159     catch (IllegalArgumentException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " nicht gefunden."); }
160     catch (ServletModuleException e){ handleError(res,res.getWriter(), "ServletException in Module ServletModule" + moduleName + " -- " + e.toString()); }
161     catch (IllegalAccessException e){
162         handleError(res,res.getWriter(), "Kein Zugriff auf Klasse ServletModule" + moduleName + " -- " + e.toString()); }
163
164     // timing...
165     sessionConnectTime = new java.util.Date().getTime() - startTime;
166     theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
167   }
168
169   private void handleError(HttpServletResponse res, PrintWriter out, String errorString) {
170     try {
171       theLog.printError(errorString);
172       SimpleHash modelRoot = new SimpleHash();
173       modelRoot.put("errorstring", new SimpleScalar(errorString));
174       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
175       HTMLTemplateProcessor.process(res,Configuration.getProperty("Mir.ErrorTemplate"),modelRoot,out);
176       out.close();
177     }
178     catch (Exception e) {
179       System.err.println("Fehler in ErrorTemplate");
180     }
181   }
182
183   /**
184    *  evaluate login for user / password
185    */
186   protected EntityUsers allowedUser(String user, String password) {
187     try {
188       if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
189       return usersModule.getUserForLogin(user, password);
190     }
191     catch(Exception e) { theLog.printDebugInfo(e.toString()); return null; }
192   }
193
194   // Redirect-methods
195   private void _sendLoginPage(HttpServletResponse res,HttpServletRequest req, PrintWriter out) {
196     String loginTemplate = "login.template";
197     try {
198       theLog.printDebugInfo("login: "+lang);
199       if(lang==null){
200         lang=getAcceptLanguage(req);
201       }
202       HTMLTemplateProcessor.process(res,lang+"/"+loginTemplate, new SimpleHash(), out);
203     } catch(HTMLParseException e) {
204       handleError(res, out, "fehler in logintemplate.");
205     }
206   }
207
208   private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
209     String startTemplate = "start_admin.template";
210                 String sessionUrl=res.encodeURL("");
211                 theLog.printDebugInfo("testurl: "+sessionUrl);
212     try {
213       // merge with logged in user and messages
214       SimpleHash mergeData = new SimpleHash();
215                         mergeData.put("session",sessionUrl);
216       mergeData.put("login_user", HTMLTemplateProcessor.makeSimpleHash(userEntity));
217       if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
218       mergeData.put("messages", HTMLTemplateProcessor.makeSimpleList(messageModule.getByWhereClause(null, "webdb_create desc",0,10)));
219       HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+startTemplate, mergeData,out);
220     }
221     catch(Exception e) {
222       handleError( res,out, "error while trying to send startpage. " + e.toString());
223     }
224   }
225
226   public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
227
228 }
229