    001/*
    002    Licensed to the Apache Software Foundation (ASF) under one
    003    or more contributor license agreements.  See the NOTICE file
    004    distributed with this work for additional information
    005    regarding copyright ownership.  The ASF licenses this file
    006    to you under the Apache License, Version 2.0 (the
    007    "License"); you may not use this file except in compliance
    008    with the License.  You may obtain a copy of the License at
    009
    010       http://www.apache.org/licenses/LICENSE-2.0
    011
    012    Unless required by applicable law or agreed to in writing,
    013    software distributed under the License is distributed on an
    014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015    KIND, either express or implied.  See the License for the
    016    specific language governing permissions and limitations
    017    under the License.
    018 */
    019package org.apache.wiki.xmlrpc;
    020
    021import org.apache.wiki.api.core.Context;
    022import org.apache.wiki.api.core.Engine;
    023import org.apache.wiki.api.core.Page;
    024import org.apache.wiki.auth.AuthorizationManager;
    025import org.apache.wiki.auth.permissions.PagePermission;
    026import org.apache.wiki.auth.permissions.WikiPermission;
    027import org.apache.wiki.pages.PageManager;
    028import org.apache.xmlrpc.AuthenticationFailed;
    029
    030import java.security.Permission;
    031import java.util.Calendar;
    032import java.util.Date;
    033import java.util.Hashtable;
    034import java.util.Set;
    035import java.util.Vector;
    036
    037/**
    038 *  Provides definitions for RPC handler routines.
    039 *
    040 *  @since 1.6.13
    041 */
    042
    043public abstract class AbstractRPCHandler implements WikiRPCHandler {
    044
    045    /** Error code: no such page. */
    046    public static final int ERR_NOPAGE       = 1;
    047    public static final int ERR_NOPERMISSION = 2;
    048
    049    /** Link to a local wiki page. */
    050    public static final String LINK_LOCAL    = "local";
    051
    052    /** Link to an external resource. */
    053    public static final String LINK_EXTERNAL = "external";
    054
    055    /** This is an inlined image. */
    056    public static final String LINK_INLINE   = "inline";
    057
    058    protected Engine m_engine;
    059    protected Context m_context;
    060
    061    /** This is the currently implemented JSPWiki XML-RPC code revision. */
    062    public static final int RPC_VERSION = 1;
    063
    064    @Override
    065    public void initialize( final Context context ) {
    066        m_context = context;
    067        m_engine  = context.getEngine();
    068    }
    069
    070    protected abstract Hashtable encodeWikiPage( Page p );
    071
    072    public Vector getRecentChanges( final Date since ) {
    073        checkPermission( PagePermission.VIEW );
    074        final Set< Page > pages = m_engine.getManager( PageManager.class ).getRecentChanges();
    075        final Vector< Hashtable< ?, ? > > result = new Vector<>();
    076
    077        // Transform UTC into local time.
    078        final Calendar cal = Calendar.getInstance();
    079        cal.setTime( since );
    080        cal.add( Calendar.MILLISECOND, cal.get( Calendar.ZONE_OFFSET ) +
    081                  (cal.getTimeZone().inDaylightTime( since ) ? cal.get( Calendar.DST_OFFSET ) : 0 ) );
    082
    083        for( final Page page : pages ) {
    084            if( page.getLastModified().after( cal.getTime() ) ) {
    085                result.add( encodeWikiPage( page ) );
    086            }
    087        }
    088
    089        return result;
    090    }
    091
    092    /**
    093     *  Checks whether the current user has permission to perform the RPC action;
    094     *  throws an exception if not allowed by {@link org.apache.wiki.auth.AuthorizationManager}.
    095     *
    096     *  @param perm the Permission to check
    097     */
    098    protected void checkPermission( final Permission perm ) {
    099        final AuthorizationManager mgr = m_engine.getManager( AuthorizationManager.class );
    100
    101        if( mgr.checkPermission( m_context.getWikiSession(), perm ) ) {
    102            return;
    103        }
    104
    105        throw new AuthenticationFailed( "You have no access to this resource, o master" );
    106    }
    107
    108    /**
    109     *  Returns the current supported JSPWiki XML-RPC API.
    110     */
    111    public int getRPCVersionSupported() {
    112        checkPermission( WikiPermission.LOGIN );
    113        return RPC_VERSION;
    114    }
    115
    116}