【问题标题】:Apache Camel Check Directory Read Permission (AWS Environment)Apache Camel 检查目录读取权限(AWS 环境)
【发布时间】:2015-04-21 13:21:43
【问题描述】:

我有一个用于验证 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 是文件)则验证成功。

以上四种场景的日志如下:

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. 如何验证目录以检查读取权限?

注意:骆驼版本是2.12.1

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

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

    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);
            }
        }   
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2011-01-17
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多