2

我想挂钩附件文件。例如,当用户尝试使用 webmail 或其他方式附加文件时,我也想挂上附件文件。我分析了回显服务,在echo_check_preview_handler函数中我可以挂钩数据的内容。但我想挂钩附件文件。我搜索了一些 c-icap 模块(squidclamav 和 yara),但没有找到这种能力。从 simple_api.c 代码中,我使用了以下代码,但我只能将 ascii 文件与 data->body->filename 挂钩。

data->body = ci_simple_file_new(0);
     if ((SEND_PERCENT_BYTES >= 0) && (START_SEND_AFTER == 0))
     {
        ci_req_unlock_data(req);
        ci_simple_file_lock_all(data->body);
     }

if (!data->body)
        return CI_ERROR;
       if (ci_simple_file_write(data->body, preview_data, preview_data_len,  ci_req_hasalldata(req)) == CI_ERROR)
               return CI_ERROR;

那么我该如何实现呢?是否有任何示例 c-icap 模块或文档或代码块?

4

2 回答 2

0

您不应该在 preview_handler 中执行此操作,而是您应该执行以下操作:

在 preview_handler - 返回 CI_MOD_CONTINUE

然后在执行 ci_simple_file_write 的地方实现 io ...

然后在数据处理程序结束时,您可以实施您的分析。

这是来自 services.h 的评论,它简要解释了 c-icap 插件的生命周期:

  • 是实现服务的结构 *
  • 为了实现一个服务,某人需要实现这个结构的成员函数。这些功能
  • 将由 c-icap 调用如下:
    • 此服务的新请求到达 -> 调用 ci_service_module::mod_init_request_data
    • icap 客户端发送预览数据 -> 调用 ci_service_module::mod_check_preview_handler。
  • 如果此函数返回 CI_MOD_ALLOW204,则 ICAP 事务将在此处停止。如果这个函数返回
  • CI_MOD_CONTINUE ICAP 客户端将发送剩余的正文数据(如果存在)。
    • 客户端开始发送更多数据 -> ci_service_module::mod_service_io 多次调用,直到
  • 客户端已发送所有正文数据。服务可以开始使用此功能向客户端发送数据
  • 在收到所有数据之前
    • 客户端已发送所有数据 -> 调用 ci_service_module::mod_end_of_data_handler
    • 客户端等待从 c-icap 读取剩余数据 -> ci_service_module::mod_service_io 调用多个
  • 直到所有正文数据发送到客户端的次数 */

不 - 您不能直接挂钩附件,但您必须从您通过 ci_simple_file API 编写的内容中解析出附件文件。

于 2013-07-28T23:23:41.457 回答
0

例如,当用户尝试使用 webmail 或其他方式附加文件时,我也想挂上附件文件

您需要挂钩 HTTP 请求包含文件,因为它是正文数据。

所以你的目标是REQMOD ICAP 请求。

这里有3个提示给你。

  1. 在预览中,检查身体魔术,将身体类型识别为“文件数据”(ci_magic_data_type_ext帮助)。
  2. 在 service_io 中,当iseof不正确时读取所有数据(ci_simple_file..函数有帮助)。
  3. 在 end_of_data 中,将文件修改或检查为ci_simple_file对象。

请记住,文件数据通常是 gzip 或 deflate 压缩的。

可以使用make doc生成 c-icap 文档。

于 2014-09-28T13:04:04.563 回答