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 }