Overte C++ Documentation
NodePermissions.h
1 //
2 // NodePermissions.h
3 // libraries/networking/src/
4 //
5 // Created by Seth Alves on 2016-6-1.
6 // Copyright 2016 High Fidelity, Inc.
7 // Copyright 2020 Vircadia contributors.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 #ifndef hifi_NodePermissions_h
14 #define hifi_NodePermissions_h
15 
16 #include <memory>
17 #include <unordered_map>
18 #include <QString>
19 #include <QMap>
20 #include <QVariant>
21 #include <QUuid>
22 #include <QHash>
23 #include <utility>
24 #include "GroupRank.h"
25 
26 class NodePermissions;
27 using NodePermissionsPointer = std::shared_ptr<NodePermissions>;
28 using NodePermissionsKey = std::pair<QString, QUuid>; // name, rankID
29 using NodePermissionsKeyList = QList<QPair<QString, QUuid>>;
30 
31 namespace std {
32  template<>
33  struct hash<NodePermissionsKey> {
34  size_t operator()(const NodePermissionsKey& key) const;
35  };
36 }
37 
38 class NodePermissions {
39 public:
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);
44 
45  QString getID() const { return _id; } // a user-name or a group-name, not verified
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); }
50 
51  // the _id member isn't authenticated/verified and _username is.
52  void setVerifiedUserName(QString userName) { _verifiedUserName = userName.toLower(); }
53  const QString& getVerifiedUserName() const { return _verifiedUserName; }
54 
55  void setVerifiedDomainUserName(QString userName) { _verifiedDomainUserName = userName.toLower(); }
56  const QString& getVerifiedDomainUserName() const { return _verifiedDomainUserName; }
57 
58  void setGroupID(QUuid groupID) { _groupID = groupID; if (!groupID.isNull()) { _groupIDSet = true; }}
59  QUuid getGroupID() const { return _groupID; }
60  bool isGroup() const { return _groupIDSet; }
61 
62  bool isAssignment { false };
63 
64  // these 3 names have special meaning.
65  static NodePermissionsKey standardNameLocalhost;
66  static NodePermissionsKey standardNameLoggedIn;
67  static NodePermissionsKey standardNameAnonymous;
68  static NodePermissionsKey standardNameFriends;
69  static QStringList standardNames;
70 
71  enum class Permission {
72  none = 0,
73  canConnectToDomain = 1,
74  canAdjustLocks = 2,
75  canRezPermanentEntities = 4,
76  canRezTemporaryEntities = 8,
77  canWriteToAssetServer = 16,
78  canConnectPastMaxCapacity = 32,
79  canKick = 64,
80  canReplaceDomainContent = 128,
81  canGetAndSetPrivateUserData = 1024,
82  canRezAvatarEntities = 2048,
83  canViewAssetURLs = 4096
84  };
85  Q_DECLARE_FLAGS(Permissions, Permission)
86  Permissions permissions;
87 
88  QVariant toVariant(QHash<QUuid, GroupRank> groupRanks = QHash<QUuid, GroupRank>());
89 
90  void setAll(bool value);
91 
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);
97 
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); }
101 
102 protected:
103  QString _id;
104  QUuid _rankID { QUuid() }; // 0 unless this is for a group
105  QString _verifiedUserName;
106  QString _verifiedDomainUserName;
107 
108  bool _groupIDSet { false };
109  QUuid _groupID;
110 };
111 Q_DECLARE_OPERATORS_FOR_FLAGS(NodePermissions::Permissions)
112 
113 
114 // wrap QHash in a class that forces all keys to be lowercase
115 class NodePermissionsMap {
116 public:
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);
122  }
123  return _data[dataKey];
124  }
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;
130  }
131  return result;
132  }
133  bool contains(const NodePermissionsKey& key) const {
134  return 0 != _data.count(NodePermissionsKey(key.first.toLower(), key.second));
135  }
136  bool contains(const QString& keyFirst, const QUuid& keySecond) const {
137  return 0 != _data.count(NodePermissionsKey(keyFirst.toLower(), keySecond));
138  }
139 
140  QList<NodePermissionsKey> keys() const {
141  QList<NodePermissionsKey> result;
142  for (const auto& entry : _data) {
143  result.push_back(entry.first);
144  }
145  return result;
146  }
147 
148  const std::unordered_map<NodePermissionsKey, NodePermissionsPointer>& get() { return _data; }
149  void clear() { _data.clear(); }
150  void remove(const NodePermissionsKey& key) { _data.erase(key); }
151 
152 private:
153  std::unordered_map<NodePermissionsKey, NodePermissionsPointer> _data;
154 };
155 
156 
157 const NodePermissions DEFAULT_AGENT_PERMISSIONS;
158 
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);
164 
165 #endif // hifi_NodePermissions_h