You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2015/04/28 21:36:34 UTC
jclouds git commit: Adds windows ACL code for file permissions,
fixes build.
Repository: jclouds
Updated Branches:
refs/heads/master 2b855809a -> 786e5d8e2
Adds windows ACL code for file permissions, fixes build.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/786e5d8e
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/786e5d8e
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/786e5d8e
Branch: refs/heads/master
Commit: 786e5d8e258857504cbfe613013dce3c90c6a846
Parents: 2b85580
Author: Zack Shoylev <za...@rackspace.com>
Authored: Wed Apr 22 18:55:30 2015 -0500
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Tue Apr 28 14:35:58 2015 -0500
----------------------------------------------------------------------
.../internal/FilesystemStorageStrategyImpl.java | 134 +++++++++++++------
.../java/org/jclouds/filesystem/util/Utils.java | 70 ++++++++++
2 files changed, 164 insertions(+), 40 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/786e5d8e/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 2f9f14b..5a75245 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -16,24 +16,27 @@
*/
package org.jclouds.filesystem.strategy.internal;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static com.google.common.io.BaseEncoding.base16;
import static java.nio.file.Files.getFileAttributeView;
import static java.nio.file.Files.getPosixFilePermissions;
import static java.nio.file.Files.readAttributes;
import static java.nio.file.Files.setPosixFilePermissions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static com.google.common.io.BaseEncoding.base16;
+import static org.jclouds.filesystem.util.Utils.isPrivate;
+import static org.jclouds.filesystem.util.Utils.isWindows;
+import static org.jclouds.filesystem.util.Utils.setPrivate;
+import static org.jclouds.filesystem.util.Utils.setPublic;
import static org.jclouds.util.Closeables2.closeQuietly;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.UserDefinedFileAttributeView;
-import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
import java.util.Set;
@@ -156,30 +159,56 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
@Override
public ContainerAccess getContainerAccess(String container) {
Path path = new File(buildPathStartingFromBaseDir(container)).toPath();
- Set<PosixFilePermission> permissions;
- try {
- permissions = getPosixFilePermissions(path);
- } catch (IOException ioe) {
- throw Throwables.propagate(ioe);
+
+ if ( isWindows() ) {
+ try {
+ if (isPrivate(path)) {
+ return ContainerAccess.PRIVATE;
+ } else {
+ return ContainerAccess.PUBLIC_READ;
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ Set<PosixFilePermission> permissions;
+ try {
+ permissions = getPosixFilePermissions(path);
+ } catch (IOException ioe) {
+ throw Throwables.propagate(ioe);
+ }
+ return permissions.contains(PosixFilePermission.OTHERS_READ)
+ ? ContainerAccess.PUBLIC_READ : ContainerAccess.PRIVATE;
}
- return permissions.contains(PosixFilePermission.OTHERS_READ)
- ? ContainerAccess.PUBLIC_READ : ContainerAccess.PRIVATE;
}
@Override
public void setContainerAccess(String container, ContainerAccess access) {
Path path = new File(buildPathStartingFromBaseDir(container)).toPath();
- Set<PosixFilePermission> permissions;
- try {
- permissions = getPosixFilePermissions(path);
- if (access == ContainerAccess.PRIVATE) {
- permissions.remove(PosixFilePermission.OTHERS_READ);
- } else if (access == ContainerAccess.PUBLIC_READ) {
- permissions.add(PosixFilePermission.OTHERS_READ);
+
+ if ( isWindows() ) {
+ try {
+ if (access == ContainerAccess.PRIVATE) {
+ setPrivate(path);
+ } else {
+ setPublic(path);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ Set<PosixFilePermission> permissions;
+ try {
+ permissions = getPosixFilePermissions(path);
+ if (access == ContainerAccess.PRIVATE) {
+ permissions.remove(PosixFilePermission.OTHERS_READ);
+ } else if (access == ContainerAccess.PUBLIC_READ) {
+ permissions.add(PosixFilePermission.OTHERS_READ);
+ }
+ setPosixFilePermissions(path, permissions);
+ } catch (IOException ioe) {
+ throw Throwables.propagate(ioe);
}
- setPosixFilePermissions(path, permissions);
- } catch (IOException ioe) {
- throw Throwables.propagate(ioe);
}
}
@@ -243,7 +272,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
return buildPathAndChecksIfBlobExists(container, key);
} catch (IOException e) {
logger.error(e, "An error occurred while checking key %s in container %s",
- container, key);
+ container, key);
throw Throwables.propagate(e);
}
}
@@ -480,30 +509,55 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
@Override
public BlobAccess getBlobAccess(String containerName, String blobName) {
Path path = new File(buildPathStartingFromBaseDir(containerName, blobName)).toPath();
- Set<PosixFilePermission> permissions;
- try {
- permissions = getPosixFilePermissions(path);
- } catch (IOException ioe) {
- throw Throwables.propagate(ioe);
+
+ if ( isWindows() ) {
+ try {
+ if (isPrivate(path)) {
+ return BlobAccess.PRIVATE;
+ } else {
+ return BlobAccess.PUBLIC_READ;
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ Set<PosixFilePermission> permissions;
+ try {
+ permissions = getPosixFilePermissions(path);
+ } catch (IOException ioe) {
+ throw Throwables.propagate(ioe);
+ }
+ return permissions.contains(PosixFilePermission.OTHERS_READ)
+ ? BlobAccess.PUBLIC_READ : BlobAccess.PRIVATE;
}
- return permissions.contains(PosixFilePermission.OTHERS_READ)
- ? BlobAccess.PUBLIC_READ : BlobAccess.PRIVATE;
}
@Override
public void setBlobAccess(String container, String name, BlobAccess access) {
Path path = new File(buildPathStartingFromBaseDir(container, name)).toPath();
- Set<PosixFilePermission> permissions;
- try {
- permissions = getPosixFilePermissions(path);
- if (access == BlobAccess.PRIVATE) {
- permissions.remove(PosixFilePermission.OTHERS_READ);
- } else if (access == BlobAccess.PUBLIC_READ) {
- permissions.add(PosixFilePermission.OTHERS_READ);
+ if ( isWindows() ) {
+ try {
+ if (access == BlobAccess.PRIVATE) {
+ setPrivate(path);
+ } else {
+ setPublic(path);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ Set<PosixFilePermission> permissions;
+ try {
+ permissions = getPosixFilePermissions(path);
+ if (access == BlobAccess.PRIVATE) {
+ permissions.remove(PosixFilePermission.OTHERS_READ);
+ } else if (access == BlobAccess.PUBLIC_READ) {
+ permissions.add(PosixFilePermission.OTHERS_READ);
+ }
+ setPosixFilePermissions(path, permissions);
+ } catch (IOException ioe) {
+ throw Throwables.propagate(ioe);
}
- setPosixFilePermissions(path, permissions);
- } catch (IOException ioe) {
- throw Throwables.propagate(ioe);
}
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/786e5d8e/apis/filesystem/src/main/java/org/jclouds/filesystem/util/Utils.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/util/Utils.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/util/Utils.java
index 95f5f57..cc25851 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/util/Utils.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/util/Utils.java
@@ -16,9 +16,19 @@
*/
package org.jclouds.filesystem.util;
+import static java.nio.file.FileSystems.getDefault;
+
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.AclEntry;
+import java.nio.file.attribute.AclEntryPermission;
+import java.nio.file.attribute.AclEntryType;
+import java.nio.file.attribute.AclFileAttributeView;
+import java.nio.file.attribute.UserPrincipal;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* Utilities for the filesystem blobstore.
@@ -41,4 +51,64 @@ public class Utils {
}
Files.delete(file.toPath());
}
+
+ /**
+ * Determine if Java is running on a windows OS
+ */
+ public static boolean isWindows() {
+ return System.getProperty("os.name", "").toLowerCase().contains("windows");
+ }
+
+ /**
+ * @param path The path to a Windows file or directory.
+ * @return true if path has permissions set to Everyone on windows. The exact permissions are not checked.
+ */
+ public static boolean isPrivate(Path path) throws IOException {
+ UserPrincipal everyone = getDefault().getUserPrincipalLookupService()
+ .lookupPrincipalByName("Everyone");
+ AclFileAttributeView aclFileAttributes = java.nio.file.Files.getFileAttributeView(
+ path, AclFileAttributeView.class);
+ for (AclEntry aclEntry : aclFileAttributes.getAcl()) {
+ if (aclEntry.principal().equals(everyone)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @param path Remove "Everyone" from this path's Windows ACL permissions.
+ */
+ public static void setPrivate(Path path) throws IOException {
+ UserPrincipal everyone = getDefault().getUserPrincipalLookupService()
+ .lookupPrincipalByName("Everyone");
+ AclFileAttributeView aclFileAttributes = java.nio.file.Files.getFileAttributeView(
+ path, AclFileAttributeView.class);
+ CopyOnWriteArrayList<AclEntry> aclList = new CopyOnWriteArrayList(aclFileAttributes.getAcl());
+ for (AclEntry aclEntry : aclList) {
+ if (aclEntry.principal().equals(everyone) && aclEntry.type().equals(AclEntryType.ALLOW)) {
+ aclList.remove(aclEntry);
+ }
+ }
+ aclFileAttributes.setAcl(aclList);
+ }
+
+ /**
+ * @param path Add "Everyone" with read enabled to this path's Windows ACL permissions.
+ */
+ public static void setPublic(Path path) throws IOException {
+ UserPrincipal everyone = getDefault().getUserPrincipalLookupService()
+ .lookupPrincipalByName("Everyone");
+ AclFileAttributeView aclFileAttributes = java.nio.file.Files.getFileAttributeView(
+ path, AclFileAttributeView.class);
+ List<AclEntry> list = aclFileAttributes.getAcl();
+ list.add(AclEntry.newBuilder().setPrincipal(everyone).setPermissions(
+ AclEntryPermission.READ_DATA,
+ AclEntryPermission.READ_ACL,
+ AclEntryPermission.READ_ATTRIBUTES,
+ AclEntryPermission.READ_NAMED_ATTRS)
+ .setType(AclEntryType.ALLOW)
+ .build());
+ aclFileAttributes.setAcl(list);
+ }
}