Apache Camel检查目录读取权限(AWS环境)

时间:2015-04-17 11:28:56

标签: apache-camel

我有一个用于验证FTP目录的API,如下所示:

public boolean validateDirectory(FtpLocation ftpLocation) throws CustomException{
    FTPClient client = new FTPClient();
    try {
        client.connect(ftpLocation.getSystem(), Integer.parseInt(ftpLocation.getPort()));
        client.login(ftpLocation.getUser(), ftpLocation.getPassword());
        client.changeWorkingDirectory(ftpLocation.getDirPath());
        int returnCode = client.getReplyCode();
        if (returnCode == 550) {
            LOG.error("Directory ["+ ftpLocation.getDirPath() + "] does not exist");
            return false;
        }           
        File dir = new File(ftpLocation.getDirPath());
        if(dir!=null){
            if (!dir.canRead()) {
                LOG.error("Directory ["+ ftpLocation.getDirPath() + "] does not have read permission");
                return false;
            }
        }
        return true;
    } catch (NumberFormatException | IOException e) {
        LOG.error("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
        throw new CustomException("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
    } finally {
        try {
            client.disconnect();
        } catch (IOException e) {
            LOG.warn("Error occured while disconnecting FTPClient", e);
        }
    }   
}

我的FTP根 / 绝对路径/ home / soumya

我想从 / source 绝对路径/ home / soumya / source )路由文件

我在测试API时发现了以下行为:

  1. 如果 source 具有权限 rwxrwxr-x ,则会抛出验证消息(实际上期望成功的文件路由)。
  2. 如果 source 具有权限 -wx-wx-x ,则会成功验证。
  3. 如果 source 不存在,则验证成功。
  4. 如果 source 不是目录(source是文件),则验证成功。
  5. 以上四种情况的日志如下:

    07:41:59.799 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not have read permission
    
    07:42:48.801 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not have read permission
    
    07:43:27.093 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not exist
    
    07:44:00.215 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not exist
    

    问题:

    1. 有没有其他方法可以解决1的问题,成功路由 source 的文件?
    2. 如何验证目录以检查读取权限?
    3. 注意: Camel版本 2.12.1

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法,如下所示:

public void validateDirectory(FtpLocation ftpLocation) throws CustomException {
    FTPClient client = new FTPClient();
    try {
        client.connect(ftpLocation.getSystem(), Integer.parseInt(ftpLocation.getPort()));
        client.login(ftpLocation.getUser(), ftpLocation.getPassword());
        client.enterLocalPassiveMode();
        client.changeWorkingDirectory(ftpLocation.getDirPath());
        int returnCode = client.getReplyCode();
        LOG.debug("FTP return code: "+ returnCode);
        if (returnCode == 550) {
            LOG.error("Directory ["+ ftpLocation.getDirPath() + "] does not exist");
            throw new CustomException("Directory ["+ ftpLocation.getDirPath() + "] does not exist");
        }
        String targetDir = client.printWorkingDirectory();
        client.cdup();
        targetDir = StringUtils.substring(targetDir, StringUtils.lastIndexOf(targetDir, File.separator) + 1);
        FTPFile ftpFiles[] = client.listFiles();
        for(FTPFile ftpFile : ftpFiles){
            if(StringUtils.equals(ftpFile.getName(), targetDir) && !ftpFile.hasPermission(FTPFile.USER_ACCESS, FTPFile.READ_PERMISSION)){
                LOG.error("No read permission for directory [" + ftpLocation.getDirPath() + "]");
                throw new CustomException("No read permission for directory [" + ftpLocation.getDirPath() + "]");
            }
        }
    } catch (NumberFormatException | IOException e) {
        LOG.error("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
        throw new CustomException("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
    } finally {
        try {
            client.disconnect();
        } catch (IOException e) {
            LOG.warn("Error occured while disconnecting FTPClient", e);
        }
    }   
}

但是,如果您有更好的解决方案,请发布。