13 #ifndef hifi_NodePermissions_h
14 #define hifi_NodePermissions_h
17 #include <unordered_map>
24 #include "GroupRank.h"
26 class NodePermissions;
27 using NodePermissionsPointer = std::shared_ptr<NodePermissions>;
28 using NodePermissionsKey = std::pair<QString, QUuid>;
29 using NodePermissionsKeyList = QList<QPair<QString, QUuid>>;
33 struct hash<NodePermissionsKey> {
34 size_t operator()(
const NodePermissionsKey& key)
const;
38 class NodePermissions {
40 NodePermissions() { _id = QUuid::createUuid().toString(); _rankID = QUuid(); }
41 NodePermissions(
const QString& name) { _id = name.toLower(); _rankID = QUuid(); }
42 NodePermissions(
const NodePermissionsKey& key) { _id = key.first.toLower(); _rankID = key.second; }
43 NodePermissions(QMap<QString, QVariant> perms);
45 QString getID()
const {
return _id; }
46 void setID(
const QString&
id) { _id = id; }
47 void setRankID(QUuid& rankID) { _rankID = rankID; }
48 QUuid getRankID()
const {
return _rankID; }
49 NodePermissionsKey getKey()
const {
return NodePermissionsKey(_id, _rankID); }
52 void setVerifiedUserName(QString userName) { _verifiedUserName = userName.toLower(); }
53 const QString& getVerifiedUserName()
const {
return _verifiedUserName; }
55 void setVerifiedDomainUserName(QString userName) { _verifiedDomainUserName = userName.toLower(); }
56 const QString& getVerifiedDomainUserName()
const {
return _verifiedDomainUserName; }
58 void setGroupID(QUuid groupID) { _groupID = groupID;
if (!groupID.isNull()) { _groupIDSet =
true; }}
59 QUuid getGroupID()
const {
return _groupID; }
60 bool isGroup()
const {
return _groupIDSet; }
62 bool isAssignment {
false };
65 static NodePermissionsKey standardNameLocalhost;
66 static NodePermissionsKey standardNameLoggedIn;
67 static NodePermissionsKey standardNameAnonymous;
68 static NodePermissionsKey standardNameFriends;
69 static QStringList standardNames;
71 enum class Permission {
73 canConnectToDomain = 1,
75 canRezPermanentEntities = 4,
76 canRezTemporaryEntities = 8,
77 canWriteToAssetServer = 16,
78 canConnectPastMaxCapacity = 32,
80 canReplaceDomainContent = 128,
81 canGetAndSetPrivateUserData = 1024,
82 canRezAvatarEntities = 2048,
83 canViewAssetURLs = 4096
85 Q_DECLARE_FLAGS(Permissions, Permission)
86 Permissions permissions;
88 QVariant toVariant(QHash<QUuid, GroupRank> groupRanks = QHash<QUuid, GroupRank>());
90 void setAll(
bool value);
92 NodePermissions& operator|=(
const NodePermissions& rhs);
93 NodePermissions& operator&=(
const NodePermissions& rhs);
94 NodePermissions operator~();
95 friend QDataStream& operator<<(QDataStream& out,
const NodePermissions& perms);
96 friend QDataStream& operator>>(QDataStream& in, NodePermissions& perms);
98 void clear(Permission p) { permissions &= (Permission) (~(uint)p); }
99 void set(Permission p) { permissions |= p; }
100 bool can(Permission p)
const {
return permissions.testFlag(p); }
104 QUuid _rankID { QUuid() };
105 QString _verifiedUserName;
106 QString _verifiedDomainUserName;
108 bool _groupIDSet {
false };
111 Q_DECLARE_OPERATORS_FOR_FLAGS(NodePermissions::Permissions)
115 class NodePermissionsMap {
117 NodePermissionsMap() { }
118 NodePermissionsPointer& operator[](
const NodePermissionsKey& key) {
119 NodePermissionsKey dataKey(key.first.toLower(), key.second);
120 if (0 == _data.count(dataKey)) {
121 _data[dataKey] = std::make_shared<NodePermissions>(key);
123 return _data[dataKey];
125 NodePermissionsPointer operator[](
const NodePermissionsKey& key)
const {
126 NodePermissionsPointer result;
127 auto itr = _data.find(NodePermissionsKey(key.first.toLower(), key.second));
128 if (_data.end() != itr) {
129 result = itr->second;
133 bool contains(
const NodePermissionsKey& key)
const {
134 return 0 != _data.count(NodePermissionsKey(key.first.toLower(), key.second));
136 bool contains(
const QString& keyFirst,
const QUuid& keySecond)
const {
137 return 0 != _data.count(NodePermissionsKey(keyFirst.toLower(), keySecond));
140 QList<NodePermissionsKey> keys()
const {
141 QList<NodePermissionsKey> result;
142 for (
const auto& entry : _data) {
143 result.push_back(entry.first);
148 const std::unordered_map<NodePermissionsKey, NodePermissionsPointer>& get() {
return _data; }
149 void clear() { _data.clear(); }
150 void remove(
const NodePermissionsKey& key) { _data.erase(key); }
153 std::unordered_map<NodePermissionsKey, NodePermissionsPointer> _data;
157 const NodePermissions DEFAULT_AGENT_PERMISSIONS;
159 QDebug operator<<(QDebug debug,
const NodePermissions& perms);
160 QDebug operator<<(QDebug debug,
const NodePermissionsPointer& perms);
161 NodePermissionsPointer& operator&=(NodePermissionsPointer& lhs,
const NodePermissionsPointer& rhs);
162 NodePermissionsPointer& operator&=(NodePermissionsPointer& lhs, NodePermissions::Permission rhs);
163 NodePermissionsPointer operator~(NodePermissionsPointer& lhs);