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     */
019    package org.apache.wiki.auth.permissions;
020    
021    import java.io.Serializable;
022    import java.security.Permission;
023    import 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     */
031    public 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        protected AllPermission()
041        {
042            this(null);
043        }
044        
045        /**
046         * Creates a new AllPermission for the given wikis.
047         * 
048         * @param wiki the wiki to which the permission should apply.  If null, will
049         *             apply to all wikis.
050         */
051        public AllPermission( String wiki )
052        {
053            super( wiki );
054            m_wiki = ( wiki == null ) ? WILDCARD : wiki;
055        }
056    
057        /**
058         * Two AllPermission objects are considered equal if their wikis are equal.
059         * @see java.lang.Object#equals(java.lang.Object)
060         * 
061         * @return {@inheritDoc}
062         * @param obj {@inheritDoc}
063         */
064        public boolean equals( Object obj )
065        {
066            if ( !( obj instanceof AllPermission ) )
067            {
068                return false;
069            }
070            AllPermission p = (AllPermission) obj;
071            return p.m_wiki != null && p.m_wiki.equals( m_wiki );
072        }
073    
074        /**
075         * No-op; always returns <code>null</code>
076         * @see java.security.Permission#getActions()
077         *
078         * @return Always null.
079         */
080        public String getActions()
081        {
082            return null;
083        }
084    
085        /**
086         * Returns the name of the wiki containing the page represented by this
087         * permission; may return the wildcard string.
088         * @return The wiki
089         */
090        public String getWiki()
091        {
092            return m_wiki;
093        }
094    
095        /**
096         * Returns the hash code for this WikiPermission.
097         * @see java.lang.Object#hashCode()
098         * 
099         * @return {@inheritDoc}
100         */
101        public int hashCode()
102        {
103            return m_wiki.hashCode();
104        }
105    
106        /**
107         * WikiPermission can only imply other WikiPermissions; no other permission
108         * types are implied. One WikiPermission implies another if all of the other
109         * WikiPermission's actions are equal to, or a subset of, those for this
110         * permission.
111         * @param permission the permission which may (or may not) be implied by
112         *            this instance
113         * @return <code>true</code> if the permission is implied,
114         *         <code>false</code> otherwise
115         * @see java.security.Permission#implies(java.security.Permission)
116         */
117        public boolean implies( Permission permission )
118        {
119            // Permission must be a JSPWiki permission, PagePermission or AllPermission
120            if ( !isJSPWikiPermission( permission ) )
121            {
122                return false;
123            }
124            String wiki = null;
125            if ( permission instanceof AllPermission )
126            {
127                wiki = ( (AllPermission) permission ).getWiki();
128            }
129            else if ( permission instanceof PagePermission )
130            {
131                wiki = ( (PagePermission) permission ).getWiki();
132            }
133            if ( permission instanceof WikiPermission )
134            {
135                wiki = ( (WikiPermission) permission ).getWiki();
136            }
137            if ( permission instanceof GroupPermission )
138            {
139                wiki = ( (GroupPermission) permission ).getWiki();
140            }
141    
142            // If the wiki is implied, it's allowed
143            return PagePermission.isSubset( m_wiki, wiki );
144        }
145    
146        /**
147         * Returns a new {@link AllPermissionCollection}.
148         * @see java.security.Permission#newPermissionCollection()
149         * 
150         * @return {@inheritDoc}
151         */
152        public PermissionCollection newPermissionCollection()
153        {
154            return new AllPermissionCollection();
155        }
156    
157        /**
158         * Prints a human-readable representation of this permission.
159         * @see java.lang.Object#toString()
160         * @return {@inheritDoc}
161         */
162        public String toString()
163        {
164            return "(\"" + this.getClass().getName() + "\",\"" + m_wiki + "\")";
165        }
166    
167        /**
168         *  Checks if the given permission is one of ours.
169         *  
170         *  @param permission Permission to check
171         *  @return true, if the permission is a JSPWiki permission; false otherwise.
172         */
173        protected static boolean isJSPWikiPermission( Permission permission )
174        {
175            return   permission instanceof WikiPermission ||
176                     permission instanceof PagePermission ||
177                     permission instanceof GroupPermission ||
178                     permission instanceof AllPermission;
179        }
180    
181    }