c-icap和附件文件

时间:2013-05-27 11:36:18

标签: c++ c open-source

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

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模块或文档或代码块?

2 个答案:

答案 0 :(得分:0)

你不应该在preview_handler中这样做,而是你应该做的事情:

预览_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从您编写的内容中解析出附件文件。

答案 1 :(得分:0)

  

例如,当用户尝试使用网络邮件或其他东西附加文件时,我想要挂钩附件文件

您需要将HTTP请求包含文件作为正文数据挂钩。

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

以下是3个提示。

  1. 在预览中,检查身体魔法,将身体类型识别为“文件数据”( ci_magic_data_type_ext 帮助)。
  2. 在service_io中,读取所有数据,而 iseof 不正确( ci_simple_file .. 函数帮助)。
  3. 在end_of_data中
  4. ,将文件修改或检查为 ci_simple_file 对象。
  5. 请记住,文件数据通常是gzip或deflate压缩。

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