mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 10:53:44 +00:00
feat(permissions): API key scopes that narrow permission and rank checks
A key's effective permission is its scope AND its owner's current permission. Scoped variants of Allowed, CanViewCharacter, ForLevel and ManageDenialNow; keys need self_* and manage_equal_rank in their scope to act on their owner or equal ranks, even for GM 9 owners. Adds the api_keys_manage permission and NotGrantable for key creation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,12 +2,15 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
#include "json.hpp"
|
||||
|
||||
namespace ApiKeys { struct Scope; }
|
||||
|
||||
/**
|
||||
* What each GM level may do on the dashboard, and in the game for the slash commands paired with a permission. Every
|
||||
* permission has a default minimum GM level; server owners can change it without rebuilding, on the Permissions page
|
||||
@@ -50,11 +53,19 @@ namespace Permissions {
|
||||
|
||||
bool Allowed(uint8_t gmLevel, const std::string& key);
|
||||
|
||||
// For a request made with an API key: the owner's level must allow it AND the key's scope must name it.
|
||||
// scope nullptr (a browser session) is the plain check.
|
||||
bool Allowed(uint8_t gmLevel, const std::string& key, const ApiKeys::Scope* scope);
|
||||
|
||||
// The permissions in a requested API key scope that a GM level may not give it (unknown ones, or ones it doesn't
|
||||
// have): a key can never be made with more than its maker has. Empty: all of them may be given.
|
||||
std::set<std::string> NotGrantable(uint8_t gmLevel, const std::set<std::string>& requested);
|
||||
|
||||
// characters_view for anyone's character, or own_characters for the viewer's own (account 0 owns nothing)
|
||||
bool CanViewCharacter(uint8_t gmLevel, uint32_t viewerAccountId, uint32_t ownerAccountId);
|
||||
bool CanViewCharacter(uint8_t gmLevel, uint32_t viewerAccountId, uint32_t ownerAccountId, const ApiKeys::Scope* scope = nullptr);
|
||||
|
||||
// {key: bool} for every permission, for templates and scripts
|
||||
nlohmann::json ForLevel(uint8_t gmLevel);
|
||||
nlohmann::json ForLevel(uint8_t gmLevel, const ApiKeys::Scope* scope = nullptr);
|
||||
|
||||
// Pure: the level a config value gives a permission (bad or out-of-range values fall back to the default)
|
||||
uint8_t Resolve(const Permission& permission, const std::string& configValue);
|
||||
|
||||
Reference in New Issue
Block a user