mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 13:18:38 +02:00
start on handling group permissions
This commit is contained in:
parent
d184aade1b
commit
dd24143d16
1 changed files with 93 additions and 3 deletions
|
@ -21,6 +21,7 @@
|
||||||
#include <QtCore/QUrl>
|
#include <QtCore/QUrl>
|
||||||
#include <QtCore/QUrlQuery>
|
#include <QtCore/QUrlQuery>
|
||||||
|
|
||||||
|
#include <AccountManager.h>
|
||||||
#include <Assignment.h>
|
#include <Assignment.h>
|
||||||
#include <HifiConfigVariantMap.h>
|
#include <HifiConfigVariantMap.h>
|
||||||
#include <HTTPConnection.h>
|
#include <HTTPConnection.h>
|
||||||
|
@ -269,19 +270,21 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
||||||
void DomainServerSettingsManager::packPermissionsForMap(QString mapName,
|
void DomainServerSettingsManager::packPermissionsForMap(QString mapName,
|
||||||
QHash<QString, NodePermissionsPointer> agentPermissions,
|
QHash<QString, NodePermissionsPointer> agentPermissions,
|
||||||
QString keyPath) {
|
QString keyPath) {
|
||||||
|
// find (or create) the "security" section of the settings map
|
||||||
QVariant* security = valueForKeyPath(_configMap.getUserConfig(), "security");
|
QVariant* security = valueForKeyPath(_configMap.getUserConfig(), "security");
|
||||||
if (!security || !security->canConvert(QMetaType::QVariantMap)) {
|
if (!security || !security->canConvert(QMetaType::QVariantMap)) {
|
||||||
security = valueForKeyPath(_configMap.getUserConfig(), "security", true);
|
security = valueForKeyPath(_configMap.getUserConfig(), "security", true);
|
||||||
(*security) = QVariantMap();
|
(*security) = QVariantMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// save settings for anonymous / logged-in / localhost
|
// find (or create) whichever subsection of "security" we are packing
|
||||||
QVariant* permissions = valueForKeyPath(_configMap.getUserConfig(), keyPath);
|
QVariant* permissions = valueForKeyPath(_configMap.getUserConfig(), keyPath);
|
||||||
if (!permissions || !permissions->canConvert(QMetaType::QVariantList)) {
|
if (!permissions || !permissions->canConvert(QMetaType::QVariantList)) {
|
||||||
permissions = valueForKeyPath(_configMap.getUserConfig(), keyPath, true);
|
permissions = valueForKeyPath(_configMap.getUserConfig(), keyPath, true);
|
||||||
(*permissions) = QVariantList();
|
(*permissions) = QVariantList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert details for each member of the section
|
||||||
QVariantList* permissionsList = reinterpret_cast<QVariantList*>(permissions);
|
QVariantList* permissionsList = reinterpret_cast<QVariantList*>(permissions);
|
||||||
(*permissionsList).clear();
|
(*permissionsList).clear();
|
||||||
foreach (QString userName, agentPermissions.keys()) {
|
foreach (QString userName, agentPermissions.keys()) {
|
||||||
|
@ -291,11 +294,16 @@ void DomainServerSettingsManager::packPermissionsForMap(QString mapName,
|
||||||
|
|
||||||
void DomainServerSettingsManager::packPermissions() {
|
void DomainServerSettingsManager::packPermissions() {
|
||||||
// transfer details from _agentPermissions to _configMap
|
// transfer details from _agentPermissions to _configMap
|
||||||
|
|
||||||
|
// save settings for anonymous / logged-in / localhost
|
||||||
packPermissionsForMap("standard_permissions", _standardAgentPermissions, AGENT_STANDARD_PERMISSIONS_KEYPATH);
|
packPermissionsForMap("standard_permissions", _standardAgentPermissions, AGENT_STANDARD_PERMISSIONS_KEYPATH);
|
||||||
|
|
||||||
// save settings for specific users
|
// save settings for specific users
|
||||||
packPermissionsForMap("permissions", _agentPermissions, AGENT_PERMISSIONS_KEYPATH);
|
packPermissionsForMap("permissions", _agentPermissions, AGENT_PERMISSIONS_KEYPATH);
|
||||||
|
|
||||||
|
// save settings for groups
|
||||||
|
packPermissionsForMap("permissions", _groupPermissions, AGENT_PERMISSIONS_KEYPATH);
|
||||||
|
|
||||||
persistToFile();
|
persistToFile();
|
||||||
_configMap.loadMasterAndUserConfig(_argumentList);
|
_configMap.loadMasterAndUserConfig(_argumentList);
|
||||||
}
|
}
|
||||||
|
@ -305,6 +313,7 @@ void DomainServerSettingsManager::unpackPermissions() {
|
||||||
|
|
||||||
_standardAgentPermissions.clear();
|
_standardAgentPermissions.clear();
|
||||||
_agentPermissions.clear();
|
_agentPermissions.clear();
|
||||||
|
_groupPermissions.clear();
|
||||||
|
|
||||||
bool foundLocalhost = false;
|
bool foundLocalhost = false;
|
||||||
bool foundAnonymous = false;
|
bool foundAnonymous = false;
|
||||||
|
@ -323,6 +332,12 @@ void DomainServerSettingsManager::unpackPermissions() {
|
||||||
permissions = valueForKeyPath(_configMap.getUserConfig(), AGENT_PERMISSIONS_KEYPATH, true);
|
permissions = valueForKeyPath(_configMap.getUserConfig(), AGENT_PERMISSIONS_KEYPATH, true);
|
||||||
(*permissions) = QVariantList();
|
(*permissions) = QVariantList();
|
||||||
}
|
}
|
||||||
|
QVariant* groupPermissions = valueForKeyPath(_configMap.getUserConfig(), GROUP_PERMISSIONS_KEYPATH);
|
||||||
|
if (!groupPermissions || !groupPermissions->canConvert(QMetaType::QVariantList)) {
|
||||||
|
qDebug() << "failed to extract group permissions from settings.";
|
||||||
|
groupPermissions = valueForKeyPath(_configMap.getUserConfig(), GROUP_PERMISSIONS_KEYPATH, true);
|
||||||
|
(*groupPermissions) = QVariantList();
|
||||||
|
}
|
||||||
|
|
||||||
QList<QVariant> standardPermissionsList = standardPermissions->toList();
|
QList<QVariant> standardPermissionsList = standardPermissions->toList();
|
||||||
foreach (QVariant permsHash, standardPermissionsList) {
|
foreach (QVariant permsHash, standardPermissionsList) {
|
||||||
|
@ -353,6 +368,19 @@ void DomainServerSettingsManager::unpackPermissions() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<QVariant> groupPermissionsList = groupPermissions->toList();
|
||||||
|
foreach (QVariant permsHash, groupPermissionsList) {
|
||||||
|
NodePermissionsPointer perms { new NodePermissions(permsHash.toMap()) };
|
||||||
|
QString id = perms->getID();
|
||||||
|
if (_groupPermissions.contains(id)) {
|
||||||
|
qDebug() << "duplicate name in group permissions table: " << id;
|
||||||
|
_groupPermissions[id] |= perms;
|
||||||
|
needPack = true;
|
||||||
|
} else {
|
||||||
|
_groupPermissions[id] = perms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if any of the standard names are missing, add them
|
// if any of the standard names are missing, add them
|
||||||
if (!foundLocalhost) {
|
if (!foundLocalhost) {
|
||||||
NodePermissionsPointer perms { new NodePermissions(NodePermissions::standardNameLocalhost) };
|
NodePermissionsPointer perms { new NodePermissions(NodePermissions::standardNameLocalhost) };
|
||||||
|
@ -375,16 +403,24 @@ void DomainServerSettingsManager::unpackPermissions() {
|
||||||
packPermissions();
|
packPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// attempt to retrieve any missing group-IDs
|
||||||
|
requestMissingGroupIDs();
|
||||||
|
|
||||||
|
|
||||||
#ifdef WANT_DEBUG
|
#ifdef WANT_DEBUG
|
||||||
qDebug() << "--------------- permissions ---------------------";
|
qDebug() << "--------------- permissions ---------------------";
|
||||||
QList<QHash<QString, NodePermissionsPointer>> permissionsSets;
|
QList<QHash<QString, NodePermissionsPointer>> permissionsSets;
|
||||||
permissionsSets << _standardAgentPermissions << _agentPermissions;
|
permissionsSets << _standardAgentPermissions << _agentPermissions << _groupPermissions;
|
||||||
foreach (auto permissionSet, permissionsSets) {
|
foreach (auto permissionSet, permissionsSets) {
|
||||||
QHashIterator<QString, NodePermissionsPointer> i(permissionSet);
|
QHashIterator<QString, NodePermissionsPointer> i(permissionSet);
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
i.next();
|
i.next();
|
||||||
NodePermissionsPointer perms = i.value();
|
NodePermissionsPointer perms = i.value();
|
||||||
qDebug() << i.key() << perms;
|
if (perms->isGroup()) {
|
||||||
|
qDebug() << i.key() << perms->getGroupID() << perms;
|
||||||
|
} else {
|
||||||
|
qDebug() << i.key() << perms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -827,3 +863,57 @@ void DomainServerSettingsManager::persistToFile() {
|
||||||
qCritical("Could not write to JSON settings file. Unable to persist settings.");
|
qCritical("Could not write to JSON settings file. Unable to persist settings.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DomainServerSettingsManager::requestMissingGroupIDs() {
|
||||||
|
QHashIterator<QString, NodePermissionsPointer> i(_groupPermissions);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
NodePermissionsPointer perms = i.value();
|
||||||
|
if (!perms->getGroupID().isNull()) {
|
||||||
|
// we already know this group's ID
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make a call to metaverse api to turn the group name into a group ID
|
||||||
|
getGroupID(perms->getID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomainServerSettingsManager::getGroupID(const QString& groupname) {
|
||||||
|
JSONCallbackParameters callbackParams;
|
||||||
|
callbackParams.jsonCallbackReceiver = this;
|
||||||
|
callbackParams.jsonCallbackMethod = "getGroupIDJSONCallback";
|
||||||
|
callbackParams.errorCallbackReceiver = this;
|
||||||
|
callbackParams.errorCallbackMethod = "getGroupIDErrorCallback";
|
||||||
|
|
||||||
|
const QString GET_GROUP_ID_PATH = "api/v1/get_group_id/%1";
|
||||||
|
|
||||||
|
qDebug() << "Requesting group ID for group named" << groupname;
|
||||||
|
|
||||||
|
DependencyManager::get<AccountManager>()->sendRequest(GET_GROUP_ID_PATH.arg(groupname),
|
||||||
|
AccountManagerAuth::None,
|
||||||
|
QNetworkAccessManager::GetOperation, callbackParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomainServerSettingsManager::getGroupIDJSONCallback(QNetworkReply& requestReply) {
|
||||||
|
QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object();
|
||||||
|
|
||||||
|
qDebug() << "GOT RESPONSE" << jsonObject["group_id"].toString();
|
||||||
|
|
||||||
|
if (jsonObject["status"].toString() == "success") {
|
||||||
|
QString groupName = jsonObject["group_name"].toString();
|
||||||
|
QUuid groupID = QUuid(jsonObject["group_id"].toString());
|
||||||
|
|
||||||
|
if (!_groupPermissions.contains(groupName)) {
|
||||||
|
qDebug() << "DomainServerSettingsManager::getGroupIDJSONCallback got response for unknown group:" << groupName;
|
||||||
|
}
|
||||||
|
|
||||||
|
_groupPermissions[groupName]->setGroupID(groupID);
|
||||||
|
} else {
|
||||||
|
// XXX what?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomainServerSettingsManager::getGroupIDErrorCallback(QNetworkReply& requestReply) {
|
||||||
|
qDebug() << "ERROR" << requestReply.error();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue