001    /*
002     * 
003     * $Revision: 15202 $ $Date: 2009-05-15 17:00:44 +0200 (Fri, 15 May 2009) $
004     *
005     * This file is part of ***  M y C o R e  ***
006     * See http://www.mycore.de/ for details.
007     *
008     * This program is free software; you can use it, redistribute it
009     * and / or modify it under the terms of the GNU General Public License
010     * (GPL) as published by the Free Software Foundation; either version 2
011     * of the License or (at your option) any later version.
012     *
013     * This program is distributed in the hope that it will be useful, but
014     * WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program, in a file called gpl.txt or license.txt.
020     * If not, write to the Free Software Foundation Inc.,
021     * 59 Temple Place - Suite 330, Boston, MA  02111-1307 USA
022     */
023    
024    package org.mycore.frontend.wcms;
025    
026    import java.io.File;
027    import java.io.FileOutputStream;
028    import java.io.IOException;
029    import java.util.List;
030    
031    import javax.servlet.http.HttpServletRequest;
032    import javax.servlet.http.HttpServletResponse;
033    
034    import org.apache.log4j.Logger;
035    import org.jdom.Document;
036    import org.jdom.Element;
037    import org.jdom.JDOMException;
038    import org.jdom.input.SAXBuilder;
039    import org.jdom.output.Format;
040    import org.jdom.output.XMLOutputter;
041    import org.jdom.xpath.XPath;
042    import org.mycore.access.MCRAccessInterface;
043    import org.mycore.access.MCRAccessManager;
044    import org.mycore.common.MCRConfiguration;
045    import org.mycore.common.MCRSession;
046    import org.mycore.common.MCRSessionMgr;
047    import org.mycore.user.MCRUser;
048    import org.mycore.user.MCRUserMgr;
049    
050    public class MCRWCMSAdminServlet extends MCRWCMSServlet {
051    
052        private static final long serialVersionUID = 1L;
053    
054        private static Logger LOGGER = Logger.getLogger(MCRWCMSAdminServlet.class);
055    
056        /*
057         * (non-Javadoc)
058         * 
059         * @see wcms.WCMSServlet#processRequest(javax.servlet.http.HttpServletRequest,
060         *      javax.servlet.http.HttpServletResponse)
061         */
062        protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
063    
064            // http://141.35.20.199:8291/servlets/MCRWCMSAdminServlet;jsessionid=32e28trrnp07r?action=logs&sort=date&sortOrder=descending
065    
066            MCRSession mcrSession = MCRSessionMgr.getCurrentSession();
067            String todo = getTodo(request);
068    
069            // generate output XML
070            Element root = new Element("cms");
071            Document jdom = new Document(root);
072            root.addContent(new Element("session").setText(todo));
073            root.addContent(new Element("userID").setText(mcrSession.get("userID").toString()));
074            root.addContent(new Element("userClass").setText(mcrSession.get("userClass").toString()));
075    
076            // process request
077            if (todo.equals("exit")) {
078                exitWCMS(request, response);
079            } else if (todo.equals("getMultimediaConfig")) {
080                Document docOut = new Document(new Element("cms"));
081                getMultimediaConfig(docOut.getRootElement());
082                getLayoutService().sendXML(request, response, docOut);
083            } else if (todo.equals("choose")) {
084                generateXML_managPage(mcrSession, root);
085                getLayoutService().doLayout(request, response, jdom);
086            } else if (todo.equals("logs")) {
087                generateXML_logs(request, root);
088                getLayoutService().doLayout(request, response, jdom);
089            } else if (todo.equals("managGlobal") && mcrSession.get("userClass").equals("admin")) {
090                generateXML_managGlobal(root);
091                getLayoutService().doLayout(request, response, jdom);
092            } else if (todo.equals("saveGlobal") && mcrSession.get("userClass").equals("admin"))
093                generateXML_saveGlobal(request, response);
094            else if (todo.equals("view") && (request.getParameter("file") != null && !request.getParameter("file").equals(""))) {
095                // live content version requested
096                if (request.getParameter("file").toString().subSequence(0, 4).equals("http")) {
097                    String url = request.getParameter("file");
098                    url = url + "?XSL.href=" + request.getParameter("XSL.href");
099                    // archived navi version requested
100                    if (request.getParameter("XSL.navi") != null && !request.getParameter("XSL.navi").equals("")
101                            && !request.getParameter("XSL.navi").toString().subSequence(0, 4).equals("http")) {
102                        url = url + "&XSL.navi=" + request.getParameter("XSL.navi");
103                        response.sendRedirect(response.encodeRedirectURL(url));
104                    } else
105                        response.sendRedirect(response.encodeRedirectURL(url));
106                }
107                // archived content version requested
108                else
109                    getLayoutService().doLayout(request, response, new File(request.getParameter("file")));
110            }
111            // manage read access
112            else if (todo.equals(MCRWCMSUtilities.getPermRightsManagementReadAccess()) && MCRWCMSUtilities.manageReadAccess()) {
113                manageReadAccess(request, response);
114            }
115            // manage wcms access
116            else if (todo.equals(MCRWCMSUtilities.getPermRightsManagementWCMSAccess()) && MCRWCMSUtilities.manageWCMSAccess()) {
117                manageWCMSAdminAccess(request, response);
118            } else
119                getLayoutService().doLayout(request, response, jdom);
120        }
121    
122        private void manageWCMSAdminAccess(HttpServletRequest request, HttpServletResponse response) throws IOException {
123            Element answer = new Element("cms");
124            answer.addContent(new Element("rightsManagement").setAttribute("mode", MCRWCMSUtilities.getPermRightsManagementWCMSAccess()));
125            // add all users to xml
126            answer.getChild("rightsManagement").addContent(MCRUserMgr.instance().getAllUsers().getRootElement().detach());
127            // add admin users to xml
128            Element adminUsers = getWCMSAdminUsers(MCRWCMSUtilities.getPermRightsManagementWCMSAccess());
129            if (adminUsers != null)
130                answer.getChild("rightsManagement").addContent(adminUsers);
131            if (request.getParameter("filter") != null && !request.getParameter("filter").equals("#$#$#")) {
132                answer.getChild("rightsManagement").setAttribute("filteredUser", request.getParameter("filter"));
133            }
134            // render
135            getLayoutService().doLayout(request, response, new Document(answer));
136        }
137    
138        private void manageReadAccess(HttpServletRequest request, HttpServletResponse response) throws IOException {
139            Element answer = new Element("cms");
140            answer.addContent(new Element("rightsManagement").setAttribute("mode", MCRWCMSUtilities.getPermRightsManagementReadAccess()));
141            // add all users to xml
142            answer.getChild("rightsManagement").addContent(MCRUserMgr.instance().getAllUsers().getRootElement().detach());
143            // add admin users to xml
144            Element adminUsers = getWCMSAdminUsers(MCRWCMSUtilities.getPermRightsManagementReadAccess());
145            if (adminUsers != null)
146                answer.getChild("rightsManagement").addContent(adminUsers);
147            getLayoutService().doLayout(request, response, new Document(answer));
148        }
149    
150        /**
151         * Returns an org.jdom.element containing all MCRUsers that have access to
152         * wcms write management
153         * 
154         * @return all wcms write admin users OR null if no user has access
155         */
156        private Element getWCMSAdminUsers(String permission) {
157            MCRUserMgr um = MCRUserMgr.instance();
158            MCRAccessInterface am = MCRAccessManager.getAccessImpl();
159            List<String> userIDs = um.getAllUserIDs();
160            Element adminUsers = (new Element("users")).setAttribute("filter", "administrators");
161            boolean adminsFound = false;
162            for (String userID : userIDs) {
163                MCRUser mcrUser = um.retrieveUser(userID);
164                if (am.checkPermission(permission, mcrUser)) {
165                    adminUsers.addContent(mcrUser.toJDOMElement());
166                    adminsFound = true;
167                }
168            }
169            if (adminsFound)
170                return adminUsers;
171            else
172                return null;
173        }
174    
175        private void exitWCMS(HttpServletRequest request, HttpServletResponse response) throws IOException {
176            if (request.getParameter("address") != null && !request.getParameter("address").equals("")) {
177                String exitURL = request.getParameter("address");
178                response.sendRedirect(response.encodeRedirectURL(exitURL));
179            } else {
180                String exitURL = request.getContextPath() + "/servlets/MCRWCMSAdminServlet?action=choose";
181                response.sendRedirect(response.encodeRedirectURL(exitURL));
182            }
183        }
184    
185        /**
186         * Returns the task for the servlet call
187         * 
188         * @param request
189         * @return
190         */
191        final String getTodo(HttpServletRequest request) {
192            if (request.getParameter("action") != null && !request.getParameter("action").equals("")) {
193                return request.getParameter("action");
194            }
195            if (request.getParameter("todo") != null && !request.getParameter("todo").equals("")) {
196                return request.getParameter("todo");
197            }
198            LOGGER.error("action AND todo == null. Call without a given request parameter.");
199            return null;
200        }
201    
202        @SuppressWarnings("unchecked")
203        public void generateXML_managPage(MCRSession mcrSession, Element root) {
204            List<Element> rootNodes = (List<Element>) mcrSession.get("rootNodes");
205            File[] contentTemplates = new File((MCRConfiguration.instance().getString("MCR.templatePath") + "content/").replace('/', File.separatorChar))
206                    .listFiles();
207            root.addContent(new Element("userRealName").setText(mcrSession.get("userRealName").toString()));
208            root.addContent(new Element("userClass").setText(mcrSession.get("userClass").toString()));
209            root.addContent(new Element("error").setText(""));
210    
211            for (Element rootNode : rootNodes) {
212                root.addContent(new Element("rootNode").setAttribute("href", rootNode.getAttributeValue("href"))
213                        .setText(rootNode.getTextTrim()));
214            }
215    
216            Element templates = new Element("templates");
217            Element contentTemp = new Element("content");
218    
219            for (int i = 0; i < contentTemplates.length; i++) {
220                if (!contentTemplates[i].isDirectory()) {
221                    contentTemp.addContent(new Element("template").setText(contentTemplates[i].getName()));
222                }
223            }
224    
225            templates.addContent(contentTemp);
226            root.addContent(templates);
227        }
228    
229        public void generateXML_logs(HttpServletRequest request, Element rootOut) {
230            String sort = request.getParameter("sort");
231            String sortOrder = request.getParameter("sortOrder");
232            String error;
233    
234            try {
235                File logFile = new File(MCRConfiguration.instance().getString("MCR.WCMS.logFile").replace('/', File.separatorChar));
236    
237                if (!logFile.exists()) {
238                    error = "Logfile nicht gefunden!";
239                }
240    
241                Element root = new SAXBuilder().build(logFile).getRootElement();
242                Element test = (Element) root.clone();
243                rootOut.addContent(test);
244            } catch (Exception e) {
245                error = e.getMessage();
246    
247                System.out.println(error);
248            }
249    
250            rootOut.addContent(new Element("sort").setAttribute("order", sortOrder).setText(sort));
251        }
252    
253        public void generateXML_managGlobal(Element rootOut) {
254            // generate template list
255            rootOut.addContent(getTemplates());
256        }
257    
258        public void generateXML_saveGlobal(HttpServletRequest request, HttpServletResponse response) {
259            try {
260                String pathToNavi = new String(MCRConfiguration.instance().getString("MCR.navigationFile").replace('/', File.separatorChar));
261                Document naviBase = new Document();
262                naviBase = XMLFile2JDOM(pathToNavi);
263    
264                Element NaviBaseRoot = naviBase.getRootElement();
265    
266                // save default template if changed
267                // get default template from navigatioBase
268                String defaultTemplateNaviBase = XPath.newInstance("/navigation/@template").valueOf(naviBase);
269    
270                // get set def. templ. by aif
271                String defaultTemplateAIF = new String();
272    
273                if ((request.getParameter("defTempl") != null) && !(request.getParameter("defTempl").equals(""))) {
274                    defaultTemplateAIF = request.getParameter("defTempl");
275                }
276    
277                if (!(defaultTemplateNaviBase.equals(defaultTemplateAIF))) {
278                    // save changed naviBase
279                    NaviBaseRoot.setAttribute("template", defaultTemplateAIF);
280    
281                    File navigationBase = new File(MCRConfiguration.instance().getString("MCR.navigationFile").replace('/', File.separatorChar));
282                    XMLOutputter xmlOut = new XMLOutputter(Format.getRawFormat().setTextMode(Format.TextMode.PRESERVE).setEncoding("UTF-8"));
283                    xmlOut.output(naviBase, new FileOutputStream(navigationBase));
284                }
285    
286                // forward to strarting page
287                String address = new String();
288                StringBuffer buffer = request.getRequestURL();
289                String queryString = request.getQueryString();
290    
291                if (queryString != null) {
292                    buffer.append("?").append(queryString);
293                }
294    
295                address = buffer.toString();
296    
297                String contextPath = request.getContextPath() + "/";
298                int pos = address.indexOf(contextPath, 9);
299                address = address.substring(0, pos) + contextPath + "servlets/MCRWCMSLoginServlet";
300                response.sendRedirect(response.encodeRedirectURL(response.encodeURL(address)));
301            } catch (JDOMException e) {
302                // TODO Auto-generated catch block
303                e.printStackTrace();
304            } catch (IOException e) {
305                // TODO Auto-generated catch block
306                e.printStackTrace();
307            }
308        }
309    
310        /*
311         * public boolean exitWCMS(HttpServletRequest request) { if
312         * (request.getParameter("back") != null &&
313         * request.getParameter("back").equals("true")) return true; return false; }
314         */
315    
316    }