1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
--[[
Copyright (c) 2022, Vsevolod Stakhov <vsevolod@rspamd.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]--
--[[[
-- @module lua_content
-- This module contains content processing logic
--]]
local exports = {}
local N = "lua_content"
local lua_util = require "lua_util"
local content_modules = {
ical = {
mime_type = {"text/calendar", "application/calendar"},
module = require "lua_content/ical",
extensions = {'ics'},
output = "text"
},
vcf = {
mime_type = {"text/vcard", "application/vcard"},
module = require "lua_content/vcard",
extensions = {'vcf'},
output = "text"
},
pdf = {
mime_type = "application/pdf",
module = require "lua_content/pdf",
extensions = {'pdf'},
output = "table"
},
}
local modules_by_mime_type
local modules_by_extension
local function init()
modules_by_mime_type = {}
modules_by_extension = {}
for k,v in pairs(content_modules) do
if v.mime_type then
if type(v.mime_type) == 'table' then
for _,mt in ipairs(v.mime_type) do
modules_by_mime_type[mt] = {k, v}
end
else
modules_by_mime_type[v.mime_type] = {k, v}
end
end
if v.extensions then
for _,ext in ipairs(v.extensions) do
modules_by_extension[ext] = {k, v}
end
end
end
end
exports.maybe_process_mime_part = function(part, task)
if not modules_by_mime_type then
init()
end
local ctype, csubtype = part:get_type()
local mt = string.format("%s/%s", ctype or 'application',
csubtype or 'octet-stream')
local pair = modules_by_mime_type[mt]
if not pair then
local ext = part:get_detected_ext()
if ext then
pair = modules_by_extension[ext]
end
end
if pair then
lua_util.debugm(N, task, "found known content of type %s: %s",
mt, pair[1])
local data = pair[2].module.process(part:get_content(), part, task)
if data then
lua_util.debugm(N, task, "extracted content from %s: %s type",
pair[1], type(data))
part:set_specific(data)
else
lua_util.debugm(N, task, "failed to extract anything from %s",
pair[1])
end
end
end
return exports
|