Skip to content

Commit

Permalink
added new method listFilesAsList, which returns an ArrayList of objec…
Browse files Browse the repository at this point in the history
…ts according with the protocol. E.g. for filesystem protocol, it will return ArrayList<java.io.File>; for smb1 protocol, it will return ArrayList<jcifs.smb.SmbFile>, and so on.
  • Loading branch information
Marlon Rubio de Carvalho Franco committed Sep 11, 2019
1 parent 4f2c951 commit 6298615
Show file tree
Hide file tree
Showing 20 changed files with 110 additions and 35 deletions.
3 changes: 2 additions & 1 deletion src/main/java/com/marlonrcfranco/IJcon.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.marlonrcfranco;

import java.io.IOException;
import java.util.ArrayList;

public interface IJcon {

Expand Down Expand Up @@ -85,7 +86,7 @@ enum types {
* @throws IOException
*/
public String listFiles(String IP, String filePath, String user, String pass) throws IOException;

public ArrayList listFilesAsList(String IP, String filePath, String user, String pass) throws Exception;
/**
* public String copyFileTo(String sourceIP, String sourceFilePath, String destIP, String destFilePath, String user, String pass)
*
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/marlonrcfranco/Jcon.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.marlonrcfranco;

import java.io.IOException;
import java.util.ArrayList;

public class Jcon implements IJcon{
private IJcon jcon;
Expand Down Expand Up @@ -51,6 +52,11 @@ public String listFiles(String IP, String filePath, String user, String pass) th
return this.jcon.listFiles(IP,filePath,user,pass);
}

@Override
public ArrayList<String> listFilesAsList(String IP, String filePath, String user, String pass) throws Exception {
return null;
}

@Override
public String copyFileTo(String sourceIP, String sourceFilePath, String destIP, String destFilePath, String user, String pass) throws IOException {
return this.jcon.copyFileTo(sourceIP,sourceFilePath,destIP,destFilePath,user,pass);
Expand Down
27 changes: 18 additions & 9 deletions src/main/java/com/marlonrcfranco/JconFileSystem.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.marlonrcfranco;

import java.io.*;
import java.util.ArrayList;

public class JconFileSystem implements IJcon{

Expand Down Expand Up @@ -84,7 +85,6 @@ public byte[] writeBytes(String IP, String filePath, String user, String pass, b
} catch (IOException e) {
output=("Erro: Não foi possível escrever no arquivo \""+filePath+"\""
+((e.getMessage() != null)?" ("+e.getMessage()+")":"")).getBytes();

}
finally {
if (file != null) file.close();
Expand Down Expand Up @@ -139,22 +139,31 @@ public String listFiles(String filePath) throws IOException {
@Override
public String listFiles(String IP, String filePath, String user, String pass) throws IOException {
String output="";
filePath = filePath.replace("\\", "/");
if (!filePath.endsWith("/")) filePath+="/";
File curDir = null;
try {
curDir = new File(filePath);
File[] filesList = curDir.listFiles();
for(File f : filesList){
output += f.getName()+(f.isDirectory()? "/":"")+"\n";
ArrayList<File> listFiles = listFilesAsList(IP, filePath, user, pass);
for (File file : listFiles) {
output += file + "\n";
}
} catch (Exception e) {
output = "Error: Could not list the files in \""+filePath+"\".";
output += "Error: Could not list the files in \""+filePath+"\".";
if (e.getMessage() != null) output+=" ("+e.getMessage()+")";
}
return output;
}

@Override
public ArrayList<File> listFilesAsList(String IP, String filePath, String user, String pass) throws Exception {
ArrayList<File> output = new ArrayList<>();
filePath = filePath.replace("\\", "/");
if (!filePath.endsWith("/")) filePath+="/";
File curDir = new File(filePath);
File[] filesList = curDir.listFiles();
for(File f : filesList){
output.add(f);
}
return output;
}

public String copyFileTo(String sourceFilePath, String destFilePath) throws IOException{
return copyFileTo("",sourceFilePath,"",destFilePath,"","");
}
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/marlonrcfranco/JconNFS.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.emc.ecs.nfsclient.rpc.CredentialUnix;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class JconNFS implements IJcon{
Expand Down Expand Up @@ -136,6 +137,11 @@ public String listFiles(String IP, String filePath, String user, String pass) th
return listFiles(IP, sharedFolder, sFilePath, user, pass);
}

@Override
public ArrayList<String> listFilesAsList(String IP, String filePath, String user, String pass) throws IOException {
return null;
}

public String listFiles(String IP, String sharedFolder, String path, String user, String pass) {
String output="";
path = path.replace("\\", "/");
Expand Down
23 changes: 18 additions & 5 deletions src/main/java/com/marlonrcfranco/JconSMB1.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class JconSMB1 implements IJcon {

Expand Down Expand Up @@ -133,25 +134,37 @@ public String listFiles(String IP, String filePath, String user, String pass) th
String output="";
filePath=filePath.replace("\\", "/");
if (!filePath.endsWith("/") && !"".equalsIgnoreCase(filePath.trim())) filePath+="/";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",user, pass);
String path="smb://"+IP+"/"+filePath;
SmbFile smbFile=null;
try {
smbFile = new SmbFile(path,auth);
SmbFile[] aSmbFiles = smbFile.listFiles();
ArrayList<SmbFile> aSmbFiles = listFilesAsList(IP, filePath, user, pass);
for (SmbFile smbF : aSmbFiles) {
output+=smbF.getName()+"\n";
}
} catch (MalformedURLException e) {
output="Erro: Nao foi possivel localizar o caminho \"" + path + "\"";
if (e.getMessage() != null) output+=" ("+e.getMessage()+")";
}catch (SmbException e) {
}catch (Exception e) {
output="Erro: Verifique se o usuário e senha estão corretos, e se possui permissão para acessar o caminho \"" + path + "\"";
if (e.getMessage() != null) output+=" ("+e.getMessage()+")";
}
return output;
}

@Override
public ArrayList<SmbFile> listFilesAsList(String IP, String filePath, String user, String pass) throws Exception {
ArrayList<SmbFile> output = new ArrayList<>();
filePath=filePath.replace("\\", "/");
if (!filePath.endsWith("/") && !"".equalsIgnoreCase(filePath.trim())) filePath+="/";
String path="smb://"+IP+"/"+filePath;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",user, pass);
SmbFile smbFile = new SmbFile(path,auth);
SmbFile[] aSmbFiles = smbFile.listFiles();
for (SmbFile smbF : aSmbFiles) {
output.add(smbF);
}
return output;
}

@Override
public String copyFileTo(String sourceIP, String sourceFilePath, String destIP, String destFilePath, String user, String pass) throws IOException {
String output="";
Expand Down
58 changes: 38 additions & 20 deletions src/main/java/com/marlonrcfranco/JconSMB23.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashSet;
Expand Down Expand Up @@ -202,36 +203,53 @@ public String copyFileTo(String sourceIP, String sourceFilePath, String destIP,
@Override
public String listFiles(String IP, String filePath, String user, String pass) throws IOException {
extractSharedPathFromPath(filePath.replace("\\", "/"));
return listFiles(IP, sharedFolder, sFilePath, user, pass, null);
}

public String listFiles(String IP, String sharedFolder, String path, String user, String pass, String domain) {
String output="";
boolean isDirectory = false;
sharedFolder = parsePath(sharedFolder);
path = parsePath(path);
String path = parsePath(sFilePath);
if (!path.trim().endsWith("/") && !"".equalsIgnoreCase(path.trim())) path+="/";
boolean isDirectory = false;
SMBClient client = new SMBClient();
try (Connection connection = client.connect(IP)) {
AuthenticationContext ac = new AuthenticationContext(user, pass.toCharArray(),domain);
Session session = connection.authenticate(ac);
// Connect to Share
try (DiskShare share = (DiskShare) session.connectShare(sharedFolder)) {
for (FileIdBothDirectoryInformation f : share.list(path, "*")) {
isDirectory = f.getFileAttributes()==FileAttributes.FILE_ATTRIBUTE_DIRECTORY.getValue();
output+= f.getFileName() + (isDirectory? "/" : "") + "\n";
}
} catch (SMBApiException e) {
output="Erro: Nao foi possivel localizar o diretorio "+sharedFolder+(!"".equalsIgnoreCase((sharedFolder+path).trim())? "/" : "")+path;
if (e.getMessage() != null) output+=" ("+e.getMessage()+")";
try {
ArrayList<FileIdBothDirectoryInformation> list = listFilesAsList(IP, sharedFolder, sFilePath, user, pass, null);
for (FileIdBothDirectoryInformation f : list) {
isDirectory = f.getFileAttributes()==FileAttributes.FILE_ATTRIBUTE_DIRECTORY.getValue();
output+= f.getFileName() + (isDirectory? "/" : "") + "\n";
}
} catch (IOException e) {
output="Erro: Nao foi possivel listar os arquivos do diretorio: "+sharedFolder;
output="Erro: Nao foi possivel listar os arquivos do diretorio: "+sharedFolder;
if (e.getMessage() != null) output+=" ("+e.getMessage()+")";
} catch (Exception e) {
output="Erro: Nao foi possivel localizar o diretorio "+sharedFolder+(!"".equalsIgnoreCase((sharedFolder+path).trim())? "/" : "")+path;
if (e.getMessage() != null) output+=" ("+e.getMessage()+")";
}
return output;
}

@Override
public ArrayList<FileIdBothDirectoryInformation> listFilesAsList(String IP, String filePath, String user, String pass) throws Exception {
extractSharedPathFromPath(filePath.replace("\\", "/"));
return listFilesAsList(IP, sharedFolder, sFilePath, user, pass, null);
}

public ArrayList<FileIdBothDirectoryInformation> listFilesAsList(String IP, String sharedFolder, String path, String user, String pass, String domain) throws Exception {
ArrayList<FileIdBothDirectoryInformation> output = new ArrayList<>();
sharedFolder = parsePath(sharedFolder);
path = parsePath(path);
if (!path.trim().endsWith("/") && !"".equalsIgnoreCase(path.trim())) path+="/";
SMBClient client = new SMBClient();
Connection connection = client.connect(IP);
AuthenticationContext ac = new AuthenticationContext(user, pass.toCharArray(),domain);
Session session = connection.authenticate(ac);
// Connect to Share
DiskShare share = (DiskShare) session.connectShare(sharedFolder);
for (FileIdBothDirectoryInformation f : share.list(path, "*")) {
output.add(f);
}
if (share!=null) share.close();
if (session!=null) session.close();
if (connection!=null) connection.close();
return output;
}

private String parsePath(String path) {
while (path.startsWith("\\") || path.startsWith("/")) {
path = path.substring(1);
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/tests/JconFileSystemTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

class JconFileSystemTest {

Expand Down Expand Up @@ -173,11 +175,16 @@ public void listFiles() {
System.out.println(response);
assert response.contains("teste10.xml");

ArrayList<File> list = jconFS.listFilesAsList("","C:\\Users\\marlon.franco\\Documents","","");
assert list.size()==response.split("\\n").length;

response = jconFS.delete( "C:\\Users\\marlon.franco\\Documents\\teste10.xml");
assert !response.contains("Erro");
System.out.println(response);
} catch (IOException e) {
assert false;
} catch (Exception e) {
assert false;
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/tests/JconSMB1Test.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package tests;

import com.marlonrcfranco.JconSMB1;
import jcifs.smb.SmbFile;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.ArrayList;

class JconSMB1Test {

Expand Down Expand Up @@ -177,12 +179,17 @@ public void listFiles() {
System.out.println(response);
assert response.contains("fileTest123.xml");

ArrayList<SmbFile> list = jSMB1.listFilesAsList(IP,"/Marlon/Teste",user,pass);
assert list.size()==response.split("\\n").length;

response = jSMB1.delete(IP,"/Marlon/Teste/fileTest123.xml",user,pass);
System.out.println(response);
assert !response.contains("Erro");

} catch (IOException e) {
assert false;
} catch (Exception e) {
assert false;
}
}

Expand Down
8 changes: 8 additions & 0 deletions src/main/java/tests/JconSMB23Test.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package tests;

import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation;
import com.marlonrcfranco.JconSMB23;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.util.ArrayList;

class JconSMB23Test {

Expand Down Expand Up @@ -133,6 +136,9 @@ public void listFiles() {
response = jSMBJ.listFiles(IP,"Marlon",user,pass);
assert response.contains("fileTest123.xml");

ArrayList<FileIdBothDirectoryInformation> list = jSMBJ.listFilesAsList(IP,"Marlon",user,pass);
assert list.size()==response.split("\\n").length;

response = jSMBJ.delete(IP,"/Marlon/Teste/fileTest123.xml",user,pass);
System.out.println(response);
assert !response.contains("Erro");
Expand All @@ -141,6 +147,8 @@ public void listFiles() {
assert !response.contains("Erro");
} catch (IOException e) {
assert false;
} catch (Exception e) {
e.printStackTrace();
}
}

Expand Down
Binary file modified target/classes/com/marlonrcfranco/IJcon$types.class
Binary file not shown.
Binary file modified target/classes/com/marlonrcfranco/IJcon.class
Binary file not shown.
Binary file modified target/classes/com/marlonrcfranco/Jcon.class
Binary file not shown.
Binary file modified target/classes/com/marlonrcfranco/JconFileSystem.class
Binary file not shown.
Binary file modified target/classes/com/marlonrcfranco/JconNFS.class
Binary file not shown.
Binary file modified target/classes/com/marlonrcfranco/JconSMB1.class
Binary file not shown.
Binary file modified target/classes/com/marlonrcfranco/JconSMB23.class
Binary file not shown.
Binary file modified target/classes/tests/JconFileSystemTest.class
Binary file not shown.
Binary file modified target/classes/tests/JconSMB1Test.class
Binary file not shown.
Binary file modified target/classes/tests/JconSMB23Test.class
Binary file not shown.
Binary file modified target/jcon.jar
Binary file not shown.

0 comments on commit 6298615

Please sign in to comment.