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

0001 /*
0002     SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "mainwindow.h"
0008 
0009 #include "core/account.h"
0010 #include "core/authjob.h"
0011 #include "drive/permissionfetchjob.h"
0012 
0013 #include <QListWidgetItem>
0014 
0015 MainWindow::MainWindow(QWidget *parent)
0016     : QMainWindow(parent)
0017 {
0018     /* Initialize GUI */
0019     ui.setupUi(this);
0020     ui.errorLabel->setVisible(false);
0021     connect(ui.authButton, &QAbstractButton::clicked, this, &MainWindow::authenticate);
0022     connect(ui.getPermissionsButton, &QAbstractButton::clicked, this, &MainWindow::slotFetchPermissions);
0023     connect(ui.permissionsList, &QListWidget::itemSelectionChanged, this, &MainWindow::permissionSelected);
0024 }
0025 
0026 void MainWindow::authenticate()
0027 {
0028     auto account = KGAPI2::AccountPtr::create();
0029     account->setScopes({KGAPI2::Account::driveScopeUrl()});
0030 
0031     /* Create AuthJob to retrieve OAuth tokens for the account */
0032     auto *authJob = new KGAPI2::AuthJob(account, QStringLiteral("554041944266.apps.googleusercontent.com"), QStringLiteral("mdT1DjzohxN3npUUzkENT0gO"));
0033     connect(authJob, &KGAPI2::Job::finished, this, [this, authJob]() {
0034         /* Always remember to delete the jobs, otherwise your application will
0035          * leak memory. */
0036         authJob->deleteLater();
0037 
0038         if (authJob->error() != KGAPI2::NoError) {
0039             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(authJob->errorString()));
0040             ui.errorLabel->setVisible(true);
0041             return;
0042         }
0043 
0044         m_account = authJob->account();
0045 
0046         ui.authStatusLabel->setText(QStringLiteral("Authenticated"));
0047         ui.fileIdEdit->setEnabled(true);
0048         ui.getPermissionsButton->setEnabled(true);
0049     });
0050 }
0051 
0052 void MainWindow::slotFetchPermissions()
0053 {
0054     if (m_account.isNull()) {
0055         ui.errorLabel->setText(QStringLiteral("Error: Please authenticate first"));
0056         ui.errorLabel->setVisible(true);
0057         ui.authButton->setVisible(true);
0058         return;
0059     }
0060 
0061     const auto fileId = ui.fileIdEdit->text();
0062     auto *fetchJob = new KGAPI2::Drive::PermissionFetchJob(fileId, m_account, this);
0063     connect(fetchJob, &KGAPI2::Job::finished, this, [this, fetchJob]() {
0064         fetchJob->deleteLater();
0065 
0066         if (fetchJob->error() != KGAPI2::NoError) {
0067             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fetchJob->errorString()));
0068             ui.errorLabel->setVisible(true);
0069             return;
0070         }
0071 
0072         /* Get all items the job has retrieved */
0073         const auto objects = fetchJob->items();
0074         ui.permissionsList->clear();
0075         for (const auto &object : objects) {
0076             const auto permission = object.dynamicCast<KGAPI2::Drive::Permission>();
0077 
0078             /* Convert the permission to QListWidget item */
0079             auto *item = new QListWidgetItem(ui.permissionsList);
0080             QString displayText;
0081             if (permission->name().isEmpty()) {
0082                 displayText = permission->emailAddress();
0083             } else {
0084                 displayText = QStringLiteral("%0 (%1)").arg(permission->name()).arg(permission->emailAddress());
0085             }
0086             item->setText(displayText);
0087             item->setData(Qt::UserRole, permission->id());
0088 
0089             ui.permissionsList->addItem(item);
0090         }
0091     });
0092 }
0093 
0094 void MainWindow::permissionSelected()
0095 {
0096     const bool hasSelection = (ui.permissionsList->selectedItems().count() != 0);
0097 
0098     ui.permissionDetailsList->clear();
0099 
0100     if (!hasSelection) {
0101         return;
0102     }
0103 
0104     const auto permissionId = ui.permissionsList->selectedItems().at(0)->data(Qt::UserRole).toString();
0105     const auto fileId = ui.fileIdEdit->text();
0106     auto *fetchJob = new KGAPI2::Drive::PermissionFetchJob(fileId, permissionId, m_account, this);
0107     connect(fetchJob, &KGAPI2::Job::finished, this, [this, fetchJob]() {
0108         fetchJob->deleteLater();
0109 
0110         if (fetchJob->error() != KGAPI2::NoError) {
0111             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fetchJob->errorString()));
0112             ui.errorLabel->setVisible(true);
0113             return;
0114         }
0115 
0116         /* Get all items the job has retrieved */
0117         const auto objects = fetchJob->items();
0118         for (const auto &object : objects) {
0119             const auto permission = object.dynamicCast<KGAPI2::Drive::Permission>();
0120 
0121             ui.permissionDetailsList->addItem(QStringLiteral("Id: %0").arg(permission->id()));
0122             ui.permissionDetailsList->addItem(QStringLiteral("Name: %0").arg(permission->name()));
0123             ui.permissionDetailsList->addItem(QStringLiteral("Email: %0").arg(permission->emailAddress()));
0124             ui.permissionDetailsList->addItem(QStringLiteral("Type: %0").arg(typeToName(permission->type())));
0125             ui.permissionDetailsList->addItem(QStringLiteral("Role: %0").arg(roleToName(permission->role())));
0126             ui.permissionDetailsList->addItem(QStringLiteral("Permission details count: %0").arg(permission->permissionDetails().size()));
0127             for (int i = 0; i < permission->permissionDetails().size(); ++i) {
0128                 const auto permissionDetails = permission->permissionDetails().at(i);
0129                 ui.permissionDetailsList->addItem(
0130                     QStringLiteral("  [%0] permissionType: %1").arg(i).arg(permissionTypeToName(permissionDetails->permissionType())));
0131                 ui.permissionDetailsList->addItem(QStringLiteral("  [%0] role: %1").arg(i).arg(roleToName(permissionDetails->role())));
0132                 ui.permissionDetailsList->addItem(
0133                     QStringLiteral("  [%0] inherited: %1").arg(i).arg(permissionDetails->inherited() ? QStringLiteral("true") : QStringLiteral("false")));
0134                 if (permissionDetails->inherited()) {
0135                     ui.permissionDetailsList->addItem(QStringLiteral("  [%0] inherited from: %1").arg(i).arg(permissionDetails->inheritedFrom()));
0136                 }
0137             }
0138         }
0139     });
0140 }
0141 
0142 QString MainWindow::roleToName(KGAPI2::Drive::Permission::Role role)
0143 {
0144     switch (role) {
0145     case KGAPI2::Drive::Permission::OwnerRole:
0146         return QStringLiteral("owner");
0147     case KGAPI2::Drive::Permission::ReaderRole:
0148         return QStringLiteral("reader");
0149     case KGAPI2::Drive::Permission::WriterRole:
0150         return QStringLiteral("writer");
0151     case KGAPI2::Drive::Permission::CommenterRole:
0152         return QStringLiteral("commenter");
0153     case KGAPI2::Drive::Permission::OrganizerRole:
0154         return QStringLiteral("organizerRole");
0155     case KGAPI2::Drive::Permission::FileOrganizerRole:
0156         return QStringLiteral("fileOrganizerRole");
0157     default:
0158         return QString();
0159     }
0160 }
0161 
0162 QString MainWindow::typeToName(KGAPI2::Drive::Permission::Type type)
0163 {
0164     switch (type) {
0165     case KGAPI2::Drive::Permission::TypeUser:
0166         return QStringLiteral("user");
0167     case KGAPI2::Drive::Permission::TypeGroup:
0168         return QStringLiteral("group");
0169     case KGAPI2::Drive::Permission::TypeDomain:
0170         return QStringLiteral("domain");
0171     case KGAPI2::Drive::Permission::TypeAnyone:
0172         return QStringLiteral("anyone");
0173     default:
0174         return QString();
0175     }
0176 }
0177 
0178 QString MainWindow::permissionTypeToName(KGAPI2::Drive::Permission::PermissionDetails::PermissionType permissionType)
0179 {
0180     switch (permissionType) {
0181     case KGAPI2::Drive::Permission::PermissionDetails::TypeFile:
0182         return QStringLiteral("file");
0183     case KGAPI2::Drive::Permission::PermissionDetails::TypeMember:
0184         return QStringLiteral("member");
0185     default:
0186         return QString();
0187     }
0188 }
0189 
0190 #include "moc_mainwindow.cpp"