[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [apper] /: Initial support for showing the untrusted packages that are to be installed
From:       Daniel Nicoletti <dantti12 () gmail ! com>
Date:       2012-11-30 21:27:21
Message-ID: 20121130212721.3A585A6091 () git ! kde ! org
[Download RAW message or body]

Git commit c66a77d2283e8b4d08ad5e9cba0fa67a67d07c58 by Daniel Nicoletti.
Committed on 30/11/2012 at 22:26.
Pushed by dantti into branch 'master'.

Initial support for showing the untrusted packages that are to be installed

M  +21   -12   ApperKCM/ApperKCM.cpp
M  +4    -1    libapper/PackageModel.cpp
M  +23   -13   libapper/PkTransaction.cpp
M  +3    -0    libapper/PkTransaction.h
M  +2    -1    libapper/PkTransactionWidget.cpp
M  +67   -13   libapper/Requirements.cpp
M  +10   -0    libapper/Requirements.h

http://commits.kde.org/apper/c66a77d2283e8b4d08ad5e9cba0fa67a67d07c58

diff --git a/ApperKCM/ApperKCM.cpp b/ApperKCM/ApperKCM.cpp
index e763fc8..b794773 100644
--- a/ApperKCM/ApperKCM.cpp
+++ b/ApperKCM/ApperKCM.cpp
@@ -193,8 +193,7 @@ ApperKCM::ApperKCM(QWidget *parent, const QVariantList &args) :
     changesView->setItemDelegate(changesDelegate);
 
     // Connect this signal to keep track of changes
-    connect(m_browseModel, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
-    connect(m_browseModel, SIGNAL(changed(bool)), changesPB, \
SLOT(setEnabled(bool))); +    connect(m_browseModel, SIGNAL(changed(bool)), this, \
SLOT(checkChanged()));  
     // packageUnchecked from changes model
     connect(m_changesModel, SIGNAL(packageUnchecked(QString)),
@@ -305,9 +304,19 @@ void ApperKCM::setCurrentActionCancel(bool cancel)
 
 void ApperKCM::checkChanged()
 {
-    bool value = m_browseModel->hasChanges();
-    changesPB->setEnabled(value);
-    emit changed(value);
+    bool hasChanges = false;
+    if (stackedWidget->currentWidget() == pageHome ||
+            stackedWidget->currentWidget() == pageChanges ||
+            stackedWidget->currentWidget() == pageBrowse) {
+        hasChanges = m_browseModel->hasChanges();
+        changesPB->setEnabled(hasChanges);
+    } else if (stackedWidget->currentWidget() == m_updaterPage) {
+        hasChanges = m_updaterPage->hasChanges();
+    } else if (stackedWidget->currentWidget() == m_settingsPage) {
+        hasChanges = m_settingsPage->hasChanges();
+    }
+
+    emit changed(hasChanges);
 }
 
 void ApperKCM::errorCode(PackageKit::Transaction::Error error, const QString \
&details) @@ -462,15 +471,16 @@ void ApperKCM::setPage(const QString &page)
 
             if (m_settingsPage == 0) {
                 m_settingsPage = new Settings(m_roles, this);
+                connect(m_settingsPage, SIGNAL(changed(bool)),
+                        this, SLOT(checkChanged()));
                 stackedWidget->addWidget(m_settingsPage);
-                m_settingsPage->load();
 
                 connect(generalSettingsPB, SIGNAL(toggled(bool)),
                         m_settingsPage, SLOT(showGeneralSettings()));
-		connect(repoSettingsPB, SIGNAL(toggled(bool)),
+                connect(repoSettingsPB, SIGNAL(toggled(bool)),
                         m_settingsPage, SLOT(showRepoSettings()));
             }
-            connect(m_settingsPage, SIGNAL(changed(bool)), this, \
SIGNAL(changed(bool))); +            checkChanged();
             setButtons(KCModule::Default | KCModule::Apply);
             emit changed(true); // THIS IS DUMB setButtons only take effect after \
changed goes true  emit changed(false);
@@ -492,14 +502,15 @@ void ApperKCM::setPage(const QString &page)
                         this, SLOT(refreshCache()));
                 connect(m_updaterPage, SIGNAL(downloadSize(QString)),
                         downloadL, SLOT(setText(QString)));
+                connect(m_updaterPage, SIGNAL(changed(bool)),
+                        this, SLOT(checkChanged()));
                 stackedWidget->addWidget(m_updaterPage);
                 checkUpdatesPB->setIcon(KIcon("view-refresh"));
                 connect(checkUpdatesPB, SIGNAL(clicked(bool)),
                         this, SLOT(refreshCache()));
             }
 
-            connect(m_updaterPage, SIGNAL(changed(bool)), this, \
                SIGNAL(changed(bool)));
-            emit changed(false);
+            checkChanged();
             stackedWidget->setCurrentWidget(m_updaterPage);
             m_updaterPage->load();
             stackedWidgetBar->setCurrentIndex(BAR_UPDATE);
@@ -548,7 +559,6 @@ void ApperKCM::on_backTB_clicked()
             return;
         }
         stackedWidgetBar->setCurrentIndex(BAR_SEARCH);
-        disconnect(m_updaterPage, SIGNAL(changed(bool)), this, \
SIGNAL(changed(bool)));  checkChanged();
     } else if (stackedWidget->currentWidget() == m_settingsPage) {
         if (!canChangePage()) {
@@ -557,7 +567,6 @@ void ApperKCM::on_backTB_clicked()
         setButtons(Apply);
         emit changed(true); // THIS IS DUMB setButtons only take effect after \
changed goes true  stackedWidgetBar->setCurrentIndex(BAR_SEARCH);
-        disconnect(m_settingsPage, SIGNAL(changed(bool)), this, \
SIGNAL(changed(bool)));  checkChanged();
     }
 
diff --git a/libapper/PackageModel.cpp b/libapper/PackageModel.cpp
index 017e39a..1609e4c 100644
--- a/libapper/PackageModel.cpp
+++ b/libapper/PackageModel.cpp
@@ -85,6 +85,7 @@ void PackageModel::addSelectedPackagesFromModel(PackageModel \
*model)  
 void PackageModel::addPackage(Transaction::Info info, const QString &packageID, \
const QString &summary, bool selected)  {
+    kDebug() << packageID;
     switch(info) {
     case Transaction::InfoBlocked:
     case Transaction::InfoFinished:
@@ -409,7 +410,9 @@ void PackageModel::removePackage(const QString &packageID)
 {
     int i = 0;
     while (i < m_packages.size()) {
-        if (m_packages[i].packageID == packageID) {
+        InternalPackage iPackage = m_packages[i];
+        if (iPackage.packageID == packageID &&
+                iPackage.info != Transaction::InfoUntrusted) {
             beginRemoveRows(QModelIndex(), i, i);
             m_packages.remove(i);
             endRemoveRows();
diff --git a/libapper/PkTransaction.cpp b/libapper/PkTransaction.cpp
index c62209b..11b8f7a 100644
--- a/libapper/PkTransaction.cpp
+++ b/libapper/PkTransaction.cpp
@@ -259,6 +259,11 @@ void PkTransaction::updatePackages()
 void PkTransaction::requeueTransaction()
 {
     Requirements *requires = qobject_cast<Requirements *>(sender());
+    if (requires && !requires->trusted()) {
+        // Set only trusted to false, to do as the user asked
+        // TODO test without this to check the fallback mode
+        d->flags ^= Transaction::TransactionFlagOnlyTrusted;
+    }
 
     // Delete the simulate model
     if (d->simulateModel) {
@@ -309,7 +314,7 @@ static bool untrustedIsNeed(Transaction::Error error)
 
 void PkTransaction::errorCode(Transaction::Error error, const QString &details)
 {
-//     kDebug() << "errorCode: " << error << details;
+     kDebug() << "errorCode: " << error << details;
     d->error = error;
     // obvious message, don't tell the user
     if (m_handlingActionRequired ||
@@ -540,6 +545,17 @@ void PkTransaction::transactionFinished(Transaction::Exit \
status)  setExitStatus(Success);
         }
         break;
+    case Transaction::ExitNeedUntrusted:
+    case Transaction::ExitKeyRequired :
+    case Transaction::ExitEulaRequired :
+    case Transaction::ExitMediaChangeRequired :
+        kDebug() << "finished KeyRequired or EulaRequired: " << status;
+//        ui->currentL->setText(PkStrings::status(Transaction::StatusSetup));
+        if (!m_handlingActionRequired) {
+            kDebug() << "Not Handling Required Action";
+            setExitStatus(Failed);
+        }
+        break;
     case Transaction::ExitCancelled :
 //        ui->progressBar->setMaximum(100);
 //        ui->progressBar->setValue(100);
@@ -556,17 +572,6 @@ void PkTransaction::transactionFinished(Transaction::Exit \
status)  setExitStatus(Failed);
         }
         break;
-    case Transaction::ExitKeyRequired :
-    case Transaction::ExitEulaRequired :
-    case Transaction::ExitMediaChangeRequired :
-    case Transaction::ExitNeedUntrusted :
-        kDebug() << "finished KeyRequired or EulaRequired: " << status;
-//        ui->currentL->setText(PkStrings::status(Transaction::StatusSetup));
-        if (!m_handlingActionRequired) {
-            kDebug() << "Not Handling Required Action";
-            setExitStatus(Failed);
-        }
-        break;
     default :
 //        ui->progressBar->setMaximum(100);
 //        ui->progressBar->setValue(100);
@@ -585,7 +590,12 @@ bool PkTransaction::isFinished() const
 {
     kDebug() << status() << role();
     return status() == Transaction::StatusFinished;
-//    return d->finished;
+    //    return d->finished;
+}
+
+PackageModel *PkTransaction::simulateModel() const
+{
+    return d->simulateModel;
 }
 
 void PkTransaction::setExitStatus(PkTransaction::ExitStatus status)
diff --git a/libapper/PkTransaction.h b/libapper/PkTransaction.h
index 38c5be9..c1a17c3 100644
--- a/libapper/PkTransaction.h
+++ b/libapper/PkTransaction.h
@@ -29,6 +29,7 @@
 
 using namespace PackageKit;
 
+class PackageModel;
 class PkTransactionPrivate;
 class PkTransactionProgressModel;
 class KDE_EXPORT PkTransaction : public Transaction
@@ -57,6 +58,8 @@ public:
     PkTransaction::ExitStatus exitStatus() const;
     bool isFinished() const;
 
+    PackageModel* simulateModel() const;
+
 signals:
     void finished(PkTransaction::ExitStatus status);
     void titleChanged(const QString &title);
diff --git a/libapper/PkTransactionWidget.cpp b/libapper/PkTransactionWidget.cpp
index 3163a89..c870462 100644
--- a/libapper/PkTransactionWidget.cpp
+++ b/libapper/PkTransactionWidget.cpp
@@ -50,6 +50,7 @@
 #include "PkTransaction.h"
 #include "TransactionDelegate.h"
 #include "PkTransactionProgressModel.h"
+#include "PackageModel.h"
 
 class PkTransactionWidgetPrivate
 {
@@ -267,7 +268,7 @@ static bool untrustedIsNeed(Transaction::Error error)
 
 void PkTransactionWidget::errorCode(Transaction::Error error, const QString \
&details)  {
-//     kDebug() << "errorCode: " << error << details;
+     kDebug() << "errorCode: " << error << details;
 //    d->error = error;
     // obvious message, don't tell the user
     if (m_handlingActionRequired ||
diff --git a/libapper/Requirements.cpp b/libapper/Requirements.cpp
index fdfc038..0a0e3fa 100644
--- a/libapper/Requirements.cpp
+++ b/libapper/Requirements.cpp
@@ -32,6 +32,7 @@ Requirements::Requirements(PackageModel *model, QWidget *parent) :
     KDialog(parent),
     m_embed(false),
     m_shouldShow(true),
+    m_untrustedButton(0),
     ui(new Ui::Requirements)
 {
     ui->setupUi(mainWidget());
@@ -40,6 +41,13 @@ Requirements::Requirements(PackageModel *model, QWidget *parent) :
     ApplicationSortFilterModel *proxy = new ApplicationSortFilterModel(this);
     proxy->setSourceModel(model);
     ui->packageView->setModel(proxy);
+    ui->packageView->header()->setResizeMode(PackageModel::NameCol, \
QHeaderView::ResizeToContents); +    \
ui->packageView->header()->hideSection(PackageModel::ActionCol); +    \
ui->packageView->header()->hideSection(PackageModel::ArchCol); +    \
ui->packageView->header()->hideSection(PackageModel::CurrentVersionCol); +    \
ui->packageView->header()->hideSection(PackageModel::OriginCol); +    \
ui->packageView->header()->hideSection(PackageModel::SizeCol); +
     m_hideAutoConfirm = false;
 
     setCaption(i18n("Additional changes"));
@@ -47,11 +55,11 @@ Requirements::Requirements(PackageModel *model, QWidget *parent) \
:  setButtons(KDialog::Ok | KDialog::Cancel);
     setButtonText(KDialog::Ok, i18n("Continue"));
     // restore size
-    setMinimumSize(QSize(450,300));
-    setInitialSize(QSize(450,300));
+    setMinimumSize(QSize(600,480));
+    setInitialSize(QSize(600,600));
     KConfig config("apper");
     KConfigGroup requirementsDialog(&config, "requirementsDialog");
-    restoreDialogSize(requirementsDialog);
+//    restoreDialogSize(requirementsDialog);
 
     QButtonGroup *group = new QButtonGroup(this);
     connect(group, SIGNAL(buttonClicked(int)), this, SLOT(actionClicked(int)));
@@ -126,17 +134,23 @@ Requirements::Requirements(PackageModel *model, QWidget \
*parent) :  ui->verticalLayout->insertWidget(count++, button);
     }
 
-    QList<QAbstractButton *> buttons = group->buttons();
-    if (!buttons.isEmpty()) {
-        QAbstractButton *button = group->buttons().first();
-        button->click();
+    if (int c = model->countInfo(Transaction::InfoUntrusted)) {
+        m_untrustedButton = new QToolButton(this);
+        m_untrustedButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+        m_untrustedButton->setCheckable(true);
+        m_untrustedButton->setAutoRaise(true);
+        m_untrustedButton->setIconSize(QSize(32, 32));
+        m_untrustedButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+        m_untrustedButton->setText(i18np("1 untrusted package", "%1 untrusted \
packages", c)); +        m_untrustedButton->setIcon(KIcon("security-low"));
+        m_untrustedButton->setVisible(false);
+        ui->verticalLayout->insertWidget(count++, m_untrustedButton);
+    }
 
-        ui->packageView->header()->setResizeMode(PackageModel::NameCol, \
                QHeaderView::ResizeToContents);
-        ui->packageView->header()->hideSection(PackageModel::ActionCol);
-        ui->packageView->header()->hideSection(PackageModel::ArchCol);
-        ui->packageView->header()->hideSection(PackageModel::CurrentVersionCol);
-        ui->packageView->header()->hideSection(PackageModel::OriginCol);
-        ui->packageView->header()->hideSection(PackageModel::SizeCol);
+    m_buttons = group->buttons();
+    if (!m_buttons.isEmpty()) {
+        QAbstractButton *button = m_buttons.first();
+        button->click();
 
         if (m_hideAutoConfirm) {
             ui->confirmCB->setVisible(false);
@@ -145,6 +159,8 @@ Requirements::Requirements(PackageModel *model, QWidget *parent) \
:  // dialog, but only if the user previusly set so
             ui->confirmCB->setChecked(requirementsDialog.readEntry("autoConfirm", \
false));  }
+    } else if (m_untrustedButton) {
+        showUntrustedButton();
     } else {
         // set this as false so the dialog is not shown
         m_shouldShow = false;
@@ -171,11 +187,28 @@ void Requirements::setEmbedded(bool embedded)
     ui->label->setVisible(!embedded);
 }
 
+bool Requirements::trusted() const
+{
+    // There are untrusted packages if the button was created...
+    return !m_untrustedButton;
+}
+
 bool Requirements::shouldShow() const
 {
     return (m_shouldShow && !ui->confirmCB->isChecked());
 }
 
+void Requirements::slotButtonClicked(int button)
+{
+    if (button == KDialog::Ok &&
+            m_untrustedButton &&
+            !m_untrustedButton->isVisible()) {
+        showUntrustedButton();
+    } else {
+        KDialog::slotButtonClicked(button);
+    }
+}
+
 void Requirements::on_confirmCB_Toggled(bool checked)
 {
     KConfig config("apper");
@@ -194,4 +227,25 @@ void Requirements::actionClicked(int type)
     proxy->filterByInfo(static_cast<Transaction::Info>(type));
 }
 
+void Requirements::showUntrustedButton()
+{
+    // Clear the other buttons
+    foreach (QAbstractButton *button, m_buttons) {
+        delete button;
+    }
+
+    // Hide the auto confirm button since we will be showing this dialog anyway
+    ui->confirmCB->setVisible(false);
+
+    ui->label->setText(i18n("You are about to install unsigned packages that can \
compromise your system, " +                            "as it is impossible to verify \
if the software came from a trusted source.")); +    QButtonGroup *group = new \
QButtonGroup(this); +    m_untrustedButton->setVisible(true);
+    group->addButton(m_untrustedButton);
+
+    ApplicationSortFilterModel *proxy;
+    proxy = qobject_cast<ApplicationSortFilterModel*>(ui->packageView->model());
+    proxy->filterByInfo(Transaction::InfoUntrusted);
+}
+
 #include "Requirements.moc"
diff --git a/libapper/Requirements.h b/libapper/Requirements.h
index 507cdad..ef731db 100644
--- a/libapper/Requirements.h
+++ b/libapper/Requirements.h
@@ -23,6 +23,8 @@
 
 #include <KDialog>
 
+#include <QToolButton>
+
 namespace Ui {
     class Requirements;
 }
@@ -38,18 +40,26 @@ public:
 
     bool embedded() const;
     void setEmbedded(bool embedded);
+    bool trusted() const;
 
 public slots:
     bool shouldShow() const;
 
+protected slots:
+     virtual void slotButtonClicked(int button);
+
 private slots:
     void on_confirmCB_Toggled(bool checked);
     void actionClicked(int type);
 
 private:
+    void showUntrustedButton();
+
     bool m_embed;
     bool m_shouldShow;
     bool m_hideAutoConfirm;
+    QToolButton *m_untrustedButton;
+    QList<QAbstractButton *> m_buttons;
     Ui::Requirements *ui;
 };
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic