From 403085ca5060a7b09ffe33450cbcdcd87d2ebbfc Mon Sep 17 00:00:00 2001 From: David McKnight Date: Tue, 22 Jan 2008 23:06:16 +0000 Subject: [PATCH] [209593] local permissions support (when non-windows) --- .../local/files/LocalFileService.java | 104 +++++++++++++++++- .../services/local/files/LocalHostFile.java | 14 ++- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java index 46763bde83c..e87b7440ac3 100644 --- a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java +++ b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java @@ -28,12 +28,14 @@ * David McKnight (IBM) - [210109] store constants in IFileService rather than IFileServiceConstants * Xuan Chen (IBM) - [210555] [regression] NPE when deleting a file on SSH * Kevin Doyle (IBM) - [208778] [efs][api] RSEFileStore#getOutputStream() does not support EFS#APPEND + * David McKnight (IBM) - [209593] [api] add support for "file permissions" and "owner" properties for unix files ********************************************************************************/ package org.eclipse.rse.internal.services.local.files; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; @@ -42,11 +44,13 @@ import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; +import java.util.StringTokenizer; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.rse.internal.services.local.ILocalService; @@ -56,6 +60,7 @@ import org.eclipse.rse.services.clientserver.IMatcher; import org.eclipse.rse.services.clientserver.ISystemFileTypes; import org.eclipse.rse.services.clientserver.ISystemOperationMonitor; import org.eclipse.rse.services.clientserver.NamePatternMatcher; +import org.eclipse.rse.services.clientserver.PathUtility; import org.eclipse.rse.services.clientserver.SystemEncodingUtil; import org.eclipse.rse.services.clientserver.SystemOperationMonitor; import org.eclipse.rse.services.clientserver.archiveutils.AbsoluteVirtualPath; @@ -66,13 +71,17 @@ import org.eclipse.rse.services.clientserver.messages.ISystemMessageProvider; import org.eclipse.rse.services.clientserver.messages.SystemMessage; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.files.AbstractFileService; +import org.eclipse.rse.services.files.HostFilePermissions; +import org.eclipse.rse.services.files.IFilePermissionsService; import org.eclipse.rse.services.files.IFileService; import org.eclipse.rse.services.files.IHostFile; +import org.eclipse.rse.services.files.IHostFilePermissions; +import org.eclipse.rse.services.files.IHostFilePermissionsContainer; import org.eclipse.rse.services.files.RemoteFileException; import org.eclipse.rse.services.files.RemoteFileIOException; import org.eclipse.rse.services.files.RemoteFileSecurityException; -public class LocalFileService extends AbstractFileService implements IFileService, ILocalService +public class LocalFileService extends AbstractFileService implements IFileService, ILocalService, IFilePermissionsService { private static final String[] ALLDRIVES = { @@ -1670,4 +1679,97 @@ public class LocalFileService extends AbstractFileService implements IFileServic public SystemMessage getMessage(String messageID) { return (_msgProvider != null ? _msgProvider.getMessage(messageID) : super.getMessage(messageID)); } + + public int getCapabilities(IHostFile file) { + int capabilities = 0; + if (_isWindows){ + return capabilities; // no windows support + } + else if (file instanceof LocalVirtualHostFile) { + return capabilities; // no virtual file support + } + else { + return FS_CAN_GET_ALL | FS_CAN_SET_ALL; + } + } + + public IHostFilePermissions getFilePermissions(IHostFile rfile, + IProgressMonitor monitor) throws SystemMessageException { + if (!_isWindows){ + + File file = new File(rfile.getParentPath(), rfile.getName()); + + // permissions in form "drwxrwxrwx ..." + String ldStr = simpleShellCommand("ls -ld", file); //$NON-NLS-1$ + + StringTokenizer tokenizer = new StringTokenizer(ldStr, " \t"); //$NON-NLS-1$ + + // permissions in form "rwxrwxrwx" + String permString = tokenizer.nextToken().substring(1); + + // user and group + tokenizer.nextToken(); // nothing important + String user = tokenizer.nextToken(); // 3rd + String group = tokenizer.nextToken(); // 4th + + IHostFilePermissions permissions = new HostFilePermissions(permString, user, group); + if (rfile instanceof IHostFilePermissionsContainer) + { + ((IHostFilePermissionsContainer)rfile).setPermissions(permissions); + } + return permissions; + } + return null; + } + + public void setFilePermissions(IHostFile rfile, + IHostFilePermissions newPermissions, IProgressMonitor monitor) + throws SystemMessageException { + if (!_isWindows){ + File file = new File(rfile.getParentPath(), rfile.getName()); + + int bits = newPermissions.getPermissionBits(); + String permissionsInOctal = Integer.toOctalString(bits); // from decimal to octal + String user = newPermissions.getUserOwner(); + String group = newPermissions.getGroupOwner(); + + // set the permissions + String result = simpleShellCommand("chmod " + permissionsInOctal, file); //$NON-NLS-1$ + + // set the user + simpleShellCommand("chown " + user, file); //$NON-NLS-1$ + + // set the group + simpleShellCommand("chown :" + group, file); //$NON-NLS-1$ + } + } + + + private String simpleShellCommand(String cmd, File file) + { + String result = null; + String args[] = new String[3]; + args[0] = "sh"; //$NON-NLS-1$ + args[1] = "-c"; //$NON-NLS-1$ + args[2] = cmd + " " + PathUtility.enQuoteUnix(file.getAbsolutePath()); //$NON-NLS-1$ + + BufferedReader childReader = null; + try { + Process childProcess = Runtime.getRuntime().exec(args); + + childReader = new BufferedReader(new InputStreamReader(childProcess.getInputStream())); + + result = childReader.readLine().trim(); + childReader.close(); + } + catch (Exception e){ + try { + childReader.close(); + } + catch (IOException ex){} + } + return result; + + } + } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalHostFile.java b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalHostFile.java index 0a403e541d6..1f8239b3851 100644 --- a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalHostFile.java +++ b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalHostFile.java @@ -13,6 +13,7 @@ * * Contributors: * Martin Oberhuber (Wind River) - Fix [168591] LocalHostFile missing equals() + * David McKnight (IBM) - [209593] [api] add support for "file permissions" and "owner" properties for unix files *******************************************************************************/ package org.eclipse.rse.internal.services.local.files; @@ -21,13 +22,16 @@ import java.io.File; import org.eclipse.rse.services.clientserver.archiveutils.ArchiveHandlerManager; import org.eclipse.rse.services.files.IHostFile; +import org.eclipse.rse.services.files.IHostFilePermissions; +import org.eclipse.rse.services.files.IHostFilePermissionsContainer; -public class LocalHostFile implements IHostFile +public class LocalHostFile implements IHostFile, IHostFilePermissionsContainer { private File _file; private boolean _isRoot = false; private boolean _isArchive = false; + private IHostFilePermissions _permissions = null; public LocalHostFile(File file) { @@ -139,4 +143,12 @@ public class LocalHostFile implements IHostFile return _file.canWrite(); } + public IHostFilePermissions getPermissions() { + return _permissions; + } + + public void setPermissions(IHostFilePermissions permissions) { + _permissions = permissions; + } + }