/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.util;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamField;
import java.security.Permission;
import java.security.PermissionCollection;
/**
* A {@code PermissionCollection} for holding {@code PropertyPermission}s.
*
* @since Android 1.0
*/
class PropertyPermissionCollection extends PermissionCollection {
private static final long serialVersionUID = 7015263904581634791L;
Hashtable<String, Permission> permissions = new Hashtable<String, Permission>(
30);
@Override
public void add(Permission perm) {
if (!isReadOnly()) {
Permission prev = permissions.put(perm.getName(), perm);
/*
* If the permission already existed but with only "read" or "write"
* set, then replace with both set.
*/
if (prev != null && !prev.getActions().equals(perm.getActions())) {
Permission np = new PropertyPermission(perm.getName(),
"read,write"); //$NON-NLS-1$
permissions.put(perm.getName(), np);
}
} else {
throw new IllegalStateException();
}
}
@Override
public Enumeration<Permission> elements() {
return permissions.elements();
}
@Override
public boolean implies(Permission perm) {
Enumeration<Permission> elemEnum = elements();
while (elemEnum.hasMoreElements()) {
if ((elemEnum.nextElement()).implies(perm)) {
return true;
}
}
/*
* At this point, the only way it can succeed is if both read and write
* are set, and these are separately granted by two different
* permissions with one representing a parent directory.
*/
return perm.getActions().equals("read,write") //$NON-NLS-1$
&& implies(new PropertyPermission(perm.getName(), "read")) //$NON-NLS-1$
&& implies(new PropertyPermission(perm.getName(), "write")); //$NON-NLS-1$
}
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("permissions", Hashtable.class), //$NON-NLS-1$
new ObjectStreamField("all_allowed", Boolean.TYPE) }; //$NON-NLS-1$
private void writeObject(ObjectOutputStream stream) throws IOException {
ObjectOutputStream.PutField fields = stream.putFields();
fields.put("permissions", permissions); //$NON-NLS-1$
fields.put("all_allowed", false); //$NON-NLS-1$
stream.writeFields();
}
@SuppressWarnings("unchecked")
private void readObject(ObjectInputStream stream) throws IOException,
ClassNotFoundException {
ObjectInputStream.GetField fields = stream.readFields();
permissions = (Hashtable<String, Permission>) fields.get(
"permissions", null); //$NON-NLS-1$
}
}
|