116 lines
4.1 KiB
C++
116 lines
4.1 KiB
C++
#include "../data/siglevel.h"
|
|
|
|
#include <c++utilities/conversion/stringbuilder.h>
|
|
#include <c++utilities/conversion/stringconversion.h>
|
|
|
|
#include <vector>
|
|
|
|
using namespace CppUtilities;
|
|
|
|
namespace LibPkg {
|
|
|
|
SignatureLevelConfig SignatureLevelConfig::fromString(std::string_view str)
|
|
{
|
|
auto parts = splitStringSimple<std::vector<std::string_view>>(str, std::string_view(" "));
|
|
auto whatToCheckPkg = SignatureLevel::Optional;
|
|
auto whatIsAllowedPkg = SignatureLevel::TrustedOnly;
|
|
auto whatToCheckDb = SignatureLevel::Optional;
|
|
auto whatIsAllowedDb = SignatureLevel::TrustedOnly;
|
|
for (auto &part : parts) {
|
|
if (part.empty()) {
|
|
continue;
|
|
}
|
|
enum SignatureScope {
|
|
All,
|
|
Package,
|
|
Database,
|
|
} scope
|
|
= All;
|
|
if (startsWith(part, "Package")) {
|
|
part = part.substr(7);
|
|
scope = Package;
|
|
} else if (startsWith(part, "Database")) {
|
|
part = part.substr(8);
|
|
scope = All;
|
|
}
|
|
SignatureLevel whatToCheck = SignatureLevel::Invalid, whatIsAllowed = SignatureLevel::Invalid;
|
|
if (part == "Never") {
|
|
whatToCheck = SignatureLevel::Never;
|
|
} else if (part == "Optional") {
|
|
whatToCheck = SignatureLevel::Optional;
|
|
} else if (part == "Required") {
|
|
whatToCheck = SignatureLevel::Required;
|
|
} else if (part == "TrustedOnly") {
|
|
whatIsAllowed = SignatureLevel::TrustedOnly;
|
|
} else if (part == "TrustAll") {
|
|
whatIsAllowed = SignatureLevel::TrustAll;
|
|
} else {
|
|
return SignatureLevelConfig(SignatureLevel::Invalid);
|
|
}
|
|
switch (scope) {
|
|
case All:
|
|
if (whatToCheck != SignatureLevel::Invalid) {
|
|
whatToCheckDb = whatToCheckPkg = whatToCheck;
|
|
} else if (whatIsAllowed != SignatureLevel::Invalid) {
|
|
whatIsAllowedDb = whatIsAllowedPkg = whatIsAllowed;
|
|
}
|
|
break;
|
|
case Package:
|
|
if (whatToCheck != SignatureLevel::Invalid) {
|
|
whatToCheckPkg = whatToCheck;
|
|
} else if (whatIsAllowed != SignatureLevel::Invalid) {
|
|
whatIsAllowedPkg = whatIsAllowed;
|
|
}
|
|
break;
|
|
case Database:
|
|
if (whatToCheck != SignatureLevel::Invalid) {
|
|
whatToCheckDb = whatToCheck;
|
|
} else if (whatIsAllowed != SignatureLevel::Invalid) {
|
|
whatIsAllowedDb = whatIsAllowed;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return SignatureLevelConfig(whatToCheckDb | whatIsAllowedDb, whatToCheckPkg | whatIsAllowedPkg);
|
|
}
|
|
|
|
std::string signatureLevelToString(SignatureLevel sigLevel, std::string_view prefix)
|
|
{
|
|
if (sigLevel == SignatureLevel::Invalid) {
|
|
return std::string();
|
|
}
|
|
const char *whatToCheck = "Optional";
|
|
const char *whatIsAllowed = "TrustedOnly";
|
|
if (sigLevel & SignatureLevel::Required) {
|
|
whatToCheck = "Required";
|
|
} else if (sigLevel & SignatureLevel::Optional) {
|
|
whatToCheck = "Optional";
|
|
} else if (sigLevel & SignatureLevel::Never) {
|
|
whatToCheck = "Never";
|
|
}
|
|
if (sigLevel & SignatureLevel::TrustedOnly) {
|
|
whatIsAllowed = "TrustedOnly";
|
|
} else if (sigLevel & SignatureLevel::TrustAll) {
|
|
whatIsAllowed = "TrustAll";
|
|
}
|
|
return argsToString(prefix, whatToCheck, ' ', prefix, whatIsAllowed);
|
|
}
|
|
|
|
std::string SignatureLevelConfig::toString() const
|
|
{
|
|
if (databaseScope == SignatureLevel::Invalid && packageScope == SignatureLevel::Invalid) {
|
|
return std::string();
|
|
} else if (databaseScope == packageScope || packageScope == SignatureLevel::Invalid) {
|
|
return signatureLevelToString(databaseScope);
|
|
} else if (databaseScope == SignatureLevel::Invalid) {
|
|
return signatureLevelToString(packageScope);
|
|
} else {
|
|
return argsToString(signatureLevelToString(databaseScope, std::string_view("Database")), ' ',
|
|
signatureLevelToString(packageScope, std::string_view("Package")));
|
|
}
|
|
}
|
|
|
|
} // namespace LibPkg
|
|
|
|
#include "reflection/siglevel.h"
|