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.auth.permissions;
020
021import java.io.Serializable;
022import java.security.Permission;
023import java.security.PermissionCollection;
024
025/**
026 * <p>
027 * Permission to perform all operations on a given wiki.
028 * </p>
029 * @since 2.3.80
030 */
031public final class AllPermission extends Permission implements Serializable {
032
033    private static final long serialVersionUID = 1L;
034
035    private static final String WILDCARD = "*";
036
037    private final String m_wiki;
038
039    /** For serialization purposes. */
040    AllPermission() {
041        this( null );
042    }
043
044    /**
045     * Creates a new AllPermission for the given wikis.
046     *
047     * @param wiki the wiki to which the permission should apply.  If null, will
048     *             apply to all wikis.
049     */
050    public AllPermission( final String wiki ) {
051        super( wiki );
052        m_wiki = ( wiki == null ) ? WILDCARD : wiki;
053    }
054
055    /**
056     * Two AllPermission objects are considered equal if their wikis are equal.
057     *
058     * @param obj {@inheritDoc}
059     * @return {@inheritDoc}
060     * @see java.lang.Object#equals(java.lang.Object)
061     */
062    public boolean equals( final Object obj ) {
063        if( !( obj instanceof AllPermission ) ) {
064            return false;
065        }
066        final AllPermission p = ( AllPermission )obj;
067        return p.m_wiki != null && p.m_wiki.equals( m_wiki );
068    }
069
070    /**
071     * No-op; always returns <code>null</code>
072     *
073     * @return Always null.
074     * @see java.security.Permission#getActions()
075     */
076    @Override
077    public String getActions() {
078        return null;
079    }
080
081    /**
082     * Returns the name of the wiki containing the page represented by this
083     * permission; may return the wildcard string.
084     *
085     * @return The wiki
086     */
087    public String getWiki() {
088        return m_wiki;
089    }
090
091    /**
092     * Returns the hash code for this WikiPermission.
093     *
094     * @return {@inheritDoc}
095     * @see java.lang.Object#hashCode()
096     */
097    public int hashCode() {
098        return m_wiki.hashCode();
099    }
100
101    /**
102     * WikiPermission can only imply other WikiPermissions; no other permission
103     * types are implied. One WikiPermission implies another if all of the other
104     * WikiPermission's actions are equal to, or a subset of, those for this
105     * permission.
106     *
107     * @param permission the permission which may (or may not) be implied by
108     *                   this instance
109     * @return <code>true</code> if the permission is implied,
110     * <code>false</code> otherwise
111     * @see java.security.Permission#implies(java.security.Permission)
112     */
113    @Override
114    public boolean implies(final Permission permission ) {
115        // Permission must be a JSPWiki permission, PagePermission or AllPermission
116        if( !PermissionChecks.isJSPWikiPermission( permission ) ) {
117            return false;
118        }
119        String wiki = null;
120        if( permission instanceof AllPermission ) {
121            wiki = ( ( AllPermission )permission ).getWiki();
122        } else if( permission instanceof PagePermission ) {
123            wiki = ( ( PagePermission )permission ).getWiki();
124        }
125        if( permission instanceof WikiPermission ) {
126            wiki = ( ( WikiPermission )permission ).getWiki();
127        }
128        if( permission instanceof GroupPermission ) {
129            wiki = ( ( GroupPermission )permission ).getWiki();
130        }
131
132        // If the wiki is implied, it's allowed
133        return PagePermission.isSubset( m_wiki, wiki );
134    }
135
136    /**
137     * Returns a new {@link AllPermissionCollection}.
138     *
139     * @return {@inheritDoc}
140     * @see java.security.Permission#newPermissionCollection()
141     */
142    @Override
143    public PermissionCollection newPermissionCollection() {
144        return new AllPermissionCollection();
145    }
146
147    /**
148     * Prints a human-readable representation of this permission.
149     *
150     * @return {@inheritDoc}
151     * @see java.lang.Object#toString()
152     */
153    public String toString() {
154        return "(\"" + this.getClass().getName() + "\",\"" + m_wiki + "\")";
155    }
156
157}