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