49e24dcda45f55a95e17de769528e06a65b9b744
[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       String queryString = req.getQueryString();
135       if (queryString!=null && !queryString.equals("")) {
136         redirectString += "?" + req.getQueryString();
137         theLog.printDebugInfo("STORING: " + redirectString);
138         session.setAttribute("login.target", redirectString);
139       }
140       _sendLoginPage(res,req,res.getWriter());
141       return;
142     }
143
144     // If no module is specified goto standard startpage
145     if (moduleName == null || moduleName.equals("")) {
146       theLog.printDebugInfo("no module: redirect to standardpage");
147       _sendStartPage(res,req, res.getWriter(),userEntity);
148       return;
149     }
150
151     //From now on regular dispatching...
152     try {
153       try {
154         theServletModule = Class.forName("mircoders.servlet.ServletModule" + moduleName);
155       } catch (ClassNotFoundException e) {
156         // searching servletmodule in mir.servlet-classes
157         theServletModule = Class.forName("mir.servlet.ServletModule" + moduleName);
158       }
159       //Instantiate the ServletModule
160       Method m = theServletModule.getMethod("getInstance",null);
161       smod = (ServletModule)m.invoke(null,null);
162       ServletModuleDispatch.dispatch(smod,req,res);
163     }
164     catch (NoSuchMethodException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " getInstance() not found."); }
165     catch (InvocationTargetException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " target not found."); }
166     catch (ClassNotFoundException e) { handleError(res, res.getWriter(), "ServletModule" + moduleName + " not found."); }
167     catch (IllegalArgumentException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " not found."); }
168     catch (ServletModuleException e){ handleError(res,res.getWriter(), "ServletException in Module ServletModule" + moduleName + " -- " + e.toString()); }
169     catch (IllegalAccessException e){
170         handleError(res,res.getWriter(), "No access to class ServletModule" + moduleName + " -- " + e.toString()); }
171
172     // timing...
173     sessionConnectTime = new java.util.Date().getTime() - startTime;
174     theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
175   }
176
177   private void handleError(HttpServletResponse res, PrintWriter out, String errorString) {
178     try {
179       theLog.printError(errorString);
180       SimpleHash modelRoot = new SimpleHash();
181       modelRoot.put("errorstring", new SimpleScalar(errorString));
182       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
183       HTMLTemplateProcessor.process(res,MirConfig.getProp("Mir.ErrorTemplate"),modelRoot,out);
184       out.close();
185     }
186     catch (Exception e) {
187       System.err.println("Error in ErrorTemplate");
188     }
189   }
190
191   /**
192    *  evaluate login for user / password
193    */
194   protected EntityUsers allowedUser(String user, String password) {
195     try {
196       if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
197       return usersModule.getUserForLogin(user, password);
198     }
199     catch(Exception e) { theLog.printDebugInfo(e.toString()); return null; }
200   }
201
202   // Redirect-methods
203   private void _sendLoginPage(HttpServletResponse res,HttpServletRequest req, PrintWriter out) {
204     String loginTemplate = "login.template";
205     String sessionUrl=res.encodeURL("");
206     //session = req.getSession(true);
207     try {
208       theLog.printDebugInfo("login: "+lang);
209       if(lang==null){
210         lang=getAcceptLanguage(req);
211       }
212       SimpleHash mergeData = new SimpleHash();
213       mergeData.put("session",sessionUrl);
214       HTMLTemplateProcessor.process(res,lang+"/"+loginTemplate, mergeData, out);
215     } catch(HTMLParseException e) {
216       handleError(res, out, "Error in logintemplate.");
217     }
218   }
219
220   private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
221     String startTemplate = "start_admin.template";
222     String sessionUrl=res.encodeURL("");
223     try {
224       // merge with logged in user and messages
225       SimpleHash mergeData = new SimpleHash();
226       mergeData.put("session",sessionUrl);
227       mergeData.put("login_user", HTMLTemplateProcessor.makeSimpleHash(userEntity));
228       if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
229       mergeData.put("messages", HTMLTemplateProcessor.makeSimpleList(messageModule.getByWhereClause(null, "webdb_create desc",0,10)));
230       HTMLTemplateProcessor.process(res,getLanguage(req,session)+"/"+startTemplate, mergeData,out);
231     }
232     catch(Exception e) {
233       handleError( res,out, "error while trying to send startpage. " + e.toString());
234     }
235   }
236
237   public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
238
239 }
240