/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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.pentaho.di.core.vfs;
import org.apache.commons.vfs2.FileContent;
import org.apache.commons.vfs2.FileName;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSelector;
import org.apache.commons.vfs2.FileSystem;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileType;
import org.apache.commons.vfs2.NameScope;
import org.apache.commons.vfs2.operations.FileOperations;
import org.apache.commons.vfs2.provider.sftp.SftpFileObject;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class SftpFileObjectWithWindowsSupport implements FileObject {
//icacls windows command permissions
private static final String FULL_ACCESS = "(F)";
private static final String MODIFY_ACCESS = "(M)";
private static final String READ_AND_EXECUTE_ACCESS = "(RX)";
private static final String READ_ACCESS = "(R)";
private static final String WRITE_ACCESS = "(W)";
private static final String WRITE_DATA_ADD_FILES_ACCESS = "WD";
private static final String READ_DATA_ADD_FILES_ACCESS = "RD";
private SftpFileObject sftpFileObject;
private SftpFileSystemWindows sftpFileSystemWindows;
private String path;
public SftpFileObjectWithWindowsSupport( SftpFileObject sftpFileObject,
SftpFileSystemWindows sftpFileSystemWindows ) throws FileSystemException {
this.sftpFileObject = sftpFileObject;
this.path = sftpFileObject.getName().getPath();
this.sftpFileSystemWindows = sftpFileSystemWindows;
}
@Override
public boolean isReadable() throws FileSystemException {
try {
if ( !this.sftpFileSystemWindows.isRemoteHostWindows() ) {
return sftpFileObject.isReadable();
} else {
return this.exists() && this.doIsReadable();
}
} catch ( Exception var ) {
throw new FileSystemException( "vfs.provider/check-is-readable.error", sftpFileObject.getName(), var );
}
}
private boolean doIsReadable() throws Exception {
boolean readable;
List<String> userGroups = this.sftpFileSystemWindows.getUserGroups();
Map<String, String> filePermissions = this.sftpFileSystemWindows.getFilePermission( this.path );
for ( String group : userGroups ) {
String acl = filePermissions.get( group );
if ( acl != null ) {
readable = acl.contains( FULL_ACCESS ) || acl.contains( MODIFY_ACCESS )
|| acl.contains( READ_AND_EXECUTE_ACCESS ) || acl.contains( READ_ACCESS )
|| acl.contains( WRITE_ACCESS ) || acl.contains( WRITE_DATA_ADD_FILES_ACCESS )
|| acl.contains( READ_DATA_ADD_FILES_ACCESS );
if ( readable ) {
return true;
}
}
}
return false;
}
@Override
public boolean isWriteable() throws FileSystemException {
try {
if ( !this.sftpFileSystemWindows.isRemoteHostWindows() ) {
return sftpFileObject.isWriteable();
} else {
return this.exists() && this.doIsWriteable();
}
} catch ( Exception var ) {
throw new FileSystemException( "vfs.provider/check-is-writeable.error", sftpFileObject.getName(), var );
}
}
protected boolean doIsWriteable() throws Exception {
boolean writeable;
List<String> userGroups = this.sftpFileSystemWindows.getUserGroups();
Map<String, String> filePermissions = this.sftpFileSystemWindows.getFilePermission( this.path );
for ( String group : userGroups ) {
String acl = filePermissions.get( group );
if ( acl != null ) {
writeable = acl.contains( FULL_ACCESS ) || acl.contains( MODIFY_ACCESS )
|| acl.contains( WRITE_ACCESS ) || acl.contains( WRITE_DATA_ADD_FILES_ACCESS );
if ( writeable ) {
return true;
}
}
}
return false;
}
@Override
public boolean canRenameTo( FileObject fileObject ) {
return sftpFileObject.canRenameTo( fileObject );
}
@Override
public void close() throws FileSystemException {
sftpFileObject.close();
}
@Override
public void copyFrom( FileObject fileObject, FileSelector fileSelector ) throws FileSystemException {
sftpFileObject.copyFrom( fileObject, fileSelector );
}
@Override
public void createFile() throws FileSystemException {
sftpFileObject.createFile();
}
@Override
public void createFolder() throws FileSystemException {
sftpFileObject.createFolder();
}
@Override
public boolean delete() throws FileSystemException {
return sftpFileObject.delete();
}
@Override
public int delete( FileSelector fileSelector ) throws FileSystemException {
return sftpFileObject.delete( fileSelector );
}
@Override
public int deleteAll() throws FileSystemException {
return sftpFileObject.deleteAll();
}
@Override
public boolean exists() throws FileSystemException {
return sftpFileObject.exists();
}
@Override
public FileObject[] findFiles( FileSelector fileSelector ) throws FileSystemException {
return sftpFileObject.findFiles( fileSelector );
}
@Override
public void findFiles( FileSelector fileSelector, boolean b, List<FileObject> list ) throws FileSystemException {
sftpFileObject.findFiles( fileSelector, b, list );
}
@Override
public FileObject getChild( String s ) throws FileSystemException {
return sftpFileObject.getChild( s );
}
@Override
public FileObject[] getChildren() throws FileSystemException {
return sftpFileObject.getChildren();
}
@Override
public FileContent getContent() throws FileSystemException {
return sftpFileObject.getContent();
}
@Override
public FileOperations getFileOperations() throws FileSystemException {
return sftpFileObject.getFileOperations();
}
@Override
public FileSystem getFileSystem() {
return this.sftpFileSystemWindows;
}
@Override
public FileName getName() {
return sftpFileObject.getName();
}
@Override
public FileObject getParent() throws FileSystemException {
return sftpFileObject.getParent();
}
@Override
public String getPublicURIString() {
return sftpFileObject.getPublicURIString();
}
@Override
public FileType getType() throws FileSystemException {
return sftpFileObject.getType();
}
@Override
public URL getURL() throws FileSystemException {
return sftpFileObject.getURL();
}
@Override
public boolean isAttached() {
return sftpFileObject.isAttached();
}
@Override
public boolean isContentOpen() {
return sftpFileObject.isContentOpen();
}
@Override
public boolean isExecutable() throws FileSystemException {
return sftpFileObject.isExecutable();
}
@Override
public boolean isFile() throws FileSystemException {
return sftpFileObject.isFile();
}
@Override
public boolean isFolder() throws FileSystemException {
return sftpFileObject.isFolder();
}
@Override
public boolean isHidden() throws FileSystemException {
return sftpFileObject.isHidden();
}
@Override
public void moveTo( FileObject fileObject ) throws FileSystemException {
sftpFileObject.moveTo( fileObject );
}
@Override
public void refresh() throws FileSystemException {
sftpFileObject.refresh();
}
@Override
public FileObject resolveFile( String s ) throws FileSystemException {
return sftpFileObject.resolveFile( s );
}
@Override
public FileObject resolveFile( String s, NameScope nameScope ) throws FileSystemException {
return sftpFileObject.resolveFile( s, nameScope );
}
@Override
public boolean setExecutable( boolean b, boolean b1 ) throws FileSystemException {
return sftpFileObject.setExecutable( b, b1 );
}
@Override
public boolean setReadable( boolean b, boolean b1 ) throws FileSystemException {
return sftpFileObject.setReadable( b, b1 );
}
@Override
public boolean setWritable( boolean b, boolean b1 ) throws FileSystemException {
return sftpFileObject.setWritable( b, b1 );
}
@Override
public int compareTo( FileObject o ) {
return sftpFileObject.compareTo( o );
}
@Override
public Iterator<FileObject> iterator() {
return sftpFileObject.iterator();
}
}