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 }