diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-10-04 21:45:59 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-10-04 21:45:59 +0100 |
commit | a3752855c6c378da51b73a1e854b439eb472cc56 (patch) | |
tree | 861dd3b34a52220e378a39eea86e4aa9b55fee4c /src/libmime | |
parent | e040d66c354b135e1281cd438958ecb3e7a8983e (diff) | |
download | rspamd-a3752855c6c378da51b73a1e854b439eb472cc56.tar.gz rspamd-a3752855c6c378da51b73a1e854b439eb472cc56.zip |
[Project] Move C++ specific declarations to C++ header
Diffstat (limited to 'src/libmime')
-rw-r--r-- | src/libmime/received.hxx | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/libmime/received.hxx b/src/libmime/received.hxx new file mode 100644 index 000000000..fd03fd1fa --- /dev/null +++ b/src/libmime/received.hxx @@ -0,0 +1,112 @@ +/*- + * Copyright 2021 Vsevolod Stakhov + * + * 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. + */ + + +#ifndef RSPAMD_RECEIVED_HXX +#define RSPAMD_RECEIVED_HXX +#pragma once + +#include "config.h" +#include "received.h" +#include "mime_string.hxx" +#include "libmime/email_addr.h" +#include "libserver/task.h" +#include <vector> +#include <string_view> +#include <utility> +#include <optional> + +namespace rspamd::mime { + +static inline auto +received_char_filter(UChar32 uc) -> UChar32 +{ + if (u_isprint(uc)) { + return u_tolower(uc); + } + + return 0; +} + +struct received_header { + mime_string from_hostname; + std::string_view from_ip; + mime_string real_hostname; + mime_string real_ip; + mime_string by_hostname; + std::string_view for_mbox; + struct rspamd_email_address *for_addr = nullptr; + rspamd_inet_addr_t *addr = nullptr; + struct rspamd_mime_header *hdr = nullptr; + time_t timestamp = 0; + int flags = 0; /* See enum rspamd_received_type */ + + received_header() noexcept + : from_hostname(received_char_filter), + real_hostname(received_char_filter), + real_ip(received_char_filter), + by_hostname(received_char_filter) {} + + ~received_header() { + if (for_addr) { + rspamd_email_address_free(for_addr); + } + } +}; + +class received_header_chain { +public: + explicit received_header_chain(struct rspamd_task *_task) : task(_task) { + headers.reserve(2); + rspamd_mempool_add_destructor(task->task_pool, + received_header_chain::received_header_chain_pool_dtor, this); + } + + enum class append_type { + append_tail, + append_head + }; + + auto new_received(append_type how = append_type::append_tail) -> received_header & { + if (how == append_type::append_tail) { + headers.emplace_back(); + + return headers.back(); + } + else { + headers.insert(std::begin(headers), {}); + + return headers.front(); + } + } + auto get_received(std::size_t nth) -> std::optional<std::reference_wrapper<received_header>>{ + if (nth < headers.size()) { + return headers[nth]; + } + + return std::nullopt; + } +private: + static auto received_header_chain_pool_dtor(void *ptr) -> void { + delete static_cast<received_header_chain *>(ptr); + } + std::vector<received_header> headers; + struct rspamd_task *task; +}; + +} + +#endif //RSPAMD_RECEIVED_HXX |