src/settings.cpp

Sat, 01 Feb 2025 16:01:14 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 01 Feb 2025 16:01:14 +0100
changeset 16
730a5638c4ad
parent 14
f0ae064c5b9c
child 25
b8d6b14c1555
permissions
-rw-r--r--

implement authormap

14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /* Copyright 2025 Mike Becker. All rights reserved.
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 *
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Redistribution and use in source and binary forms, with or without
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * modification, are permitted provided that the following conditions are met:
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * 1. Redistributions of source code must retain the above copyright
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * notice, this list of conditions and the following disclaimer.
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 2. Redistributions in binary form must reproduce the above copyright
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer in the
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * documentation and/or other materials provided with the distribution.
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 *
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 */
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 #include "settings.h"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 #include <format>
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #include <algorithm>
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
29 #include <fstream>
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 using namespace fm;
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
33 static bool check_author(std::string_view author, std::string_view allowed) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
34 // check for exact match
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
35 if (author == allowed) return true;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
36
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
37 // check mail address matching
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
38 if (author.contains(std::format("<{}>", allowed))) return true;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
39
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
40 // check local-part from mail address matching
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
41 if (author.contains(std::format("<{}@", allowed))) return true;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
42
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
43 return false;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
44 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
45
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 [[nodiscard]] bool settings::exclude_author(const std::string &author) const {
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 // no allow-list means: always allowed
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 if (authors.empty()) return false;
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 // check all allowed authors
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
51 return !std::ranges::any_of(authors, [&](const auto &allowed) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
52 return check_author(author, allowed);
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 });
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 }
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
55
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
56 std::string_view trim(const std::string& str) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
57 size_t s = str.find_first_not_of(" \t");
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
58 size_t l = str.find_last_not_of(" \t") + 1 - s;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
59 return std::string_view{str}.substr(s, l);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
60 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
61
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
62 int settings::parse_authormap(const std::string& path) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
63 std::ifstream file(path);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
64
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
65 if (!file.is_open()) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
66 return -1;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
67 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
68
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
69 std::string line;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
70 while (std::getline(file, line)) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
71 line = trim(line);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
72
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
73 // skip empty lines and comments
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
74 if (line.empty() || line[0] == '#') {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
75 continue;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
76 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
77
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
78 // find delimiter
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
79 size_t delimPos = line.find('=');
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
80 if (delimPos == std::string::npos) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
81 return -1;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
82 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
83
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
84 auto key = std::string{trim(line.substr(0, delimPos))};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
85 auto value = std::string{trim(line.substr(delimPos + 1))};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
86 authormap[std::move(key)] = std::move(value);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
87 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
88
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
89 return 0;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
90 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
91
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
92 std::string settings::map_author(std::string_view author) const {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
93 if (authormap.empty()) return std::string{author};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
94
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
95 for (const auto &[old_name, new_name] : authormap) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
96 if (check_author(author, old_name)) return new_name;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
97 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
98
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
99 return std::string{author};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
100 }

mercurial