session-tracking over get-param, if browser does not allow cookies.
[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   public HttpSession session;
34
35
36   public void doGet(HttpServletRequest req, HttpServletResponse res)
37     throws ServletException, IOException {
38     doPost(req,res);
39   }
40
41   public void doPost(HttpServletRequest req, HttpServletResponse res)
42     throws ServletException, IOException {
43
44     long            startTime = (new java.util.Date()).getTime();
45     Class           theServletModule;
46     ServletModule   smod;
47     long            sessionConnectTime=0;
48     String          http="";
49
50     // get the configration
51     if (!confed){
52       confed = getConfig(req);
53     }
54
55     session = req.getSession(true);
56       
57     if (req.getServerPort() == 443) http="https"; else http="http";
58     res.setContentType("text/html");
59     String moduleName = req.getParameter("module");
60
61     if(session.getAttribute("Language")==null){
62       setLanguage(session,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,session).equals(lang)){
82           setLanguage(session,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         
90         if (target != null) {
91           theLog.printDebugInfo("Redirect: "+target);
92           int serverPort = req.getServerPort();
93           String redirect = "";
94           String redirectString ="";
95           
96           
97           if(serverPort==80){
98             redirect=res.encodeURL(http + "://" + req.getServerName() + target);
99             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
100                     + redirect
101                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
102           } else {
103             redirect=res.encodeURL(http + "://" + req.getServerName() + ":" +req.getServerPort() + target);
104             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
105                     + redirect
106                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
107           }
108           res.getWriter().println(redirectString);
109           
110           
111           //res.sendRedirect(redirect);
112           
113         } else {
114           // redirecting to default target
115           theLog.printDebugInfo("--login: no target - redirecting to default");
116           _sendStartPage(res,req,res.getWriter(),userEntity);
117         }
118         return;
119       } // if login succesful
120     } // if login
121
122     if (moduleName!=null && moduleName.equals("logout")) {
123       theLog.printDebugInfo("--logout");
124       session.invalidate();
125       _sendLoginPage(res,req,res.getWriter());
126       return;
127     }
128
129     // Check if authed!
130     EntityUsers userEntity = (EntityUsers)session.getAttribute("login.uid");
131     if (userEntity == null) {
132       // redirect to loginpage
133       String redirectString = req.getRequestURI();
134       if (req.getQueryString()!=null) redirectString += "?" + req.getQueryString();
135       theLog.printDebugInfo("STORING: " + redirectString);
136       session.setAttribute("login.target", redirectString);
137       _sendLoginPage(res,req,res.getWriter());
138       return;
139     }
140
141     // Bei blossem Serveltaufruf redirect auf Standardstarttemplate
142     if (moduleName == null || moduleName.equals("")) {
143       theLog.printDebugInfo("no module: redirect to standardpage");
144       _sendStartPage(res,req, res.getWriter(),userEntity);
145       return;
146     }
147
148     //From now on normal Dispatching...
149     try {
150       try {
151         theServletModule = Class.forName("mircoders.servlet.ServletModule" + moduleName);
152       } catch (ClassNotFoundException e) {
153         // searching Servlet webdb.servlet-classes
154         theServletModule = Class.forName("mir.servlet.ServletModule" + moduleName);
155       }
156       //Instanciate the ServletModule
157       Method m = theServletModule.getMethod("getInstance",null);
158       smod = (ServletModule)m.invoke(null,null);
159       ServletModuleDispatch.dispatch(smod,req,res);
160     }
161     catch (NoSuchMethodException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " getInstance() nicht gefunden."); }
162     catch (InvocationTargetException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " target nicht gefunden."); }
163     catch (ClassNotFoundException e) { handleError(res, res.getWriter(), "ServletModule" + moduleName + " nicht gefunden."); }
164     catch (IllegalArgumentException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " nicht gefunden."); }
165     catch (ServletModuleException e){ handleError(res,res.getWriter(), "ServletException in Module ServletModule" + moduleName + " -- " + e.toString()); }
166     catch (IllegalAccessException e){
167         handleError(res,res.getWriter(), "Kein Zugriff auf Klasse ServletModule" + moduleName + " -- " + e.toString()); }
168
169     // timing...
170     sessionConnectTime = new java.util.Date().getTime() - startTime;
171     theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
172   }
173
174   private void handleError(HttpServletResponse res, PrintWriter out, String errorString) {
175     try {
176       theLog.printError(errorString);
177       SimpleHash modelRoot = new SimpleHash();
178       modelRoot.put("errorstring", new SimpleScalar(errorString));
179       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
180       HTMLTemplateProcessor.process(res,Configuration.getProperty("Mir.ErrorTemplate"),modelRoot,out);
181       out.close();
182     }
183     catch (Exception e) {
184       System.err.println("Fehler in ErrorTemplate");
185     }
186   }
187
188   /**
189    *  evaluate login for user / password
190    */
191   protected EntityUsers allowedUser(String user, String password) {
192     try {
193       if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
194       return usersModule.getUserForLogin(user, password);
195     }
196     catch(Exception e) { theLog.printDebugInfo(e.toString()); return null; }
197   }
198
199   // Redirect-methods
200   private void _sendLoginPage(HttpServletResponse res,HttpServletRequest req, PrintWriter out) {
201     String loginTemplate = "login.template";
202     String sessionUrl=res.encodeURL("");
203     //session = req.getSession(true);
204     try {
205       theLog.printDebugInfo("login: "+lang);
206       if(lang==null){
207         lang=getAcceptLanguage(req);
208       }
209       SimpleHash mergeData = new SimpleHash();
210       mergeData.put("session",sessionUrl);
211       HTMLTemplateProcessor.process(res,lang+"/"+loginTemplate, mergeData, out);
212     } catch(HTMLParseException e) {
213       handleError(res, out, "fehler in logintemplate.");
214     }
215   }
216
217   private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
218     String startTemplate = "start_admin.template";
219     String sessionUrl=res.encodeURL("");
220     try {
221       // merge with logged in user and messages
222       SimpleHash mergeData = new SimpleHash();
223       mergeData.put("session",sessionUrl);
224       mergeData.put("login_user", HTMLTemplateProcessor.makeSimpleHash(userEntity));
225       if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
226       mergeData.put("messages", HTMLTemplateProcessor.makeSimpleList(messageModule.getByWhereClause(null, "webdb_create desc",0,10)));
227       HTMLTemplateProcessor.process(res,getLanguage(req,session)+"/"+startTemplate, mergeData,out);
228     }
229     catch(Exception e) {
230       handleError( res,out, "error while trying to send startpage. " + e.toString());
231     }
232   }
233
234   public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
235
236 }
237