You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by oz...@apache.org on 2007/03/21 22:54:03 UTC
svn commit: r521013 - in /jakarta/slide/trunk/wck: conf/Domain.xml
src/org/apache/slide/simple/reference/WebdavFileStore.java
src/org/apache/slide/simple/store/WebdavStoreAdapter.java
src/org/apache/slide/simple/store/WebdavStorePermissionExtension.java
Author: ozeigermann
Date: Wed Mar 21 14:54:02 2007
New Revision: 521013
URL: http://svn.apache.org/viewvc?view=rev&rev=521013
Log:
Added a SecurityStore option to WCK
Added:
jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStorePermissionExtension.java
Modified:
jakarta/slide/trunk/wck/conf/Domain.xml
jakarta/slide/trunk/wck/src/org/apache/slide/simple/reference/WebdavFileStore.java
jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStoreAdapter.java
Modified: jakarta/slide/trunk/wck/conf/Domain.xml
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/wck/conf/Domain.xml?view=diff&rev=521013&r1=521012&r2=521013
==============================================================================
--- jakarta/slide/trunk/wck/conf/Domain.xml (original)
+++ jakarta/slide/trunk/wck/conf/Domain.xml Wed Mar 21 14:54:02 2007
@@ -34,7 +34,11 @@
<reference store="nodestore"/>
</macrostore-->
<!--lockstore classname="org.apache.slide.store.mem.TransientLockStore"/-->
- <securitystore classname="org.apache.slide.store.mem.TransientSecurityStore"/>
+ <!--securitystore classname="org.apache.slide.store.mem.TransientSecurityStore"/-->
+ <securitystore>
+ <reference store="nodestore"/>
+ </securitystore>
+
</store>
<store name="memory">
<nodestore classname="org.apache.slide.store.mem.TransientNodeStore"/>
Modified: jakarta/slide/trunk/wck/src/org/apache/slide/simple/reference/WebdavFileStore.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/wck/src/org/apache/slide/simple/reference/WebdavFileStore.java?view=diff&rev=521013&r1=521012&r2=521013
==============================================================================
--- jakarta/slide/trunk/wck/src/org/apache/slide/simple/reference/WebdavFileStore.java (original)
+++ jakarta/slide/trunk/wck/src/org/apache/slide/simple/reference/WebdavFileStore.java Wed Mar 21 14:54:02 2007
@@ -25,18 +25,25 @@
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
import java.security.Principal;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -47,7 +54,9 @@
import org.apache.slide.common.ServiceAccessException;
import org.apache.slide.common.ServiceParameterErrorException;
import org.apache.slide.common.ServiceParameterMissingException;
+import org.apache.slide.common.Uri;
import org.apache.slide.security.AccessDeniedException;
+import org.apache.slide.security.NodePermission;
import org.apache.slide.security.UnauthenticatedException;
import org.apache.slide.simple.store.BasicWebdavStore;
import org.apache.slide.simple.store.WebdavStoreAdapter;
@@ -56,6 +65,7 @@
import org.apache.slide.simple.store.WebdavStoreMacroCopyExtension;
import org.apache.slide.simple.store.WebdavStoreMacroDeleteExtension;
import org.apache.slide.simple.store.WebdavStoreMacroMoveExtension;
+import org.apache.slide.simple.store.WebdavStorePermissionExtension;
import org.apache.slide.store.util.FileHelper;
import org.apache.slide.structure.ObjectAlreadyExistsException;
import org.apache.slide.structure.ObjectNotFoundException;
@@ -159,15 +169,17 @@
* @version $Revision$
*/
public class WebdavFileStore implements BasicWebdavStore, WebdavStoreLockExtension, WebdavStoreBulkPropertyExtension,
- WebdavStoreMacroCopyExtension, WebdavStoreMacroMoveExtension, WebdavStoreMacroDeleteExtension {
+ WebdavStoreMacroCopyExtension, WebdavStoreMacroMoveExtension, WebdavStoreMacroDeleteExtension, WebdavStorePermissionExtension {
- private static final String ROOTPATH_PARAMETER = "rootpath";
+ protected static final String ROOTPATH_PARAMETER = "rootpath";
- private static final String LOCK_FILE_EXTENSION = ".lck";
+ protected static final String LOCK_FILE_EXTENSION = ".lck";
- private static final String PROPERTY_FILE_PREFIX = ".";
+ protected static final String PROPERTY_FILE_PREFIX = ".";
- private static void save(InputStream is, File file) throws IOException {
+ protected static final String SECURITY_FILE_SUFFIX = ".rights";
+
+ protected static void save(InputStream is, File file) throws IOException {
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
try {
FileHelper.copy(is, os);
@@ -566,6 +578,12 @@
}
protected File getPropertyFile(String uri) {
+ String path = getPropertyFilePath(uri);
+ File file = new File(root, path);
+ return file;
+ }
+
+ protected String getPropertyFilePath(String uri) {
String dir;
String name;
int lastSlash = uri.lastIndexOf('/');
@@ -577,6 +595,11 @@
name = uri;
}
String path = dir + PROPERTY_FILE_PREFIX + name;
+ return path;
+ }
+
+ protected File getSecurityFile(String uri) {
+ String path = getPropertyFilePath(uri) + SECURITY_FILE_SUFFIX;
File file = new File(root, path);
return file;
}
@@ -700,4 +723,76 @@
}
}
+
+ public void deletePermissions(String uri) throws ServiceAccessException {
+ File file = getSecurityFile(uri);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+
+ public void setPermissions(String uri, List permissions) throws ServiceAccessException {
+ File file = getSecurityFile(uri);
+ assureCreated(file, uri);
+ Writer writer = null;
+ try {
+ writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+ for (Iterator iter = permissions.iterator(); iter.hasNext();) {
+ NodePermission permission = (NodePermission) iter.next();
+ writer.write(permission.getSubjectUri());
+ writer.write(",");
+ writer.write(permission.getActionUri());
+ writer.write(",");
+ writer.write(Boolean.toString(permission.isInheritable()));
+ writer.write(",");
+ writer.write(Boolean.toString(permission.isNegative()));
+ writer.write("\n");
+ }
+ } catch (FileNotFoundException e) {
+ throw new ServiceAccessException(service, e);
+ } catch (IOException e) {
+ throw new ServiceAccessException(service, e);
+ } finally {
+ if (writer != null)
+ try {
+ writer.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ public List getPermissions(String uri) throws ServiceAccessException {
+ File file = getSecurityFile(uri);
+
+ List permissions = new ArrayList();
+
+ if (!file.exists()) {
+ return permissions;
+ }
+ try {
+ InputStream is = new FileInputStream(file);
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+
+ String line = null;
+
+ while ((line = br.readLine()) != null) {
+ String[] field = line.split(",");
+ String user = field[0];
+ String action = field[1];
+ String inheritable = field[2];
+ String negative = field[3];
+ NodePermission permission = new NodePermission(uri.toString(), user, action,
+ Boolean.valueOf(inheritable).booleanValue(), Boolean.valueOf(negative)
+ .booleanValue());
+ permissions.add(permission);
+ }
+ } catch (FileNotFoundException e) {
+ throw new ServiceAccessException(service, e);
+ } catch (IOException e) {
+ throw new ServiceAccessException(service, e);
+ }
+
+ return permissions;
+ }
+
}
Modified: jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStoreAdapter.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStoreAdapter.java?view=diff&rev=521013&r1=521012&r2=521013
==============================================================================
--- jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStoreAdapter.java (original)
+++ jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStoreAdapter.java Wed Mar 21 14:54:02 2007
@@ -38,6 +38,7 @@
import org.apache.slide.lock.NodeLock;
import org.apache.slide.lock.ObjectLockedException;
import org.apache.slide.security.AccessDeniedException;
+import org.apache.slide.security.NodePermission;
import org.apache.slide.security.UnauthenticatedException;
import org.apache.slide.simple.authentication.JAASLoginModule;
import org.apache.slide.simple.reference.WebdavFileStore;
@@ -58,7 +59,7 @@
* @version $Revision$
*/
public class WebdavStoreAdapter extends AbstractXAServiceBase implements Service, ContentStore, NodeStore, LockStore,
- RevisionDescriptorStore, RevisionDescriptorsStore {
+ RevisionDescriptorStore, RevisionDescriptorsStore, SecurityStore {
protected static final String LOG_CHANNEL = WebdavStoreAdapter.class.getName();
@@ -360,6 +361,28 @@
return id.enumerateLocks(uri);
}
+
+ // ==== SecurityStore Methods ================================
+
+ public Enumeration enumeratePermissions(Uri uri) throws ServiceAccessException {
+ log("enumeratePermissions(" + uri + ")");
+ return ((TransactionId) getCurrentlyActiveTransactionalResource()).enumeratePermissions(uri);
+ }
+
+ public void grantPermission(Uri uri, NodePermission permission) throws ServiceAccessException {
+ log("grantPermission(" + uri + ")");
+ ((TransactionId) getCurrentlyActiveTransactionalResource()).grantPermission(uri, permission);
+ }
+
+ public void revokePermission(Uri uri, NodePermission permission) throws ServiceAccessException {
+ log("revokePermission(" + uri + ")");
+ ((TransactionId) getCurrentlyActiveTransactionalResource()).revokePermission(uri, permission);
+ }
+
+ public void revokePermissions(Uri uri) throws ServiceAccessException {
+ log("revokePermissions(" + uri + ")");
+ ((TransactionId) getCurrentlyActiveTransactionalResource()).revokePermissions(uri);
+ }
protected void log(String msg) {
getLogger().log(msg, this.getClass().getName(), Logger.DEBUG);
}
@@ -396,6 +419,8 @@
protected WebdavStoreSinglePropertyExtension singlePropStore = null;
+ protected WebdavStorePermissionExtension securityStore = null;
+
protected Set toBeCreated;
protected Set tentativeResourceCreated;
@@ -427,6 +452,9 @@
if (store instanceof WebdavStoreSinglePropertyExtension) {
singlePropStore = (WebdavStoreSinglePropertyExtension) store;
}
+ if (store instanceof WebdavStorePermissionExtension) {
+ securityStore = (WebdavStorePermissionExtension) store;
+ }
this.parameters = parameters;
} catch (Exception e) {
throw new ServiceAccessException(service, e);
@@ -909,6 +937,41 @@
}
}
+ protected Enumeration enumeratePermissions(Uri uri) throws ServiceAccessException {
+ checkAuthentication();
+ Vector permissions = new Vector();
+ if (securityStore != null) {
+ permissions = new Vector(securityStore.getPermissions(uri.toString()));
+ }
+ return permissions.elements();
+ }
+
+ protected void grantPermission(Uri uri, NodePermission permission)
+ throws ServiceAccessException {
+ checkAuthentication();
+ if (securityStore != null) {
+ List permissions = securityStore.getPermissions(uri.toString());
+ permissions.add(permission);
+ securityStore.setPermissions(uri.toString(), permissions);
+ }
+ }
+
+ protected void revokePermission(Uri uri, NodePermission permission)
+ throws ServiceAccessException {
+ checkAuthentication();
+ if (securityStore != null) {
+ List permissions = securityStore.getPermissions(uri.toString());
+ permissions.remove(permission);
+ securityStore.setPermissions(uri.toString(), permissions);
+ }
+ }
+
+ protected void revokePermissions(Uri uri) throws ServiceAccessException {
+ checkAuthentication();
+ if (securityStore != null) {
+ securityStore.deletePermissions(uri.toString());
+ }
+ }
protected boolean objectExists(Uri uri) throws ServiceAccessException {
try {
return (toBeCreated.contains(uri.toString()) || store.objectExists(uri.toString()));
Added: jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStorePermissionExtension.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStorePermissionExtension.java?view=auto&rev=521013
==============================================================================
--- jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStorePermissionExtension.java (added)
+++ jakarta/slide/trunk/wck/src/org/apache/slide/simple/store/WebdavStorePermissionExtension.java Wed Mar 21 14:54:02 2007
@@ -0,0 +1,67 @@
+/*
+ * $Header$
+ * $Revision: 208281 $
+ * $Date: 2004-12-09 13:17:09 +0100 (Do, 09 Dez 2004) $
+ *
+ * ====================================================================
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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 org.apache.slide.simple.store;
+
+import java.util.List;
+
+import org.apache.slide.common.ServiceAccessException;
+import org.apache.slide.simple.reference.WebdavFileStore;
+
+/**
+ * Optional extension to the
+ * {@link org.apache.slide.simple.store.BasicWebdavStore basic store} with
+ * permission call backs.
+ *
+ * <p>
+ * It can be fed by the same adapter as the
+ * {@link org.apache.slide.simple.store.WebdavStoreAdapter adapter}!
+ * </p>
+ *
+ * <p>
+ * Be sure to read the Javadocs of the
+ * {@link org.apache.slide.simple.store.BasicWebdavStore basic one} first!
+ * </p>
+ *
+ * <p>
+ * <em>Caution: It is most important to understand that this is no general purpose store.
+ * It has been designed to solely work with access to Slide via WebDAV with general methods.
+ * It relies on certain sequences of calls that are done when the Slide core is being accessed through
+ * the WebDAV layer. Other sequences are likely to make this store fail.</em>
+ * </p>
+ *
+ * @see BasicWebdavStore
+ * @see WebdavFileStore
+ * @see WebdavStoreAdapter
+ * @see WebdavStoreSinglePropertyExtension
+ * @version $Revision: 208281 $
+ */
+public interface WebdavStorePermissionExtension extends BasicWebdavStore {
+
+ void deletePermissions(String uri) throws ServiceAccessException;
+
+ void setPermissions(String uri, List permissions) throws ServiceAccessException;
+
+ List getPermissions(String uri) throws ServiceAccessException;
+
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org