Skip to content
Snippets Groups Projects
Select Git revision
  • 0fe26da113ab89d8d76dd0358f12f038b00a8f04
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/releaseTest
  • release/releaseWindowsTest
  • release/windowsReleaseTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 1.0.0
  • 0.3.0
  • 0.2.1
  • 0.2.0
  • 0.1.0
26 results

ciphermodel.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ciphermodel.cpp 5.26 KiB
    /****************************************************************************
     *   Copyright (C) 2015 by Savoir-Faire Linux                               *
     *   Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> *
     *                                                                          *
     *   This library is free software; you can redistribute it and/or          *
     *   modify it under the terms of the GNU Lesser General Public             *
     *   License as published by the Free Software Foundation; either           *
     *   version 2.1 of the License, or (at your option) any later version.     *
     *                                                                          *
     *   This library is distributed in the hope that it will be useful,        *
     *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
     *   Lesser General Public License for more details.                        *
     *                                                                          *
     *   You should have received a copy of the GNU General Public License      *
     *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
     ***************************************************************************/
    #include "ciphermodel.h"
    
    //Qt
    #include <QtCore/QCoreApplication>
    
    //Ring daemon
    #include <account_const.h>
    
    //Ring
    #include "dbus/configurationmanager.h"
    #include "account.h"
    #include "private/account_p.h"
    
    class CipherModelPrivate {
    public:
       CipherModelPrivate(Account* parent);
       ~CipherModelPrivate();
    
       //Attributes
       bool*                            m_lChecked          ;
       Account*                         m_pAccount          ;
       static QVector<QByteArray>       m_slSupportedCiphers;
       static QHash<const QString,int>  m_shMapping         ;
       static bool                      m_sIsLoaded         ;
       bool                             m_UseDefault        ;
    
       static void loadCiphers();
    };
    
    bool CipherModelPrivate::m_sIsLoaded = false;
    QVector<QByteArray> CipherModelPrivate::m_slSupportedCiphers;
    QHash<const QString,int>  CipherModelPrivate::m_shMapping;
    
    CipherModelPrivate::CipherModelPrivate(Account* parent) : m_pAccount(parent),m_UseDefault(true)
    {
       if (!CipherModelPrivate::m_sIsLoaded) {
          const QStringList cs = DBus::ConfigurationManager::instance().getSupportedCiphers(DRing::Account::ProtocolNames::IP2IP);
          foreach(const QString& c, cs) {
             m_shMapping[c] = m_slSupportedCiphers.size();
             m_slSupportedCiphers << c.toLatin1();
          }
          m_sIsLoaded = true;
       }
    
       m_lChecked = new bool[m_slSupportedCiphers.size()]{};
    
       foreach(const QString& cipher, parent->d_ptr->accountDetail(DRing::Account::ConfProperties::TLS::CIPHERS).split(' ')) {
          if (!cipher.trimmed().isEmpty()) {
             m_lChecked[m_shMapping[cipher]] = true;
             m_UseDefault = false;
          }
       }
    }
    
    CipherModelPrivate::~CipherModelPrivate()
    {
       delete[] m_lChecked;
    }
    
    void CipherModelPrivate::loadCiphers()
    {
       const QStringList cs = DBus::ConfigurationManager::instance().getSupportedCiphers("IP2IP");
       foreach(const QString& c, cs)
          m_slSupportedCiphers << c.toLatin1();
       m_sIsLoaded = true;
    }
    
    CipherModel::CipherModel(Account* parent) : QAbstractListModel(parent),
    d_ptr(new CipherModelPrivate(parent))
    {}
    
    CipherModel::~CipherModel()
    {
       delete d_ptr;
    }
    
    QHash<int,QByteArray> CipherModel::roleNames() const
    {
       static QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
       /*static bool initRoles = false;
       if (!initRoles) {
          initRoles = true;
    
       }*/
       return roles;
    }
    
    //Model functions
    QVariant CipherModel::data( const QModelIndex& index, int role) const
    {
       if (!index.isValid()) return QVariant();
       switch (role) {
          case Qt::DisplayRole:
             return CipherModelPrivate::m_slSupportedCiphers[index.row()];
          case Qt::CheckStateRole:
             return d_ptr->m_lChecked[index.row()]?Qt::Checked:Qt::Unchecked;
       };
       return QVariant();
    }
    
    int CipherModel::rowCount( const QModelIndex& parent ) const
    {
       Q_UNUSED(parent)
       return d_ptr->m_slSupportedCiphers.size();
    }
    
    Qt::ItemFlags CipherModel::flags( const QModelIndex& index ) const
    {
       return (index.isValid()) ? (Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsUserCheckable) : Qt::NoItemFlags;
    }
    
    bool CipherModel::setData( const QModelIndex& index, const QVariant &value, int role)
    {
       if (index.isValid() && role == Qt::CheckStateRole) {
          d_ptr->m_lChecked[index.row()] = value == Qt::Checked;
          emit dataChanged(index,index);
          QStringList ciphers;
          for(int i =0; i< d_ptr->m_slSupportedCiphers.size();i++) {
             if (d_ptr->m_lChecked[i])
                ciphers << d_ptr->m_slSupportedCiphers[i];
          }
          d_ptr->m_pAccount->d_ptr->setAccountProperty(DRing::Account::ConfProperties::TLS::CIPHERS,ciphers.join(QString(' ')));
    
          emit modified();
    
          return true;
       }
       return false;
    }
    
    bool CipherModel::useDefault() const
    {
       return d_ptr->m_UseDefault;
    }
    
    void CipherModel::setUseDefault(bool value)
    {
       d_ptr->m_UseDefault = value;
       if (value) {
          for (int i =0; i < d_ptr->m_slSupportedCiphers.size();i++) {
             d_ptr->m_lChecked[i] = false;
          }
          emit dataChanged(index(0,0),index(d_ptr->m_slSupportedCiphers.size()-1,0));
       }
    }