actionroot-quickhack deleted
[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       MirConfig.setServletName(req.getServerName());
54     }
55
56     session = req.getSession(true);
57
58     if (req.getServerPort() == 443) http="https"; else http="http";
59     res.setContentType("text/html");
60     String moduleName = req.getParameter("module");
61
62     if(session.getAttribute("Language")==null){
63       setLanguage(session,getAcceptLanguage(req));
64     }
65
66     // Authentifizierung
67     if (moduleName!=null && moduleName.equals("login")) {
68       String user=req.getParameter("login");
69       String passwd= req.getParameter("password");
70       String lang = req.getParameter("lang");
71       theLog.printDebugInfo("--login: evaluating for user: "+user);
72       EntityUsers userEntity = allowedUser(user,passwd);
73       if (userEntity==null) {
74         // login failed: redirecting to login
75         theLog.printWarning("--login: failed!");
76         _sendLoginPage(res,req,res.getWriter());
77         return;
78       } else {
79         // login successful
80
81         //if accept-language!=selected language change language
82         if(!getLanguage(req,session).equals(lang)){
83           setLanguage(session,lang);
84         }
85
86         theLog.printInfo("--login: successful! setting uid: " + userEntity.getId());
87         session.setAttribute("login.uid", userEntity);
88         theLog.printDebugInfo("--login: trying to retrieve login.target");
89         String target = (String)session.getAttribute("login.target");
90
91         if (target != null) {
92           theLog.printDebugInfo("Redirect: "+target);
93           int serverPort = req.getServerPort();
94           String redirect = "";
95           String redirectString ="";
96
97
98           if(serverPort==80){
99             redirect=res.encodeURL(http + "://" + req.getServerName() + target);
100             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
101                     + redirect
102                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
103           } else {
104             redirect=res.encodeURL(http + "://" + req.getServerName() + ":" +req.getServerPort() + target);
105             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
106                     + redirect
107                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
108           }
109           res.getWriter().println(redirectString);
110
111
112           //res.sendRedirect(redirect);
113
114         } else {
115           // redirecting to default target
116           theLog.printDebugInfo("--login: no target - redirecting to default");
117           _sendStartPage(res,req,res.getWriter(),userEntity);
118         }
119         return;
120       } // if login succesful
121     } // if login
122
123     if (moduleName!=null && moduleName.equals("logout")) {
124       theLog.printDebugInfo("--logout");
125       session.invalidate();
126       _sendLoginPage(res,req,res.getWriter());
127       return;
128     }
129
130     // Check if authed!
131     EntityUsers userEntity = (EntityUsers)session.getAttribute("login.uid");
132     if (userEntity == null) {
133       // redirect to loginpage
134       String redirectString = req.getRequestURI();
135       String queryString = req.getQueryString();
136       if (queryString!=null && !queryString.equals("")) {
137         redirectString += "?" + req.getQueryString();
138         theLog.printDebugInfo("STORING: " + redirectString);
139         session.setAttribute("login.target", redirectString);
140       }
141       _sendLoginPage(res,req,res.getWriter());
142       return;
143     }
144
145     // If no module is specified goto standard startpage
146     if (moduleName == null || moduleName.equals("")) {
147       theLog.printDebugInfo("no module: redirect to standardpage");
148       _sendStartPage(res,req, res.getWriter(),userEntity);
149       return;
150     }
151
152     //From now on regular dispatching...
153     try {
154       try {
155         theServletModule = Class.forName("mircoders.servlet.ServletModule" + moduleName);
156       } catch (ClassNotFoundException e) {
157         // searching servletmodule in mir.servlet-classes
158         theServletModule = Class.forName("mir.servlet.ServletModule" + moduleName);
159       }
160       //Instantiate the ServletModule
161       Method m = theServletModule.getMethod("getInstance",null);
162       smod = (ServletModule)m.invoke(null,null);
163       ServletModuleDispatch.dispatch(smod,req,res);
164     }
165     catch (NoSuchMethodException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " getInstance() not found."); }
166     catch (InvocationTargetException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " target not found."); }
167     catch (ClassNotFoundException e) { handleError(res, res.getWriter(), "ServletModule" + moduleName + " not found."); }
168     catch (IllegalArgumentException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " not found."); }
169     catch (ServletModuleException e){ handleError(res,res.getWriter(), "ServletException in Module ServletModule" + moduleName + " -- " + e.toString()); }
170     catch (IllegalAccessException e){
171         handleError(res,res.getWriter(), "No access to class ServletModule" + moduleName + " -- " + e.toString()); }
172
173     // timing...
174     sessionConnectTime = new java.util.Date().getTime() - startTime;
175     theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
176   }
177
178   private void handleError(HttpServletResponse res, PrintWriter out, String errorString) {
179     try {
180       theLog.printError(errorString);
181       SimpleHash modelRoot = new SimpleHash();
182       modelRoot.put("errorstring", new SimpleScalar(errorString));
183       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
184       HTMLTemplateProcessor.process(res,MirConfig.getProp("Mir.ErrorTemplate"),modelRoot,out);
185       out.close();
186     }
187     catch (Exception e) {
188       System.err.println("Error in ErrorTemplate");
189     }
190   }
191
192   /**
193    *  evaluate login for user / password
194    */
195   protected EntityUsers allowedUser(String user, String password) {
196     try {
197       if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
198       return usersModule.getUserForLogin(user, password);
199     }
200     catch(Exception e) { theLog.printDebugInfo(e.toString()); return null; }
201   }
202
203   // Redirect-methods
204   private void _sendLoginPage(HttpServletResponse res,HttpServletRequest req, PrintWriter out) {
205     String loginTemplate = "login.template";
206     String sessionUrl=res.encodeURL("");
207     //session = req.getSession(true);
208     try {
209       theLog.printDebugInfo("login: "+lang);
210       if(lang==null){
211         lang=getAcceptLanguage(req);
212       }
213       SimpleHash mergeData = new SimpleHash();
214       mergeData.put("session",sessionUrl);
215       HTMLTemplateProcessor.process(res,lang+"/"+loginTemplate, mergeData, out);
216     } catch(HTMLParseException e) {
217       handleError(res, out, "Error in logintemplate.");
218     }
219   }
220
221   private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
222     String startTemplate = "start_admin.template";
223     String sessionUrl=res.encodeURL("");
224     try {
225       // merge with logged in user and messages
226       SimpleHash mergeData = new SimpleHash();
227       mergeData.put("session",sessionUrl);
228       mergeData.put("login_user", HTMLTemplateProcessor.makeSimpleHash(userEntity));
229       if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
230       mergeData.put("messages", HTMLTemplateProcessor.makeSimpleList(messageModule.getByWhereClause(null, "webdb_create desc",0,10)));
231       HTMLTemplateProcessor.process(res,getLanguage(req,session)+"/"+startTemplate, mergeData,out);
232     }
233     catch(Exception e) {
234       handleError( res,out, "error while trying to send startpage. " + e.toString());
235     }
236   }
237
238   public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
239
240 }
241