001: /*
002: JSPWiki - a JSP-based WikiWiki clone.
003:
004: Copyright (C) 2001-2002 Janne Jalkanen (Janne.Jalkanen@iki.fi)
005:
006: This program is free software; you can redistribute it and/or modify
007: it under the terms of the GNU Lesser General Public License as published by
008: the Free Software Foundation; either version 2.1 of the License, or
009: (at your option) any later version.
010:
011: This program is distributed in the hope that it will be useful,
012: but WITHOUT ANY WARRANTY; without even the implied warranty of
013: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: GNU Lesser General Public License for more details.
015:
016: You should have received a copy of the GNU Lesser General Public License
017: along with this program; if not, write to the Free Software
018: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020: package com.ecyrd.jspwiki.xmlrpc;
021:
022: import java.security.Permission;
023: import java.util.*;
024:
025: import org.apache.xmlrpc.AuthenticationFailed;
026:
027: import com.ecyrd.jspwiki.WikiContext;
028: import com.ecyrd.jspwiki.WikiEngine;
029: import com.ecyrd.jspwiki.WikiPage;
030: import com.ecyrd.jspwiki.auth.AuthorizationManager;
031: import com.ecyrd.jspwiki.auth.permissions.PagePermission;
032: import com.ecyrd.jspwiki.auth.permissions.WikiPermission;
033:
034: /**
035: * Provides definitions for RPC handler routines.
036: *
037: * @author Janne Jalkanen
038: * @since 1.6.13
039: */
040:
041: public abstract class AbstractRPCHandler implements WikiRPCHandler {
042: /** Error code: no such page. */
043: public static final int ERR_NOPAGE = 1;
044: public static final int ERR_NOPERMISSION = 2;
045:
046: /**
047: * Link to a local wiki page.
048: */
049: public static final String LINK_LOCAL = "local";
050:
051: /**
052: * Link to an external resource.
053: */
054: public static final String LINK_EXTERNAL = "external";
055:
056: /**
057: * This is an inlined image.
058: */
059: public static final String LINK_INLINE = "inline";
060:
061: protected WikiEngine m_engine;
062: protected WikiContext m_context;
063:
064: /**
065: * This is the currently implemented JSPWiki XML-RPC code revision.
066: */
067: public static final int RPC_VERSION = 1;
068:
069: public void initialize(WikiContext context) {
070: m_context = context;
071: m_engine = context.getEngine();
072: }
073:
074: protected abstract Hashtable encodeWikiPage(WikiPage p);
075:
076: public Vector getRecentChanges(Date since) {
077: checkPermission(PagePermission.VIEW);
078: Collection pages = m_engine.getRecentChanges();
079: Vector result = new Vector();
080:
081: // Transform UTC into local time.
082: Calendar cal = Calendar.getInstance();
083: cal.setTime(since);
084: cal.add(Calendar.MILLISECOND,
085: (cal.get(Calendar.ZONE_OFFSET) + (cal.getTimeZone()
086: .inDaylightTime(since) ? cal
087: .get(Calendar.DST_OFFSET) : 0)));
088:
089: for (Iterator i = pages.iterator(); i.hasNext();) {
090: WikiPage page = (WikiPage) i.next();
091:
092: if (page.getLastModified().after(cal.getTime())) {
093: result.add(encodeWikiPage(page));
094: }
095: }
096:
097: return result;
098: }
099:
100: /**
101: * Checks whether the current user has permission to perform the RPC action;
102: * throws an exception if not allowed by {@link com.ecyrd.jspwiki.auth.AuthorizationManager}.
103: *
104: * @throws AuthenticationFailed A RuntimeException, if the authentication fails and the user has no permission.
105: * @param perm the Permission to check
106: */
107: protected void checkPermission(Permission perm) {
108: AuthorizationManager mgr = m_engine.getAuthorizationManager();
109:
110: if (mgr.checkPermission(m_context.getWikiSession(), perm))
111: return;
112:
113: throw new AuthenticationFailed(
114: "You have no access to this resource, o master");
115: }
116:
117: /**
118: * Returns the current supported JSPWiki XML-RPC API.
119: */
120: public int getRPCVersionSupported() {
121: checkPermission(WikiPermission.LOGIN);
122:
123: return RPC_VERSION;
124: }
125: }
|