src/settings.cpp

Tue, 25 Feb 2025 18:22:55 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 25 Feb 2025 18:22:55 +0100
changeset 43
f58fd8461e10
parent 25
b8d6b14c1555
permissions
-rw-r--r--

add dist target

fixes #607

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) {
25
b8d6b14c1555 fix crash when author map contains blank lines - fixes #598
Mike Becker <universe@uap-core.de>
parents: 16
diff changeset
57 size_t s = str.find_first_not_of(" \t\r");
b8d6b14c1555 fix crash when author map contains blank lines - fixes #598
Mike Becker <universe@uap-core.de>
parents: 16
diff changeset
58 if (s == std::string::npos) return "";
b8d6b14c1555 fix crash when author map contains blank lines - fixes #598
Mike Becker <universe@uap-core.de>
parents: 16
diff changeset
59 size_t l = str.find_last_not_of(" \t\r") + 1 - s;
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
60 return std::string_view{str}.substr(s, l);
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
63 int settings::parse_authormap(const std::string& path) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
64 std::ifstream file(path);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
65
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
66 if (!file.is_open()) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
67 return -1;
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
70 std::string line;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
71 while (std::getline(file, line)) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
72 line = trim(line);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
73
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
74 // skip empty lines and comments
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
75 if (line.empty() || line[0] == '#') {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
76 continue;
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
79 // find delimiter
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
80 size_t delimPos = line.find('=');
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
81 if (delimPos == std::string::npos) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
82 return -1;
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
85 auto key = std::string{trim(line.substr(0, delimPos))};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
86 auto value = std::string{trim(line.substr(delimPos + 1))};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
87 authormap[std::move(key)] = std::move(value);
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
90 return 0;
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
93 std::string settings::map_author(std::string_view author) const {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
94 if (authormap.empty()) return std::string{author};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
95
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
96 for (const auto &[old_name, new_name] : authormap) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
97 if (check_author(author, old_name)) return new_name;
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
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
100 return std::string{author};
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
101 }

mercurial