/******************************************************************************* * Copyright (c) 2003, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.osgi.internal.permadmin; import java.io.IOException; import java.security.*; import org.eclipse.osgi.framework.adaptor.PermissionStorage; /** * PermissionStorage privileged action class. This class is not thread safe. Callers * must ensure multiple threads do not call methods on this class at the same time. */ public class SecurePermissionStorage implements PermissionStorage, PrivilegedExceptionAction<String[]> { private final PermissionStorage storage; private String location; private String[] data; private String[] infos; private int action; private static final int GET = 1; private static final int SET = 2; private static final int LOCATION = 3; private static final int GET_INFOS = 4; private static final int SAVE_INFOS = 5; public SecurePermissionStorage(PermissionStorage storage) { this.storage = storage; } public String[] run() throws IOException { switch (action) { case GET : return storage.getPermissionData(location); case SET : storage.setPermissionData(location, data); return null; case LOCATION : return storage.getLocations(); case SAVE_INFOS : storage.saveConditionalPermissionInfos(infos); return null; case GET_INFOS : return storage.getConditionalPermissionInfos(); } throw new UnsupportedOperationException(); } public String[] getPermissionData(String loc) throws IOException { this.location = loc; this.action = GET; try { return AccessController.doPrivileged(this); } catch (PrivilegedActionException e) { throw (IOException) e.getException(); } } public String[] getLocations() throws IOException { this.action = LOCATION; try { return AccessController.doPrivileged(this); } catch (PrivilegedActionException e) { throw (IOException) e.getException(); } } public void setPermissionData(String location, String[] data) throws IOException { this.location = location; this.data = data; this.action = SET; try { AccessController.doPrivileged(this); } catch (PrivilegedActionException e) { throw (IOException) e.getException(); } } public void saveConditionalPermissionInfos(String[] updatedInfos) throws IOException { this.action = SAVE_INFOS; this.infos = updatedInfos; try { AccessController.doPrivileged(this); } catch (PrivilegedActionException e) { throw (IOException) e.getException(); } } public String[] getConditionalPermissionInfos() throws IOException { this.action = GET_INFOS; try { return AccessController.doPrivileged(this); } catch (PrivilegedActionException e) { throw (IOException) e.getException(); } } }