infinipaint/src/CollabPermissions.hpp
copilot 7f34283537
All checks were successful
Windows Release / windows-x86_64 (push) Successful in 1h12m54s
Add host-configurable collab permissions with layered overrides.
Session/person/layer defaults plus person×layer ACL (Allow/Deny/Inherit) for draw, move, delete, hide, and layer management; bump save format to 0.9.0-fork.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-07 18:12:42 +01:00

77 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* InfiniPaint (fork)
* Collab ACL: World → Person → Layer → Person×Layer (Allow/Deny/Inherit)
*/
#pragma once
#include <cstdint>
#include <map>
#include <string>
#include <cereal/types/map.hpp>
#include <cereal/types/string.hpp>
enum class CollabRight : uint8_t {
Draw = 0,
Move,
Delete,
Hide,
ManageLayers,
COUNT
};
enum class CollabTriState : uint8_t {
Inherit = 0,
Allow = 1,
Deny = 2
};
struct CollabPermissionSet {
CollabTriState draw = CollabTriState::Inherit;
CollabTriState move = CollabTriState::Inherit;
CollabTriState erase = CollabTriState::Inherit;
CollabTriState hide = CollabTriState::Inherit;
CollabTriState manageLayers = CollabTriState::Inherit;
CollabTriState get(CollabRight right) const;
void set(CollabRight right, CollabTriState state);
bool any_concrete() const;
static CollabPermissionSet all_allow();
static CollabPermissionSet all_inherit();
static CollabPermissionSet content_deny(); // Draw/Move/Delete Deny, rest Inherit
template <typename Archive>
void serialize(Archive& a) {
a(draw, move, erase, hide, manageLayers);
}
bool operator==(const CollabPermissionSet&) const = default;
};
struct CollabSessionDefaults {
// Concrete fallback when everything inherits (Inherit treated as Allow).
CollabPermissionSet worldDefault = CollabPermissionSet::all_allow();
// Copied onto ClientData when a player joins.
CollabPermissionSet newPlayerDefaults = CollabPermissionSet::all_inherit();
// Copied onto new layers' DisplayData.layerDefaults.
CollabPermissionSet newLayerDefaults = CollabPermissionSet::all_inherit();
template <typename Archive>
void serialize(Archive& a) {
a(worldDefault, newPlayerDefaults, newLayerDefaults);
}
bool operator==(const CollabSessionDefaults&) const = default;
};
/** Resolve Allow/Deny for peer on a layer. Host callers should short-circuit before this. */
bool collab_resolve_allow(
CollabRight right,
const CollabPermissionSet* personLayerOverride, // nullable
const CollabPermissionSet& layerDefaults,
const CollabPermissionSet& personDefaults,
const CollabPermissionSet& worldDefault);
const char* collab_right_label(CollabRight right);
const char* collab_tristate_label(CollabTriState state);
CollabTriState collab_cycle_tristate(CollabTriState state);