File indexing completed on 2024-05-12 05:22:21

0001 /*
0002     SPDX-FileCopyrightText: 2012 Andrius da Costa Ribas <andriusmao@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "permission.h"
0008 #include "permission_p.h"
0009 #include "utils_p.h"
0010 
0011 #include <QJsonDocument>
0012 
0013 using namespace KGAPI2;
0014 using namespace KGAPI2::Drive;
0015 
0016 class Q_DECL_HIDDEN Permission::PermissionDetails::Private
0017 {
0018 public:
0019     Private() = default;
0020     Private(const Private &other) = default;
0021 
0022     PermissionDetails::PermissionType permissionType = PermissionType::UndefinedType;
0023     Role role;
0024     QList<Role> additionalRoles;
0025     QString inheritedFrom;
0026     bool inherited = false;
0027 
0028     static PermissionType permissionTypeFromName(const QString &typeName);
0029     static QString permissionTypeToName(PermissionType permissionType);
0030 };
0031 
0032 Permission::PermissionDetails::PermissionDetails()
0033     : d(new Private)
0034 {
0035 }
0036 
0037 Permission::PermissionDetails::PermissionDetails(const Permission::PermissionDetails &other)
0038     : d(new Private(*(other.d)))
0039 {
0040 }
0041 
0042 Permission::PermissionDetails::~PermissionDetails() = default;
0043 
0044 bool Permission::PermissionDetails::operator==(const Permission::PermissionDetails &other) const
0045 {
0046     GAPI_COMPARE(permissionType);
0047     GAPI_COMPARE(role);
0048     GAPI_COMPARE(additionalRoles);
0049     GAPI_COMPARE(inheritedFrom);
0050     GAPI_COMPARE(inherited);
0051     return true;
0052 }
0053 
0054 QString Permission::PermissionDetails::Private::permissionTypeToName(Permission::PermissionDetails::PermissionType permissionType)
0055 {
0056     switch (permissionType) {
0057     case Permission::PermissionDetails::TypeFile:
0058         return QStringLiteral("file");
0059     case Permission::PermissionDetails::TypeMember:
0060         return QStringLiteral("member");
0061     default:
0062         return QString();
0063     }
0064 }
0065 
0066 Permission::PermissionDetails::PermissionType Permission::PermissionDetails::Private::permissionTypeFromName(const QString &typeName)
0067 {
0068     if (typeName == QLatin1StringView("file")) {
0069         return Permission::PermissionDetails::TypeFile;
0070     } else if (typeName == QLatin1StringView("member")) {
0071         return Permission::PermissionDetails::TypeMember;
0072     } else {
0073         return Permission::PermissionDetails::UndefinedType;
0074     }
0075 }
0076 
0077 Permission::PermissionDetails::PermissionType Permission::PermissionDetails::permissionType() const
0078 {
0079     return d->permissionType;
0080 }
0081 
0082 Permission::Role Permission::PermissionDetails::role() const
0083 {
0084     return d->role;
0085 }
0086 
0087 QList<Permission::Role> Permission::PermissionDetails::additionalRoles() const
0088 {
0089     return d->additionalRoles;
0090 }
0091 
0092 QString Permission::PermissionDetails::inheritedFrom() const
0093 {
0094     return d->inheritedFrom;
0095 }
0096 
0097 bool Permission::PermissionDetails::inherited() const
0098 {
0099     return d->inherited;
0100 }
0101 
0102 Permission::Role Permission::Private::roleFromName(const QString &roleName)
0103 {
0104     if (roleName == QLatin1StringView("owner")) {
0105         return Permission::OwnerRole;
0106     } else if (roleName == QLatin1StringView("reader")) {
0107         return Permission::ReaderRole;
0108     } else if (roleName == QLatin1StringView("writer")) {
0109         return Permission::WriterRole;
0110     } else if (roleName == QLatin1StringView("commenter")) {
0111         return Permission::CommenterRole;
0112     } else if (roleName == QLatin1StringView("organizer")) {
0113         return Permission::OrganizerRole;
0114     } else if (roleName == QLatin1StringView("fileOrganizer")) {
0115         return Permission::FileOrganizerRole;
0116     } else {
0117         return Permission::UndefinedRole;
0118     }
0119 }
0120 
0121 Permission::Type Permission::Private::typeFromName(const QString &typeName)
0122 {
0123     if (typeName == QLatin1StringView("user")) {
0124         return Permission::TypeUser;
0125     } else if (typeName == QLatin1StringView("group")) {
0126         return Permission::TypeGroup;
0127     } else if (typeName == QLatin1StringView("domain")) {
0128         return Permission::TypeDomain;
0129     } else if (typeName == QLatin1StringView("anyone")) {
0130         return Permission::TypeAnyone;
0131     } else {
0132         return Permission::UndefinedType;
0133     }
0134 }
0135 
0136 QString Permission::Private::roleToName(Permission::Role role)
0137 {
0138     switch (role) {
0139     case Permission::OwnerRole:
0140         return QStringLiteral("owner");
0141     case Permission::ReaderRole:
0142         return QStringLiteral("reader");
0143     case Permission::WriterRole:
0144         return QStringLiteral("writer");
0145     case Permission::CommenterRole:
0146         return QStringLiteral("commenter");
0147     case Permission::OrganizerRole:
0148         return QStringLiteral("organizerRole");
0149     case Permission::FileOrganizerRole:
0150         return QStringLiteral("fileOrganizerRole");
0151     default:
0152         return QString();
0153     }
0154 }
0155 
0156 QString Permission::Private::typeToName(Permission::Type type)
0157 {
0158     switch (type) {
0159     case Permission::TypeUser:
0160         return QStringLiteral("user");
0161     case Permission::TypeGroup:
0162         return QStringLiteral("group");
0163     case Permission::TypeDomain:
0164         return QStringLiteral("domain");
0165     case Permission::TypeAnyone:
0166         return QStringLiteral("anyone");
0167     default:
0168         return QString();
0169     }
0170 }
0171 
0172 PermissionPtr Permission::Private::fromJSON(const QVariantMap &map)
0173 {
0174     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#permission")) {
0175         return PermissionPtr();
0176     }
0177 
0178     PermissionPtr permission(new Permission());
0179     permission->setEtag(map[QStringLiteral("etag")].toString());
0180     permission->d->id = map[QStringLiteral("id")].toString();
0181     permission->d->selfLink = map[QStringLiteral("selfLink")].toUrl();
0182     permission->d->name = map[QStringLiteral("name")].toString();
0183 
0184     permission->d->role = Private::roleFromName(map[QStringLiteral("role")].toString());
0185 
0186     const QStringList additionalRoles = map[QStringLiteral("additionalRoles")].toStringList();
0187     for (const QString &additionalRole : additionalRoles) {
0188         permission->d->additionalRoles << Private::roleFromName(additionalRole);
0189     }
0190 
0191     permission->d->type = Private::typeFromName(map[QStringLiteral("type")].toString());
0192     permission->d->authKey = map[QStringLiteral("authKey")].toString();
0193     permission->d->withLink = map[QStringLiteral("withLink")].toBool();
0194     permission->d->photoLink = map[QStringLiteral("photoLink")].toUrl();
0195     permission->d->value = map[QStringLiteral("value")].toString();
0196     permission->d->emailAddress = map[QStringLiteral("emailAddress")].toString();
0197     permission->d->domain = map[QStringLiteral("domain")].toString();
0198     permission->d->expirationDate = QDateTime::fromString(map[QStringLiteral("expirationDate")].toString(), Qt::ISODate);
0199     permission->d->deleted = map[QStringLiteral("deleted")].toBool();
0200 
0201     if (map.contains(QStringLiteral("permissionDetails"))) {
0202         const QVariantList permissionDetailsList = map[QStringLiteral("permissionDetails")].toList();
0203         for (const QVariant &variant : permissionDetailsList) {
0204             const QVariantMap permissionDetailsMap = variant.toMap();
0205             auto permissionDetails = PermissionDetailsPtr::create();
0206             permissionDetails->d->permissionType =
0207                 PermissionDetails::Private::permissionTypeFromName(permissionDetailsMap[QStringLiteral("permissionType")].toString());
0208             permissionDetails->d->role = Private::roleFromName(permissionDetailsMap[QStringLiteral("role")].toString());
0209             const QStringList permissionDetailsAdditionalRoles = permissionDetailsMap[QStringLiteral("additionalRoles")].toStringList();
0210             for (const QString &additionalRole : permissionDetailsAdditionalRoles) {
0211                 permissionDetails->d->additionalRoles << Private::roleFromName(additionalRole);
0212             }
0213             permissionDetails->d->inheritedFrom = permissionDetailsMap[QStringLiteral("inheritedFrom")].toString();
0214             permissionDetails->d->inherited = map[QStringLiteral("inherited")].toBool();
0215 
0216             permission->d->permissionDetails << permissionDetails;
0217         }
0218     }
0219 
0220     return permission;
0221 }
0222 
0223 Permission::Private::Private()
0224     : role(Permission::UndefinedRole)
0225     , type(Permission::UndefinedType)
0226     , withLink(false)
0227 {
0228 }
0229 
0230 Permission::Private::Private(const Private &other) = default;
0231 
0232 Permission::Permission()
0233     : KGAPI2::Object()
0234     , d(new Private)
0235 {
0236 }
0237 
0238 Permission::Permission(const Permission &other)
0239     : KGAPI2::Object(other)
0240     , d(new Private(*(other.d)))
0241 {
0242 }
0243 
0244 Permission::~Permission()
0245 {
0246     delete d;
0247 }
0248 
0249 bool Permission::operator==(const Permission &other) const
0250 {
0251     if (!Object::operator==(other)) {
0252         return false;
0253     }
0254     GAPI_COMPARE(id)
0255     GAPI_COMPARE(selfLink)
0256     GAPI_COMPARE(name)
0257     GAPI_COMPARE(role)
0258     GAPI_COMPARE(additionalRoles)
0259     GAPI_COMPARE(type)
0260     GAPI_COMPARE(authKey)
0261     GAPI_COMPARE(withLink)
0262     GAPI_COMPARE(photoLink)
0263     GAPI_COMPARE(value)
0264     GAPI_COMPARE(emailAddress)
0265     GAPI_COMPARE(domain)
0266     GAPI_COMPARE(expirationDate)
0267     GAPI_COMPARE(deleted)
0268     GAPI_COMPARE(permissionDetails)
0269     return true;
0270 }
0271 
0272 QString Permission::id() const
0273 {
0274     return d->id;
0275 }
0276 
0277 void Permission::setId(const QString &id)
0278 {
0279     d->id = id;
0280 }
0281 
0282 QUrl Permission::selfLink() const
0283 {
0284     return d->selfLink;
0285 }
0286 
0287 QString Permission::name() const
0288 {
0289     return d->name;
0290 }
0291 
0292 Permission::Role Permission::role() const
0293 {
0294     return d->role;
0295 }
0296 
0297 void Permission::setRole(Permission::Role role)
0298 {
0299     d->role = role;
0300 }
0301 
0302 QList<Permission::Role> Permission::additionalRoles() const
0303 {
0304     return d->additionalRoles;
0305 }
0306 
0307 void Permission::setAdditionalRoles(const QList<Permission::Role> &additionalRoles)
0308 {
0309     d->additionalRoles = additionalRoles;
0310 }
0311 
0312 Permission::Type Permission::type() const
0313 {
0314     return d->type;
0315 }
0316 
0317 void Permission::setType(Permission::Type type)
0318 {
0319     d->type = type;
0320 }
0321 
0322 QString Permission::authKey() const
0323 {
0324     return d->authKey;
0325 }
0326 
0327 bool Permission::withLink() const
0328 {
0329     return d->withLink;
0330 }
0331 
0332 void Permission::setWithLink(bool withLink)
0333 {
0334     d->withLink = withLink;
0335 }
0336 
0337 QUrl Permission::photoLink() const
0338 {
0339     return d->photoLink;
0340 }
0341 
0342 QString Permission::value() const
0343 {
0344     return d->value;
0345 }
0346 
0347 void Permission::setValue(const QString &value)
0348 {
0349     d->value = value;
0350 }
0351 
0352 QString Permission::emailAddress() const
0353 {
0354     return d->emailAddress;
0355 }
0356 
0357 QString Permission::domain() const
0358 {
0359     return d->domain;
0360 }
0361 
0362 QDateTime Permission::expirationDate() const
0363 {
0364     return d->expirationDate;
0365 }
0366 
0367 bool Permission::deleted() const
0368 {
0369     return d->deleted;
0370 }
0371 
0372 Permission::PermissionDetailsList Permission::permissionDetails() const
0373 {
0374     return d->permissionDetails;
0375 }
0376 
0377 PermissionPtr Permission::fromJSON(const QByteArray &jsonData)
0378 {
0379     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0380     if (document.isNull()) {
0381         return PermissionPtr();
0382     }
0383     const QVariant json = document.toVariant();
0384     const QVariantMap map = json.toMap();
0385 
0386     return Private::fromJSON(map);
0387 }
0388 
0389 PermissionsList Permission::fromJSONFeed(const QByteArray &jsonData)
0390 {
0391     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0392     if (document.isNull()) {
0393         return PermissionsList();
0394     }
0395     const QVariant json = document.toVariant();
0396     const QVariantMap map = json.toMap();
0397     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#permissionList")) {
0398         return PermissionsList();
0399     }
0400 
0401     PermissionsList permissions;
0402     const QVariantList items = map[QStringLiteral("items")].toList();
0403     for (const QVariant &item : items) {
0404         const PermissionPtr permission = Private::fromJSON(item.toMap());
0405         if (!permission.isNull()) {
0406             permissions << permission;
0407         }
0408     }
0409     return permissions;
0410 }
0411 
0412 QByteArray Permission::toJSON(const PermissionPtr &permission)
0413 {
0414     QVariantMap map;
0415 
0416     if (permission->role() != Permission::UndefinedRole) {
0417         map[QStringLiteral("role")] = Private::roleToName(permission->role());
0418     }
0419     if (permission->type() != Permission::UndefinedType) {
0420         map[QStringLiteral("type")] = Private::typeToName(permission->type());
0421     }
0422 
0423     QVariantList additionalRoles;
0424     const auto roles = permission->additionalRoles();
0425     additionalRoles.reserve(roles.size());
0426     for (Permission::Role additionalRole : roles) {
0427         additionalRoles << Private::roleToName(additionalRole);
0428     }
0429     if (!additionalRoles.isEmpty()) {
0430         map[QStringLiteral("additionalRoles")] = additionalRoles;
0431     }
0432 
0433     map[QStringLiteral("withLink")] = permission->withLink();
0434 
0435     if (!permission->value().isEmpty()) {
0436         map[QStringLiteral("value")] = permission->value();
0437     }
0438 
0439     QJsonDocument document = QJsonDocument::fromVariant(map);
0440     return document.toJson(QJsonDocument::Compact);
0441 }